instant-python 0.24.0__tar.gz → 0.24.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {instant_python-0.24.0 → instant_python-0.24.2}/.agents/agents/convention_keeper.md +11 -8
- instant_python-0.24.2/.agents/agents/judge.md +112 -0
- instant_python-0.24.2/.agents/agents/leader.md +110 -0
- instant_python-0.24.2/.agents/agents/spec_partner.md +81 -0
- instant_python-0.24.2/.agents/agents/tdd_craftsman.md +92 -0
- instant_python-0.24.2/.agents/skills/mutation_testing/SKILL.md +218 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.github/dependabot.yml +5 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/.github/workflows/ci.yml +24 -20
- {instant_python-0.24.0 → instant_python-0.24.2}/.github/workflows/pages.yml +3 -3
- {instant_python-0.24.0 → instant_python-0.24.2}/.github/workflows/release.yml +5 -5
- {instant_python-0.24.0 → instant_python-0.24.2}/.gitignore +4 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/.pre-commit-config.yaml +3 -3
- instant_python-0.24.2/.tool-versions +1 -0
- {instant_python-0.24.0/instant_python/templates/boilerplate/agents → instant_python-0.24.2}/AGENTS.md +64 -148
- {instant_python-0.24.0 → instant_python-0.24.2}/CHANGELOG.md +142 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/PKG-INFO +2 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/README.md +1 -0
- {instant_python-0.24.0/instant_python/templates/boilerplate → instant_python-0.24.2/docs}/agents/convention_guidelines.md +8 -0
- {instant_python-0.24.0/docs/conventions/workflow → instant_python-0.24.2/docs/agents}/leader_workflow.md +25 -35
- instant_python-0.24.2/docs/agents/spec_guidelines.md +102 -0
- instant_python-0.24.2/docs/conventions/testing/assertion-helper-methods.md +101 -0
- instant_python-0.24.2/docs/conventions/testing/common-test-variables-in-setup-method.md +84 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/conventions/testing/tdd-outside-in.md +6 -6
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/guide/default_features.md +26 -20
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/guide/template_reference.md +45 -50
- instant_python-0.24.2/docs/specs/0001-metrics-middleware-refactor.md +91 -0
- instant_python-0.24.2/docs/specs/0002-new-tool-management-system.md +170 -0
- instant_python-0.24.2/docs/specs/0003-interactive-configuration-wizard-ux.md +192 -0
- instant_python-0.24.2/instant_python/__init__.py +1 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/cli/instant_python_typer.py +2 -2
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/infra/question_wizard/questionary_console_wizard.py +5 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/infra/question_wizard/step/dependencies_step.py +24 -15
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/infra/question_wizard/step/general_step.py +12 -8
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/infra/question_wizard/step/git_step.py +10 -8
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/infra/question_wizard/step/questionary.py +2 -4
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/infra/question_wizard/step/steps.py +8 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/infra/question_wizard/step/template_step.py +15 -10
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/domain/project_renderer.py +2 -2
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/domain/project_structure.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/infra/env_manager/pdm_env_manager.py +2 -2
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/infra/env_manager/system_console.py +2 -2
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/infra/env_manager/uv_env_manager.py +2 -4
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/infra/renderer/jinja_environment.py +7 -6
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/infra/writer/file_system_project_writer.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/metrics/delivery/metrics_middleware.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/metrics/domain/error_metrics_event.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/metrics/domain/usage_metrics_data.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/metrics/infra/post_hog_config.py +1 -2
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/metrics/infra/post_hog_metrics_reporter.py +2 -2
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/domain/config_schema.py +8 -10
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/domain/dependency_config.py +2 -2
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/domain/general_config.py +24 -18
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/domain/git_config.py +3 -4
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/domain/template_config.py +5 -5
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/.gitignore +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/.pre-commit-config.yaml +0 -2
- instant_python-0.24.2/instant_python/templates/boilerplate/agents/AGENTS.md +147 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/agents/convention_keeper.md +11 -8
- instant_python-0.24.2/instant_python/templates/boilerplate/agents/agents/judge.md +112 -0
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/agents/craftsman_leader.md → instant_python-0.24.2/instant_python/templates/boilerplate/agents/agents/leader.md +33 -22
- instant_python-0.24.2/instant_python/templates/boilerplate/agents/agents/spec_partner.md +104 -0
- instant_python-0.24.2/instant_python/templates/boilerplate/agents/agents/tdd_craftsman.md +92 -0
- instant_python-0.24.0/docs/conventions/convention-guidelines.md → instant_python-0.24.2/instant_python/templates/boilerplate/agents/convention_guidelines.md +10 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/leader_workflow.md +20 -31
- instant_python-0.24.0/.agents/commands/code_review.md → instant_python-0.24.2/instant_python/templates/boilerplate/agents/skills/code_review/SKILL.md +1 -2
- {instant_python-0.24.0/.agents → instant_python-0.24.2/instant_python/templates/boilerplate/agents}/skills/micro_steps_coach/REFERENCE.md +2 -2
- instant_python-0.24.2/instant_python/templates/boilerplate/agents/skills/mutation_testing/SKILL.md +218 -0
- instant_python-0.24.2/instant_python/templates/boilerplate/agents/spec_guidelines.md +80 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/github/ci.yml +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/pyproject.toml +6 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/scripts/makefile +7 -2
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/agents/agents.yml +31 -35
- {instant_python-0.24.0 → instant_python-0.24.2}/makefile +9 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/pyproject.toml +8 -2
- instant_python-0.24.2/test/config/infra/question_wizard/fake_questionary.py +29 -0
- instant_python-0.24.2/test/config/infra/question_wizard/test_questionary_console_wizard.py +80 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/delivery/test_init_cli.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/domain/mothers/node_mother.py +4 -2
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/domain/mothers/project_structure_mother.py +2 -2
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/domain/test_node.py +2 -2
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/infra/env_manager/test_pdm_env_manager.py +6 -4
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/infra/env_manager/test_system_console.py +18 -14
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/infra/env_manager/test_uv_env_manager.py +6 -4
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/infra/formatter/test_ruff_project_formatter.py +2 -2
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/infra/renderer/test_jinja_environment.py +4 -4
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/infra/renderer/test_jinja_project_renderer.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/infra/version_control/test_git_configurer.py +3 -3
- {instant_python-0.24.0 → instant_python-0.24.2}/test/metrics/application/test_config_snapshot_creator.py +2 -2
- {instant_python-0.24.0 → instant_python-0.24.2}/test/metrics/application/test_usage_metrics_sender.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/test/metrics/infra/test_post_hog_config.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/test/metrics/infra/test_user_identity_manager.py +1 -1
- instant_python-0.24.2/test/shared/domain/mothers/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/shared/domain/mothers/general_config_mother.py +4 -3
- {instant_python-0.24.0 → instant_python-0.24.2}/test/shared/domain/mothers/template_config_mother.py +3 -2
- {instant_python-0.24.0 → instant_python-0.24.2}/test/shared/domain/test_config_schema.py +2 -2
- {instant_python-0.24.0 → instant_python-0.24.2}/test/shared/domain/test_dependency_config.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/test/shared/domain/test_general_config.py +20 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/test/shared/domain/test_git_config.py +3 -5
- instant_python-0.24.2/test/shared/persistence/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/shared/persistence/test_yaml_config_repository.py +2 -2
- instant_python-0.24.2/uv.lock +2722 -0
- instant_python-0.24.0/.agents/agents/craftsman_leader.md +0 -99
- instant_python-0.24.0/.agents/agents/judge.md +0 -83
- instant_python-0.24.0/.agents/agents/spec_partner.md +0 -70
- instant_python-0.24.0/.agents/agents/tdd_craftsman.md +0 -76
- instant_python-0.24.0/.agents/skills/convention/SKILL.md +0 -32
- instant_python-0.24.0/.agents/skills/mutation_testing/SKILL.md +0 -744
- instant_python-0.24.0/.agents/skills/spec/SKILL.md +0 -53
- instant_python-0.24.0/AGENTS.md +0 -148
- instant_python-0.24.0/docs/features/0001-metrics-middleware-refactor.spec +0 -144
- instant_python-0.24.0/instant_python/__init__.py +0 -1
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/agents/judge.md +0 -83
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/agents/spec_partner.md +0 -72
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/agents/tdd_craftsman.md +0 -76
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/convention/SKILL.md +0 -32
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/mutation_testing/SKILL.md +0 -744
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/skills/spec/SKILL.md +0 -57
- instant_python-0.24.0/uv.lock +0 -2343
- {instant_python-0.24.0 → instant_python-0.24.2}/.agents/commands/commit.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.agents/commands/technical_debt_review.md +0 -0
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/commands/code_review.md → instant_python-0.24.2/.agents/skills/code_review/SKILL.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.agents/skills/complexity_review/REFERENCE.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.agents/skills/complexity_review/SKILL.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.agents/skills/hamburger_method/REFERENCE.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.agents/skills/hamburger_method/SKILL.md +0 -0
- {instant_python-0.24.0/instant_python/templates/boilerplate/agents → instant_python-0.24.2/.agents}/skills/micro_steps_coach/REFERENCE.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.agents/skills/micro_steps_coach/SKILL.md +0 -0
- instant_python-0.24.0/.agents/commands/security_review.md → instant_python-0.24.2/.agents/skills/security_review/SKILL.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.agents/skills/story_splitting/REFERENCE.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.agents/skills/story_splitting/SKILL.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.agents/skills/test_desiderata/REFERENCE.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.agents/skills/test_desiderata/SKILL.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.agents/skills/xp_refactor/SKILL.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.github/FUNDING.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.github/actions/python_setup/action.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.github/pull_request_template.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/.python-version +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/CITATION.cff +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/LICENSE +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/SECURITY.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/codeql-config.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/changelog/.components/changelog_header.md.j2 +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/changelog/.components/changelog_init.md.j2 +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/changelog/.components/changelog_update.md.j2 +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/changelog/.components/changes.md.j2 +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/changelog/.components/first_release.md.j2 +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/changelog/.components/macros.md.j2 +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/changelog/.components/versioned_changes.md.j2 +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/changelog/.release_notes.md.j2 +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/changelog/CHANGELOG.md.j2 +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/assets/favicon.svg +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/assets/logo.svg +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/development/contributing.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/development/releases.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/development/security.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/downloads_macro.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/getting_started/first_steps.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/getting_started/installation.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/getting_started/privacy_and_metrics.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/guide/command_config.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/guide/command_init.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/guide/custom_projects.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/guide/index.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/docs/documentation/home/index.md +0 -0
- {instant_python-0.24.0/docs/features → instant_python-0.24.2/docs/specs}/technical-debt-review.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/cli/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/cli/cli.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/application/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/application/config_generator.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/delivery/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/delivery/cli.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/domain/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/domain/question_wizard.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/infra/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/infra/question_wizard/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/config/infra/question_wizard/step/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/application/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/application/project_initializer.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/delivery/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/delivery/cli.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/domain/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/domain/env_manager.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/domain/node.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/domain/project_formatter.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/domain/project_writer.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/domain/version_control_configurer.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/infra/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/infra/env_manager/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/infra/env_manager/env_manager_factory.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/infra/formatter/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/infra/formatter/ruff_project_formatter.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/infra/renderer/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/infra/renderer/jinja_project_renderer.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/infra/version_control/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/infra/version_control/git_configurer.py +1 -1
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/initialize/infra/writer/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/metrics/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/metrics/application/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/metrics/application/config_snapshot_creator.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/metrics/application/usage_metrics_sender.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/metrics/delivery/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/metrics/domain/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/metrics/domain/config_snapshot.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/metrics/domain/metrics_reporter.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/metrics/infra/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/metrics/infra/user_identity_manager.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/application_error.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/domain/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/domain/config_repository.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/infra/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/infra/persistence/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/infra/persistence/yaml_config_repository.py +3 -3
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/supported_built_in_features.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/supported_licenses.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/supported_managers.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/supported_python_versions.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/shared/supported_templates.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/.python-version +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/CITATION.cff +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/LICENSE +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/README.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/SECURITY.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/commands/commit.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/commands/technical_debt_review.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/skills/complexity_review/REFERENCE.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/skills/complexity_review/SKILL.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/skills/hamburger_method/REFERENCE.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/skills/hamburger_method/SKILL.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/skills/micro_steps_coach/SKILL.md +0 -0
- instant_python-0.24.0/instant_python/templates/boilerplate/agents/commands/security_review.md → instant_python-0.24.2/instant_python/templates/boilerplate/agents/skills/security_review/SKILL.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/skills/story_splitting/REFERENCE.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/skills/story_splitting/SKILL.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/skills/test_desiderata/REFERENCE.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/skills/test_desiderata/SKILL.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/skills/xp_refactor/SKILL.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/tasks.json +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/agents/tdd_outside_in.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/event_bus/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/event_bus/domain_event.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/event_bus/domain_event_json_deserializer.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/event_bus/domain_event_json_serializer.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/event_bus/domain_event_subscriber.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/event_bus/event_aggregate.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/event_bus/event_bus.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/event_bus/exchange_type.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/event_bus/mock_event_bus.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/event_bus/rabbit_mq_configurer.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/event_bus/rabbit_mq_connection.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/event_bus/rabbit_mq_consumer.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/event_bus/rabbit_mq_event_bus.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/event_bus/rabbit_mq_queue_formatter.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/event_bus/rabbit_mq_settings.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/exceptions/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/exceptions/base_error.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/exceptions/domain_error.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/exceptions/domain_event_type_not_found_error.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/exceptions/rabbit_mq_connection_not_established_error.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/exceptions/required_value_error.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/fastapi/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/fastapi/application.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/fastapi/error_handlers.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/fastapi/error_response.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/fastapi/fastapi_log_middleware.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/fastapi/lifespan.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/fastapi/success_response.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/github/action.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/github/bug_report.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/github/dependabot.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/github/feature_request.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/github/pages.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/github/release.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/logger/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/logger/file_logger.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/logger/file_rotating_handler.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/logger/json_formatter.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/mkdocs.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/mypy.ini +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/alembic_migrator.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/async/README.md +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/async/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/async/alembic.ini +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/async/async_engine_fixture.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/async/async_session.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/async/env.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/async/models_metadata.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/async/postgres_settings.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/async/script.py.mako +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/async/sqlalchemy_repository.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/base.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/synchronous/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/synchronous/session_maker.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/persistence/synchronous/sqlalchemy_repository.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/scripts/add_dependency.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/scripts/create_aggregate.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/scripts/insert_template.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/scripts/integration.sh +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/scripts/local_setup.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/scripts/post-merge.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/scripts/pre-commit.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/scripts/pre-push.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/scripts/remove_dependency.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/boilerplate/scripts/unit.sh +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/clean_architecture/layers/application.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/clean_architecture/layers/delivery.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/clean_architecture/layers/domain.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/clean_architecture/layers/infra.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/clean_architecture/layers/test_application.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/clean_architecture/layers/test_delivery.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/clean_architecture/layers/test_domain.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/clean_architecture/layers/test_infra.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/clean_architecture/main_structure.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/clean_architecture/source.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/clean_architecture/test.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/config_files/gitignore.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/config_files/mypy.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/config_files/pyproject.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/config_files/python_version.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/documentation/citation.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/documentation/documentation.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/documentation/license.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/documentation/readme.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/documentation/security.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/domain_driven_design/layers/bounded_context.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/domain_driven_design/layers/delivery.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/domain_driven_design/layers/shared.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/domain_driven_design/layers/shared_domain.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/domain_driven_design/layers/shared_infra.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/domain_driven_design/layers/test_shared.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/domain_driven_design/layers/test_shared_delivery.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/domain_driven_design/layers/test_shared_domain.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/domain_driven_design/layers/test_shared_infra.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/domain_driven_design/main_structure.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/domain_driven_design/source.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/domain_driven_design/test.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/errors.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/events/event_bus_domain.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/events/event_bus_infra.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/events/mock_event_bus.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/fastapi/fastapi_app.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/fastapi/fastapi_domain.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/fastapi/fastapi_infra.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/github/github_action.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/github/github_issues_template.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/github/makefile.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/github/precommit_hook.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/logger.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/macros.j2 +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/persistence/alembic_migrator.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/persistence/async_alembic.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/persistence/async_engine_conftest.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/persistence/async_sqlalchemy.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/persistence/persistence.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/persistence/synchronous_sqlalchemy.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/standard_project/layers/source_features.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/standard_project/layers/test_event_bus.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/standard_project/layers/test_features.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/standard_project/main_structure.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/standard_project/source.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/instant_python/templates/project_structure/standard_project/test.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/mkdocs.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/mypy.ini +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/opencode.json +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/schemas/ipy-schema.json +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/schemas/main-structure-schema.json +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/cli/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/cli/test_version_command.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/config/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/config/application/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/config/application/test_config_generator.py +0 -0
- {instant_python-0.24.0/test/initialize → instant_python-0.24.2/test/config/infra}/__init__.py +0 -0
- {instant_python-0.24.0/test/initialize/application → instant_python-0.24.2/test/config/infra/question_wizard}/__init__.py +0 -0
- {instant_python-0.24.0/test/initialize/delivery → instant_python-0.24.2/test/initialize}/__init__.py +0 -0
- {instant_python-0.24.0/test/initialize/domain → instant_python-0.24.2/test/initialize/application}/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/application/test_project_initializer.py +1 -1
- {instant_python-0.24.0/test/initialize/domain/mothers → instant_python-0.24.2/test/initialize/delivery}/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/delivery/approvaltests_config.json +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/delivery/approved_files/TestInitCli.test_should_initialize_project_with_custom_project_structure.approved.txt +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/delivery/approved_files/TestInitCli.test_should_initialize_project_with_general_section_combinations.approved.txt +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/delivery/approved_files/TestInitCli.test_should_initialize_project_with_git_section_combinations.approved.txt +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/delivery/approved_files/TestInitCli.test_should_initialize_project_with_predefined_dependencies_and_different_managers.approved.txt +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/delivery/approved_files/TestInitCli.test_should_initialize_project_with_template_section_combinations.approved.txt +0 -0
- {instant_python-0.24.0/test/initialize/infra → instant_python-0.24.2/test/initialize/domain}/__init__.py +0 -0
- {instant_python-0.24.0/test/initialize/infra/env_manager → instant_python-0.24.2/test/initialize/domain/mothers}/__init__.py +0 -0
- {instant_python-0.24.0/test/initialize/infra/env_manager/mother → instant_python-0.24.2/test/initialize/infra}/__init__.py +0 -0
- {instant_python-0.24.0/test/initialize/infra/formatter → instant_python-0.24.2/test/initialize/infra/env_manager}/__init__.py +0 -0
- {instant_python-0.24.0/test/initialize/infra/renderer → instant_python-0.24.2/test/initialize/infra/env_manager/mother}/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/infra/env_manager/mother/command_execution_result_mother.py +0 -0
- {instant_python-0.24.0/test/initialize/infra/version_control → instant_python-0.24.2/test/initialize/infra/formatter}/__init__.py +0 -0
- {instant_python-0.24.0/test/initialize/infra/writer → instant_python-0.24.2/test/initialize/infra/renderer}/__init__.py +0 -0
- {instant_python-0.24.0/test/metrics → instant_python-0.24.2/test/initialize/infra/version_control}/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/infra/writer/TestFileSystemProjectWriter.test_should_create_file_in_file_system.approved.txt +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/infra/writer/TestFileSystemProjectWriter.test_should_create_python_module_in_file_system.approved.txt +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/infra/writer/TestFileSystemProjectWriter.test_should_create_standard_directory_in_file_system.approved.txt +0 -0
- {instant_python-0.24.0/test/metrics/application → instant_python-0.24.2/test/initialize/infra/writer}/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/initialize/infra/writer/test_file_system_project_writer.py +0 -0
- {instant_python-0.24.0/test/metrics/domain → instant_python-0.24.2/test/metrics}/__init__.py +0 -0
- {instant_python-0.24.0/test/metrics/infra → instant_python-0.24.2/test/metrics/application}/__init__.py +0 -0
- {instant_python-0.24.0/test/shared → instant_python-0.24.2/test/metrics/domain}/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/metrics/domain/config_snapshot_mother.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/metrics/domain/error_metrics_event_mother.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/metrics/domain/usage_metrics_event_mother.py +0 -0
- {instant_python-0.24.0/test/shared/domain → instant_python-0.24.2/test/metrics/infra}/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/metrics/infra/cassettes/error_posthog_reporter.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/metrics/infra/cassettes/success_posthog_reporter.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/metrics/infra/test_post_hog_metrics_reporter.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/random_generator.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/resources/base_ipy_config.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/resources/domain_error_template.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/resources/hello_world.j2 +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/resources/main_structure.yml +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/resources/standard_project/main_structure.yml +0 -0
- {instant_python-0.24.0/test/shared/domain/mothers → instant_python-0.24.2/test/shared}/__init__.py +0 -0
- {instant_python-0.24.0/test/shared/persistence → instant_python-0.24.2/test/shared/domain}/__init__.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/shared/domain/mothers/config_schema_mother.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/shared/domain/mothers/dependency_config_mother.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/shared/domain/mothers/git_config_mother.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/shared/domain/test_template_configuration.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/test/utils.py +0 -0
- {instant_python-0.24.0 → instant_python-0.24.2}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: convention_keeper
|
|
3
|
-
description: Captures learnings from completed features and updates or creates convention documentation. Runs after judge approval before
|
|
3
|
+
description: Captures learnings from completed features and updates or creates convention documentation. Runs after judge approval before release.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Convention Keeper
|
|
@@ -14,25 +14,28 @@ You do not write code, tests, or spec files. You maintain the convention library
|
|
|
14
14
|
|
|
15
15
|
## Protocol
|
|
16
16
|
|
|
17
|
-
1. Read `docs/
|
|
17
|
+
1. Read `AGENTS.md` (Repository knowledge map), `docs/agents/convention_guidelines.md` and the spec file, `docs/progress/tdd_<name>.md`, and `docs/progress/judge_<name>.md` for the completed feature.
|
|
18
18
|
2. Identify anything worth documenting as a convention:
|
|
19
19
|
- Architectural patterns that emerged (e.g., a new way to structure a use case)
|
|
20
20
|
- Testing patterns or test helpers worth standardizing
|
|
21
21
|
- Error handling patterns used across layers
|
|
22
22
|
- Design decisions that were debated and settled
|
|
23
23
|
- Any practice that would benefit future features
|
|
24
|
-
3. For each candidate, check if a relevant convention doc already exists in `docs/conventions/`.
|
|
24
|
+
3. For each candidate, check if a relevant convention doc already exists in `docs/conventions/`.
|
|
25
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/
|
|
26
|
+
5. If no doc exists, create a new one following the template in `docs/agents/convention_guidelines.md`.
|
|
27
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
|
|
28
|
+
7. **Propagate changes to agent prompts**: After the human approves, add the convention file path to the read-instruction
|
|
29
|
+
list in the relevant agent prompt(s) under `.agents/agents/`. For each agent, locate the line that reads
|
|
30
|
+
`Read docs/agents/convention_guidelines.md, ...` and append the new path (e.g., `docs/conventions/<area>/<name>.md`). If unsure which agents need it, ask the human.
|
|
29
31
|
|
|
30
32
|
## Hard rules
|
|
31
33
|
|
|
32
|
-
- NEVER edit `instant_python/`, `test/`, or `docs/
|
|
34
|
+
- NEVER edit `instant_python/`, `test/`, or `docs/specs/`.
|
|
33
35
|
- NEVER change the feature status in Linear.
|
|
34
36
|
- NEVER write code or tests.
|
|
35
|
-
- Each convention goes in its own standalone file. No bundling.
|
|
37
|
+
- Each convention goes in its own standalone file, placed in the right area subfolder of `docs/conventions/` per the guideline. No bundling.
|
|
38
|
+
- Conventions record general concepts and decisions about patterns (in tests, code, architecture, workflow) — never concrete cases tied to a specific feature, incident, or implementation detail. No feature names, no "during <issue>" stories, no narration of one particular implementation. Illustrate patterns with generic examples; the "Real world examples" section only links to real files as pointers.
|
|
36
39
|
- Always ask the human to approve new convention files.
|
|
37
40
|
|
|
38
41
|
## Communication
|
|
@@ -40,7 +43,7 @@ You do not write code, tests, or spec files. You maintain the convention library
|
|
|
40
43
|
Your final output is **a single line**:
|
|
41
44
|
|
|
42
45
|
```
|
|
43
|
-
conventions updated -> docs/conventions/<name>.md
|
|
46
|
+
conventions updated -> docs/conventions/<area>/<name>.md
|
|
44
47
|
```
|
|
45
48
|
|
|
46
49
|
or if nothing new was found:
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: judge
|
|
3
|
+
description: Reviews code and runs mutation testing. Approves or rejects the tdd_craftsman's work against the requirements, 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
|
+
## Available skills
|
|
17
|
+
|
|
18
|
+
- **code_review** — use it to structure the review in step 4 below: test quality,
|
|
19
|
+
maintainability, simplicity, and alignment with project rules.
|
|
20
|
+
- **security_review** — use it as an extra pass, alongside step 4, whenever the change
|
|
21
|
+
touches an attack surface (auth, external input, secrets, dependencies, deserialization).
|
|
22
|
+
- **mutation_testing** — use it on every mutation-testing pass: it covers how to run and read
|
|
23
|
+
`mutmut` (mutant states, mutation score thresholds, `mutmut results`/`show`/`html`) and how
|
|
24
|
+
to tell a genuinely weak test from an equivalent mutant that can't be killed.
|
|
25
|
+
|
|
26
|
+
## Mindset
|
|
27
|
+
|
|
28
|
+
- **Review is the whole game.** Treat every review as the only gate standing between this
|
|
29
|
+
change and production — there is no second pass after you approve.
|
|
30
|
+
- **Traceability is non-negotiable.** When SDD applies, every `R<n>` requirement must map to
|
|
31
|
+
a concrete test, and every task or subtask in the Linear project must be `Release` or have a
|
|
32
|
+
documented reason why not.
|
|
33
|
+
- **No tests, no approval.** a feature without tests proving its behavior does not pass review
|
|
34
|
+
- **Passing isn't proof.** Green tests only show the code runs; mutation testing shows the
|
|
35
|
+
suite would actually catch a regression.
|
|
36
|
+
|
|
37
|
+
## Protocol
|
|
38
|
+
|
|
39
|
+
1. Read `AGENTS.md` (Repository knowledge map), `docs/agents/convention_guidelines.md`, `docs/conventions/testing/common-test-variables-in-setup-method.md`, `docs/conventions/testing/assertion-helper-methods.md`, the spec file, and `docs/progress/tdd_<name>.md`.
|
|
40
|
+
2. **Scenario coverage**: for each requirement in the spec file, locate at least one concrete test in `test/` that verifies it. If any scenario lacks coverage, reject.
|
|
41
|
+
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.
|
|
42
|
+
4. **Quality (craftsman lens)** on every file touched:
|
|
43
|
+
- Short functions with a single reason to change?
|
|
44
|
+
- Revealing names, no duplication, no magic numbers?
|
|
45
|
+
- Correct error contract (status codes, response body)?
|
|
46
|
+
- Evaluate test quality using the **test_desiderata** skill (are tests isolated, fast, specific, behavioral, structure-insensitive?).
|
|
47
|
+
- Evaluate code quality, simplicity and maintainability with **code_review** skill, and alignment with
|
|
48
|
+
`AGENTS.md`'s Core Principles and Code Standards.
|
|
49
|
+
- Evaluate security concerns using the **security_review** skill
|
|
50
|
+
5. Run `make test`. Must be green.
|
|
51
|
+
6. **If review passes**, run mutation testing:
|
|
52
|
+
- Use the **mutation_testing** skill and `mutmut` as the mutation tool.
|
|
53
|
+
- The threshold is **100% on new/touched lines**. Scope the run to the feature with the dotted module pattern, never a filesystem path: `make mutate MUTATE_PATH="instant_python.<feature>.*"`. In mutmut 3.7 the positional arg filters mutant names, so a directory path like `instant_python/<feature>/` matches nothing and silently mutates the whole project.
|
|
54
|
+
- When the suite contains a pre-existing red test, mutmut aborts. Keep the run scoped and deterministic.
|
|
55
|
+
- `len()` calls are never mutated and decorated functions (e.g. `@property`) are skipped; do not demand mutants on those lines — compensate with behavioral tests that exercise the public output.
|
|
56
|
+
- Review `make mutate` output and `mutmut show <id>` for surviving mutants.
|
|
57
|
+
- For each surviving mutant, document: file, line, mutation applied, and what test is missing to kill it.
|
|
58
|
+
7. Emit verdict.
|
|
59
|
+
|
|
60
|
+
## Verdict format
|
|
61
|
+
|
|
62
|
+
Your final output is a single block in `docs/progress/judge_<name>.md`:
|
|
63
|
+
|
|
64
|
+
```markdown
|
|
65
|
+
# Review — <feature name>
|
|
66
|
+
|
|
67
|
+
**Review verdict:** APPROVED | CHANGES_REQUESTED
|
|
68
|
+
**Mutation verdict:** PASS | FAIL
|
|
69
|
+
|
|
70
|
+
## Scenario coverage (R ↔ test)
|
|
71
|
+
- R1: [x] covered by `test_create_invoice_happy_path`
|
|
72
|
+
- R2: [ ] ← no test verifying it
|
|
73
|
+
|
|
74
|
+
## TDD discipline
|
|
75
|
+
- Production code without a demanding test? NO / YES (file:line)
|
|
76
|
+
- Evidence of Red→Green→Refactor? YES / NO
|
|
77
|
+
|
|
78
|
+
## Code quality
|
|
79
|
+
- (concrete findings with file:line)
|
|
80
|
+
|
|
81
|
+
## Surviving mutants (if any)
|
|
82
|
+
- src/invoices/domain/invoice.py:42 — `==` → `!=`
|
|
83
|
+
Missing: a test distinguishing exact equality
|
|
84
|
+
|
|
85
|
+
## Required changes (if applicable)
|
|
86
|
+
1. ...
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Your chat response is **a single line**:
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
APPROVED -> docs/progress/judge_<name>.md
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
or
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
CHANGES_REQUESTED -> docs/progress/judge_<name>.md
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Hard rules
|
|
102
|
+
|
|
103
|
+
- NEVER write or edit production code or tests in `instant_python/` or `test/` — you review,
|
|
104
|
+
you don't implement.
|
|
105
|
+
- Never approve with red tests or `make test` failing.
|
|
106
|
+
- Never approve if any requirement has no test coverage.
|
|
107
|
+
- Never approve production code that no test demands.
|
|
108
|
+
- Never edit the code. You say what fails, you do not fix it.
|
|
109
|
+
- Never declare mutation PASS below the threshold.
|
|
110
|
+
- If a surviving mutant is a genuine equivalent (does not change observable behavior), document it and exclude with explicit justification. Do not abuse this.
|
|
111
|
+
- Reference the **mutation_testing** skill when running mutation analysis.
|
|
112
|
+
- Be specific: cite file and line. No generic feedback.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: leader
|
|
3
|
+
description: Orchestrate all the development phases (conversation -> spec -> tdd -> review -> conventions). Never writes code or tests.
|
|
4
|
+
---
|
|
5
|
+
# 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 `Release` in the Linear project.
|
|
16
|
+
- Do not skip the spec conversation including expected behavior, requirements and slicing. Every feature with the label `sdd` goes through `spec_partner` before any code.
|
|
17
|
+
- Do not skip the human approval gate for the `docs/specs/<name>.md` with the spec defined. When the spec 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/specs/<name>.md`
|
|
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` (Repository knowledge map) to get oriented.
|
|
29
|
+
2. Read the features of the project using the Linear MCP and `docs/progress/current.md` to get a sense of the current session.
|
|
30
|
+
3. Read `docs/agents/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 spec is defined: the human signs
|
|
36
|
+
off on the executable contract before a single line of production code is
|
|
37
|
+
written.
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
Todo
|
|
41
|
+
→ [spec_partner] conversation → generates spec file
|
|
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
|
+
If the task does not need SDD, either because the task does not have the label or because it is a simple task
|
|
51
|
+
that doesn't need that much definition, the feature will follow these phases:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
Todo
|
|
55
|
+
→ [spec_partner] conversation to understand what to build -> does not generate a spec file
|
|
56
|
+
→ In Progress
|
|
57
|
+
→ [tdd_craftsman] Red → Green → Refactor cycle (one test at a time)
|
|
58
|
+
→ [judge] review is the whole game and executes mutation testing
|
|
59
|
+
→ [convention_keeper] captures learnings → updates convention docs
|
|
60
|
+
→ Release
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
NEVER jump into TDD if the spec file has not been approved.
|
|
64
|
+
NEVER declare `Release` unless the `judge` approves, mutation testing succeeds, and the
|
|
65
|
+
`convention_keeper` has had a chance to capture learnings.
|
|
66
|
+
|
|
67
|
+
## How to decompose “implement the next pending feature”
|
|
68
|
+
|
|
69
|
+
Look at the first issue with status != `Release` and not `blocked` in
|
|
70
|
+
the Linear project. Look at the work in progress to get a sense of what was the last piece of work.
|
|
71
|
+
|
|
72
|
+
### Case A — status == `Todo`, with no spec file covering it
|
|
73
|
+
|
|
74
|
+
1. Launch **1 `spec_partner`**. It is conversational: it debates decisions
|
|
75
|
+
with the human and writes/updates a spec file.
|
|
76
|
+
2. Once the spec is captured, the same `spec_partner` updates the spec file with the EARS requirements.
|
|
77
|
+
3. **STOP.** Message the human:
|
|
78
|
+
> "Scenarios are in `docs/specs/<name>.md`. Read them and say
|
|
79
|
+
> **'approved'** to start the TDD cycle, or ask me for changes."
|
|
80
|
+
|
|
81
|
+
### Case B — scenarios approved by the human
|
|
82
|
+
|
|
83
|
+
1. Update the issue status to `In Progress` in the Linear project.
|
|
84
|
+
2. Launch **1 `tdd_craftsman`**, passing the requirements section of the `docs/specs/<name>.md`. It works under strict TDD.
|
|
85
|
+
3. When finished → launch **1 `judge`** (approve or reject).
|
|
86
|
+
4. If the `judge` approves → it executes mutation testing.
|
|
87
|
+
5. Once mutation passes → launch **1 `convention_keeper`** to capture learnings.
|
|
88
|
+
6. Only then does the `tdd_craftsman` update the issue status to `Release` in the Linear project.
|
|
89
|
+
|
|
90
|
+
### Case C — scenarios without human approval
|
|
91
|
+
|
|
92
|
+
DO NOT continue. Remind the human that it is their turn to read the spec
|
|
93
|
+
file.
|
|
94
|
+
|
|
95
|
+
### Case D — status == `In Progress`
|
|
96
|
+
|
|
97
|
+
Interrupted session. Ask whether to resume the TDD cycle or abort.
|
|
98
|
+
|
|
99
|
+
## Anti-broken-telephone rule
|
|
100
|
+
|
|
101
|
+
When launching subagents, instruct them to write results to files (`docs/specs/<name>.md`, `docs/progress/<agent>_<name>.md`) and
|
|
102
|
+
return only the reference, not the content.
|
|
103
|
+
|
|
104
|
+
## What you don't do
|
|
105
|
+
|
|
106
|
+
- Edit `instant_python/` or `test/`.
|
|
107
|
+
- Mark features as `Release` in the Linear project (you set `In Progress`, but only the `tdd_craftsman` sets `Release` after judge approval).
|
|
108
|
+
- Skip the human approval gate for the spec files.
|
|
109
|
+
- Close a feature without `judge` approval.
|
|
110
|
+
- Accept results delivered through chat without a file reference.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec_partner
|
|
3
|
+
description: Converses and debates with the human to produce the docs/specs/<name>.md spec file. 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 a spec file is
|
|
9
|
+
produced: `docs/specs/<name>.md` (reasoned spec).
|
|
10
|
+
You do not write code or tests.
|
|
11
|
+
|
|
12
|
+
You combine two roles:
|
|
13
|
+
1. **Spec partner** — debate, uncomfortable questions, decision documentation.
|
|
14
|
+
2. **Requirements author** — distill the consensus into EARS criteria explaining the requirements the feature needs to cover.
|
|
15
|
+
3. **Product manager** — slice the tasks to deliver the feature in incremental steps.
|
|
16
|
+
|
|
17
|
+
## Available skills
|
|
18
|
+
|
|
19
|
+
- **story_splitting**: use it to split a feature in different stories/tasks when there are clear splitting points
|
|
20
|
+
- **hamburger_method**: use it to split a feature in different stories/tasks when there are no clear splitting points
|
|
21
|
+
- **complexity_review**: use it to evaluate proposed technical solutions for a task or story
|
|
22
|
+
|
|
23
|
+
## Mindset
|
|
24
|
+
|
|
25
|
+
You are not a transcriber. You are a **critical interlocutor**. Your value lies in the
|
|
26
|
+
questions the human did not ask themselves:
|
|
27
|
+
|
|
28
|
+
- What happens in the edge case (empty list, nonexistent id, invalid flag)?
|
|
29
|
+
- What is the exact output contract (status codes, response body)?
|
|
30
|
+
- What design alternative did we discard and why?
|
|
31
|
+
- Does this conflict with a previous decision documented in another spec?
|
|
32
|
+
- Is the proposed technical approach over-engineered for the actual need? (Use the **complexity_review** skill to challenge unnecessary scale, consistency, or infrastructure choices.)
|
|
33
|
+
|
|
34
|
+
Propose **at least two options** for each non-trivial decision and argue for one. Let
|
|
35
|
+
the human decide; record the decision and its rationale.
|
|
36
|
+
|
|
37
|
+
## Protocol
|
|
38
|
+
|
|
39
|
+
1. Read `AGENTS.md` (Repository knowledge map), `docs/agents/convention_guidelines.md`, `docs/agents/spec_guidelines.md`, the available skills,
|
|
40
|
+
and any existing spec for the feature.
|
|
41
|
+
2. **Debate** open points with the human. One question or block of options per
|
|
42
|
+
turn — do not fire an entire questionnaire at once.
|
|
43
|
+
3. When consensus is reached, **write or extend** `docs/specs/<name>.md`. When writing a technical approach
|
|
44
|
+
use the **complexity_review** skill to challenge overengineered solutions early. The file will have a
|
|
45
|
+
section containing:
|
|
46
|
+
- **Purpose** — one sentence.
|
|
47
|
+
- **Behavior** — what it does, in precise prose.
|
|
48
|
+
- **Contract** — inputs, outputs (status codes, response body).
|
|
49
|
+
- **Edge cases** — enumerated.
|
|
50
|
+
- **Decisions** — each decision with its rationale and the discarded alternative.
|
|
51
|
+
4. Once the spec is complete, **extend** `docs/specs/<name>.md` including the EARS requirements in a specific _Requirements_ section.
|
|
52
|
+
Each requirement must be separate with `R<n>` tag so `tdd_craftsman` and `judge` agents can reference them.
|
|
53
|
+
5. Finally, record the sliced tasks in the Linear project as subtasks of the feature issue — see _Task hierarchy_ below.
|
|
54
|
+
Do **not** write tasks in the spec file. When decomposing the feature, use the **story_splitting** skill to detect if the feature
|
|
55
|
+
is too broad, and the **hamburger_method** skill to explore layers and alternatives to deliver the feature in incremental steps.
|
|
56
|
+
6. **STOP**. Do not launch any other agent. The `leader` decides when to continue.
|
|
57
|
+
|
|
58
|
+
### Task hierarchy
|
|
59
|
+
|
|
60
|
+
The sliced tasks live as subtasks of the feature issue in the Linear project, never in the spec file. The feature already tracked there becomes the parent issue;
|
|
61
|
+
each sliced task is a child issue in its `subtasks`. An issue that needs further decomposition nests its own `subtasks`.
|
|
62
|
+
Dot-separated ids (`feature`, `feature.1`, `feature.1.2`) make the hierarchy visible at a glance. New subtasks start with status
|
|
63
|
+
`Todo`.
|
|
64
|
+
|
|
65
|
+
## Hard rules
|
|
66
|
+
|
|
67
|
+
- NEVER edit `instant_python/` or `test/`.
|
|
68
|
+
- NEVER change the status of existing issues in the Linear project (creating the sliced subtasks of the feature is your job).
|
|
69
|
+
- NEVER write code or tests.
|
|
70
|
+
- If a decision remains unresolved, write it as an **OPEN QUESTION** in the spec and do not mark it as resolved.
|
|
71
|
+
- Every claim in the spec must be convertible to a EARS requirement. If it is not testable, refine it or mark it as open.
|
|
72
|
+
|
|
73
|
+
## Communication
|
|
74
|
+
|
|
75
|
+
Your final output is **a single line**:
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
spec_ready -> docs/specs/<name>.md (<n> scenarios)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Never return file contents in chat — they live in `docs/specs/`.
|
|
@@ -0,0 +1,92 @@
|
|
|
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 requirements in the spec 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/specs/<name>.md`. 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 requirement in the spec file)
|
|
25
|
+
GREEN → minimum implementation to make it pass
|
|
26
|
+
REFACTOR → clean up with the bar green: names, duplication, short functions
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Available skills
|
|
30
|
+
|
|
31
|
+
- **xp_refactor**: use it on the Refactor step of a TDD cycle, or as a final pass on any code
|
|
32
|
+
you just wrote when TDD wasn't used, to cut duplication and keep the fewest elements needed
|
|
33
|
+
before marking a task complete.
|
|
34
|
+
- **test_desiderata**: use it to check the tests you just wrote against Kent Beck's 12
|
|
35
|
+
properties before marking a task complete. It matters most on the no-TDD path, where
|
|
36
|
+
nothing forced the tests to be minimal and behavior-driven from the start.
|
|
37
|
+
- **micro_steps_coach**: use it to break and simplified an approach into 1-3h steps
|
|
38
|
+
|
|
39
|
+
## Mindset
|
|
40
|
+
|
|
41
|
+
- **Simplicity first.** The simplest working solution wins — no speculative abstractions,
|
|
42
|
+
no gold-plating beyond what the task or its `subtasks` in the Linear project ask for.
|
|
43
|
+
- **Small, incremental steps.** One task or one behavior at a time, not a sweeping change
|
|
44
|
+
that touches everything at once.
|
|
45
|
+
|
|
46
|
+
## Protocol
|
|
47
|
+
|
|
48
|
+
1. Read `AGENTS.md` (Repository knowledge map), `docs/agents/convention_guidelines.md`, `docs/conventions/testing/`, and the spec for the feature.
|
|
49
|
+
2. Record in `docs/progress/current.md`: `Feature in progress: <name>` and the list of requirements `R1...R<n>` you will cover.
|
|
50
|
+
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.
|
|
51
|
+
4. **For each requirement in order**, execute one or more Red-Green-Refactor cycles using Outside-In TDD:
|
|
52
|
+
a. **RED** — write a test in `test/` that encodes the functional requirement 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.
|
|
53
|
+
b. **GREEN** — the minimum implementation in `instant_python/` that makes it pass.
|
|
54
|
+
c. **REFACTOR** — with the bar green, apply the **xp_refactor** skill to eliminate duplication, improve naming, and simplify. Run tests again after every change.
|
|
55
|
+
d. Append the cycle to `docs/progress/tdd_<name>.md` (which `R<n>`, which test, what minimum change).
|
|
56
|
+
5. **Outside-In order per scenario**: not every requirement scenario becomes an acceptance test. Per the TDD convention:
|
|
57
|
+
- **Happy path and critical error scenarios** → start with a delivery acceptance test (TestClient, full stack). Then drive the application layer, then domain and infra.
|
|
58
|
+
- **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.
|
|
59
|
+
6. **Traceability**: every `R<n>` scenario must be covered by at least one concrete test. Write the `R<n> → test` map in `docs/progress/tdd_<name>.md`.
|
|
60
|
+
7. Run `make test`. Green end to end.
|
|
61
|
+
8. **Do not mark `done` yourself.** The `judge` must review first.
|
|
62
|
+
9. If the `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`.
|
|
63
|
+
|
|
64
|
+
## Hard rules
|
|
65
|
+
|
|
66
|
+
- No production code without a red test demanding it (Law 1).
|
|
67
|
+
- One feature per session.
|
|
68
|
+
- Do not "pre-write" code for future scenarios. One requirement at a time.
|
|
69
|
+
- If a requirement cannot be satisfied without deviating from the specification, stop and request a contract change — do not invent behavior.
|
|
70
|
+
- Refactor ONLY in green. If tests are red, you do not refactor: you fix.
|
|
71
|
+
- Short functions, revealing names, no magic numbers.
|
|
72
|
+
- NEVER skip a task or subtask in the Linear project without documenting why in `docs/progress/tdd_<name>.md`.
|
|
73
|
+
- NEVER launch `judge` or `convention_keeper` — the `leader` orchestrates them.
|
|
74
|
+
- NEVER change an issue status in the Linear project except to `Release`, and only when the `leader`
|
|
75
|
+
reinvokes you after judge approval and mutation testing have passed.
|
|
76
|
+
- Use `make` targets for all test and lint commands — never call pytest, mypy, or ruff directly.
|
|
77
|
+
|
|
78
|
+
## Communication with the leader
|
|
79
|
+
|
|
80
|
+
Your final output is **a single line**:
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
green -> docs/progress/tdd_<name>.md
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
or
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
blocked -> docs/progress/tdd_<name>.md
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Never return diffs in chat. The leader reads them from disk if needed.
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mutation_testing
|
|
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
|
+
---
|
|
5
|
+
|
|
6
|
+
# Mutation Testing for Python
|
|
7
|
+
|
|
8
|
+
Mutation testing answers the question: **"Are my tests actually catching bugs?"**
|
|
9
|
+
|
|
10
|
+
Code coverage tells you what code your tests execute. Mutation testing tells you if your tests would **detect changes** to that code. A
|
|
11
|
+
test suite with 100% coverage can still miss 40% of potential bugs.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Core Concept
|
|
16
|
+
|
|
17
|
+
**The Mutation Testing Process:**
|
|
18
|
+
|
|
19
|
+
1. **Generate mutants**: Introduce small bugs (mutations) into production code
|
|
20
|
+
2. **Run tests**: Execute your test suite against each mutant
|
|
21
|
+
3. **Evaluate results**: If tests fail, the mutant is "killed" (good). If tests pass, the mutant "survived" (bad - your tests missed the bug)
|
|
22
|
+
|
|
23
|
+
**The Insight**: A surviving mutant represents a bug your tests wouldn't catch.
|
|
24
|
+
|
|
25
|
+
## When to Use This Skill
|
|
26
|
+
|
|
27
|
+
Use mutation testing analysis when:
|
|
28
|
+
|
|
29
|
+
- Reviewing code changes on a branch
|
|
30
|
+
- Verifying test effectiveness after TDD
|
|
31
|
+
- Identifying weak tests that appear to have coverage
|
|
32
|
+
- Finding missing edge case tests
|
|
33
|
+
- Validating that refactoring didn't weaken test suite
|
|
34
|
+
|
|
35
|
+
**Integration with TDD:**
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
TDD Workflow Mutation Testing Validation
|
|
39
|
+
┌─────────────────┐ ┌─────────────────────────────┐
|
|
40
|
+
│ RED: Write test │ │ │
|
|
41
|
+
│ GREEN: Pass it │──────────► │ After GREEN: Verify tests │
|
|
42
|
+
│ REFACTOR │ │ would kill relevant mutants │
|
|
43
|
+
└─────────────────┘ └─────────────────────────────┘
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Reviewing a Mutation Results
|
|
47
|
+
|
|
48
|
+
`mutmut` generates and runs the real mutants — there's no need to simulate them by hand. Use
|
|
49
|
+
this process to go from a `make mutate` run to a reject/approve decision:
|
|
50
|
+
|
|
51
|
+
### Step 1: Scope to What Changed
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# Get files changed for this task
|
|
55
|
+
git diff main...HEAD --name-only | grep '\.py$' | grep -v 'test_'
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
mutmut may report on the whole codebase; only survived mutants in the code this task actually
|
|
59
|
+
changed are relevant to this review.
|
|
60
|
+
|
|
61
|
+
### Step 2: Run and Read Results
|
|
62
|
+
|
|
63
|
+
Run `make mutate`, then `uv run mutmut results` for the mutation score and the list of
|
|
64
|
+
survived mutants (see Integration with mutmut below).
|
|
65
|
+
|
|
66
|
+
### Step 3: Classify Each Relevant Survived Mutant
|
|
67
|
+
|
|
68
|
+
For every survived mutant in changed code, use `uv run mutmut show <id>` to see the exact
|
|
69
|
+
change, then decide:
|
|
70
|
+
|
|
71
|
+
1. **Is there a test that exercises this code path at all?**
|
|
72
|
+
2. **If yes, is the assertion specific enough that this mutant would have failed it?**
|
|
73
|
+
3. **If neither, is this actually an equivalent mutant** (see Equivalent Mutants below) rather
|
|
74
|
+
than a real gap?
|
|
75
|
+
|
|
76
|
+
### Step 4: Act
|
|
77
|
+
|
|
78
|
+
| Category | Action |
|
|
79
|
+
|--------------------------------|--------------------------------------------------------|
|
|
80
|
+
| Killed | None — tests are effective |
|
|
81
|
+
| Survived, real gap | Reject; `tdd_craftsman` must add/strengthen a test |
|
|
82
|
+
| Survived, equivalent mutant | None — not a real bug, but document why in the verdict |
|
|
83
|
+
| No test covers the line at all | Reject; `tdd_craftsman` must add a behavior test |
|
|
84
|
+
|
|
85
|
+
## Mutant States and Metrics
|
|
86
|
+
|
|
87
|
+
mutmut itself reports killed/survived/timeout/skipped. "No Coverage" shows up as a plain
|
|
88
|
+
survived mutant, and "Equivalent" is never a label mutmut assigns — it's the judgment call
|
|
89
|
+
`judge` makes after inspecting a survived mutant that turns out to be unkillable.
|
|
90
|
+
|
|
91
|
+
### Mutant States
|
|
92
|
+
|
|
93
|
+
| State | Meaning | Action |
|
|
94
|
+
|-----------------|---------------------------------|----------------------------|
|
|
95
|
+
| **Killed** | Test failed when mutant applied | Good - tests are effective |
|
|
96
|
+
| **Survived** | Tests passed with mutant active | Bad - add/strengthen test |
|
|
97
|
+
| **No Coverage** | No test exercises this code | Add behavior test |
|
|
98
|
+
| **Timeout** | Tests timed out (infinite loop) | Counted as detected |
|
|
99
|
+
| **Equivalent** | Mutant produces same behavior | No action - not a real bug |
|
|
100
|
+
|
|
101
|
+
### Target Mutation Score
|
|
102
|
+
|
|
103
|
+
| Score | Quality |
|
|
104
|
+
|--------|-------------------------------------------|
|
|
105
|
+
| < 60% | Weak test suite - significant gaps |
|
|
106
|
+
| 60-80% | Moderate - many improvements possible |
|
|
107
|
+
| 80-90% | Good - but still gaps to address |
|
|
108
|
+
| > 90% | Strong - but watch for equivalent mutants |
|
|
109
|
+
|
|
110
|
+
## Equivalent Mutants
|
|
111
|
+
|
|
112
|
+
Equivalent mutants produce the same behavior as the original code. They cannot be killed because there is no observable difference.
|
|
113
|
+
|
|
114
|
+
### Common Equivalent Mutant Patterns
|
|
115
|
+
|
|
116
|
+
**Pattern 1: Operations with identity elements**
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
# Mutant in conditional where both branches have same effect
|
|
120
|
+
if whatever:
|
|
121
|
+
number += 0 # Can mutate to -= 0, *= 1, /= 1 - all equivalent!
|
|
122
|
+
else:
|
|
123
|
+
number += 0
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**Pattern 2: Boundary conditions that don't affect outcome**
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
# When max equals min, condition doesn't matter
|
|
130
|
+
max_val = max(a, b)
|
|
131
|
+
min_val = min(a, b)
|
|
132
|
+
if a >= b: # Mutating to <= or < has no effect when a == b
|
|
133
|
+
result = 10 ** (max_val - min_val) # 10 ** 0 = 1 regardless
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Pattern 3: Dead code paths**
|
|
137
|
+
|
|
138
|
+
```python
|
|
139
|
+
# If this path is never reached, mutations don't matter
|
|
140
|
+
if impossible_condition:
|
|
141
|
+
do_something() # Mutating this won't affect behavior
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Pattern 4: None handling equivalences**
|
|
145
|
+
|
|
146
|
+
```python
|
|
147
|
+
# When value is never None in practice
|
|
148
|
+
if value is None: # Mutating to == None has same effect
|
|
149
|
+
return default
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### How to Handle Equivalent Mutants
|
|
153
|
+
|
|
154
|
+
1. **Identify**: Analyze if mutation truly changes observable behavior
|
|
155
|
+
2. **Document**: Note why mutant is equivalent
|
|
156
|
+
3. **Accept**: 100% mutation score may not be achievable
|
|
157
|
+
4. **Consider refactoring**: Sometimes equivalent mutants indicate unclear code
|
|
158
|
+
|
|
159
|
+
### Python-Specific Gotchas
|
|
160
|
+
|
|
161
|
+
| Pattern | Why It's Weak | How to Strengthen |
|
|
162
|
+
|----------------------------------------------|-------------------------------------|-------------------------------------|
|
|
163
|
+
| Testing `is None` only | Doesn't verify `== None` difference | Test with `""`, `0`, `[]` |
|
|
164
|
+
| Testing `.get()` only with existing keys | Doesn't verify default behavior | Test missing keys |
|
|
165
|
+
| Testing list comprehensions with all matches | Doesn't verify filter logic | Mix matching and non-matching items |
|
|
166
|
+
| Testing only happy path exceptions | Doesn't verify exception conditions | Use `pytest.raises()` |
|
|
167
|
+
| Testing only `and` with both True | Doesn't verify operator choice | Test with mixed True/False |
|
|
168
|
+
|
|
169
|
+
## Integration with mutmut
|
|
170
|
+
|
|
171
|
+
### Running mutmut
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# Always through the make target — never call mutmut directly
|
|
175
|
+
make mutate
|
|
176
|
+
|
|
177
|
+
# Under the hood, this runs:
|
|
178
|
+
uv run mutmut run
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
mutmut supports scoping a run to specific files/modules with Unix filename pattern matching
|
|
182
|
+
on the dotted module path:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
uv run mutmut run "instant_python.module_name*"
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
`make mutate` exposes this as the `MUTATE_PATH` var, so you don't have to call
|
|
189
|
+
mutmut directly to scope a run:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
make mutate MUTATE_PATH="instant_python.module_name*"
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
To derive the pattern from a changed file, drop the `.py` extension and replace `/` with `.`:
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
# instant_python/module_name/foo.py -> instant_python.module_name.foo*
|
|
199
|
+
CHANGED_FILE="instant_python/module_name/foo.py"
|
|
200
|
+
MUTATE_PATH="$(echo "$CHANGED_FILE" | sed 's/\.py$//; s#/#.#g')*"
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Reading results
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
# Mutation score + summary of killed/survived/timeout/skipped mutants
|
|
207
|
+
uv run mutmut results
|
|
208
|
+
|
|
209
|
+
# Inspect one mutant's diff
|
|
210
|
+
uv run mutmut show <id>
|
|
211
|
+
|
|
212
|
+
# Interactive browser — press f to retest a function, m to retest a module
|
|
213
|
+
uv run mutmut browse
|
|
214
|
+
|
|
215
|
+
# Apply a mutant to disk to see the change in context, then revert
|
|
216
|
+
uv run mutmut apply <id>
|
|
217
|
+
git checkout -- .
|
|
218
|
+
```
|