kiln-cli 0.3.2__tar.gz → 0.3.3__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 (406) hide show
  1. kiln_cli-0.3.3/.pre-commit-config.yaml +31 -0
  2. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/CHANGELOG.md +5 -0
  3. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/CLAUDE.md +4 -2
  4. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/CONTRIBUTING.md +2 -1
  5. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/PKG-INFO +4 -2
  6. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/README.fr.md +3 -1
  7. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/README.md +3 -1
  8. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/docs/backlog/backlog.md +28 -14
  9. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/.claude-plugin/plugin.json +2 -2
  10. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/README.md +2 -1
  11. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/hooks/kiln-a-jour.py +5 -1
  12. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/scripts/preparer-worktree.sh +1 -1
  13. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/skills/backlog/SKILL.md +2 -1
  14. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/skills/contribution/SKILL.md +2 -0
  15. kiln_cli-0.3.3/plugins/base/skills/good-first-issues/SKILL.md +92 -0
  16. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/pyproject.toml +1 -1
  17. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/cli.py +43 -1
  18. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/fleet.py +1 -14
  19. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/update.py +74 -0
  20. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/test_cli.py +17 -0
  21. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/test_flotte.py +1 -1
  22. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/test_hook_kiln_a_jour.py +4 -0
  23. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/test_unites.py +55 -1
  24. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/uv.lock +1 -1
  25. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.claude-plugin/marketplace.json +0 -0
  26. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  27. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  28. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/ISSUE_TEMPLATE/idea.yml +0 -0
  29. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/pull_request_template.md +0 -0
  30. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/workflows/charte.yml +0 -0
  31. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/workflows/contrat-api.yml +0 -0
  32. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/workflows/django.yml +0 -0
  33. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/workflows/infra.yml +0 -0
  34. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/workflows/kiln.yml +0 -0
  35. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/workflows/maven.yml +0 -0
  36. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/workflows/mutation.yml +0 -0
  37. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/workflows/pnpm.yml +0 -0
  38. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/workflows/pypi.yml +0 -0
  39. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/workflows/python.yml +0 -0
  40. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/workflows/sbom.yml +0 -0
  41. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/workflows/securite.yml +0 -0
  42. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.github/workflows/vercel.yml +0 -0
  43. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.gitignore +0 -0
  44. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/.python-version +0 -0
  45. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/LICENSE +0 -0
  46. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/SECURITY.md +0 -0
  47. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/actions/charte/action.yml +0 -0
  48. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/actions/services/action.yml +0 -0
  49. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/copier.yml +0 -0
  50. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/docs/assets/kiln-accueil.svg +0 -0
  51. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/docs/assets/social-preview.png +0 -0
  52. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/docs/backlog/README.md +0 -0
  53. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/docs/backlog/rejected.md +0 -0
  54. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/docs/backlog/urgent.md +0 -0
  55. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/docs/inventaire-annski.md +0 -0
  56. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/macros.jinja +0 -0
  57. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/.mcp.json +0 -0
  58. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/hooks/controle-fichier.py +0 -0
  59. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/hooks/garde-branche.py +0 -0
  60. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/hooks/hooks.json +0 -0
  61. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/hooks/protege-fichiers.py +0 -0
  62. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/hooks/relances.py +0 -0
  63. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/hooks/rtk.py +0 -0
  64. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/scripts/statusline.py +0 -0
  65. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/skills/adoption/SKILL.md +0 -0
  66. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/skills/fusion/SKILL.md +0 -0
  67. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/skills/maj-kiln/SKILL.md +0 -0
  68. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/skills/nettoyage/SKILL.md +0 -0
  69. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/skills/relecture/SKILL.md +0 -0
  70. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/skills/report-to-kiln/SKILL.md +0 -0
  71. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/skills/token/SKILL.md +0 -0
  72. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/skills/version/SKILL.md +0 -0
  73. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/base/skills/worktree/SKILL.md +0 -0
  74. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-django/.claude-plugin/plugin.json +0 -0
  75. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-django/.mcp.json +0 -0
  76. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-django/skills/migration/SKILL.md +0 -0
  77. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-django/skills/postgres-lecture/SKILL.md +0 -0
  78. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-django/skills/postgres-lecture/role.sh +0 -0
  79. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-django/skills/regen-api/SKILL.md +0 -0
  80. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/.claude-plugin/plugin.json +0 -0
  81. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/.mcp.json +0 -0
  82. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/scripts/apercu.mjs +0 -0
  83. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/scripts/playwright-mcp.sh +0 -0
  84. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/apercu/SKILL.md +0 -0
  85. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/SKILL.md +0 -0
  86. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/advanced-hooks.md +0 -0
  87. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/advanced-layers.md +0 -0
  88. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/advanced-module-authoring.md +0 -0
  89. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/best-practices-data-fetching.md +0 -0
  90. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/best-practices-ssr.md +0 -0
  91. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/core-cli.md +0 -0
  92. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/core-config.md +0 -0
  93. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/core-data-fetching.md +0 -0
  94. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/core-deployment.md +0 -0
  95. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/core-directory-structure.md +0 -0
  96. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/core-modules.md +0 -0
  97. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/core-routing.md +0 -0
  98. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/features-components-autoimport.md +0 -0
  99. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/features-components.md +0 -0
  100. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/features-composables.md +0 -0
  101. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/features-server.md +0 -0
  102. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/features-state.md +0 -0
  103. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/nuxt/references/rendering-modes.md +0 -0
  104. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/polish/SKILL.md +0 -0
  105. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/SKILL.md +0 -0
  106. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/advanced-environments.md +0 -0
  107. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/advanced-projects.md +0 -0
  108. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/advanced-type-testing.md +0 -0
  109. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/advanced-vi.md +0 -0
  110. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/core-cli.md +0 -0
  111. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/core-config.md +0 -0
  112. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/core-describe.md +0 -0
  113. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/core-expect.md +0 -0
  114. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/core-hooks.md +0 -0
  115. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/core-test-api.md +0 -0
  116. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/features-benchmarking.md +0 -0
  117. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/features-concurrency.md +0 -0
  118. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/features-context.md +0 -0
  119. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/features-coverage.md +0 -0
  120. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/features-filtering.md +0 -0
  121. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/features-mocking.md +0 -0
  122. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/features-reporters.md +0 -0
  123. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/features-snapshots.md +0 -0
  124. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vitest/references/features-test-tags.md +0 -0
  125. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/SKILL.md +0 -0
  126. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/animation-class-based-technique.md +0 -0
  127. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/animation-state-driven-technique.md +0 -0
  128. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/component-async.md +0 -0
  129. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/component-data-flow.md +0 -0
  130. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/component-fallthrough-attrs.md +0 -0
  131. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/component-keep-alive.md +0 -0
  132. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/component-slots.md +0 -0
  133. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/component-suspense.md +0 -0
  134. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/component-teleport.md +0 -0
  135. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/component-transition-group.md +0 -0
  136. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/component-transition.md +0 -0
  137. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/composables.md +0 -0
  138. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/directives.md +0 -0
  139. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/perf-avoid-component-abstraction-in-lists.md +0 -0
  140. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/perf-v-once-v-memo-directives.md +0 -0
  141. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/perf-virtualize-large-lists.md +0 -0
  142. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/plugins.md +0 -0
  143. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/reactivity.md +0 -0
  144. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/render-functions.md +0 -0
  145. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/sfc.md +0 -0
  146. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/state-management.md +0 -0
  147. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-best-practices/references/updated-hook-performance.md +0 -0
  148. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-testing-best-practices/SKILL.md +0 -0
  149. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/async-component-testing.md +0 -0
  150. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/teleport-testing-complexity.md +0 -0
  151. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-async-await-flushpromises.md +0 -0
  152. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-browser-vs-node-runners.md +0 -0
  153. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-component-blackbox-approach.md +0 -0
  154. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-composables-helper-wrapper.md +0 -0
  155. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-e2e-playwright-recommended.md +0 -0
  156. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-no-snapshot-only.md +0 -0
  157. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-suspense-async-components.md +0 -0
  158. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/pile-nuxt/skills/vue-testing-best-practices/reference/testing-vitest-recommended-for-vue.md +0 -0
  159. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/serena/.claude-plugin/plugin.json +0 -0
  160. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/serena/.mcp.json +0 -0
  161. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/serena/scripts/lecture.yml +0 -0
  162. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/serena/scripts/serena.sh +0 -0
  163. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/stripe/.claude-plugin/plugin.json +0 -0
  164. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/stripe/.mcp.json +0 -0
  165. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/stripe/scripts/stripe-test.sh +0 -0
  166. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/vps-podman/.claude-plugin/plugin.json +0 -0
  167. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/vps-podman/skills/deployer/SKILL.md +0 -0
  168. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/vps-podman/skills/prod-dump/SKILL.md +0 -0
  169. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/plugins/vps-podman/skills/prod-logs/SKILL.md +0 -0
  170. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/__init__.py +0 -0
  171. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/adopt.py +0 -0
  172. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/backlog.py +0 -0
  173. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/banner.py +0 -0
  174. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/charte/__init__.py +0 -0
  175. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/charte/charte.py +0 -0
  176. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/charte/cliquets.py +0 -0
  177. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/charte/interdictions.py +0 -0
  178. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/charte/moteur.py +0 -0
  179. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/charte/outils_python.py +0 -0
  180. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/charte/waivers.py +0 -0
  181. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/check.py +0 -0
  182. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/ci/__init__.py +0 -0
  183. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/ci/execution.py +0 -0
  184. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/ci/jobs.py +0 -0
  185. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/ci/runner.py +0 -0
  186. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/ci/services.py +0 -0
  187. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/ci/verdict.py +0 -0
  188. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/ci/workflow.py +0 -0
  189. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/config.py +0 -0
  190. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/contract.py +0 -0
  191. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/deps.py +0 -0
  192. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/dev.py +0 -0
  193. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/doctor.py +0 -0
  194. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/frozen.py +0 -0
  195. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/github.py +0 -0
  196. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/install.py +0 -0
  197. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/new.py +0 -0
  198. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/poste.py +0 -0
  199. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/py.typed +0 -0
  200. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/release.py +0 -0
  201. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/rules.py +0 -0
  202. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/settings.py +0 -0
  203. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/shell.py +0 -0
  204. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/stack.py +0 -0
  205. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/statusline.py +0 -0
  206. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/template.py +0 -0
  207. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/ui.py +0 -0
  208. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/versions.py +0 -0
  209. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/src/kiln/waive.py +0 -0
  210. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/.claude/settings.json.jinja +0 -0
  211. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/.editorconfig +0 -0
  212. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/.gitattributes.jinja +0 -0
  213. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/.github/CODEOWNERS.jinja +0 -0
  214. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/.github/pull_request_template.md +0 -0
  215. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/.github/workflows/ci.yml.jinja +0 -0
  216. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/.gitignore.jinja +0 -0
  217. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/.pre-commit-config.yaml.jinja +0 -0
  218. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/.vscode/extensions.json.jinja +0 -0
  219. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/.vscode/settings.json.jinja +0 -0
  220. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/CLAUDE.md.jinja +0 -0
  221. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/README.md.jinja +0 -0
  222. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/charte.toml.jinja +0 -0
  223. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/docs/backlog/README.md.jinja +0 -0
  224. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/docs/backlog/backlog.md.jinja +0 -0
  225. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/docs/backlog/rejected.md.jinja +0 -0
  226. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/docs/backlog/urgent.md +0 -0
  227. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/docs/{% if deploiement == /"vps/" %}exploitation{% endif %}/production.md.jinja" +0 -0
  228. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"cli/" %}backend{% endif %}/.python-version" +0 -0
  229. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"cli/" %}backend{% endif %}/CLAUDE.md.jinja" +0 -0
  230. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"cli/" %}backend{% endif %}/pyproject.toml.jinja" +0 -0
  231. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"cli/" %}backend{% endif %}/tests/__init__.py" +0 -0
  232. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"cli/" %}backend{% endif %}/tests/test_cli.py.jinja" +0 -0
  233. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/__init__.py.jinja" +0 -0
  234. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/__main__.py.jinja" +0 -0
  235. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/cli.py.jinja" +0 -0
  236. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/greeting.py" +0 -0
  237. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/py.typed" +0 -0
  238. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/.python-version" +0 -0
  239. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/CLAUDE.md.jinja" +0 -0
  240. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/data/README.md" +0 -0
  241. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/data/sample/measurements.csv" +0 -0
  242. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/notebooks/exploration.py" +0 -0
  243. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/__init__.py" +0 -0
  244. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/figures.py" +0 -0
  245. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/py.typed" +0 -0
  246. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/sources.py" +0 -0
  247. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/transforms.py" +0 -0
  248. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/pyproject.toml.jinja" +0 -0
  249. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/tests/__init__.py" +0 -0
  250. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/tests/test_figures.py" +0 -0
  251. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/tests/test_sources.py" +0 -0
  252. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/tests/test_transforms.py" +0 -0
  253. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"data/" %}backend{% endif %}/{% if podman %}Containerfile{% endif %}" +0 -0
  254. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/.env.example.jinja" +0 -0
  255. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/.python-version" +0 -0
  256. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/CLAUDE.md.jinja" +0 -0
  257. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/config/__init__.py" +0 -0
  258. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/config/api.py.jinja" +0 -0
  259. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/config/asgi.py" +0 -0
  260. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/config/health.py" +0 -0
  261. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/config/management/__init__.py" +0 -0
  262. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/config/management/commands/__init__.py" +0 -0
  263. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/config/management/commands/export_openapi.py" +0 -0
  264. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/config/middleware.py" +0 -0
  265. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/config/settings.py.jinja" +0 -0
  266. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/config/urls.py" +0 -0
  267. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/config/wsgi.py" +0 -0
  268. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/manage.py" +0 -0
  269. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/pyproject.toml.jinja" +0 -0
  270. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/tests/__init__.py" +0 -0
  271. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/tests/test_health.py" +0 -0
  272. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/tests/test_openapi.py" +0 -0
  273. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/tests/test_security_headers.py" +0 -0
  274. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"django/" %}backend{% endif %}/{% if podman %}Containerfile{% endif %}" +0 -0
  275. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"fastapi/" %}backend{% endif %}/.env.example.jinja" +0 -0
  276. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"fastapi/" %}backend{% endif %}/.python-version" +0 -0
  277. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"fastapi/" %}backend{% endif %}/CLAUDE.md.jinja" +0 -0
  278. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/__init__.py" +0 -0
  279. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/health.py" +0 -0
  280. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/main.py.jinja" +0 -0
  281. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/settings.py" +0 -0
  282. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"fastapi/" %}backend{% endif %}/pyproject.toml.jinja" +0 -0
  283. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"fastapi/" %}backend{% endif %}/tests/__init__.py" +0 -0
  284. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"fastapi/" %}backend{% endif %}/tests/test_health.py" +0 -0
  285. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"fastapi/" %}backend{% endif %}/{% if podman %}Containerfile{% endif %}" +0 -0
  286. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"java/" %}backend{% endif %}/.mvn/maven.config" +0 -0
  287. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"java/" %}backend{% endif %}/.mvn/wrapper/maven-wrapper.properties" +0 -0
  288. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"java/" %}backend{% endif %}/CLAUDE.md.jinja" +0 -0
  289. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"java/" %}backend{% endif %}/mvnw" +0 -0
  290. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"java/" %}backend{% endif %}/mvnw.cmd" +0 -0
  291. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"java/" %}backend{% endif %}/pom.xml.jinja" +0 -0
  292. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"java/" %}backend{% endif %}/src/main/java/fr/{{ nom | replace('-', '') }}/Main.java.jinja" +0 -0
  293. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"java/" %}backend{% endif %}/src/main/java/fr/{{ nom | replace('-', '') }}/greeting/GreetingService.java.jinja" +0 -0
  294. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"java/" %}backend{% endif %}/src/test/java/fr/{{ nom | replace('-', '') }}/MainTest.java.jinja" +0 -0
  295. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if backend == /"java/" %}backend{% endif %}/src/test/java/fr/{{ nom | replace('-', '') }}/greeting/GreetingServiceTest.java.jinja" +0 -0
  296. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/Caddyfile.jinja" +0 -0
  297. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/backup.sh.jinja" +0 -0
  298. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/compose.yaml.jinja" +0 -0
  299. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/deploy-remote.sh.jinja" +0 -0
  300. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/heal.sh.jinja" +0 -0
  301. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/project.json.jinja" +0 -0
  302. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/restore-test.sh.jinja" +0 -0
  303. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/setup-deploy-user.sh.jinja" +0 -0
  304. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-backup.service.jinja" +0 -0
  305. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-backup.timer.jinja" +0 -0
  306. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-heal.service.jinja" +0 -0
  307. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-heal.timer.jinja" +0 -0
  308. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-restore-test.service.jinja" +0 -0
  309. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-restore-test.timer.jinja" +0 -0
  310. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/lib/ci-verte.sh" +0 -0
  311. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/lib/{% if deploiement == /"vps/" %}cible-vps.sh{% endif %}" +0 -0
  312. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/lib/{% if deploiement == /"vps/" %}fumee.sh{% endif %}" +0 -0
  313. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/{% if deploiement == /"vps/" %}deploy-backend.sh{% endif %}.jinja" +0 -0
  314. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/{% if deploiement == /"vps/" %}smoke-test.sh{% endif %}.jinja" +0 -0
  315. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if deploiement == /"vps/" or front_deploiement == /"vercel/" %}scripts{% endif %}/ops/{% if front_deploiement == /"vercel/" %}deploy-frontend.sh{% endif %}" +0 -0
  316. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"astro/" %}frontend{% endif %}/.gitignore" +0 -0
  317. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"astro/" %}frontend{% endif %}/.nvmrc" +0 -0
  318. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"astro/" %}frontend{% endif %}/AGENTS.md" +0 -0
  319. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"astro/" %}frontend{% endif %}/CLAUDE.md.jinja" +0 -0
  320. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"astro/" %}frontend{% endif %}/astro.config.mjs.jinja" +0 -0
  321. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"astro/" %}frontend{% endif %}/package.json.jinja" +0 -0
  322. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"astro/" %}frontend{% endif %}/pnpm-workspace.yaml" +0 -0
  323. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"astro/" %}frontend{% endif %}/public/favicon.ico" +0 -0
  324. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"astro/" %}frontend{% endif %}/public/favicon.svg" +0 -0
  325. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/constants.ts.jinja" +0 -0
  326. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/layouts/BaseLayout.astro" +0 -0
  327. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/pages/index.astro.jinja" +0 -0
  328. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/styles/global.css" +0 -0
  329. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"astro/" %}frontend{% endif %}/tsconfig.json" +0 -0
  330. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"astro/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}" +0 -0
  331. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"dash/" %}frontend{% endif %}/.python-version" +0 -0
  332. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"dash/" %}frontend{% endif %}/CLAUDE.md.jinja" +0 -0
  333. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"dash/" %}frontend{% endif %}/app.py" +0 -0
  334. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/__init__.py" +0 -0
  335. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/constants.py.jinja" +0 -0
  336. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/layout.py.jinja" +0 -0
  337. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/{% if backend == 'data' %}callbacks.py{% endif %}" +0 -0
  338. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/{% if backend in ['django', 'fastapi'] %}api.py{% endif %}" +0 -0
  339. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"dash/" %}frontend{% endif %}/pyproject.toml.jinja" +0 -0
  340. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"dash/" %}frontend{% endif %}/tests/__init__.py" +0 -0
  341. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"dash/" %}frontend{% endif %}/tests/test_layout.py.jinja" +0 -0
  342. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"dash/" %}frontend{% endif %}/tests/{% if backend == 'data' %}test_callbacks.py{% endif %}" +0 -0
  343. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"dash/" %}frontend{% endif %}/tests/{% if backend in ['django', 'fastapi'] %}test_api.py{% endif %}" +0 -0
  344. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"dash/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +0 -0
  345. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/.gitignore" +0 -0
  346. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/.nvmrc" +0 -0
  347. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/AGENTS.md" +0 -0
  348. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/CLAUDE.md.jinja" +0 -0
  349. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/app/favicon.ico" +0 -0
  350. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/app/globals.css" +0 -0
  351. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/app/layout.tsx" +0 -0
  352. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/app/page.tsx.jinja" +0 -0
  353. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/components/{% if backend in ['django', 'fastapi'] %}HealthStatus.tsx{% endif %}" +0 -0
  354. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/eslint.config.mjs" +0 -0
  355. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/lib/constants.ts.jinja" +0 -0
  356. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/lib/{% if backend in ['django', 'fastapi'] %}api.ts{% endif %}" +0 -0
  357. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/next.config.ts.jinja" +0 -0
  358. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/package.json.jinja" +0 -0
  359. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/pnpm-workspace.yaml" +0 -0
  360. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/tsconfig.json" +0 -0
  361. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"next/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +0 -0
  362. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/.gitignore" +0 -0
  363. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/.nvmrc" +0 -0
  364. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/CLAUDE.md.jinja" +0 -0
  365. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/app.vue.jinja" +0 -0
  366. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/assets/css/main.css" +0 -0
  367. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/assets/css/tokens.css" +0 -0
  368. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/components/{% if backend in ['django', 'fastapi'] %}HealthStatus.vue{% endif %}" +0 -0
  369. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/composables/{% if backend == 'django' %}useApi.ts{% endif %}" +0 -0
  370. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/composables/{% if backend in ['django', 'fastapi'] %}useHealth.ts{% endif %}.jinja" +0 -0
  371. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/eslint.config.mjs" +0 -0
  372. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/nuxt.config.ts.jinja" +0 -0
  373. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/package.json.jinja" +0 -0
  374. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/pnpm-workspace.yaml" +0 -0
  375. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/public/favicon.ico" +0 -0
  376. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/public/robots.txt" +0 -0
  377. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/tsconfig.json" +0 -0
  378. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +0 -0
  379. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/.python-version" +0 -0
  380. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/.streamlit/config.toml" +0 -0
  381. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/CLAUDE.md.jinja" +0 -0
  382. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/app.py" +0 -0
  383. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/dashboard/__init__.py" +0 -0
  384. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/dashboard/constants.py.jinja" +0 -0
  385. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/dashboard/home.py.jinja" +0 -0
  386. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/dashboard/{% if backend in ['django', 'fastapi'] %}api.py{% endif %}" +0 -0
  387. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/pyproject.toml.jinja" +0 -0
  388. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/tests/__init__.py" +0 -0
  389. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/tests/test_app.py.jinja" +0 -0
  390. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/tests/{% if backend in ['django', 'fastapi'] %}test_api.py{% endif %}" +0 -0
  391. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +0 -0
  392. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if podman %}.containerignore{% endif %} +0 -0
  393. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{% if podman %}compose.yaml{% endif %}.jinja +0 -0
  394. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/template/{{_copier_conf.answers_file}}.jinja +0 -0
  395. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/conftest.py +0 -0
  396. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/test_adopt.py +0 -0
  397. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/test_backlog.py +0 -0
  398. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/test_ci.py +0 -0
  399. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/test_deploiement.py +0 -0
  400. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/test_garde_branche.py +0 -0
  401. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/test_modele.py +0 -0
  402. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/test_plugins.py +0 -0
  403. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/test_relances.py +0 -0
  404. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/test_statusline.py +0 -0
  405. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/test_waive.py +0 -0
  406. {kiln_cli-0.3.2 → kiln_cli-0.3.3}/tests/test_waivers.py +0 -0
@@ -0,0 +1,31 @@
1
+ # Contrôles de kiln rejoués par git, comme dans les repos générés.
2
+ #
3
+ # Installation, une fois, à la racine : kiln install (ou : uvx pre-commit install)
4
+ # Le crochet vaut pour l'arbre principal et tous les worktrees. Tout rejouer :
5
+ # pre-commit run --all-files --hook-stage pre-push
6
+ # Le typage, trop lent pour chaque commit, se joue avant chaque push : `develop` ne reçoit la
7
+ # CI complète qu'au passage d'une version (skill `base:version`).
8
+ default_install_hook_types: [pre-commit, pre-push]
9
+ default_stages: [pre-commit]
10
+ repos:
11
+ - repo: local
12
+ hooks:
13
+ - id: ruff-check
14
+ name: ruff check
15
+ entry: uv run ruff check --fix --force-exclude
16
+ language: system
17
+ types: [python]
18
+
19
+ - id: ruff-format
20
+ name: ruff format
21
+ entry: uv run ruff format --force-exclude
22
+ language: system
23
+ types: [python]
24
+
25
+ - id: typage
26
+ name: typage mypy (avant push)
27
+ entry: uv run mypy src tests
28
+ language: system
29
+ pass_filenames: false
30
+ always_run: true
31
+ stages: [pre-push]
@@ -5,6 +5,11 @@ 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.3 — 2026-10-16
9
+ - `kiln completion bash` : script de complétion tiré des commandes et options de kiln, à activer par `eval "$(kiln completion bash)"` dans `~/.bashrc` (#41, merci @HarshRajSinghania).
10
+ - Skill `good-first-issues` : garde ouvertes sur GitHub quelques issues pour débutants, tirées du backlog et réservées aux contributeurs extérieurs.
11
+ - Correctifs : `kiln update` ne s'arrête plus sur un conflit dans `ci.yml` après la promotion d'une version (seul le `@<tag>` des workflows de kiln différait) ; `base:worktree` ne bute plus sur un repo sans fichier `.env` ; la mise à jour d'un kiln installé depuis un dossier retire aussi l'ancien outil `kiln`.
12
+
8
13
  ## v0.3.2 — 2026-10-16
9
14
  - `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
15
  - 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.
@@ -27,7 +27,8 @@ un dossier ou un module.
27
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/` (dont `relances.py`, politique commune des questions de kiln) ; `scripts/statusline.py`),
30
+ fusion créditée), `good-first-issues` (quelques issues pour débutants tirées du backlog,
31
+ réservées aux contributeurs extérieurs) ; `hooks/` (dont `relances.py`, politique commune des questions de kiln) ; `scripts/statusline.py`),
31
32
  `pile-django/`, `pile-nuxt/`, `vps-podman/`, `stripe/`, `serena/`.
32
33
  - `.github/workflows/` : workflows réutilisables appelés par les repos générés, plus ceux de
33
34
  kiln (`kiln.yml` contrôles, `pypi.yml` publication du paquet `kiln-cli` au tag promu) ;
@@ -98,5 +99,6 @@ l'outil), `release.py` (`kiln version`).
98
99
 
99
100
  `uv run pytest -q` (réparti sur tous les cœurs par pytest-xdist : une vingtaine de secondes ;
100
101
  `-n 0` pour un seul processus, au débogage), `uv run ruff check`
101
- et `uv run ruff format --check`. Un hook ou un script de plugin est lu en direct par Claude Code
102
+ et `uv run ruff format --check`. Le crochet pre-commit de kiln (`.pre-commit-config.yaml`, posé par
103
+ `kiln install`) lance ruff à chaque commit et mypy avant chaque push. Un hook ou un script de plugin est lu en direct par Claude Code
102
104
  (catalogue déclaré en dossier local) : il agit dès la fusion dans `develop`.
@@ -33,6 +33,7 @@ You need [uv](https://docs.astral.sh/uv/) and git. Python 3.14 is downloaded by
33
33
  git clone https://github.com/antoine-tena/kiln
34
34
  cd kiln
35
35
  uv sync
36
+ uvx pre-commit install # ruff before each commit, mypy before each push
36
37
  uv run kiln # the CLI, straight from your checkout
37
38
  KILN_TEMPLATE=$PWD uv run kiln new /tmp/demo --no-github # try your template changes
38
39
  ```
@@ -42,7 +43,7 @@ Checks (the same ones CI runs):
42
43
  ```sh
43
44
  uv run ruff check . && uv run ruff format --check src tests
44
45
  uv run mypy src tests
45
- uv run pytest -q # renders every stack combination, takes ~2 minutes
46
+ uv run pytest -q # renders every stack combination, ~20 s on all cores
46
47
  ```
47
48
 
48
49
  ## Where things live
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: kiln-cli
3
- Version: 0.3.2
3
+ Version: 0.3.3
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
@@ -78,6 +78,7 @@ keeps every repo you own current:
78
78
  # macOS, Linux, and Windows through WSL. The PyPI package is kiln-cli, the command is kiln.
79
79
  uv tool install kiln-cli
80
80
  # …or try it without installing anything: uvx kiln-cli new my-app
81
+ # Tab completion in bash: add eval "$(kiln completion bash)" to ~/.bashrc
81
82
 
82
83
  # 2. Create a project — answer a few questions, or pass them as flags
83
84
  kiln new my-app
@@ -168,6 +169,7 @@ make the opinions yours.
168
169
  | `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. |
169
170
  | `kiln ci [commit]` | Replay the repo's GitHub CI locally against throwaway PostgreSQL/Redis, and push the verdict as a git note. |
170
171
  | `kiln contrat` | Django + Nuxt: export `openapi.json` and regenerate the front's API types. |
172
+ | `kiln completion bash` | Print a bash completion script built from the parser; enable it with `eval "$(kiln completion bash)"` in `~/.bashrc`. |
171
173
  | `charte` | Check the repo against its `charte.toml` (`--detail`, `types`, `couverture`). |
172
174
 
173
175
  Full reference (in French): [README.fr.md](README.fr.md#commandes).
@@ -198,7 +200,7 @@ claude plugin install base@kiln
198
200
 
199
201
  | Plugin | What's inside |
200
202
  |---|---|
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). |
203
+ | `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), `good-first-issues` (a small, steady stock of `good first issue` issues drawn from your backlog and reserved for newcomers, refilled as they get merged) 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). |
202
204
  | `pile-django` | Migrations, API regeneration, read-only PostgreSQL. |
203
205
  | `pile-nuxt` | Nuxt / Vue / Vitest skills, UI polish, screenshots on three phones and a desktop (Playwright). |
204
206
  | `vps-podman` | Deploy, production logs, production dumps. |
@@ -32,7 +32,7 @@ Les plugins Claude Code vivent dans [`plugins/`](plugins/), catalogue `kiln`
32
32
  - `base`, pour tous les projets, installé au niveau utilisateur : skills `worktree`, `fusion`,
33
33
  `version` (release/vN, contrôle complet, annonce, main tagué, déploiement), `nettoyage`,
34
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
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), `good-first-issues` (un petit stock d'issues `good first issue` tiré du backlog et réservé aux contributeurs extérieurs, regarni à chaque fusion) ; hooks garde de branche (et refus d'un message de commit signé Claude), fichiers protégés, contrôle du fichier
36
36
  modifié, questions à l'ouverture de session : dans un repo kiln, sa mise à jour (l'outil kiln s'il
37
37
  est en retard sur GitHub, puis le repo par `kiln update` ; un « non » repousse la question de
38
38
  5, 10, 30 puis 50 sessions, après quoi désinstaller kiln ou délier le repo est proposé) ; dans
@@ -80,6 +80,7 @@ l'installer). Pour suivre les candidates (canal `interne`) ou un commit précis
80
80
  `uv tool install git+https://github.com/antoine-tena/kiln@<tag>`. macOS, Linux, et Windows par
81
81
  WSL. Quand une version sort, le hook de début de session propose de mettre à jour l'outil, puis
82
82
  chaque repo ; à la main : `uv tool upgrade kiln-cli`, puis `kiln update` dans le repo.
83
+ Complétion dans bash : `eval "$(kiln completion bash)"` dans `~/.bashrc`.
83
84
  Python 3.14 est requis ; uv le télécharge au besoin. Au premier `kiln install`, kiln demande le
84
85
  système du poste (Linux, WSL ou macOS) et le garde dans `~/.config/kiln/config.toml`, avec
85
86
  `proprietaire` et `equipe` par défaut si on les y ajoute.
@@ -100,6 +101,7 @@ système du poste (Linux, WSL ou macOS) et le garde dans `~/.config/kiln/config.
100
101
  | `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. |
101
102
  | `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. |
102
103
  | `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. |
104
+ | `kiln completion bash` | Script de complétion bash tiré des commandes et options de kiln ; l'activer par `eval "$(kiln completion bash)"` dans `~/.bashrc`. |
103
105
  | `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. |
104
106
  | `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. |
105
107
  | `charte` | Vérifie le repo contre son `charte.toml` (`charte --detail`, `charte types`, `charte couverture`). |
@@ -54,6 +54,7 @@ keeps every repo you own current:
54
54
  # macOS, Linux, and Windows through WSL. The PyPI package is kiln-cli, the command is kiln.
55
55
  uv tool install kiln-cli
56
56
  # …or try it without installing anything: uvx kiln-cli new my-app
57
+ # Tab completion in bash: add eval "$(kiln completion bash)" to ~/.bashrc
57
58
 
58
59
  # 2. Create a project — answer a few questions, or pass them as flags
59
60
  kiln new my-app
@@ -144,6 +145,7 @@ make the opinions yours.
144
145
  | `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. |
145
146
  | `kiln ci [commit]` | Replay the repo's GitHub CI locally against throwaway PostgreSQL/Redis, and push the verdict as a git note. |
146
147
  | `kiln contrat` | Django + Nuxt: export `openapi.json` and regenerate the front's API types. |
148
+ | `kiln completion bash` | Print a bash completion script built from the parser; enable it with `eval "$(kiln completion bash)"` in `~/.bashrc`. |
147
149
  | `charte` | Check the repo against its `charte.toml` (`--detail`, `types`, `couverture`). |
148
150
 
149
151
  Full reference (in French): [README.fr.md](README.fr.md#commandes).
@@ -174,7 +176,7 @@ claude plugin install base@kiln
174
176
 
175
177
  | Plugin | What's inside |
176
178
  |---|---|
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). |
179
+ | `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), `good-first-issues` (a small, steady stock of `good first issue` issues drawn from your backlog and reserved for newcomers, refilled as they get merged) 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). |
178
180
  | `pile-django` | Migrations, API regeneration, read-only PostgreSQL. |
179
181
  | `pile-nuxt` | Nuxt / Vue / Vitest skills, UI polish, screenshots on three phones and a desktop (Playwright). |
180
182
  | `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-18.**
25
+ before 16 October 2026 were `AF-NN`, same number). **Next free: T-22.**
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).
@@ -36,6 +36,8 @@ North star: **kiln v0.3.0 public, adopted by every generated repo**.
36
36
  log: `- **YYYY-MM-DD** · T-NN · Title — what was done (branch) · opened YYYY-MM-DD`.
37
37
  - **Locations quoted are hints, not addresses.**
38
38
  - Overview: `grep -E '^(## |### T-|- \*\*Status)' docs/backlog/backlog.md`.
39
+ - **Good first issues**: keep 3 open on GitHub, reserved for outside contributors (skill
40
+ `base:good-first-issues`); their tickets have **Owner**: `contributor — #NN`.
39
41
 
40
42
  ---
41
43
 
@@ -43,20 +45,21 @@ North star: **kiln v0.3.0 public, adopted by every generated repo**.
43
45
 
44
46
  ### T-14 · Promote v0.3.1, the first release on PyPI
45
47
  - **Type**: task
46
- - **Status**: blocked — waiting for `v0.3.2-rc.1`
48
+ - **Status**: blocked — waiting for antoine (delete the old token)
47
49
  - **Opened**: 2026-10-16
48
- - **Effort**: S · **Owner**: Claude · **Due**: —
50
+ - **Effort**: XS · **Owner**: antoine, then Claude · **Due**: —
49
51
  - **Origin**: promotion of v0.3.0, 16 October 2026
50
52
 
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.
53
+ `v0.3.1` is promoted and `kiln-cli 0.3.1` is on PyPI (16 October 2026); `v0.3.2-rc.2` is the
54
+ candidate followed by annway, sweep and vision.
55
+ - [x] Cut `v0.3.2-rc.1`, then `-rc.2` (tests independent of the machine's git config); the
56
+ `CHANGELOG.md` entry credits #39 (@SakarPaisen). `kiln update --all` done.
57
+ - [x] Promote `v0.3.1`, `pypi` run green, `uvx --from kiln-cli==0.3.1 kiln` works on an empty
58
+ uv cache.
59
+ - [x] README (English and French): `uv tool install kiln-cli` as the main install.
60
+ - [x] Token scoped to `kiln-cli` in `.pypi/token`, `PYPI_TOKEN` secret updated (16 October
61
+ 2026); it is first used by the promotion of `v0.3.2`.
62
+ - [ ] antoine deletes the old account-wide token on https://pypi.org/manage/account/token/
60
63
 
61
64
  ## 🟠 Important
62
65
 
@@ -69,7 +72,14 @@ North star: **kiln v0.3.0 public, adopted by every generated repo**.
69
72
  16 October 2026
70
73
 
71
74
  antoine's goal: lots of stars. Directories take projects that already have users: the launch
72
- comes first. Posts are made by antoine, never without them; Claude drafts the texts.
75
+ comes first. Hacker News and Reddit: posted by antoine (no API for HN, Reddit vets new apps),
76
+ Claude drafts the texts. Elsewhere, Claude posts directly on antoine's accounts, with no review
77
+ (antoine's call, 16 October 2026), saying the text is written with Claude where the platform
78
+ asks, then gives the links.
79
+ - [x] Accounts with an API key, ready (16 October 2026): dev.to (`.devto/`, user
80
+ `antoine-tena`) and Bluesky (`.bluesky/`, `antoine-tena.bsky.social`, app password).
81
+ - [ ] On launch day: article on dev.to, post on Bluesky (Mastodon dropped, antoine's call,
82
+ 16 October 2026).
73
83
  - [ ] A demo of `kiln new` at the top of the README (GIF or asciinema, issue #38).
74
84
  - [ ] Show HN (https://news.ycombinator.com/submit), suggested title "Show HN: Kiln – make
75
85
  Claude Code build production-grade repos, and keep them that way".
@@ -207,12 +217,16 @@ takes the nested worktrees as gitlinks; `.claude/worktrees/` is only ignored in
207
217
  - **Effort**: S · **Owner**: Claude · **Due**: —
208
218
  - **Origin**: interface redesign, 15 October 2026
209
219
  - [ ] `kiln check`: the step title and the `✓` line say the same thing (one command per step).
210
- - [ ] Bash completion (`kiln <Tab>`).
220
+ - Bash completion moved to T-20.
211
221
 
212
222
  ---
213
223
 
214
224
  ## ✅ Done
215
225
 
226
+ - **2026-10-16** · T-21 · Credit #41 in the notes of the next release — line in the `v0.3.3` entry of `CHANGELOG.md` (release/v0.3.3) · opened 2026-10-16
227
+ - **2026-10-16** · T-20 · Bash completion (`kiln completion bash`) — PR #41 by @HarshRajSinghania, fixed up and merged, issue #40 closed · opened 2026-10-16
228
+ - **2026-10-16** · T-18 · Promoting a release makes `kiln update` conflict on `ci.yml` — cause confirmed (Copier's old render takes the promoted tag from `git describe`); the three-way merge is redone with the project's tag, reproduced in a test (fix/conflit-promotion) · opened 2026-10-16
229
+ - **2026-10-16** · T-19 · kiln has no pre-push hook — `.pre-commit-config.yaml` (ruff at commit, mypy before push), set by `kiln install` (chore/pre-push-kiln) · opened 2026-10-16
216
230
  - **2026-10-16** · T-16 · A failed `kiln update --all` leaves a worktree that blocks the next
217
231
  run — a worktree with no change and no commit of its own is removed after the failure and
218
232
  before the next run; one with work in it is kept and named (`fix/update-reseau`) · opened 2026-10-16
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "base",
3
- "version": "0.11.0",
4
- "description": "Pour tous les projets : worktrees, fusion, version, nettoyage, mise à jour de kiln, défauts remontés à kiln, PR de contributeurs, jetons de service, garde de branche, modèle kiln à jour, fichiers protégés, context7",
3
+ "version": "0.12.0",
4
+ "description": "Pour tous les projets : worktrees, fusion, version, nettoyage, mise à jour de kiln, défauts remontés à kiln, PR de contributeurs, issues pour débutants, jetons de service, garde de branche, modèle kiln à jour, fichiers protégés, context7",
5
5
  "author": {
6
6
  "name": "antoine-tena"
7
7
  }
@@ -4,7 +4,8 @@ Vu depuis un repo par le lien `.claude/kiln`, créé à l'ouverture de chaque se
4
4
  git) : c'est le plugin tel qu'il tourne sur ce poste.
5
5
 
6
6
  - `skills/` : les skills `/base:…` (`worktree`, `fusion`, `version`, `nettoyage`, `backlog`,
7
- `maj-kiln`, `report-to-kiln`, `token`, `contribution`).
7
+ `maj-kiln`, `report-to-kiln`, `token`, `contribution`,
8
+ `good-first-issues`).
8
9
  - `hooks/` : les hooks (`hooks.json` dit quand chacun se déclenche).
9
10
  - `scripts/` : la status line.
10
11
 
@@ -188,7 +188,11 @@ def tool_update_command(install: tuple[str, str] | None, tag: str) -> str:
188
188
  return f'{legacy}uv tool install --force "{PYPI_NAME}=={version}" && {plugins}'
189
189
  if install is None or install[0] in ("git", "pypi"):
190
190
  return f'{legacy}uv tool install --force "git+{KILN_GIT_URL}@{tag}" && {plugins}'
191
- return f'git -C "{install[1]}" pull --ff-only && uv tool install --reinstall "{install[1]}"'
191
+ # L'ancien outil retiré après le pull : un pull refusé ne laisse pas le poste sans kiln.
192
+ return (
193
+ f'git -C "{install[1]}" pull --ff-only && {legacy}'
194
+ f'uv tool install --reinstall "{install[1]}"'
195
+ )
192
196
 
193
197
 
194
198
  # --- Repo : de quelle version du modèle part-il ? ---
@@ -9,7 +9,7 @@ main_tree="$(dirname "$(git -C "$worktree" rev-parse --path-format=absolute --gi
9
9
 
10
10
  # Fichiers .env* ignorés de l'arbre principal (hors exemples et node_modules), même chemin relatif.
11
11
  git -C "$main_tree" ls-files --others --ignored --exclude-standard -- '*.env' '*.env.*' '.env' '.env.*' \
12
- | grep -vE '(^|/)node_modules/|\.(example|sample)$|^\.claude/worktrees/' \
12
+ | { grep -vE '(^|/)node_modules/|\.(example|sample)$|^\.claude/worktrees/' || true; } \
13
13
  | while read -r f; do
14
14
  mkdir -p "$worktree/$(dirname "$f")"
15
15
  cp -p "$main_tree/$f" "$worktree/$f"
@@ -25,7 +25,8 @@ everything in it is old: check it against the current code before acting. Never
25
25
  archived report.
26
26
 
27
27
  **No argument**: propose the next 3 tickets in section order (critical first), following the
28
- north star in the header and skipping `blocked` tickets; for each, the ID, one sentence, the
28
+ north star in the header and skipping `blocked` tickets and those reserved for outside
29
+ contributors (**Owner**: `contributor — #NN`, skill `base:good-first-issues`); for each, the ID, one sentence, the
29
30
  effort, and the owner. List separately the blocked tickets waiting for the user themselves.
30
31
  Quickly check in the code that the ticket is not already done (the locations quoted are hints,
31
32
  often stale).
@@ -169,6 +169,8 @@ branch (`develop` if it exists, else the default branch; retarget with
169
169
  (`base:version`), note it in the backlog (`base:backlog`) so it is not forgotten.
170
170
  - A first contribution that went well: suggest a next one if an issue labelled
171
171
  `good first issue` fits, in one line, without insisting.
172
+ - The PR closed a `good first issue`: close its ticket in the backlog, crediting them, and
173
+ offer to open the next one (`base:good-first-issues`).
172
174
  - If the user wants to be quick next time, say what would have helped (a PR template line, a
173
175
  rule in `CONTRIBUTING.md`) and offer to add it.
174
176
 
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: good-first-issues
3
+ description: Keep a small, steady stock of `good first issue` issues open on GitHub, drawn from the backlog and reserved for outside contributors, so a newcomer who wants to help always finds a task ready; nothing is posted without the user's yes. Use when the user asks for good first issues, wants to attract contributors, or when base:contribution has just merged a PR that closed one.
4
+ argument-hint: "[target number | off]"
5
+ ---
6
+
7
+ A good first issue does not bring contributors by itself; it is the open door for someone who
8
+ already wants to help. A few that are clear and alive beat many that rot: the target is small
9
+ (3 by default, never more than 5), and an issue nobody took in three months is better closed
10
+ than left as a sign of a project nobody follows.
11
+
12
+ ## The setting
13
+
14
+ It lives in the "How to use" section of `docs/backlog/backlog.md`, one line:
15
+
16
+ - **Good first issues**: keep 3 open on GitHub, reserved for outside contributors (skill
17
+ `base:good-first-issues`); their tickets have **Owner**: `contributor — #NN`.
18
+
19
+ - No line: the repo does not do this. Say so and offer to start (`$ARGUMENTS` a number, or the
20
+ user's yes to 3); the line goes in on the work branch with the first issues.
21
+ - `$ARGUMENTS` a number: change the target in the line. `off`: remove the line; the open issues
22
+ stay, their tickets go back to `**Owner**: Claude` only if the user says so.
23
+ - A repo without `docs/backlog/backlog.md`: skill `base:backlog` first.
24
+
25
+ ## 1. Count what is open
26
+
27
+ gh issue list --label "good first issue" --state open --json number,title,assignees,createdAt,updatedAt,comments
28
+
29
+ Match each issue to its ticket in the backlog (`**Owner**: contributor — #NN`) and fix any drift:
30
+ - an issue closed or merged whose ticket is still open: close the ticket (`base:backlog done`),
31
+ crediting the contributor (`… — fixed by @login in #PR`);
32
+ - an open issue with no ticket (opened by hand): fine, it counts;
33
+ - an issue with no activity for three months and no one on it: propose closing it with a
34
+ kind word and giving the ticket back (`**Owner**: Claude`).
35
+
36
+ An issue someone asked for or is assigned to still counts: it is taken, not done.
37
+
38
+ ## 2. Pick the tickets that fill the gap
39
+
40
+ Missing = target − open. Pick that many tickets from `docs/backlog/backlog.md`, all sections,
41
+ that a stranger can do without knowing the project:
42
+ - effort `XS` or `S`, one subject, a clear notion of done;
43
+ - the files to touch are few and can be named; no design decision left open;
44
+ - no secret, server, account or access only the user has; nothing urgent (🔴 critical stays
45
+ ours: a contributor may take weeks);
46
+ - not `blocked`, not `in progress`, not already reserved.
47
+
48
+ Prefer variety (a bug, a doc fix, a small improvement) and what a newcomer learns the project
49
+ from. Check in the code that each ticket is still to do. If fewer tickets fit than missing, say
50
+ so: a smaller stock is better than a vague issue. A large ticket can be split in the backlog
51
+ first (a new `T-NN` for the small part) when the split is obvious.
52
+
53
+ ## 3. Write the issues
54
+
55
+ In English, for someone who has never seen the repo. Title: what to achieve, not the ticket's
56
+ internal wording. Body:
57
+
58
+ <why it matters, two or three sentences>
59
+
60
+ ## What to do
61
+ - [ ] …
62
+
63
+ ## Where to look
64
+ - `path/to/file.py` — <what is there>
65
+
66
+ ## Done when
67
+ <the visible result, and the test that shows it>
68
+
69
+ New to the project? Read [CONTRIBUTING.md](https://github.com/<owner>/<repo>/blob/<default branch>/CONTRIBUTING.md);
70
+ ask anything here, there is no wrong question.
71
+
72
+ No internal jargon (ticket IDs, French names of the repo's skills, decisions made in chat),
73
+ no `@` of anyone, nothing about Claude. Labels: `good first issue`, plus `bug`, `enhancement`
74
+ or `documentation` as fits (`gh label list`).
75
+
76
+ ## 4. Post, after the yes
77
+
78
+ Show the user each title and body, say they will be public under their account, and post only
79
+ after an explicit yes:
80
+
81
+ gh issue create --title "…" --body-file <file> --label "good first issue" --label "…"
82
+
83
+ Then, on the work branch (a worktree, skill `base:worktree`), set each ticket's **Owner** to
84
+ `contributor — #NN`, add the setting line if it was missing, commit
85
+ (`docs(backlog): good first issues #NN, #NN`), and merge (`base:fusion`).
86
+
87
+ ## Reserved tickets
88
+
89
+ A ticket whose **Owner** is `contributor — #NN` is left for outside contributors: never
90
+ proposed as next (`base:backlog`), never fixed by us, even in ten minutes, even in passing.
91
+ The exceptions are the user's decision: they need it now, or it turned out not to fit (then
92
+ close the issue with an explanation and give the ticket back).
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  # Sur PyPI, `kiln` est pris : la distribution s'appelle kiln-cli, la commande reste `kiln`.
3
3
  name = "kiln-cli"
4
- version = "0.3.2"
4
+ version = "0.3.3"
5
5
  description = "Make Claude Code build production-grade repos, and keep them that way"
6
6
  readme = "README.md"
7
7
  license = "MIT"
@@ -42,7 +42,7 @@ FRONTENDS = ("nuxt", "next", "astro", "streamlit", "dash", "aucun")
42
42
  # Écran d'accueil : commandes par section ; le rôle de chacune vient de son aide argparse.
43
43
  COMMAND_GROUPS = (
44
44
  ("Projet", ("new", "adopt", "install", "update", "set", "waive")),
45
- ("Au quotidien", ("dev", "check", "ci", "contrat", "doctor")),
45
+ ("Au quotidien", ("dev", "check", "ci", "contrat", "doctor", "completion")),
46
46
  ("Tous les repos", ("status", "update --all", "version")),
47
47
  )
48
48
  FLEET_UPDATE_ROLE = "mettre à jour chaque repo kiln, fusion directe"
@@ -106,9 +106,48 @@ def build_parser() -> argparse.ArgumentParser:
106
106
  "--poste", action="store_true", help="réglages du poste, même depuis un repo"
107
107
  )
108
108
  _add_waive_command(commands)
109
+ completion_parser = commands.add_parser(
110
+ "completion", help="script de complétion du shell (eval dans ~/.bashrc)"
111
+ )
112
+ completion_parser.add_argument("shell", choices=["bash"], help="shell visé")
109
113
  return parser
110
114
 
111
115
 
116
+ def generate_bash_completion() -> str:
117
+ """Script de complétion bash tiré du parser : commandes, puis options et choix de chacune."""
118
+ subparsers = next(
119
+ action
120
+ for action in build_parser()._actions
121
+ if isinstance(action, argparse._SubParsersAction)
122
+ )
123
+ cases: list[str] = []
124
+ for name, subparser in sorted(subparsers.choices.items()):
125
+ words: set[str] = set()
126
+ for action in subparser._actions:
127
+ words.update(action.option_strings)
128
+ if not action.option_strings and action.choices:
129
+ words.update(str(choice) for choice in action.choices)
130
+ cases.append(
131
+ f" {name})\n"
132
+ f' COMPREPLY=( $(compgen -W "{" ".join(sorted(words))}" -- "$cur") )\n'
133
+ f" ;;"
134
+ )
135
+ commands = " ".join(sorted(subparsers.choices))
136
+ return f"""# kiln bash completion: eval "$(kiln completion bash)"
137
+ _kiln_completion() {{
138
+ local cur="${{COMP_WORDS[COMP_CWORD]}}"
139
+ COMPREPLY=()
140
+ if [[ $COMP_CWORD -eq 1 ]]; then
141
+ COMPREPLY=( $(compgen -W "{commands}" -- "$cur") )
142
+ return 0
143
+ fi
144
+ case "${{COMP_WORDS[1]}}" in
145
+ {"\n".join(cases)}
146
+ esac
147
+ }}
148
+ complete -F _kiln_completion kiln"""
149
+
150
+
112
151
  def _add_waive_command(commands: argparse._SubParsersAction[argparse.ArgumentParser]) -> None:
113
152
  waive_parser = commands.add_parser(
114
153
  "waive", help="déroger à une règle de kiln, ou figer un fichier (sans argument : lister)"
@@ -231,6 +270,9 @@ BANNER_ACTIONS = {
231
270
 
232
271
 
233
272
  def dispatch(arguments: argparse.Namespace) -> None:
273
+ if arguments.command == "completion":
274
+ print(generate_bash_completion())
275
+ return
234
276
  _show_banner(arguments)
235
277
  if arguments.command == "new":
236
278
  new.create_project(_new_project_request(arguments))
@@ -18,7 +18,7 @@ from kiln.check import run_checks
18
18
  from kiln.install import install_project
19
19
  from kiln.shell import KilnError, capture, require_tools, run, step
20
20
  from kiln.stack import ANSWERS_FILE, CHARTER_FILE, answers_if_any, load_stack, read_answers
21
- from kiln.update import update_project
21
+ from kiln.update import conflicted_files, update_project
22
22
  from kiln.versions import latest_release, release_version
23
23
 
24
24
  KILN_SOURCE_MARKERS = ("antoine-tena/kiln", "antoine-tena/init-repo")
@@ -36,7 +36,6 @@ PREFERRED_INTEGRATION_BRANCH = "develop"
36
36
  MAX_FILES_PER_COMMIT = 10
37
37
  # pre-commit refuse de tourner tant que sa configuration modifiée n'est pas commitée.
38
38
  FIRST_COMMITTED = ".pre-commit-config.yaml"
39
- CONFLICT_MARKER = "<<<<<<< before updating"
40
39
  COMMIT_ATTEMPTS = 2
41
40
 
42
41
 
@@ -219,18 +218,6 @@ def _update_worktree(worktree: Path, *, allow_major: bool) -> list[str]:
219
218
  return run_checks(worktree)
220
219
 
221
220
 
222
- def conflicted_files(worktree: Path) -> list[str]:
223
- """Fichiers où Copier a laissé un conflit à résoudre à la main."""
224
- found = subprocess.run(
225
- ["git", "grep", "-l", "--untracked", CONFLICT_MARKER],
226
- cwd=worktree,
227
- capture_output=True,
228
- text=True,
229
- check=False,
230
- )
231
- return found.stdout.split()
232
-
233
-
234
221
  def integration_branch(root: Path) -> str:
235
222
  preferred = subprocess.run(
236
223
  [