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