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