Zum Inhalt

The questions of Copier

Copier asks these 25 questions when it copies the blueprint, in this order, and keeps the answers in .copier-answers.yml, so that copier update asks only a new question. --data name=value gives an answer without the question, also later: copier update --defaults --vcs-ref=:current: --data name=value changes an answer of an existing repository, and the defaults of Copier's settings file answer the questions that stay the same for all of your repositories, as your own account shows. A default that is a template of Copier comes from the answers before it, in the delimiters of the blueprint: {= … =} for a value and [% … %] for a block.

  • project_name: The name of the project, such as "Paperless Sync"
  • project_slug: The name of the repository; owner.github.io, such as dennis-otto.github.io, for the website of the owner itself
  • description: One sentence that says what the project does
  • project_type: The kind of project
  • owner: The GitHub account or organization of the repository, such as octo-org
  • author: The maintainer, named in the license and the governance
  • copyright: The copyright of the license, years and holder; several separated by semicolons
  • license: The license
  • python_package: The name of the Python package or module
  • ha_domain: The domain of the integration in Home Assistant
  • nextcloud_app_id: The id of the Nextcloud app, 32 characters at most
  • nextcloud_namespace: The PHP namespace of the app, under OCA
  • languages: The languages of the code, which CodeQL analyzes (it has no PHP)
  • discussions: Use GitHub Discussions for questions, ideas and the announcements of releases
  • successor: The owner has designated a successor through GitHub's account successor setting, who can take over the repository
  • homepage: The website of the project; by default the one that the Docs workflow publishes on GitHub Pages, empty for none
  • topics: The topics of the repository, separated by commas; up to 20, each of lowercase letters, digits and hyphens
  • sponsor: The GitHub Sponsors account of the sponsor button; empty for none
  • release_app: The GitHub App of the owner that opens the release and update pull requests, by the name in its address (github.com/apps/NAME); empty to register one after the copy, as the checklist shows
  • release_app_client_id: The Client ID of the release app, on its settings page, such as Iv23li…
  • release_app_id: The App ID of the release app, the number on its settings page
  • renovate_runner: Who runs Renovate, which opens the updates of the dependencies
  • issue_assistant_ai: Let an AI engine, Claude, analyze each new issue, with its token as a secret of the environment issue-assistant
  • sample_code: Start with sample code and tests; an existing repository that takes the blueprint answers no
  • test_workflows: Other workflows of the repository that run tests, by their names and separated by commas, whose failed jobs the flaky-test bot runs once more; empty for none

The questions

project_name

The name of the project, such as "Paperless Sync".

The name and the description stand as they are in a docstring of Python, a comment of TypeScript and the CDATA of appinfo/info.xml, which """, */ and ]]> would end, and a backslash would start an escape there; the other files escape them.

  • Type: text
  • Asked: always
  • When Copier refuses an answer, it says: Name the project. Write the name without """, */, ]]>, backslashes and line breaks, which would end or break the code that names it.
  • Default: none: Copier asks for it

project_slug

The name of the repository; owner.github.io, such as dennis-otto.github.io, for the website of the owner itself.

  • Type: text
  • Asked: always
  • When Copier refuses an answer, it says: Use lowercase letters, digits and hyphens, or the name of the website of an owner, such as dennis-otto.github.io.
  • Default: a template of Copier, from the answers before it:
{= project_name | lower | regex_replace('[^a-z0-9]+', '-') | trim('-') =}

description

One sentence that says what the project does.

  • Type: text
  • Asked: always
  • When Copier refuses an answer, it says: Describe the project in one sentence. Write the description without """, */, ]]>, backslashes and line breaks, which would end or break the code that quotes it.
  • Default: none: Copier asks for it

project_type

The kind of project.

  • Type: one of the choices
  • Asked: always
  • Default: none: Copier asks for it
Answer What Copier shows
home-assistant Home Assistant integration (Python, HACS)
nextcloud-app Nextcloud app (PHP, App Store)
github-action GitHub Action (Python, composite)
python-package Python package (PyPI)
node-package Node package (TypeScript, npm)
container Container image (GHCR)
generic Repository without a build (docs, configuration, scripts)

owner

The GitHub account or organization of the repository, such as octo-org.

No default: each owner names their account, or sets it once for all of their repositories in the defaults of Copier's settings file.

  • Type: text
  • Asked: always
  • When Copier refuses an answer, it says: Name the GitHub account or organization of the repository, such as octo-org.
  • Default: none: Copier asks for it

author

The maintainer, named in the license and the governance.

  • Type: text
  • Asked: always
  • When Copier refuses an answer, it says: Name the maintainer.
  • Default: a template of Copier, from the answers before it:
[% if owner == blueprint_owner.account %]{= blueprint_owner.author =}
[% else %]{= owner =}
[% endif %]

The copyright of the license, years and holder; several separated by semicolons.

  • Type: text
  • Asked: always
  • Default: {= '%Y' | strftime =} {= author =}, a template of Copier

license

The license.

  • Type: one of the choices
  • Asked: always
  • Default: a template of Copier, from the answers before it:
[% if project_type == 'nextcloud-app' %]AGPL-3.0-or-later
[% else %]MIT
[% endif %]
Answer What Copier shows
MIT MIT
MIT-0 MIT No Attribution (MIT-0)
BSD-3-Clause BSD 3-Clause
Apache-2.0 Apache 2.0
GPL-3.0-or-later GPL 3.0 or later
AGPL-3.0-or-later AGPL 3.0 or later

python_package

The name of the Python package or module.

  • Type: text
  • Asked: only when project_type in ['python-package', 'github-action', 'home-assistant']
  • When Copier refuses an answer, it says: Use lowercase letters, digits and underscores.
  • Default: {= project_slug | replace('-', '_') =}, a template of Copier

ha_domain

The domain of the integration in Home Assistant.

  • Type: text
  • Asked: only when project_type == 'home-assistant'
  • When Copier refuses an answer, it says: Use lowercase letters, digits and underscores.
  • Default: {= python_package =}, a template of Copier

nextcloud_app_id

The id of the Nextcloud app, 32 characters at most.

The App Store takes an id of 32 characters at most, from a lowercase letter to a letter or a digit, as the schema of appinfo/info.xml says.

  • Type: text
  • Asked: only when project_type == 'nextcloud-app'
  • When Copier refuses an answer, it says: Use 2 to 32 lowercase letters, digits and underscores, from a letter to a letter or a digit, as the App Store takes them.
  • Default: {= (project_slug | replace('-', '_'))[:32] | trim('_') =}, a template of Copier

nextcloud_namespace

The PHP namespace of the app, under OCA.

  • Type: text
  • Asked: only when project_type == 'nextcloud-app'
  • When Copier refuses an answer, it says: Use a name of PHP in CamelCase, such as PaperlessSync or Files_Sharing: a capital letter, then letters, digits and underscores.
  • Default: a template of Copier, from the answers before it:
{= project_name | regex_replace('[^A-Za-z0-9]+', ' ') | title | replace(' ', '') =}

languages

The languages of the code, which CodeQL analyzes (it has no PHP).

  • Type: several of the choices
  • Asked: always
  • Default: a template of Copier, from the answers before it:
[%- if project_type in ['home-assistant', 'github-action', 'python-package'] -%][python]
[%- elif project_type in ['node-package', 'nextcloud-app'] -%][javascript-typescript]
[%- else -%][]
[%- endif -%]
Answer What Copier shows
python Python
javascript-typescript JavaScript or TypeScript
go Go
java-kotlin Java or Kotlin
ruby Ruby
rust Rust

discussions

Use GitHub Discussions for questions, ideas and the announcements of releases.

  • Type: yes or no
  • Asked: always
  • Default: yes

successor

The owner has designated a successor through GitHub's account successor setting, who can take over the repository.

  • Type: yes or no
  • Asked: always
  • Default: no

homepage

The website of the project; by default the one that the Docs workflow publishes on GitHub Pages, empty for none.

The website that the Docs workflow publishes on GitHub Pages, at the address that mkdocs.yml names: the README, the About box of the repository, the issue forms and the manifest of an integration or an app link it.

  • Type: text
  • Asked: always
  • When Copier refuses an answer, it says: Name the address of the website, such as https://octo-org.github.io/demo/, or leave it empty.
  • Default: a template of Copier, from the answers before it:
https://{= owner | lower =}.github.io/
[% if project_slug != (owner | lower) ~ '.github.io' %]{= project_slug =}/
[% endif %]

topics

The topics of the repository, separated by commas; up to 20, each of lowercase letters, digits and hyphens.

The topics of the repository on GitHub, with those of each kind by default: HACS lists an integration only with topics, and its check asks for them.

  • Type: text
  • Asked: always
  • When Copier refuses an answer, it says: Separate up to 20 topics by commas, each of 50 characters at most, with lowercase letters, digits and hyphens, such as home-assistant. HACS lists an integration only with topics, and its check asks for them: name at least one, such as home-assistant.
  • Default: a template of Copier, from the answers before it:
[%- if project_type == 'home-assistant' -%]home-assistant, hacs, hacs-integration, home-assistant-integration, home-assistant-custom-component, homeassistant
[%- elif project_type == 'nextcloud-app' -%]nextcloud, nextcloud-app
[%- elif project_type == 'github-action' -%]github-actions, github-action
[%- elif project_type == 'python-package' -%]python, pypi
[%- elif project_type == 'node-package' -%]typescript, nodejs, npm
[%- elif project_type == 'container' -%]docker, container, ghcr
[%- endif -%]

The GitHub Sponsors account of the sponsor button; empty for none.

  • Type: text
  • Asked: always
  • When Copier refuses an answer, it says: Name a GitHub account, or leave it empty.
  • Default: {= owner =}, a template of Copier

release_app

The GitHub App of the owner that opens the release and update pull requests, by the name in its address (github.com/apps/NAME); empty to register one after the copy, as the checklist shows.

The GitHub App of the release and update pull requests, whose token starts their checks, signs the release tags and runs the bots. Empty for none yet: the checklist then shows how to register one, and copier update with these answers names it.

  • Type: text
  • Asked: always
  • When Copier refuses an answer, it says: Name the app as its address does, github.com/apps/NAME, with lowercase letters, digits and hyphens, or leave it empty.
  • Default: a template of Copier, from the answers before it:
[% if owner == blueprint_owner.account %]{= blueprint_owner.release_app =}
[% endif %]

release_app_client_id

The Client ID of the release app, on its settings page, such as Iv23li…

  • Type: text
  • Asked: only when release_app != ''
  • When Copier refuses an answer, it says: Copy the Client ID from the settings page of the app, such as Iv23li…; the App ID is the number next to it.
  • Default: a template of Copier, from the answers before it:
[% if release_app == blueprint_owner.release_app %]{= blueprint_owner.release_app_client_id =}
[% endif %]

release_app_id

The App ID of the release app, the number on its settings page.

  • Type: text
  • Asked: only when release_app != ''
  • When Copier refuses an answer, it says: Copy the App ID, a number, from the settings page of the app.
  • Default: a template of Copier, from the answers before it:
[% if release_app == blueprint_owner.release_app %]{= blueprint_owner.release_app_id =}
[% endif %]

renovate_runner

Who runs Renovate, which opens the updates of the dependencies.

Who runs Renovate, which opens the updates of the dependencies: a workflow of the repository itself, as the release app; the Mend Renovate app, which the owner installs; or the Renovate workflow of the blueprint, which runs it for every repository of the blueprint's owner and only for them.

  • Type: one of the choices
  • Asked: always
  • When Copier refuses an answer, it says: The Renovate workflow of the blueprint runs only for the repositories of Dennis-Otto: choose a workflow in this repository (self) or the Mend Renovate app (mend). The Renovate workflow of the blueprint already runs for every repository of Dennis-Otto that has its rules, so a second Renovate would fight it over the branches: choose the blueprint's workflow (hub).
  • Default: a template of Copier, from the answers before it:
[% if owner == blueprint_owner.account %]hub
[% else %]self
[% endif %]
Answer What Copier shows
self A Renovate workflow in this repository, as the release app (self)
mend The Mend Renovate app, which the owner installs (mend)
hub The Renovate workflow of the blueprint, for the repositories of its owner (hub)

issue_assistant_ai

Let an AI engine, Claude, analyze each new issue, with its token as a secret of the environment issue-assistant.

The issue assistant labels the issues and answers its commands without AI; with AI, the engine of .github/issue-assistant/config.toml, Claude, also analyzes each new issue, with its secret in the environment issue-assistant.

  • Type: yes or no
  • Asked: always
  • Default: yes

sample_code

Start with sample code and tests; an existing repository that takes the blueprint answers no.

  • Type: yes or no
  • Asked: always
  • Default: yes

test_workflows

Other workflows of the repository that run tests, by their names and separated by commas, whose failed jobs the flaky-test bot runs once more; empty for none.

The flaky-test bot watches the CI and Docker E2E of every repository; a repository whose other workflows run tests, such as visual tests, names them here.

  • Type: text
  • Asked: always
  • When Copier refuses an answer, it says: Name each workflow as the name: line of its file does, with letters, digits, spaces and ( ) . _ / - only, and separate them by commas.
  • Default: empty

The values that Copier works out

Copier never asks these and doesn't keep them in .copier-answers.yml: the files of the template read them, and Copier works them out from the answers at every copy and update.

blueprint_owner

The owner of this blueprint, whose own repositories keep its name and its release app as their defaults; every other owner names their own. A fork of the blueprint names its owner here. Never asked and not stored.

  • Type: YAML
  • Default: these values, as YAML:
account: Dennis-Otto
author: Dennis Otto
release_app: dennis-otto-release-automation
release_app_client_id: Iv23liP9PIEHOV74AiIA
release_app_id: '4739928'

stack

  • Type: text
  • Default: a template of Copier, from the answers before it:
[%- if project_type == 'home-assistant' -%]home-assistant
[%- elif project_type == 'nextcloud-app' -%]php
[%- elif project_type in ['github-action', 'python-package'] -%]python
[%- elif project_type == 'node-package' -%]node
[%- elif project_type == 'container' -%]container
[%- else -%]generic
[%- endif -%]

publish_to

  • Type: text
  • Default: a template of Copier, from the answers before it:
[%- if project_type == 'home-assistant' -%]hacs
[%- elif project_type == 'nextcloud-app' -%]nextcloud-appstore
[%- elif project_type == 'github-action' -%]github-action
[%- elif project_type == 'python-package' -%]pypi
[%- elif project_type == 'node-package' -%]npm
[%- elif project_type == 'container' -%]ghcr
[%- else -%]none
[%- endif -%]

codeql_languages

The languages CodeQL analyzes, besides the workflows; it has no PHP.

  • Type: text
  • Default: a template of Copier, from the answers before it:
[%- set found = [] -%]
[%- for language in ['python', 'javascript-typescript', 'go', 'java-kotlin', 'ruby', 'rust'] if language in languages -%]
[%- set _ = found.append(language) -%]
[%- endfor -%] [{= (found + ['actions']) | join(', ') =}]

ci_workflow

The workflow of the checks: the stack's, or one with the action's own test run.

  • Type: text
  • Default: a template of Copier, from the answers before it:
[% if project_type == 'github-action' %]github-action
[% else %]{= stack =}
[% endif %]

python_version

Home Assistant needs the newest Python; actions run on the runner's Python 3.12.

  • Type: text
  • Default: a template of Copier, from the answers before it:
[% if stack == 'home-assistant' %]3.14
[% else %]3.12
[% endif %]

release_type

How the release bot finds the version: Python and Node in their manifests, the others in version.txt, with the version in other files kept equal.

  • Type: text
  • Default: a template of Copier, from the answers before it:
[%- if project_type == 'python-package' -%]python
[%- elif stack == 'node' -%]node
[%- else -%]simple
[%- endif -%]

The files of a project

After the first copy, these belong to the project: an update never overwrites them. Renovate keeps the dependency manifests of the project current. The patterns follow .gitignore: those without a slash would match at any depth, so the files of the root start with one. template/AGENTS.md.jinja lists them for coding agents, and a test keeps both lists equal.

The 53 patterns of the files of a project
  • /README.md
  • /CHANGELOG.md
  • /version.txt
  • /.release-please-manifest.json
  • /mkdocs.yml
  • /docs/index.md
  • /docs/security.md
  • .github/issue-assistant/project.md
  • .github/agents.project.md
  • /docs/decisions
  • .github/ISSUE_TEMPLATE/bug_report.yml
  • .github/ISSUE_TEMPLATE/feature_request.yml
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/DISCUSSION_TEMPLATE/q-a.yml
  • .github/DISCUSSION_TEMPLATE/ideas.yml
  • .github/labels.toml
  • .github/labeler.yml
  • /.markdownlint.jsonc
  • .github/cspell-words.txt
  • .github/renovate.json5
  • .github/findings.toml
  • .github/dependency-review.yml
  • .github/social-preview.html
  • /scripts/screenshots.sh
  • .github/screenshots-paths.txt
  • .github/repository.project.toml
  • .github/checks.project.toml
  • .github/workflows/action-test.yml
  • /.lycheeignore
  • /pyproject.toml
  • /requirements-dev.in
  • /requirements-dev.txt
  • /requirements-test.in
  • /requirements-test.txt
  • /requirements-fuzz.in
  • /requirements-fuzz.txt
  • /fuzz
  • /composer.json
  • /composer.lock
  • /package.json
  • /package-lock.json
  • /Dockerfile
  • /action.yml
  • /hacs.json
  • /src
  • /lib
  • /app
  • /appinfo
  • /img
  • /custom_components
  • /tests
  • /test
  • /*.py