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.
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/CHANGELOG.md +8 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/CLAUDE.md +8 -7
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/PKG-INFO +7 -4
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/README.fr.md +35 -7
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/README.md +6 -3
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/docs/backlog/backlog.md +42 -49
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/hooks/garde-branche.py +20 -1
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/hooks/kiln-a-jour.py +114 -96
- kiln_cli-0.3.2/plugins/base/hooks/relances.py +166 -0
- kiln_cli-0.3.2/plugins/base/skills/adoption/SKILL.md +28 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/contribution/SKILL.md +13 -2
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/fusion/SKILL.md +3 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/maj-kiln/SKILL.md +4 -3
- kiln_cli-0.3.2/plugins/base/skills/relecture/SKILL.md +95 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/version/SKILL.md +3 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/pyproject.toml +1 -1
- kiln_cli-0.3.2/src/kiln/adopt.py +110 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/charte/charte.py +58 -6
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/charte/moteur.py +4 -1
- kiln_cli-0.3.2/src/kiln/charte/waivers.py +167 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/cli.py +71 -3
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/fleet.py +65 -4
- kiln_cli-0.3.2/src/kiln/frozen.py +69 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/update.py +21 -1
- kiln_cli-0.3.2/src/kiln/waive.py +172 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/CLAUDE.md.jinja +10 -0
- kiln_cli-0.3.2/tests/conftest.py +13 -0
- kiln_cli-0.3.2/tests/test_adopt.py +63 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_flotte.py +49 -0
- kiln_cli-0.3.2/tests/test_garde_branche.py +49 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_hook_kiln_a_jour.py +47 -16
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_modele.py +1 -1
- kiln_cli-0.3.2/tests/test_relances.py +102 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_unites.py +41 -3
- kiln_cli-0.3.2/tests/test_waive.py +98 -0
- kiln_cli-0.3.2/tests/test_waivers.py +204 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/uv.lock +1 -1
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.claude-plugin/marketplace.json +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/ISSUE_TEMPLATE/idea.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/pull_request_template.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/charte.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/contrat-api.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/django.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/infra.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/kiln.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/maven.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/mutation.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/pnpm.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/pypi.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/python.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/sbom.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/securite.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.github/workflows/vercel.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.gitignore +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/.python-version +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/CONTRIBUTING.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/LICENSE +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/SECURITY.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/actions/charte/action.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/actions/services/action.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/copier.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/docs/assets/kiln-accueil.svg +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/docs/assets/social-preview.png +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/docs/backlog/README.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/docs/backlog/rejected.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/docs/backlog/urgent.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/docs/inventaire-annski.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/macros.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/.claude-plugin/plugin.json +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/.mcp.json +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/README.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/hooks/controle-fichier.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/hooks/hooks.json +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/hooks/protege-fichiers.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/hooks/rtk.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/scripts/preparer-worktree.sh +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/scripts/statusline.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/backlog/SKILL.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/nettoyage/SKILL.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/report-to-kiln/SKILL.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/token/SKILL.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/base/skills/worktree/SKILL.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-django/.claude-plugin/plugin.json +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-django/.mcp.json +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-django/skills/migration/SKILL.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-django/skills/postgres-lecture/SKILL.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-django/skills/postgres-lecture/role.sh +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-django/skills/regen-api/SKILL.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/.claude-plugin/plugin.json +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/.mcp.json +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/scripts/apercu.mjs +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/scripts/playwright-mcp.sh +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/apercu/SKILL.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/SKILL.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/advanced-hooks.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/advanced-layers.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/advanced-module-authoring.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/best-practices-data-fetching.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/best-practices-ssr.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/core-cli.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/core-config.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/core-data-fetching.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/core-deployment.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/core-directory-structure.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/core-modules.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/core-routing.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/features-components-autoimport.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/features-components.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/features-composables.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/features-server.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/features-state.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/nuxt/references/rendering-modes.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/polish/SKILL.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/SKILL.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/advanced-environments.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/advanced-projects.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/advanced-type-testing.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/advanced-vi.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/core-cli.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/core-config.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/core-describe.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/core-expect.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/core-hooks.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/core-test-api.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-benchmarking.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-concurrency.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-context.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-coverage.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-filtering.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-mocking.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-reporters.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-snapshots.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vitest/references/features-test-tags.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/SKILL.md +0 -0
- {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
- {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
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-async.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-data-flow.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-fallthrough-attrs.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-keep-alive.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-slots.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-suspense.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-teleport.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-transition-group.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/component-transition.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/composables.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/directives.md +0 -0
- {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
- {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
- {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
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/plugins.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/reactivity.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/render-functions.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/sfc.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/state-management.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-best-practices/references/updated-hook-performance.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/pile-nuxt/skills/vue-testing-best-practices/SKILL.md +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/serena/.claude-plugin/plugin.json +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/serena/.mcp.json +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/serena/scripts/lecture.yml +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/serena/scripts/serena.sh +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/stripe/.claude-plugin/plugin.json +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/stripe/.mcp.json +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/stripe/scripts/stripe-test.sh +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/vps-podman/.claude-plugin/plugin.json +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/vps-podman/skills/deployer/SKILL.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/vps-podman/skills/prod-dump/SKILL.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/plugins/vps-podman/skills/prod-logs/SKILL.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/__init__.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/backlog.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/banner.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/charte/__init__.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/charte/cliquets.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/charte/interdictions.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/charte/outils_python.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/check.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ci/__init__.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ci/execution.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ci/jobs.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ci/runner.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ci/services.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ci/verdict.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ci/workflow.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/config.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/contract.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/deps.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/dev.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/doctor.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/github.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/install.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/new.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/poste.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/py.typed +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/release.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/rules.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/settings.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/shell.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/stack.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/statusline.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/template.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/ui.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/src/kiln/versions.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.claude/settings.json.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.editorconfig +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.gitattributes.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.github/CODEOWNERS.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.github/pull_request_template.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.github/workflows/ci.yml.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.gitignore.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.pre-commit-config.yaml.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.vscode/extensions.json.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/.vscode/settings.json.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/README.md.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/charte.toml.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/docs/backlog/README.md.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/docs/backlog/backlog.md.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/docs/backlog/rejected.md.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/docs/backlog/urgent.md +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/docs/{% if deploiement == /"vps/" %}exploitation{% endif %}/production.md.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/.python-version" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/CLAUDE.md.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/pyproject.toml.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/tests/__init__.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/tests/test_cli.py.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/__init__.py.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/__main__.py.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/cli.py.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/greeting.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"cli/" %}backend{% endif %}/{{ nom | replace('-', '_') }}/py.typed" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/.python-version" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/CLAUDE.md.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/data/README.md" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/data/sample/measurements.csv" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/notebooks/exploration.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/__init__.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/figures.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/py.typed" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/sources.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/pipeline/transforms.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/pyproject.toml.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/tests/__init__.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/tests/test_figures.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/tests/test_sources.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/tests/test_transforms.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"data/" %}backend{% endif %}/{% if podman %}Containerfile{% endif %}" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/.env.example.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/.python-version" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/CLAUDE.md.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/__init__.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/api.py.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/asgi.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/health.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/management/__init__.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/management/commands/__init__.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/management/commands/export_openapi.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/middleware.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/settings.py.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/urls.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/config/wsgi.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/manage.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/pyproject.toml.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/tests/__init__.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/tests/test_health.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/tests/test_openapi.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/tests/test_security_headers.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"django/" %}backend{% endif %}/{% if podman %}Containerfile{% endif %}" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/.env.example.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/.python-version" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/CLAUDE.md.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/__init__.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/health.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/main.py.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/app/settings.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/pyproject.toml.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/tests/__init__.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/tests/test_health.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"fastapi/" %}backend{% endif %}/{% if podman %}Containerfile{% endif %}" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/.mvn/maven.config" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/.mvn/wrapper/maven-wrapper.properties" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/CLAUDE.md.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/mvnw" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/mvnw.cmd" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if backend == /"java/" %}backend{% endif %}/pom.xml.jinja" +0 -0
- {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
- {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
- {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
- {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
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/Caddyfile.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/backup.sh.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/compose.yaml.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/deploy-remote.sh.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/heal.sh.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/project.json.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/restore-test.sh.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/setup-deploy-user.sh.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-backup.service.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-backup.timer.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-heal.service.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-heal.timer.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-restore-test.service.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if deploiement == /"vps/" %}config{% endif %}/vps/{{ nom }}-restore-test.timer.jinja" +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/.gitignore" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/.nvmrc" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/AGENTS.md" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/CLAUDE.md.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/astro.config.mjs.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/package.json.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/pnpm-workspace.yaml" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/public/favicon.ico" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/public/favicon.svg" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/constants.ts.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/layouts/BaseLayout.astro" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/pages/index.astro.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/src/styles/global.css" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/tsconfig.json" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"astro/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/.python-version" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/CLAUDE.md.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/app.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/__init__.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/constants.py.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/dashboard/layout.py.jinja" +0 -0
- {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
- {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
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/pyproject.toml.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/tests/__init__.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/tests/test_layout.py.jinja" +0 -0
- {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
- {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
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"dash/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/.gitignore" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/.nvmrc" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/AGENTS.md" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/CLAUDE.md.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/app/favicon.ico" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/app/globals.css" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/app/layout.tsx" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/app/page.tsx.jinja" +0 -0
- {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
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/eslint.config.mjs" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/lib/constants.ts.jinja" +0 -0
- {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
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/next.config.ts.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/package.json.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/pnpm-workspace.yaml" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/tsconfig.json" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"next/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/.gitignore" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/.nvmrc" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/CLAUDE.md.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/app.vue.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/assets/css/main.css" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/app/assets/css/tokens.css" +0 -0
- {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
- {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
- {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
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/eslint.config.mjs" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/nuxt.config.ts.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/package.json.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/pnpm-workspace.yaml" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/public/favicon.ico" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/public/robots.txt" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/tsconfig.json" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"nuxt/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/.python-version" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/.streamlit/config.toml" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/CLAUDE.md.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/app.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/dashboard/__init__.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/dashboard/constants.py.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/dashboard/home.py.jinja" +0 -0
- {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
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/pyproject.toml.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/tests/__init__.py" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/tests/test_app.py.jinja" +0 -0
- {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
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if frontend == /"streamlit/" %}frontend{% endif %}/{% if podman %}Containerfile{% endif %}.jinja" +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if podman %}.containerignore{% endif %} +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{% if podman %}compose.yaml{% endif %}.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/template/{{_copier_conf.answers_file}}.jinja +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_backlog.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_ci.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_cli.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_deploiement.py +0 -0
- {kiln_cli-0.3.1 → kiln_cli-0.3.2}/tests/test_plugins.py +0 -0
- {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.
|
|
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
|
|
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`,
|
|
34
|
-
`
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
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-
|
|
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-
|
|
44
|
+
### T-14 · Promote v0.3.1, the first release on PyPI
|
|
45
45
|
- **Type**: task
|
|
46
|
-
- **Status**: blocked — waiting for
|
|
47
|
-
- **Opened**: 2026-10-
|
|
46
|
+
- **Status**: blocked — waiting for `v0.3.2-rc.1`
|
|
47
|
+
- **Opened**: 2026-10-16
|
|
48
48
|
- **Effort**: S · **Owner**: Claude · **Due**: —
|
|
49
|
-
- **Origin**:
|
|
50
|
-
|
|
51
|
-
`v0.3.0-
|
|
52
|
-
(
|
|
53
|
-
`
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
- [ ]
|
|
58
|
-
|
|
59
|
-
- [ ]
|
|
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-
|
|
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(
|