instant-python 0.23.2__tar.gz → 0.24.0__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.
- instant_python-0.24.0/.agents/agents/convention_keeper.md +52 -0
- instant_python-0.24.0/.agents/agents/craftsman_leader.md +99 -0
- instant_python-0.24.0/.agents/agents/judge.md +83 -0
- instant_python-0.24.0/.agents/agents/spec_partner.md +70 -0
- instant_python-0.24.0/.agents/agents/tdd_craftsman.md +76 -0
- instant_python-0.23.2/instant_python/templates/boilerplate/agents/commands/code-review.md → instant_python-0.24.0/.agents/commands/code_review.md +2 -1
- {instant_python-0.23.2/instant_python/templates/boilerplate/agents → instant_python-0.24.0/.agents}/commands/commit.md +1 -1
- instant_python-0.23.2/instant_python/templates/boilerplate/agents/commands/technical-debt-review.md → instant_python-0.24.0/.agents/commands/technical_debt_review.md +1 -1
- {instant_python-0.23.2/.agents/skills/complexity-review → instant_python-0.24.0/.agents/skills/complexity_review}/SKILL.md +7 -7
- instant_python-0.24.0/.agents/skills/convention/SKILL.md +32 -0
- {instant_python-0.23.2/instant_python/templates/boilerplate/agents/skills/hamburger-method → instant_python-0.24.0/.agents/skills/hamburger_method}/REFERENCE.md +6 -6
- {instant_python-0.23.2/instant_python/templates/boilerplate/agents/skills/hamburger-method → instant_python-0.24.0/.agents/skills/hamburger_method}/SKILL.md +14 -14
- {instant_python-0.23.2/.agents/skills/micro-steps-coach → instant_python-0.24.0/.agents/skills/micro_steps_coach}/REFERENCE.md +1 -0
- {instant_python-0.23.2/instant_python/templates/boilerplate/agents/skills/micro-steps-coach → instant_python-0.24.0/.agents/skills/micro_steps_coach}/SKILL.md +14 -14
- {instant_python-0.23.2/.agents/skills/mutation-testing → instant_python-0.24.0/.agents/skills/mutation_testing}/SKILL.md +1 -1
- instant_python-0.24.0/.agents/skills/spec/SKILL.md +53 -0
- {instant_python-0.23.2/instant_python/templates/boilerplate/agents/skills/story-splitting → instant_python-0.24.0/.agents/skills/story_splitting}/SKILL.md +14 -14
- {instant_python-0.23.2/instant_python/templates/boilerplate/agents/skills/test-desiderata → instant_python-0.24.0/.agents/skills/test_desiderata}/SKILL.md +1 -1
- {instant_python-0.23.2/.agents/skills/xp-refactor → instant_python-0.24.0/.agents/skills/xp_refactor}/SKILL.md +2 -2
- {instant_python-0.23.2 → instant_python-0.24.0}/.gitignore +1 -0
- instant_python-0.24.0/AGENTS.md +148 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/CHANGELOG.md +54 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/PKG-INFO +1 -1
- instant_python-0.23.2/docs/adrs/adr-guidelines.md → instant_python-0.24.0/docs/conventions/convention-guidelines.md +2 -4
- instant_python-0.24.0/docs/conventions/testing/tdd-outside-in.md +239 -0
- instant_python-0.24.0/docs/conventions/workflow/leader_workflow.md +95 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/guide/default_features.md +108 -40
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/guide/template_reference.md +171 -32
- instant_python-0.24.0/instant_python/__init__.py +1 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/.gitignore +9 -1
- {instant_python-0.23.2 → instant_python-0.24.0/instant_python/templates/boilerplate/agents}/AGENTS.md +12 -5
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/agents/convention_keeper.md +52 -0
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/agents/craftsman_leader.md +99 -0
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/agents/judge.md +83 -0
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/agents/spec_partner.md +72 -0
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/agents/tdd_craftsman.md +76 -0
- {instant_python-0.23.2/.agents → instant_python-0.24.0/instant_python/templates/boilerplate/agents}/commands/commit.md +1 -1
- instant_python-0.23.2/.agents/commands/technical-debt-review.md → instant_python-0.24.0/instant_python/templates/boilerplate/agents/commands/technical_debt_review.md +1 -1
- instant_python-0.23.2/instant_python/templates/boilerplate/agents/adr-guidelines.md → instant_python-0.24.0/instant_python/templates/boilerplate/agents/convention_guidelines.md +2 -4
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/leader_workflow.md +96 -0
- {instant_python-0.23.2/instant_python/templates/boilerplate/agents/skills/complexity-review → instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/complexity_review}/SKILL.md +7 -7
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/convention/SKILL.md +32 -0
- {instant_python-0.23.2/.agents/skills/hamburger-method → instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/hamburger_method}/REFERENCE.md +6 -6
- {instant_python-0.23.2/.agents/skills/hamburger-method → instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/hamburger_method}/SKILL.md +14 -14
- {instant_python-0.23.2/instant_python/templates/boilerplate/agents/skills/micro-steps-coach → instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/micro_steps_coach}/REFERENCE.md +3 -4
- {instant_python-0.23.2/.agents/skills/micro-steps-coach → instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/micro_steps_coach}/SKILL.md +14 -14
- {instant_python-0.23.2/instant_python/templates/boilerplate/agents/skills/mutation-testing → instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/mutation_testing}/SKILL.md +1 -1
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/spec/SKILL.md +57 -0
- {instant_python-0.23.2/.agents/skills/story-splitting → instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/story_splitting}/SKILL.md +14 -14
- {instant_python-0.23.2/.agents/skills/test-desiderata → instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/test_desiderata}/SKILL.md +1 -1
- {instant_python-0.23.2/instant_python/templates/boilerplate/agents/skills/xp-refactor → instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/xp_refactor}/SKILL.md +2 -2
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/tasks.json +12 -0
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/tdd_outside_in.md +239 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/pyproject.toml +2 -1
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/scripts/makefile +9 -8
- instant_python-0.24.0/instant_python/templates/project_structure/agents/agents.yml +167 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/pyproject.toml +1 -1
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/renderer/test_jinja_environment.py +3 -1
- {instant_python-0.23.2 → instant_python-0.24.0}/uv.lock +62 -62
- instant_python-0.23.2/.agents/skills/adr/SKILL.md +0 -34
- instant_python-0.23.2/.agents/skills/design-doc/SKILL.md +0 -42
- instant_python-0.23.2/docs/design_docs/design-doc-guidelines.md +0 -185
- instant_python-0.23.2/instant_python/__init__.py +0 -1
- instant_python-0.23.2/instant_python/templates/boilerplate/agents/AGENTS.md +0 -226
- instant_python-0.23.2/instant_python/templates/boilerplate/agents/design-doc-guidelines.md +0 -185
- instant_python-0.23.2/instant_python/templates/boilerplate/agents/skills/adr/SKILL.md +0 -34
- instant_python-0.23.2/instant_python/templates/boilerplate/agents/skills/design-doc/SKILL.md +0 -42
- instant_python-0.23.2/instant_python/templates/project_structure/agents/agents.yml +0 -129
- instant_python-0.23.2/test/initialize/delivery/approved_files/TestInitCli.test_should_initialize_project_with_template_section_combinations.received.txt +0 -56
- /instant_python-0.23.2/.agents/commands/security-review.md → /instant_python-0.24.0/.agents/commands/security_review.md +0 -0
- {instant_python-0.23.2/.agents/skills/complexity-review → instant_python-0.24.0/.agents/skills/complexity_review}/REFERENCE.md +0 -0
- {instant_python-0.23.2/.agents/skills/story-splitting → instant_python-0.24.0/.agents/skills/story_splitting}/REFERENCE.md +0 -0
- {instant_python-0.23.2/.agents/skills/test-desiderata → instant_python-0.24.0/.agents/skills/test_desiderata}/REFERENCE.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/.github/FUNDING.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/.github/actions/python_setup/action.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/.github/dependabot.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/.github/pull_request_template.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/.github/workflows/ci.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/.github/workflows/pages.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/.github/workflows/release.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/.pre-commit-config.yaml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/.python-version +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/CITATION.cff +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/LICENSE +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/README.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/SECURITY.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/codeql-config.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/changelog/.components/changelog_header.md.j2 +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/changelog/.components/changelog_init.md.j2 +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/changelog/.components/changelog_update.md.j2 +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/changelog/.components/changes.md.j2 +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/changelog/.components/first_release.md.j2 +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/changelog/.components/macros.md.j2 +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/changelog/.components/versioned_changes.md.j2 +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/changelog/.release_notes.md.j2 +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/changelog/CHANGELOG.md.j2 +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/assets/favicon.svg +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/assets/logo.svg +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/development/contributing.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/development/releases.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/development/security.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/downloads_macro.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/getting_started/first_steps.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/getting_started/installation.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/getting_started/privacy_and_metrics.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/guide/command_config.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/guide/command_init.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/guide/custom_projects.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/guide/index.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/docs/documentation/home/index.md +0 -0
- /instant_python-0.23.2/docs/design_docs/0001-metrics-middleware-refactor.md → /instant_python-0.24.0/docs/features/0001-metrics-middleware-refactor.spec +0 -0
- {instant_python-0.23.2/docs/design_docs → instant_python-0.24.0/docs/features}/technical-debt-review.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/cli/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/cli/cli.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/cli/instant_python_typer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/application/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/application/config_generator.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/delivery/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/delivery/cli.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/domain/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/domain/question_wizard.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/infra/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/infra/question_wizard/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/infra/question_wizard/questionary_console_wizard.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/infra/question_wizard/step/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/infra/question_wizard/step/dependencies_step.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/infra/question_wizard/step/general_step.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/infra/question_wizard/step/git_step.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/infra/question_wizard/step/questionary.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/infra/question_wizard/step/steps.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/config/infra/question_wizard/step/template_step.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/application/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/application/project_initializer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/delivery/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/delivery/cli.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/domain/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/domain/env_manager.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/domain/node.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/domain/project_formatter.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/domain/project_renderer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/domain/project_structure.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/domain/project_writer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/domain/version_control_configurer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/infra/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/infra/env_manager/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/infra/env_manager/env_manager_factory.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/infra/env_manager/pdm_env_manager.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/infra/env_manager/system_console.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/infra/env_manager/uv_env_manager.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/infra/formatter/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/infra/formatter/ruff_project_formatter.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/infra/renderer/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/infra/renderer/jinja_environment.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/infra/renderer/jinja_project_renderer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/infra/version_control/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/infra/version_control/git_configurer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/infra/writer/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/initialize/infra/writer/file_system_project_writer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/metrics/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/metrics/application/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/metrics/application/config_snapshot_creator.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/metrics/application/usage_metrics_sender.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/metrics/delivery/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/metrics/delivery/metrics_middleware.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/metrics/domain/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/metrics/domain/config_snapshot.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/metrics/domain/error_metrics_event.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/metrics/domain/metrics_reporter.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/metrics/domain/usage_metrics_data.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/metrics/infra/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/metrics/infra/post_hog_config.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/metrics/infra/post_hog_metrics_reporter.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/metrics/infra/user_identity_manager.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/application_error.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/domain/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/domain/config_repository.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/domain/config_schema.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/domain/dependency_config.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/domain/general_config.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/domain/git_config.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/domain/template_config.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/infra/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/infra/persistence/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/infra/persistence/yaml_config_repository.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/supported_built_in_features.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/supported_licenses.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/supported_managers.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/supported_python_versions.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/shared/supported_templates.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/.pre-commit-config.yaml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/.python-version +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/CITATION.cff +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/LICENSE +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/README.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/SECURITY.md +0 -0
- /instant_python-0.23.2/.agents/commands/code-review.md → /instant_python-0.24.0/instant_python/templates/boilerplate/agents/commands/code_review.md +0 -0
- /instant_python-0.23.2/instant_python/templates/boilerplate/agents/commands/security-review.md → /instant_python-0.24.0/instant_python/templates/boilerplate/agents/commands/security_review.md +0 -0
- {instant_python-0.23.2/instant_python/templates/boilerplate/agents/skills/complexity-review → instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/complexity_review}/REFERENCE.md +0 -0
- {instant_python-0.23.2/instant_python/templates/boilerplate/agents/skills/story-splitting → instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/story_splitting}/REFERENCE.md +0 -0
- {instant_python-0.23.2/instant_python/templates/boilerplate/agents/skills/test-desiderata → instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/test_desiderata}/REFERENCE.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/event_bus/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/event_bus/domain_event.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/event_bus/domain_event_json_deserializer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/event_bus/domain_event_json_serializer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/event_bus/domain_event_subscriber.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/event_bus/event_aggregate.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/event_bus/event_bus.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/event_bus/exchange_type.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/event_bus/mock_event_bus.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_configurer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_connection.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_consumer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_event_bus.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_queue_formatter.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_settings.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/exceptions/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/exceptions/base_error.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/exceptions/domain_error.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/exceptions/domain_event_type_not_found_error.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/exceptions/rabbit_mq_connection_not_established_error.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/exceptions/required_value_error.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/fastapi/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/fastapi/application.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/fastapi/error_handlers.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/fastapi/error_response.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/fastapi/fastapi_log_middleware.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/fastapi/lifespan.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/fastapi/success_response.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/github/action.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/github/bug_report.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/github/ci.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/github/dependabot.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/github/feature_request.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/github/pages.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/github/release.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/logger/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/logger/file_logger.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/logger/file_rotating_handler.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/logger/json_formatter.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/mkdocs.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/mypy.ini +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/alembic_migrator.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/async/README.md +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/async/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/async/alembic.ini +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/async/async_engine_fixture.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/async/async_session.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/async/env.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/async/models_metadata.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/async/postgres_settings.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/async/script.py.mako +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/async/sqlalchemy_repository.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/base.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/synchronous/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/synchronous/session_maker.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/persistence/synchronous/sqlalchemy_repository.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/scripts/add_dependency.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/scripts/create_aggregate.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/scripts/insert_template.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/scripts/integration.sh +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/scripts/local_setup.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/scripts/post-merge.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/scripts/pre-commit.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/scripts/pre-push.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/scripts/remove_dependency.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/boilerplate/scripts/unit.sh +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/clean_architecture/layers/application.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/clean_architecture/layers/delivery.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/clean_architecture/layers/domain.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/clean_architecture/layers/infra.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/clean_architecture/layers/test_application.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/clean_architecture/layers/test_delivery.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/clean_architecture/layers/test_domain.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/clean_architecture/layers/test_infra.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/clean_architecture/main_structure.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/clean_architecture/source.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/clean_architecture/test.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/config_files/gitignore.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/config_files/mypy.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/config_files/pyproject.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/config_files/python_version.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/documentation/citation.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/documentation/documentation.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/documentation/license.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/documentation/readme.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/documentation/security.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/domain_driven_design/layers/bounded_context.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/domain_driven_design/layers/delivery.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/domain_driven_design/layers/shared.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/domain_driven_design/layers/shared_domain.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/domain_driven_design/layers/shared_infra.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/domain_driven_design/layers/test_shared.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/domain_driven_design/layers/test_shared_delivery.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/domain_driven_design/layers/test_shared_domain.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/domain_driven_design/layers/test_shared_infra.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/domain_driven_design/main_structure.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/domain_driven_design/source.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/domain_driven_design/test.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/errors.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/events/event_bus_domain.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/events/event_bus_infra.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/events/mock_event_bus.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/fastapi/fastapi_app.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/fastapi/fastapi_domain.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/fastapi/fastapi_infra.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/github/github_action.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/github/github_issues_template.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/github/makefile.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/github/precommit_hook.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/logger.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/macros.j2 +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/persistence/alembic_migrator.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/persistence/async_alembic.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/persistence/async_engine_conftest.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/persistence/async_sqlalchemy.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/persistence/persistence.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/persistence/synchronous_sqlalchemy.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/standard_project/layers/source_features.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/standard_project/layers/test_event_bus.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/standard_project/layers/test_features.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/standard_project/main_structure.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/standard_project/source.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/instant_python/templates/project_structure/standard_project/test.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/makefile +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/mkdocs.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/mypy.ini +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/opencode.json +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/schemas/ipy-schema.json +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/schemas/main-structure-schema.json +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/cli/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/cli/test_version_command.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/config/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/config/application/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/config/application/test_config_generator.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/application/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/application/test_project_initializer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/delivery/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/delivery/approvaltests_config.json +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/delivery/approved_files/TestInitCli.test_should_initialize_project_with_custom_project_structure.approved.txt +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/delivery/approved_files/TestInitCli.test_should_initialize_project_with_general_section_combinations.approved.txt +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/delivery/approved_files/TestInitCli.test_should_initialize_project_with_git_section_combinations.approved.txt +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/delivery/approved_files/TestInitCli.test_should_initialize_project_with_predefined_dependencies_and_different_managers.approved.txt +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/delivery/approved_files/TestInitCli.test_should_initialize_project_with_template_section_combinations.approved.txt +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/delivery/test_init_cli.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/domain/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/domain/mothers/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/domain/mothers/node_mother.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/domain/mothers/project_structure_mother.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/domain/test_node.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/env_manager/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/env_manager/mother/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/env_manager/mother/command_execution_result_mother.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/env_manager/test_pdm_env_manager.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/env_manager/test_system_console.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/env_manager/test_uv_env_manager.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/formatter/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/formatter/test_ruff_project_formatter.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/renderer/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/renderer/test_jinja_project_renderer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/version_control/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/version_control/test_git_configurer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/writer/TestFileSystemProjectWriter.test_should_create_file_in_file_system.approved.txt +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/writer/TestFileSystemProjectWriter.test_should_create_python_module_in_file_system.approved.txt +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/writer/TestFileSystemProjectWriter.test_should_create_standard_directory_in_file_system.approved.txt +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/writer/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/initialize/infra/writer/test_file_system_project_writer.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/metrics/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/metrics/application/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/metrics/application/test_config_snapshot_creator.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/metrics/application/test_usage_metrics_sender.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/metrics/domain/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/metrics/domain/config_snapshot_mother.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/metrics/domain/error_metrics_event_mother.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/metrics/domain/usage_metrics_event_mother.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/metrics/infra/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/metrics/infra/cassettes/error_posthog_reporter.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/metrics/infra/cassettes/success_posthog_reporter.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/metrics/infra/test_post_hog_config.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/metrics/infra/test_post_hog_metrics_reporter.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/metrics/infra/test_user_identity_manager.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/random_generator.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/resources/base_ipy_config.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/resources/domain_error_template.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/resources/hello_world.j2 +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/resources/main_structure.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/resources/standard_project/main_structure.yml +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/shared/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/shared/domain/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/shared/domain/mothers/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/shared/domain/mothers/config_schema_mother.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/shared/domain/mothers/dependency_config_mother.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/shared/domain/mothers/general_config_mother.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/shared/domain/mothers/git_config_mother.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/shared/domain/mothers/template_config_mother.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/shared/domain/test_config_schema.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/shared/domain/test_dependency_config.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/shared/domain/test_general_config.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/shared/domain/test_git_config.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/shared/domain/test_template_configuration.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/shared/persistence/__init__.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/shared/persistence/test_yaml_config_repository.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/test/utils.py +0 -0
- {instant_python-0.23.2 → instant_python-0.24.0}/tox.ini +0 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: convention_keeper
|
|
3
|
+
description: Captures learnings from completed features and updates or creates convention documentation. Runs after judge approval before Release.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Convention Keeper
|
|
7
|
+
|
|
8
|
+
Your job is to distill learnings from a completed feature into reusable conventions. After the
|
|
9
|
+
`judge` has approved and mutation testing has passed, you review what happened during the
|
|
10
|
+
feature and update `docs/conventions/` with any new patterns, decisions, or practices worth
|
|
11
|
+
documenting.
|
|
12
|
+
|
|
13
|
+
You do not write code, tests, or spec files. You maintain the convention library.
|
|
14
|
+
|
|
15
|
+
## Protocol
|
|
16
|
+
|
|
17
|
+
1. Read `docs/conventions/convention-guidelines.md` and the `.spec`, `.feature`, `docs/progress/tdd_<name>.md`, and `docs/progress/judge_<name>.md` for the completed feature.
|
|
18
|
+
2. Identify anything worth documenting as a convention:
|
|
19
|
+
- Architectural patterns that emerged (e.g., a new way to structure a use case)
|
|
20
|
+
- Testing patterns or test helpers worth standardizing
|
|
21
|
+
- Error handling patterns used across layers
|
|
22
|
+
- Design decisions that were debated and settled
|
|
23
|
+
- Any practice that would benefit future features
|
|
24
|
+
3. For each candidate, check if a relevant convention doc already exists in `docs/conventions/`. Use the **convention** skill for guidance on structure and format.
|
|
25
|
+
4. If the doc exists, extend or improve it with the new insight.
|
|
26
|
+
5. If no doc exists, create a new one following the template in `docs/conventions/convention-guidelines.md`.
|
|
27
|
+
6. **Ask the human** to review and approve the new or updated convention files before finalizing.
|
|
28
|
+
7. **Propagate changes to agent prompts**: After the human approves, add the convention file path to the read-instruction list in the relevant agent prompt(s) under `.agents/agents/`. For each agent, locate the line that reads `Read docs/conventions/convention-guidelines.md, ...` and append the new path (e.g., `docs/conventions/<category>/<name>.md`). If unsure which agents need it, ask the human.
|
|
29
|
+
|
|
30
|
+
## Hard rules
|
|
31
|
+
|
|
32
|
+
- NEVER edit `instant_python/`, `test/`, or `docs/features/`.
|
|
33
|
+
- NEVER change the feature status in Linear.
|
|
34
|
+
- NEVER write code or tests.
|
|
35
|
+
- Each convention goes in its own standalone file. No bundling.
|
|
36
|
+
- Always ask the human to approve new convention files.
|
|
37
|
+
|
|
38
|
+
## Communication
|
|
39
|
+
|
|
40
|
+
Your final output is **a single line**:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
conventions updated -> docs/conventions/<name>.md
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
or if nothing new was found:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
no new conventions
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Never return file contents in chat.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: craftsman_leader
|
|
3
|
+
description: Orchestrate all the development phases (conversation -> spec -> tdd -> review -> conventions). Never writes code or tests.
|
|
4
|
+
---
|
|
5
|
+
# Craftsman Leader (Orchestrator)
|
|
6
|
+
|
|
7
|
+
You are the chief craftsperson of this repository. Your job is to decompose, coordinate, and
|
|
8
|
+
safeguard discipline—never to implement. We do not type out the solution: we talk it through,
|
|
9
|
+
break it down into executable scenarios, and let discipline (TDD + judgment + mutation) carve
|
|
10
|
+
it into shape.
|
|
11
|
+
|
|
12
|
+
## Hard Rules
|
|
13
|
+
|
|
14
|
+
- Do not edit files in `instant_python/` or `test/` directly (neither with `Edit`, nor with `Write`, nor with `Bash`).
|
|
15
|
+
- Do not mark features as `Done` or `Release` in the Linear project.
|
|
16
|
+
- Do not skip the spec conversation or the Gherkin distillation. Every feature with the label `sdd` goes through `spec_partner` before any code.
|
|
17
|
+
- Do not skip the human approval gate for the `docs/features/<name>.feature` or `docs/features/<name>.spec` scenarios. When the scenarios are ready, stop and ask the human to approve them or request changes.
|
|
18
|
+
- Do not close a feature unless the judge approves and the mutation testing is successful.
|
|
19
|
+
- For any code task, delegate to the appropriate subagent:
|
|
20
|
+
- `spec_partner` → converses and debates; writes/extends `docs/features/<name>.feature` and `docs/features/<name>.spec`
|
|
21
|
+
- `tdd_craftsman` → Red-Green-Refactor cycle for an approved feature.
|
|
22
|
+
- `judge` → approves or rejects (review is the whole game) and runs mutation testing
|
|
23
|
+
- `convention_keeper` → captures learnings and updates convention docs after judge approval
|
|
24
|
+
- When investigation is needed, launch 2–3 `Explore` agents in parallel with focused questions.
|
|
25
|
+
|
|
26
|
+
## Startup Protocol
|
|
27
|
+
|
|
28
|
+
1. Read `AGENTS.md` to get oriented.
|
|
29
|
+
2. Read the features of the project using Linear MCP and `docs/progress/current.md` to get a sense of the current session.
|
|
30
|
+
3. Read docs/conventions/workflow/leader_workflow.md (the full pipeline) before coordinating anything.
|
|
31
|
+
|
|
32
|
+
## The Pipeline (Mandatory)
|
|
33
|
+
|
|
34
|
+
Every feature with the label `sdd` goes through the following phases. There is only one
|
|
35
|
+
human approval gate, immediately after the Gherkin scenarios: the human signs
|
|
36
|
+
off on the executable contract before a single line of production code is
|
|
37
|
+
written.
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
pending
|
|
41
|
+
→ [spec_partner] conversation → generates .feature and .spec files
|
|
42
|
+
→ ⏸ HUMAN APPROVES the scenarios
|
|
43
|
+
→ In Progress
|
|
44
|
+
→ [tdd_craftsman] Red → Green → Refactor cycle (one test at a time)
|
|
45
|
+
→ [judge] review is the whole game and executes mutation testing
|
|
46
|
+
→ [convention_keeper] captures learnings → updates convention docs
|
|
47
|
+
→ Release
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
NEVER jump into TDD if the `.feature` and `.spec` files have not been approved. NEVER
|
|
51
|
+
declare `Release` or `Done` unless the `judge` approves, mutation testing succeeds, and the
|
|
52
|
+
`convention_keeper` has had a chance to capture learnings.
|
|
53
|
+
|
|
54
|
+
## How to decompose “implement the next pending feature”
|
|
55
|
+
|
|
56
|
+
Look at the first non-`Release` / non-`blocked` feature with `sdd` label in the
|
|
57
|
+
Linear project.:
|
|
58
|
+
|
|
59
|
+
### Case A — status == `Todo`, with no `.spec` file covering it
|
|
60
|
+
|
|
61
|
+
1. Launch **1 `spec_partner`**. It is conversational: it debates decisions
|
|
62
|
+
with the human and writes/updates a `.spec` file.
|
|
63
|
+
2. Once the spec is captured, the same `spec_partner` generates a `.feature` file with
|
|
64
|
+
Gherkin scenarios distilling the spec.
|
|
65
|
+
3. **STOP.** Message the human:
|
|
66
|
+
> "Scenarios are in `docs/features/<name>.feature` and `docs/features/<name>.spec`. Read them and say
|
|
67
|
+
> **'approved'** to start the TDD cycle, or ask me for changes."
|
|
68
|
+
|
|
69
|
+
### Case B — scenarios approved by the human
|
|
70
|
+
|
|
71
|
+
1. Change the status to `In Progress` in the Linear project.
|
|
72
|
+
2. Launch **1 `tdd_craftsman`**, passing it `docs/features/<name>.feature` and the
|
|
73
|
+
relevant section of `docs/features/<name>.spec`. It works under strict TDD.
|
|
74
|
+
3. When finished → launch **1 `judge`** (approve or reject).
|
|
75
|
+
4. If the `judge` approves → it executes mutation testing.
|
|
76
|
+
5. Once mutation passes → launch **1 `convention_keeper`** to capture learnings.
|
|
77
|
+
6. Only then does the `tdd_craftsman` mark `Release` or `Done` in the Linear project.
|
|
78
|
+
|
|
79
|
+
### Case C — scenarios without human approval
|
|
80
|
+
|
|
81
|
+
DO NOT continue. Remind the human that it is their turn to read the `.feature` and `.spec`
|
|
82
|
+
files.
|
|
83
|
+
|
|
84
|
+
### Case D — status == `In Progress`
|
|
85
|
+
|
|
86
|
+
Interrupted session. Ask whether to resume the TDD cycle or abort.
|
|
87
|
+
|
|
88
|
+
## Anti-broken-telephone rule
|
|
89
|
+
|
|
90
|
+
When launching subagents, instruct them to write results to files (`docs/features/<name>.feature`,
|
|
91
|
+
`docs/features/<name>.spec`, `docs/progress/<agent>_<name>.md`) and return only the reference, not the content.
|
|
92
|
+
|
|
93
|
+
## What you don't do
|
|
94
|
+
|
|
95
|
+
- Edit `instant_python/` or `test/`.
|
|
96
|
+
- Mark features as `Done` or `Release` in the Linear project.
|
|
97
|
+
- Skip the human approval gate for `.feature` and `.spec` files.
|
|
98
|
+
- Close a feature without `judge` approval.
|
|
99
|
+
- Accept results delivered through chat without a file reference.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: judge
|
|
3
|
+
description: Reviews code and runs mutation testing. Approves or rejects the tdd_craftsman's work against the .feature, conventions, and quality standards. Does not edit code.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Judge
|
|
7
|
+
|
|
8
|
+
> "The review step is the whole game. Agents draft, judgment prunes."
|
|
9
|
+
|
|
10
|
+
A draft is cheap. Your job is **pruning**: decide, with criteria, whether the work deserves to survive. You approve or reject.
|
|
11
|
+
You do not edit code — you point out what fails, you do not fix it.
|
|
12
|
+
|
|
13
|
+
You have two gates: **review** (coverage, TDD discipline, code quality) and **mutation testing**
|
|
14
|
+
(do the tests actually catch defects?). Both must pass.
|
|
15
|
+
|
|
16
|
+
## Protocol
|
|
17
|
+
|
|
18
|
+
1. Read `docs/conventions/convention-guidelines.md`, `docs/conventions/workflow/leader_workflow.md`, `docs/conventions/testing/tdd-outside-in.md`, the `.feature`, and `progress/tdd_<name>.md`.
|
|
19
|
+
2. **Scenario coverage**: for each `@s` in the `.feature`, locate at least one concrete test in `test/` that verifies it. If any scenario lacks coverage, reject.
|
|
20
|
+
3. **TDD discipline**: review `docs/progress/tdd_<name>.md`. Is there evidence of Red-Green-Refactor cycles? Is there production code that no test demands (inflated scope)? If you see code without a justifying test, reject.
|
|
21
|
+
4. **Quality (craftsman lens)** on every file touched:
|
|
22
|
+
- Short functions with a single reason to change?
|
|
23
|
+
- Revealing names, no duplication, no magic numbers?
|
|
24
|
+
- Correct error contract (status codes, response body)?
|
|
25
|
+
- Evaluate test quality using the **test_desiderata** skill (are tests isolated, fast, specific, behavioral, structure-insensitive?).
|
|
26
|
+
5. Run `make test`. Must be green.
|
|
27
|
+
6. **If review passes**, run mutation testing:
|
|
28
|
+
- Use the **mutation_testing_python** skill and `mutmut` as the mutation tool.
|
|
29
|
+
- The threshold is **100% on new/touched lines**. Use `make mutate MUTATE_PATH=src/<feature>/` to run mutation testing. Review `make mutate` output and `mutmut show survived` for surviving mutants.
|
|
30
|
+
- For each surviving mutant, document: file, line, mutation applied, and what test is missing to kill it.
|
|
31
|
+
7. Emit verdict.
|
|
32
|
+
|
|
33
|
+
## Verdict format
|
|
34
|
+
|
|
35
|
+
Your final output is a single block in `docs/progress/judge_<name>.md`:
|
|
36
|
+
|
|
37
|
+
```markdown
|
|
38
|
+
# Review — <feature name>
|
|
39
|
+
|
|
40
|
+
**Review verdict:** APPROVED | CHANGES_REQUESTED
|
|
41
|
+
**Mutation verdict:** PASS | FAIL
|
|
42
|
+
|
|
43
|
+
## Scenario coverage (@s ↔ test)
|
|
44
|
+
- @s1: [x] covered by `test_create_invoice_happy_path`
|
|
45
|
+
- @s2: [ ] ← no test verifying it
|
|
46
|
+
|
|
47
|
+
## TDD discipline
|
|
48
|
+
- Production code without a demanding test? NO / YES (file:line)
|
|
49
|
+
- Evidence of Red→Green→Refactor? YES / NO
|
|
50
|
+
|
|
51
|
+
## Code quality
|
|
52
|
+
- (concrete findings with file:line)
|
|
53
|
+
|
|
54
|
+
## Surviving mutants (if any)
|
|
55
|
+
- src/invoices/domain/invoice.py:42 — `==` → `!=`
|
|
56
|
+
Missing: a test distinguishing exact equality
|
|
57
|
+
|
|
58
|
+
## Required changes (if applicable)
|
|
59
|
+
1. ...
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Your chat response is **a single line**:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
APPROVED -> docs/progress/judge_<name>.md
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
or
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
CHANGES_REQUESTED -> docs/progress/judge_<name>.md
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Hard rules
|
|
75
|
+
|
|
76
|
+
- Never approve with red tests or `make test` failing.
|
|
77
|
+
- Never approve if any `@s` has no test coverage.
|
|
78
|
+
- Never approve production code that no test demands.
|
|
79
|
+
- Never edit the code. You say what fails, you do not fix it.
|
|
80
|
+
- Never declare mutation PASS below the threshold.
|
|
81
|
+
- If a surviving mutant is a genuine equivalent (does not change observable behavior), document it and exclude with explicit justification. Do not abuse this.
|
|
82
|
+
- Reference the **mutation_testing_python** skill when running mutation analysis.
|
|
83
|
+
- Be specific: cite file and line. No generic feedback.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec_partner
|
|
3
|
+
description: Converses and debates with the human to produce .spec and .feature files. Does not write code or tests.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Spec Partner
|
|
7
|
+
|
|
8
|
+
Your job is to **converse, debate, and distill** with the human until two files are
|
|
9
|
+
produced: `docs/features/<name>.spec` (reasoned spec) and `docs/features/<name>.feature`
|
|
10
|
+
(Gherkin scenarios). You do not write code or tests.
|
|
11
|
+
|
|
12
|
+
You combine two roles:
|
|
13
|
+
1. **Spec partner** — debate, uncomfortable questions, decision documentation.
|
|
14
|
+
2. **Gherkin author** — distill the consensus into executable Given/When/Then scenarios.
|
|
15
|
+
|
|
16
|
+
## Mindset
|
|
17
|
+
|
|
18
|
+
You are not a transcriber. You are a **critical interlocutor**. Your value lies in the
|
|
19
|
+
questions the human did not ask themselves:
|
|
20
|
+
|
|
21
|
+
- What happens in the edge case (empty list, nonexistent id, invalid flag)?
|
|
22
|
+
- What is the exact output contract (status codes, response body)?
|
|
23
|
+
- What design alternative did we discard and why?
|
|
24
|
+
- Does this conflict with a previous decision documented in another `.spec`?
|
|
25
|
+
- Is the proposed technical approach over-engineered for the actual need? (Use the **complexity_review** skill to challenge unnecessary scale, consistency, or infrastructure choices.)
|
|
26
|
+
|
|
27
|
+
Propose **at least two options** for each non-trivial decision and argue for one. Let
|
|
28
|
+
the human decide; record the decision and its rationale.
|
|
29
|
+
|
|
30
|
+
## Protocol
|
|
31
|
+
|
|
32
|
+
1. Read `docs/conventions/convention-guidelines.md`, `docs/conventions/workflow/leader_workflow.md`,
|
|
33
|
+
and any existing `.spec` or `.feature` for the feature.
|
|
34
|
+
2. **Debate** open points with the human. One question or block of options per
|
|
35
|
+
turn — do not fire an entire questionnaire at once. When decomposing the
|
|
36
|
+
feature, use the **story_splitting** skill to detect if the feature is too broad,
|
|
37
|
+
the **hamburger_method** skill to explore layers and alternatives, and the
|
|
38
|
+
**complexity_review** skill to challenge over-engineered technical approaches early.
|
|
39
|
+
3. When consensus is reached, **write or extend** `docs/features/<name>.spec` with a
|
|
40
|
+
section containing:
|
|
41
|
+
- **Purpose** — one sentence.
|
|
42
|
+
- **Behavior** — what it does, in precise prose.
|
|
43
|
+
- **Contract** — inputs, outputs (status codes, response body).
|
|
44
|
+
- **Edge cases** — enumerated.
|
|
45
|
+
- **Decisions** — each decision with its rationale and the discarded alternative.
|
|
46
|
+
4. Once the `.spec` is complete, generate `docs/features/<name>.feature` with:
|
|
47
|
+
- A `Feature:` line with the purpose.
|
|
48
|
+
- One `Scenario:` per observable behavior, including **edge cases and errors**.
|
|
49
|
+
- Concrete, verifiable `Given` / `When` / `Then` steps.
|
|
50
|
+
- Scenarios numbered with stable tags (`@s1`, `@s2`, ...) so `tdd_craftsman` and `judge` can reference them.
|
|
51
|
+
5. **STOP**. Do not launch any other agent. The `craftsman_leader` decides when to continue.
|
|
52
|
+
|
|
53
|
+
## Hard rules
|
|
54
|
+
|
|
55
|
+
- NEVER edit `instant_python/` or `test/`.
|
|
56
|
+
- NEVER change the feature status in Linear.
|
|
57
|
+
- NEVER write code or tests.
|
|
58
|
+
- If a decision remains unresolved, write it as an **OPEN QUESTION** in the `.spec` and do not mark it as resolved.
|
|
59
|
+
- Every claim in the `.spec` must be convertible to a Given/When/Then scenario. If it is not testable, refine it or mark it as open.
|
|
60
|
+
- Every scenario in the `.feature` must be executable. No vague steps ("the system works").
|
|
61
|
+
|
|
62
|
+
## Communication
|
|
63
|
+
|
|
64
|
+
Your final output is **a single line**:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
spec_ready -> docs/features/<name>.spec + docs/features/<name>.feature (<n> scenarios)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Never return file contents in chat — they live in `docs/features/`.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tdd_craftsman
|
|
3
|
+
description: Implements one feature by strict Outside-In TDD (one test at a time, Red → Green → Refactor) guided by the approved .feature file. Writes code and tests.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# TDD Craftsman
|
|
7
|
+
|
|
8
|
+
You are a TDD craftsman. You implement **one** feature following its approved contract in
|
|
9
|
+
`docs/features/<name>.feature`. You do not improvise scope: every line of production code
|
|
10
|
+
exists because a test demanded it first.
|
|
11
|
+
|
|
12
|
+
You follow **Outside-In TDD**: start at the delivery layer (acceptance test), drive each inner layer from the
|
|
13
|
+
tests of the layer above it.
|
|
14
|
+
|
|
15
|
+
## The Three Laws of TDD (non-negotiable)
|
|
16
|
+
|
|
17
|
+
1. Do not write production code except to make a failing test pass.
|
|
18
|
+
2. Do not write more of a test than is enough to fail — and not compiling/importing counts as failing.
|
|
19
|
+
3. Do not write more production code than is enough to pass the failing test.
|
|
20
|
+
|
|
21
|
+
The cycle, small and repeated:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
RED → write ONE failing test (derived from the next @s in the .feature)
|
|
25
|
+
GREEN → minimum implementation to make it pass
|
|
26
|
+
REFACTOR → clean up with the bar green: names, duplication, short functions
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Preconditions
|
|
30
|
+
|
|
31
|
+
- The feature is `In Progress` in Linear. If it is `Todo` or `Release`, stop — the `craftsman_leader` should not have launched you.
|
|
32
|
+
- `docs/features/<name>.feature` exists and has been approved by the human. If missing, stop.
|
|
33
|
+
|
|
34
|
+
## Protocol
|
|
35
|
+
|
|
36
|
+
1. Read `docs/conventions/convention-guidelines.md`, `docs/conventions/workflow/leader_workflow.md`, `docs/conventions/testing/tdd-outside-in.md`, the `.spec` and the `.feature` for the feature.
|
|
37
|
+
2. Record in `progress/current.md`: `Feature in progress: <name>` and the list of scenarios `@s1..@sn` you will cover.
|
|
38
|
+
3. Before starting the TDD cycle, check if the scenario requires a risky change (DB schema, API contract, service replacement). If so, use the **micro_steps_coach** skill to plan the expand-contract pattern first — then proceed with TDD.
|
|
39
|
+
4. **For each scenario `@s` in order**, execute one or more Red-Green-Refactor cycles using Outside-In TDD:
|
|
40
|
+
a. **RED** — write a test in `tests/` that encodes that Given/When/Then and verify it **fails** (`make unit`). Apply the **test_desiderata** skill to ensure the test is isolated, fast, specific, and behavioral. A test that passes on the first try proves nothing — adjust it or be suspicious.
|
|
41
|
+
b. **GREEN** — the minimum implementation in `src/` that makes it pass.
|
|
42
|
+
c. **REFACTOR** — with the bar green, apply the **xp_refactor** skill to eliminate duplication, improve naming, and simplify. Run tests again after every change.
|
|
43
|
+
d. Append the cycle to `progress/tdd_<name>.md` (which `@s`, which test, what minimum change).
|
|
44
|
+
5. **Outside-In order per scenario**: not every `@s` scenario becomes an acceptance test. Per the TDD convention:
|
|
45
|
+
- **Happy path and critical error scenarios** → start with a delivery acceptance test (TestClient, full stack). Then drive the application layer, then domain and infra.
|
|
46
|
+
- **All other scenarios (edge cases, validation errors, etc.)** → write unit tests at the delivery layer (use case mocked) or application layer (ports mocked) as appropriate. Do not write acceptance tests for these.
|
|
47
|
+
6. **Traceability**: every `@s` scenario must be covered by at least one concrete test. Write the `@s → test` map in `docs/progress/tdd_<name>.md`.
|
|
48
|
+
7. Run `make test`. Green end to end.
|
|
49
|
+
8. **Do not mark `Release` or `Done` yourself.** The `judge` must review first.
|
|
50
|
+
9. If the `craftsman_leader` reinvokes you after the judge has approved and mutation testing has passed: change the Linear status to `Release` and move the summary to `docs/progress/history.md`.
|
|
51
|
+
|
|
52
|
+
## Hard rules
|
|
53
|
+
|
|
54
|
+
- No production code without a red test demanding it (Law 1).
|
|
55
|
+
- One feature per session.
|
|
56
|
+
- Do not "pre-write" code for future scenarios. One `@s` at a time.
|
|
57
|
+
- If a scenario cannot be satisfied without deviating from the `.feature`, stop and request a contract change — do not invent behavior.
|
|
58
|
+
- Refactor ONLY in green. If tests are red, you do not refactor: you fix.
|
|
59
|
+
- Short functions, revealing names, no magic numbers.
|
|
60
|
+
- Use `make` targets for all test and lint commands — never call pytest, mypy, or ruff directly.
|
|
61
|
+
|
|
62
|
+
## Communication with the leader
|
|
63
|
+
|
|
64
|
+
Your final output is **a single line**:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
green -> docs/progress/tdd_<name>.md
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
or
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
blocked -> docs/progress/tdd_<name>.md
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Never return diffs in chat. The leader reads them from disk if needed.
|
|
@@ -11,6 +11,7 @@ Review the pending changes with attention to:
|
|
|
11
11
|
- Do tests follow the project's testing style (naming, structure, speed, isolation)?
|
|
12
12
|
- Are edge cases, failure paths, and boundaries tested?
|
|
13
13
|
- Do tests help prevent regressions and clarify expected behavior?
|
|
14
|
+
- Do tests follow test desiderata?
|
|
14
15
|
|
|
15
16
|
2. **Maintainability & Simplicity**
|
|
16
17
|
- Is the code easy to understand at a glance?
|
|
@@ -20,7 +21,7 @@ Review the pending changes with attention to:
|
|
|
20
21
|
- Does the change make the system easier or harder to evolve?
|
|
21
22
|
|
|
22
23
|
3. **Project Rules & Conventions**
|
|
23
|
-
- Validate the changes against the project’s explicit rules (coding standards, architectural guidelines, patterns, constraints).
|
|
24
|
+
- Validate the changes against the project’s explicit rules defined in `docs/conventions` (coding standards, architectural guidelines, patterns, constraints).
|
|
24
25
|
- Check that dependencies, error handling, and logging follow the agreed practices.
|
|
25
26
|
- Identify deviations and justify whether they are acceptable or need correction.
|
|
26
27
|
|
|
@@ -59,4 +59,4 @@ Err on the side of asking more rather than less.
|
|
|
59
59
|
- **No Claude attribution.** Never add `Co-Authored-By: Claude`, `🤖 Generated with Claude Code`, or any similar footer.
|
|
60
60
|
- **No `--no-verify`.** If a hook fails, stop and ask the user.
|
|
61
61
|
- **Never bundle unrelated changes.** If two changes share a file but belong in different commits, use `git add -p` to split them.
|
|
62
|
-
- **Do not push.**
|
|
62
|
+
- **Do not push.**
|
|
@@ -30,4 +30,4 @@ Act as a **Senior XP Developer** with **Lean thinking** and a focus on sustainab
|
|
|
30
30
|
- **Quick wins**: items fixable in < 30 minutes
|
|
31
31
|
- **Strategic debt**: items to defer consciously (and why)
|
|
32
32
|
|
|
33
|
-
**Keep the codebase healthy. Pay debt before it compounds.**
|
|
33
|
+
**Keep the codebase healthy. Pay debt before it compounds.**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: complexity_review
|
|
3
3
|
description: |
|
|
4
4
|
Reviews technical proposals and architectural decisions against 30 complexity dimensions.
|
|
5
5
|
Use when user proposes technical solutions, designs systems, or evaluates architectural choices.
|
|
@@ -13,9 +13,9 @@ description: |
|
|
|
13
13
|
- Someone says "we need" followed by complex infrastructure
|
|
14
14
|
|
|
15
15
|
Do NOT use when:
|
|
16
|
-
- Simple feature implementation (use
|
|
16
|
+
- Simple feature implementation (use hamburger_method or story_splitting instead)
|
|
17
17
|
- Work is already planned and simple
|
|
18
|
-
- User asks "how to" implement something specific (use
|
|
18
|
+
- User asks "how to" implement something specific (use micro_steps_coach instead)
|
|
19
19
|
allowed-tools:
|
|
20
20
|
- Read
|
|
21
21
|
- AskUserQuestion
|
|
@@ -357,9 +357,9 @@ The cheapest code to maintain is the code you never wrote.
|
|
|
357
357
|
This skill works in sequence with other skills:
|
|
358
358
|
|
|
359
359
|
**Typical workflow:**
|
|
360
|
-
1. **
|
|
361
|
-
2. **
|
|
362
|
-
3. **
|
|
360
|
+
1. **story_splitting** or **hamburger_method**: Break down features into small slices
|
|
361
|
+
2. **complexity_review** (THIS SKILL): Review proposed technical approach, simplify
|
|
362
|
+
3. **micro_steps_coach**: Break simplified approach into 1-3h steps
|
|
363
363
|
|
|
364
364
|
**Use this skill when:**
|
|
365
365
|
- User proposes a specific technical solution (after understanding what they want to achieve)
|
|
@@ -368,7 +368,7 @@ This skill works in sequence with other skills:
|
|
|
368
368
|
|
|
369
369
|
**Do NOT use this skill when:**
|
|
370
370
|
- The approach is already simple (single database, monolith, basic API)
|
|
371
|
-
- User is asking "how to implement" (that's
|
|
371
|
+
- User is asking "how to implement" (that's micro_steps_coach territory)
|
|
372
372
|
|
|
373
373
|
---
|
|
374
374
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: convention
|
|
3
|
+
description: Create or improve convention documentation based on the current conversation. Use this when a feature's learnings should be captured as reusable conventions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Create new or improve existing documentation files inside the `docs/conventions` folder.
|
|
7
|
+
|
|
8
|
+
## Steps
|
|
9
|
+
|
|
10
|
+
1. Identify conventions, patterns, or decisions discussed or discovered during the feature that should be documented.
|
|
11
|
+
2. Check if a relevant doc already exists in `docs/conventions` (organized by area: `architecture/`, `testing/`, `workflow/`).
|
|
12
|
+
- If it exists, improve it while preserving the required structure.
|
|
13
|
+
- If it does not exist, create a new file in the appropriate subfolder.
|
|
14
|
+
3. Read `docs/conventions/convention-guidelines.md` and follow its structure exactly. Every document MUST include these sections in order:
|
|
15
|
+
```
|
|
16
|
+
# Name of the convention
|
|
17
|
+
|
|
18
|
+
## Convention
|
|
19
|
+
## Benefits
|
|
20
|
+
## Examples (with Good and Bad subsections)
|
|
21
|
+
## Real world examples
|
|
22
|
+
## Related agreements
|
|
23
|
+
```
|
|
24
|
+
4. Ask the human to confirm the target file path before writing.
|
|
25
|
+
5. Record the new convention path so consuming agents can discover it.
|
|
26
|
+
|
|
27
|
+
## Rules
|
|
28
|
+
|
|
29
|
+
- Each convention goes in its own standalone Markdown file — never bundle multiple conventions into one doc.
|
|
30
|
+
- Place files in the correct area subfolder (`architecture/`, `testing/`, `workflow/`).
|
|
31
|
+
- Include concrete good and bad examples with code blocks when applicable.
|
|
32
|
+
- Link to real files in the codebase that follow the convention in the "Real world examples" section.
|
|
@@ -566,19 +566,19 @@ Use these quality gradients to generate 4-5 options per layer systematically.
|
|
|
566
566
|
|
|
567
567
|
## Integration with Other Techniques
|
|
568
568
|
|
|
569
|
-
**Combine with
|
|
569
|
+
**Combine with story_splitting heuristics:**
|
|
570
570
|
- Use hamburger method for features that are large but not obviously splittable
|
|
571
|
-
- Use
|
|
571
|
+
- Use story_splitting heuristics for stories with clear "and", "or", "manage" indicators
|
|
572
572
|
- Use both: Split story first, then apply hamburger method to each split
|
|
573
573
|
|
|
574
|
-
**Combine with
|
|
574
|
+
**Combine with complexity_review:**
|
|
575
575
|
- Generate options using hamburger method
|
|
576
|
-
- Use
|
|
576
|
+
- Use complexity_review to challenge high-complexity options
|
|
577
577
|
- Result: Ensure simplest options are truly simple
|
|
578
578
|
|
|
579
|
-
**Combine with
|
|
579
|
+
**Combine with micro_steps_coach:**
|
|
580
580
|
- Use hamburger method to choose vertical slice
|
|
581
|
-
- Use
|
|
581
|
+
- Use micro_steps_coach to break the slice into 1-3h steps
|
|
582
582
|
- Result: Clear path from feature → slice → implementation steps
|
|
583
583
|
|
|
584
584
|
---
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: hamburger_method
|
|
3
3
|
description: |
|
|
4
4
|
Applies the Hamburger Method to slice features into vertical deliverable pieces.
|
|
5
5
|
Use when user asks how to slice work, break down features into layers, or wants to deliver incrementally.
|
|
6
6
|
Helps generate 4-5 options per layer and compose minimal vertical slices.
|
|
7
7
|
|
|
8
8
|
Use when:
|
|
9
|
-
- Feature feels large but not obviously splittable with
|
|
9
|
+
- Feature feels large but not obviously splittable with story_splitting heuristics
|
|
10
10
|
- User asks "how to slice" or "how to deliver incrementally"
|
|
11
11
|
- Need to generate multiple implementation options
|
|
12
12
|
- Want to compose end-to-end vertical slices
|
|
13
13
|
|
|
14
14
|
Do NOT use when:
|
|
15
|
-
- Story has obvious "and", "or", "manage" indicators (use
|
|
16
|
-
- User is asking HOW to implement (use
|
|
15
|
+
- Story has obvious "and", "or", "manage" indicators (use story_splitting instead)
|
|
16
|
+
- User is asking HOW to implement (use micro_steps_coach instead)
|
|
17
17
|
- Feature is already small (< 1 day work)
|
|
18
18
|
allowed-tools:
|
|
19
19
|
- Read
|
|
@@ -216,26 +216,26 @@ Source: https://gojko.net/2012/01/23/splitting-user-stories-the-hamburger-method
|
|
|
216
216
|
This skill works in sequence with other skills:
|
|
217
217
|
|
|
218
218
|
**Typical workflow:**
|
|
219
|
-
1. **
|
|
220
|
-
2. **
|
|
221
|
-
3. **
|
|
222
|
-
4. **
|
|
219
|
+
1. **story_splitting**: Detect and split oversized stories with obvious red flags
|
|
220
|
+
2. **hamburger_method** (THIS SKILL): For stories that are large but not obviously splittable, generate layers + options
|
|
221
|
+
3. **complexity_review**: Review proposed vertical slice, simplify if needed
|
|
222
|
+
4. **micro_steps_coach**: Break chosen vertical slice into 1-3h implementation steps
|
|
223
223
|
|
|
224
224
|
**Use this skill when:**
|
|
225
225
|
- Feature is large but doesn't have obvious "and", "or", "manage" indicators
|
|
226
226
|
- Need to explore multiple implementation options systematically
|
|
227
227
|
- Want to compose minimal end-to-end slice
|
|
228
228
|
|
|
229
|
-
**Vs.
|
|
230
|
-
- **
|
|
231
|
-
- **
|
|
229
|
+
**Vs. story_splitting:**
|
|
230
|
+
- **story_splitting**: Best for stories with clear linguistic red flags ("manage users and roles")
|
|
231
|
+
- **hamburger_method**: Best for features that need layered analysis ("implement notifications")
|
|
232
232
|
- Can use BOTH: Split story first, then apply hamburger method to each smaller story
|
|
233
233
|
|
|
234
234
|
**Integration example:**
|
|
235
235
|
- User: "Implement user notifications" (no obvious split points)
|
|
236
|
-
- Apply
|
|
237
|
-
- Then use
|
|
238
|
-
- Then use
|
|
236
|
+
- Apply hamburger_method → Identify 5 layers, generate options, compose smallest slice
|
|
237
|
+
- Then use complexity_review → Ensure simplest slice is truly simple
|
|
238
|
+
- Then use micro_steps_coach → Break slice into 1-3h steps
|
|
239
239
|
|
|
240
240
|
---
|
|
241
241
|
|
|
@@ -136,6 +136,7 @@ def get_user_address(user_id):
|
|
|
136
136
|
result = db.query("SELECT address_structured FROM users WHERE id = ?", user_id)
|
|
137
137
|
return json.loads(result)
|
|
138
138
|
|
|
139
|
+
|
|
139
140
|
# Step 2: Update UI to display structured address (2h)
|
|
140
141
|
# Now can display fields separately:
|
|
141
142
|
# {{ address.street }}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: micro_steps_coach
|
|
3
3
|
description: |
|
|
4
4
|
Breaks down ANY work into 1-3 hour micro-steps with zero downtime.
|
|
5
5
|
Use for large refactorings, technical improvements, debugging, research, migrations, or any work that feels too big or risky.
|
|
@@ -13,9 +13,9 @@ description: |
|
|
|
13
13
|
- Work will take more than 1 day
|
|
14
14
|
|
|
15
15
|
Do NOT use when:
|
|
16
|
-
- User is still deciding WHAT to build (use
|
|
16
|
+
- User is still deciding WHAT to build (use story_splitting or hamburger_method first)
|
|
17
17
|
- Work is already small (< 3 hours)
|
|
18
|
-
- User asks for architectural review (use
|
|
18
|
+
- User asks for architectural review (use complexity_review instead)
|
|
19
19
|
allowed-tools:
|
|
20
20
|
- Read
|
|
21
21
|
- AskUserQuestion
|
|
@@ -268,24 +268,24 @@ Watch for these signs:
|
|
|
268
268
|
This skill works in sequence with other skills:
|
|
269
269
|
|
|
270
270
|
**Typical workflow:**
|
|
271
|
-
1. **
|
|
272
|
-
2. **
|
|
273
|
-
3. **
|
|
274
|
-
4. **
|
|
271
|
+
1. **story_splitting**: Break down large user stories into smaller ones
|
|
272
|
+
2. **hamburger_method**: Choose vertical slice to implement first
|
|
273
|
+
3. **complexity_review**: Review and simplify technical approach
|
|
274
|
+
4. **micro_steps_coach** (THIS SKILL): Break simplified approach into 1-3h steps
|
|
275
275
|
|
|
276
276
|
**Use this skill when:**
|
|
277
277
|
- User knows WHAT to build and asks HOW to implement it
|
|
278
|
-
- After architectural decisions are made (
|
|
278
|
+
- After architectural decisions are made (complexity_review)
|
|
279
279
|
- When planning execution of a story/feature/refactoring
|
|
280
280
|
|
|
281
281
|
**Integration examples:**
|
|
282
|
-
- Use **
|
|
283
|
-
- Use **
|
|
284
|
-
- Use **
|
|
282
|
+
- Use **story_splitting** first → "Admin can create user" → Then use micro_steps_coach to plan the 1-3h steps
|
|
283
|
+
- Use **hamburger_method** first → Choose slice (manual email notification) → Then use micro_steps_coach for implementation steps
|
|
284
|
+
- Use **complexity_review** first → Simplify to PostgreSQL instead of Kafka → Then use micro_steps_coach for migration steps
|
|
285
285
|
|
|
286
286
|
**Do NOT use this skill when:**
|
|
287
|
-
- User hasn't decided what to build yet (use
|
|
288
|
-
- User is proposing complex architecture (use
|
|
287
|
+
- User hasn't decided what to build yet (use story_splitting first)
|
|
288
|
+
- User is proposing complex architecture (use complexity_review first)
|
|
289
289
|
|
|
290
290
|
---
|
|
291
291
|
|
|
@@ -351,4 +351,4 @@ Examples included:
|
|
|
351
351
|
- Complete interaction examples with user
|
|
352
352
|
|
|
353
353
|
Author: Eduardo Ferro (expand-contract pattern applied to micro-steps)
|
|
354
|
-
Source: https://www.eferro.net/
|
|
354
|
+
Source: https://www.eferro.net/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: mutation_testing_python
|
|
3
3
|
description: Mutation testing patterns for Python using mutmut. Use when analyzing Python code to find weak or missing tests, verifying pytest effectiveness, strengthening Python test suites, or validating TDD workflows in Python projects.
|
|
4
4
|
---
|
|
5
5
|
|