@pennyfarthing/core 11.3.3 → 11.3.5
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.
- package/README.md +1 -1
- package/package.json +3 -2
- package/packages/core/dist/workflow/__test_context_watch__/.session/.tandem-turn-counter +1 -0
- package/packages/core/dist/workflow/__test_context_watch__/.session/95-6-session.md +3 -0
- package/packages/core/dist/workflow/__test_context_watch__/.session/95-6-tandem-architect.md +6 -0
- package/packages/core/dist/workflow/__test_file_watch__/.session/95-4-tandem-architect.md +6 -0
- package/packages/core/dist/workflow/__test_file_watch__/workdir/trigger.ts +1 -0
- package/packages/core/dist/workflow/__test_tool_watch__/.session/95-5-tandem-architect.md +6 -0
- package/packages/core/dist/workflow/__test_tool_watch__/.session/95-5-tandem-toolcalls.jsonl +1 -0
- package/packages/core/dist/workflow/cross-entity-validation.d.ts +117 -0
- package/packages/core/dist/workflow/cross-entity-validation.d.ts.map +1 -0
- package/packages/core/dist/workflow/cross-entity-validation.js +148 -0
- package/packages/core/dist/workflow/cross-entity-validation.js.map +1 -0
- package/packages/core/dist/workflow/cross-entity-validation.test.d.ts +10 -0
- package/packages/core/dist/workflow/cross-entity-validation.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/cross-entity-validation.test.js +512 -0
- package/packages/core/dist/workflow/cross-entity-validation.test.js.map +1 -0
- package/pennyfarthing-dist/agents/sm-finish.md +2 -2
- package/pennyfarthing-dist/agents/testing-runner.md +1 -1
- package/pennyfarthing-dist/commands/pf-prime.md +1 -1
- package/pennyfarthing-dist/guides/agent-behavior.md +1 -1
- package/pennyfarthing-dist/guides/bikerack.md +1 -1
- package/pennyfarthing-dist/guides/brownfield-tools.md +7 -7
- package/pennyfarthing-dist/guides/gates.md +3 -3
- package/pennyfarthing-dist/guides/handoff-cli.md +6 -6
- package/pennyfarthing-dist/guides/prime.md +6 -6
- package/pennyfarthing-dist/guides/scale-levels.md +1 -1
- package/pennyfarthing-dist/personas/themes/firefly.yaml +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/CLAUDE.md +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/README.md +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/__pycache__/context.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/__pycache__/focus.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/__pycache__/split.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/cli.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/focus.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/split.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bellmode_hook.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/__init__.py +1 -1
- package/pennyfarthing-dist/pf/bikerack/__main__.py +5 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/audit_log_panel.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/background_panel.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/changed_panel.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/cli.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/context_meter_footer.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/debug_panel.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/diffs_panel.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/git_panel.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/launcher.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/portrait_resolver.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/progress_panel.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/sprint_panel.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/story_detail_data.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/story_detail_screen.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/tui.py +17 -17
- package/pennyfarthing-dist/pf/bmad/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/cli.py +7 -7
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/importer.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/sync.py +9 -9
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/test_parser.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/test_sync.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/brownfield/__init__.py +1 -1
- package/pennyfarthing-dist/pf/brownfield/__main__.py +8 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/brownfield/cli.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/cli.py +24 -24
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/codemarkers/__init__.py +2 -2
- package/pennyfarthing-dist/pf/codemarkers/__main__.py +6 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/codemarkers/analyze.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/codemarkers/cli.py +8 -8
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/codemarkers/formatters.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/__init__.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/__pycache__/config.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/__pycache__/output.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/pr_config.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/themes.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/complexity/__init__.py +2 -2
- package/pennyfarthing-dist/pf/complexity/__main__.py +6 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/complexity/analyze.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/complexity/cli.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/complexity/formatters.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/config.py +2 -2
- package/pennyfarthing-dist/pf/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/consultation/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/consultation/cli.py +5 -5
- package/pennyfarthing-dist/pf/deadcode/__main__.py +6 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/analyze.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/cli.py +8 -8
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/formatters.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/dependencies/__init__.py +2 -2
- package/pennyfarthing-dist/pf/dependencies/__main__.py +5 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/dependencies/analyze.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/dependencies/cli.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/dependencies/formatters.py +1 -1
- package/pennyfarthing-dist/pf/epic/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/epic/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/gate/cli.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/__init__.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/create_branches.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/hooks_installer.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/repos.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/status_all.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/worktree.py +3 -3
- package/pennyfarthing-dist/pf/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git_group/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git_group/cli.py +10 -10
- package/pennyfarthing-dist/pf/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/cli.py +5 -5
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/marker.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/phase_check.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/__init__.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/__main__.py +2 -2
- package/pennyfarthing-dist/pf/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/__pycache__/models.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/analyze.py +8 -8
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/cli.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/formatters.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/bell_mode.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/cli.py +11 -11
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/context_breaker.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/context_warning.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/cyclist_pretooluse.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/schema_validation.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/session_start.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/sprint_yaml_validation.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/statusline.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/__init__.py +2 -2
- package/pennyfarthing-dist/pf/hotspots/__main__.py +6 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/__pycache__/models.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/analyze.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/cli.py +5 -5
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/formatters.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__init__.py +5 -5
- package/pennyfarthing-dist/pf/jira/__main__.py +10 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/claim.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/client.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/create.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/epic.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/operations.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/story.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/sync.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/bidirectional.py +9 -9
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/claim.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/cli.py +15 -15
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/client.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/create.py +5 -5
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/epic.py +6 -6
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/operations.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/reconcile.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/story.py +6 -6
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/sync.py +5 -5
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira_bidirectional_sync.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira_epic_creation.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira_sync.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira_sync_story.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/launch/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/launch/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/launch/cli.py +7 -7
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/__init__.py +5 -5
- package/pennyfarthing-dist/pf/migration/__main__.py +10 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/cli.py +6 -6
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/validate.py +7 -7
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/output.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/patch_mode.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/preflight/__init__.py +1 -1
- package/pennyfarthing-dist/pf/preflight/__main__.py +10 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/preflight/cli.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/pretooluse_hook.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/__init__.py +7 -7
- package/pennyfarthing-dist/pf/prime/__main__.py +8 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/cli.py +9 -9
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/heatmap.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/loader.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/persona.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/session.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/tiers.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/workflow.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/schema_validation_hook.py +1 -1
- package/pennyfarthing-dist/pf/session/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/session/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/session/cli.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/session_start_hook.py +1 -1
- package/pennyfarthing-dist/pf/settings/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/settings/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/settings/cli.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/settings/settings.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__init__.py +5 -5
- package/pennyfarthing-dist/pf/sprint/__main__.py +10 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/archive.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/loader.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/status.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/validator.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/work.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/archive.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/archive_epic.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/cli.py +41 -41
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/epic_add.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/epic_update.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/import_epic.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/loader.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/status.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/story_add.py +5 -5
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/story_finish.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/story_update.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/validate_cmd.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/validator.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/work.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/story/__init__.py +7 -7
- package/pennyfarthing-dist/pf/story/__main__.py +10 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/story/cli.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/story/create.py +2 -2
- package/pennyfarthing-dist/pf/tests/__init__.py +1 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/conftest.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_108_1_gate_migration.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_108_2_remove_handoff_fallback.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_archive_epic.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_bc.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_bikerack.py +39 -39
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_brownfield.py +6 -6
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_cli_modules.py +20 -20
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_cli_normalization.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_codemarkers.py +60 -60
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_common.py +17 -17
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_confidence_sm_evaluation.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_confidence_sm_gate.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_dialogue_manager.py +11 -11
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_epic_shard_validation.py +15 -15
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_gate_file_resolution.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_gate_runner.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_git_utils.py +8 -8
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_handoff_cli.py +12 -12
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_handoff_e2e.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_healthscore.py +20 -20
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_jira_package.py +29 -29
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_package_structure.py +42 -42
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_patch_mode.py +22 -22
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_prime.py +41 -41
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_resolve_gate_file_field.py +1 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_sprint_package.py +30 -30
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_sprint_panel.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_sprint_validator.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_story_add.py +11 -11
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_story_package.py +12 -12
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_story_update.py +16 -16
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_tiers.py +72 -72
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_token_counting.py +28 -28
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_topology_loader.py +37 -37
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_tui_focus.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_tui_panel_persistence.py +10 -10
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_validate_cmd.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_version_sentinel.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_workflow_check.py +7 -7
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_workflow_list_team.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_yaml_io.py +1 -1
- package/pennyfarthing-dist/pf/theme/__main__.py +6 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/theme/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/theme/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/theme/cli.py +6 -6
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/agent.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/schema.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/skill_command.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/sprint.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/tandem_awareness.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/team_mode.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/workflow.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/cli.py +9 -9
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/welcome_hook.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/__init__.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/__pycache__/scale.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/__pycache__/state.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/cli.py +18 -18
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/helpers.py +1 -1
- package/pennyfarthing-dist/pyproject.toml +18 -0
- package/pennyfarthing-dist/scripts/core/agent-session.sh +3 -3
- package/pennyfarthing-dist/scripts/core/check-context.sh +8 -8
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +3 -3
- package/pennyfarthing-dist/scripts/jira/README.md +1 -1
- package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +1 -1
- package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +1 -1
- package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +1 -1
- package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +1 -1
- package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +1 -1
- package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +1 -1
- package/pennyfarthing-dist/scripts/lib/common.sh +3 -3
- package/pennyfarthing-dist/scripts/lib/run-pf.sh +11 -13
- package/pennyfarthing-dist/scripts/sprint/README.md +1 -1
- package/pennyfarthing-dist/scripts/story/create-story.sh +1 -1
- package/pennyfarthing-dist/scripts/story/size-story.sh +1 -1
- package/pennyfarthing-dist/scripts/story/story-template.sh +1 -1
- package/pennyfarthing-dist/scripts/theme/list-themes.sh +3 -3
- package/pennyfarthing-dist/templates/pyproject.toml +3 -3
- package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__main__.py +0 -5
- package/pennyfarthing_scripts/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/audit_log_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/context_meter_footer.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/events.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/portrait.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bmad/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bmad/__pycache__/parser.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bmad/__pycache__/sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bmad/__pycache__/test_parser.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/bmad/__pycache__/test_sync.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__main__.py +0 -8
- package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__main__.py +0 -6
- package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__main__.py +0 -6
- package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__main__.py +0 -6
- package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__main__.py +0 -5
- package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/epic/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/gate/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/gate/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/gate/__pycache__/validate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/hooks_installer.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/repos.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/worktree.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/phase_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__main__.py +0 -6
- package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__main__.py +0 -10
- package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__main__.py +0 -10
- package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__main__.py +0 -10
- package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__main__.py +0 -8
- package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/heatmap.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/session/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/settings/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/settings/__pycache__/settings.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__main__.py +0 -10
- package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__main__.py +0 -10
- package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__init__.py +0 -1
- package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_108_2_remove_handoff_fallback.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_confidence_sm_evaluation.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_confidence_sm_gate.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_gate_file_resolution.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_gate_runner.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_resolve_gate_file_field.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_list_team.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_list_team.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/theme/__main__.py +0 -6
- package/pennyfarthing_scripts/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/tandem_awareness.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/team_mode.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/team_lifecycle.cpython-314.pyc +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/base_panel.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/events.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/ws_client.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/parser.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/brownfield/discover.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/codemarkers/models.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/config.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/output.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/complexity/models.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/consultation/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/consultation/dialogue_manager.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/context.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/models.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/dependencies/models.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/epic/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/epic/cli.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/gate/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/gate/validate.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git_group/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/complete_phase.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/gate_file.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/gate_runner.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/resolve_gate.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/models.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/cyclist-pretooluse-hook.sh +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/pre_edit_check.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/reflector_check.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/session_stop.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/models.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/launch/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/session.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/skill.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/step.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/preflight/finish.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/models.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/version_sentinel.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/session/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/settings/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/yaml_io.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/story/size.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/story/template.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/swebench.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/theme/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/scale.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/state.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/team_lifecycle.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Tests for CLI entry point modules.
|
|
2
2
|
|
|
3
|
-
Story 63-9: Reorganize
|
|
3
|
+
Story 63-9: Reorganize pf into fan-out CLI pattern.
|
|
4
4
|
|
|
5
5
|
These tests verify the CLI modules work as entry points and
|
|
6
6
|
properly delegate to library modules.
|
|
@@ -16,7 +16,7 @@ class TestJiraCLIModule:
|
|
|
16
16
|
def test_jira_cli_help(self) -> None:
|
|
17
17
|
"""jira CLI should show help with --help."""
|
|
18
18
|
result = subprocess.run(
|
|
19
|
-
[sys.executable, "-m", "
|
|
19
|
+
[sys.executable, "-m", "pf.jira", "--help"],
|
|
20
20
|
capture_output=True,
|
|
21
21
|
text=True,
|
|
22
22
|
timeout=30,
|
|
@@ -29,7 +29,7 @@ class TestJiraCLIModule:
|
|
|
29
29
|
def test_jira_cli_view_subcommand(self) -> None:
|
|
30
30
|
"""jira CLI should have view subcommand."""
|
|
31
31
|
result = subprocess.run(
|
|
32
|
-
[sys.executable, "-m", "
|
|
32
|
+
[sys.executable, "-m", "pf.jira", "view", "--help"],
|
|
33
33
|
capture_output=True,
|
|
34
34
|
text=True,
|
|
35
35
|
timeout=30,
|
|
@@ -41,7 +41,7 @@ class TestJiraCLIModule:
|
|
|
41
41
|
def test_jira_cli_sync_subcommand(self) -> None:
|
|
42
42
|
"""jira CLI should have sync subcommand."""
|
|
43
43
|
result = subprocess.run(
|
|
44
|
-
[sys.executable, "-m", "
|
|
44
|
+
[sys.executable, "-m", "pf.jira", "sync", "--help"],
|
|
45
45
|
capture_output=True,
|
|
46
46
|
text=True,
|
|
47
47
|
timeout=30,
|
|
@@ -52,7 +52,7 @@ class TestJiraCLIModule:
|
|
|
52
52
|
def test_jira_cli_claim_subcommand(self) -> None:
|
|
53
53
|
"""jira CLI should have claim subcommand."""
|
|
54
54
|
result = subprocess.run(
|
|
55
|
-
[sys.executable, "-m", "
|
|
55
|
+
[sys.executable, "-m", "pf.jira", "claim", "--help"],
|
|
56
56
|
capture_output=True,
|
|
57
57
|
text=True,
|
|
58
58
|
timeout=30,
|
|
@@ -63,7 +63,7 @@ class TestJiraCLIModule:
|
|
|
63
63
|
def test_jira_cli_create_subcommand(self) -> None:
|
|
64
64
|
"""jira CLI should have create subcommand."""
|
|
65
65
|
result = subprocess.run(
|
|
66
|
-
[sys.executable, "-m", "
|
|
66
|
+
[sys.executable, "-m", "pf.jira", "create", "--help"],
|
|
67
67
|
capture_output=True,
|
|
68
68
|
text=True,
|
|
69
69
|
timeout=30,
|
|
@@ -74,7 +74,7 @@ class TestJiraCLIModule:
|
|
|
74
74
|
def test_jira_cli_bidirectional_subcommand(self) -> None:
|
|
75
75
|
"""jira CLI should have bidirectional subcommand."""
|
|
76
76
|
result = subprocess.run(
|
|
77
|
-
[sys.executable, "-m", "
|
|
77
|
+
[sys.executable, "-m", "pf.jira", "bidirectional", "--help"],
|
|
78
78
|
capture_output=True,
|
|
79
79
|
text=True,
|
|
80
80
|
timeout=30,
|
|
@@ -89,7 +89,7 @@ class TestSprintCLIModule:
|
|
|
89
89
|
def test_sprint_cli_help(self) -> None:
|
|
90
90
|
"""sprint CLI should show help with --help."""
|
|
91
91
|
result = subprocess.run(
|
|
92
|
-
[sys.executable, "-m", "
|
|
92
|
+
[sys.executable, "-m", "pf.sprint", "--help"],
|
|
93
93
|
capture_output=True,
|
|
94
94
|
text=True,
|
|
95
95
|
timeout=30,
|
|
@@ -101,7 +101,7 @@ class TestSprintCLIModule:
|
|
|
101
101
|
def test_sprint_cli_status_subcommand(self) -> None:
|
|
102
102
|
"""sprint CLI should have status subcommand."""
|
|
103
103
|
result = subprocess.run(
|
|
104
|
-
[sys.executable, "-m", "
|
|
104
|
+
[sys.executable, "-m", "pf.sprint", "status", "--help"],
|
|
105
105
|
capture_output=True,
|
|
106
106
|
text=True,
|
|
107
107
|
timeout=30,
|
|
@@ -112,7 +112,7 @@ class TestSprintCLIModule:
|
|
|
112
112
|
def test_sprint_cli_backlog_subcommand(self) -> None:
|
|
113
113
|
"""sprint CLI should have backlog subcommand."""
|
|
114
114
|
result = subprocess.run(
|
|
115
|
-
[sys.executable, "-m", "
|
|
115
|
+
[sys.executable, "-m", "pf.sprint", "backlog", "--help"],
|
|
116
116
|
capture_output=True,
|
|
117
117
|
text=True,
|
|
118
118
|
timeout=30,
|
|
@@ -123,7 +123,7 @@ class TestSprintCLIModule:
|
|
|
123
123
|
def test_sprint_cli_work_subcommand(self) -> None:
|
|
124
124
|
"""sprint CLI should have work subcommand."""
|
|
125
125
|
result = subprocess.run(
|
|
126
|
-
[sys.executable, "-m", "
|
|
126
|
+
[sys.executable, "-m", "pf.sprint", "work", "--help"],
|
|
127
127
|
capture_output=True,
|
|
128
128
|
text=True,
|
|
129
129
|
timeout=30,
|
|
@@ -134,7 +134,7 @@ class TestSprintCLIModule:
|
|
|
134
134
|
def test_sprint_cli_archive_subcommand(self) -> None:
|
|
135
135
|
"""sprint CLI should have archive subcommand."""
|
|
136
136
|
result = subprocess.run(
|
|
137
|
-
[sys.executable, "-m", "
|
|
137
|
+
[sys.executable, "-m", "pf.sprint", "archive", "--help"],
|
|
138
138
|
capture_output=True,
|
|
139
139
|
text=True,
|
|
140
140
|
timeout=30,
|
|
@@ -149,7 +149,7 @@ class TestStoryCLIModule:
|
|
|
149
149
|
def test_story_cli_help(self) -> None:
|
|
150
150
|
"""story CLI should show help with --help."""
|
|
151
151
|
result = subprocess.run(
|
|
152
|
-
[sys.executable, "-m", "
|
|
152
|
+
[sys.executable, "-m", "pf.story", "--help"],
|
|
153
153
|
capture_output=True,
|
|
154
154
|
text=True,
|
|
155
155
|
timeout=30,
|
|
@@ -161,7 +161,7 @@ class TestStoryCLIModule:
|
|
|
161
161
|
def test_story_cli_size_subcommand(self) -> None:
|
|
162
162
|
"""story CLI should have size subcommand."""
|
|
163
163
|
result = subprocess.run(
|
|
164
|
-
[sys.executable, "-m", "
|
|
164
|
+
[sys.executable, "-m", "pf.story", "size", "--help"],
|
|
165
165
|
capture_output=True,
|
|
166
166
|
text=True,
|
|
167
167
|
timeout=30,
|
|
@@ -172,7 +172,7 @@ class TestStoryCLIModule:
|
|
|
172
172
|
def test_story_cli_template_subcommand(self) -> None:
|
|
173
173
|
"""story CLI should have template subcommand."""
|
|
174
174
|
result = subprocess.run(
|
|
175
|
-
[sys.executable, "-m", "
|
|
175
|
+
[sys.executable, "-m", "pf.story", "template", "--help"],
|
|
176
176
|
capture_output=True,
|
|
177
177
|
text=True,
|
|
178
178
|
timeout=30,
|
|
@@ -183,7 +183,7 @@ class TestStoryCLIModule:
|
|
|
183
183
|
def test_story_cli_create_subcommand(self) -> None:
|
|
184
184
|
"""story CLI should have create subcommand."""
|
|
185
185
|
result = subprocess.run(
|
|
186
|
-
[sys.executable, "-m", "
|
|
186
|
+
[sys.executable, "-m", "pf.story", "create", "--help"],
|
|
187
187
|
capture_output=True,
|
|
188
188
|
text=True,
|
|
189
189
|
timeout=30,
|
|
@@ -198,7 +198,7 @@ class TestOldCLICompatibility:
|
|
|
198
198
|
def test_jira_sync_module_runnable(self) -> None:
|
|
199
199
|
"""jira_sync.py should still be runnable as module."""
|
|
200
200
|
result = subprocess.run(
|
|
201
|
-
[sys.executable, "-m", "
|
|
201
|
+
[sys.executable, "-m", "pf.jira_sync", "--help"],
|
|
202
202
|
capture_output=True,
|
|
203
203
|
text=True,
|
|
204
204
|
timeout=30,
|
|
@@ -210,7 +210,7 @@ class TestOldCLICompatibility:
|
|
|
210
210
|
def test_jira_bidirectional_sync_module_runnable(self) -> None:
|
|
211
211
|
"""jira_bidirectional_sync.py should still be runnable."""
|
|
212
212
|
result = subprocess.run(
|
|
213
|
-
[sys.executable, "-m", "
|
|
213
|
+
[sys.executable, "-m", "pf.jira_bidirectional_sync", "--help"],
|
|
214
214
|
capture_output=True,
|
|
215
215
|
text=True,
|
|
216
216
|
timeout=30,
|
|
@@ -221,7 +221,7 @@ class TestOldCLICompatibility:
|
|
|
221
221
|
def test_jira_epic_creation_module_runnable(self) -> None:
|
|
222
222
|
"""jira_epic_creation.py should still be runnable."""
|
|
223
223
|
result = subprocess.run(
|
|
224
|
-
[sys.executable, "-m", "
|
|
224
|
+
[sys.executable, "-m", "pf.jira_epic_creation", "--help"],
|
|
225
225
|
capture_output=True,
|
|
226
226
|
text=True,
|
|
227
227
|
timeout=30,
|
|
@@ -232,7 +232,7 @@ class TestOldCLICompatibility:
|
|
|
232
232
|
def test_jira_sync_story_module_runnable(self) -> None:
|
|
233
233
|
"""jira_sync_story.py should still be runnable."""
|
|
234
234
|
result = subprocess.run(
|
|
235
|
-
[sys.executable, "-m", "
|
|
235
|
+
[sys.executable, "-m", "pf.jira_sync_story", "--help"],
|
|
236
236
|
capture_output=True,
|
|
237
237
|
text=True,
|
|
238
238
|
timeout=30,
|
|
@@ -26,7 +26,7 @@ class TestCodeMarkerModel:
|
|
|
26
26
|
|
|
27
27
|
def test_required_fields(self) -> None:
|
|
28
28
|
"""CodeMarker requires path, line, marker_type, text."""
|
|
29
|
-
from
|
|
29
|
+
from pf.codemarkers.models import CodeMarker
|
|
30
30
|
|
|
31
31
|
m = CodeMarker(path="src/app.ts", line=42, marker_type="TODO", text="TODO: refactor")
|
|
32
32
|
assert m.path == "src/app.ts"
|
|
@@ -36,7 +36,7 @@ class TestCodeMarkerModel:
|
|
|
36
36
|
|
|
37
37
|
def test_default_blame_fields(self) -> None:
|
|
38
38
|
"""Blame fields default to empty/zero."""
|
|
39
|
-
from
|
|
39
|
+
from pf.codemarkers.models import CodeMarker
|
|
40
40
|
|
|
41
41
|
m = CodeMarker(path="a.py", line=1, marker_type="FIXME", text="FIXME: broken")
|
|
42
42
|
assert m.author == ""
|
|
@@ -46,7 +46,7 @@ class TestCodeMarkerModel:
|
|
|
46
46
|
|
|
47
47
|
def test_stale_marker(self) -> None:
|
|
48
48
|
"""is_stale can be set to True."""
|
|
49
|
-
from
|
|
49
|
+
from pf.codemarkers.models import CodeMarker
|
|
50
50
|
|
|
51
51
|
m = CodeMarker(
|
|
52
52
|
path="old.py", line=10, marker_type="TODO", text="TODO: old",
|
|
@@ -57,7 +57,7 @@ class TestCodeMarkerModel:
|
|
|
57
57
|
|
|
58
58
|
def test_serializable(self) -> None:
|
|
59
59
|
"""CodeMarker should be serializable via dataclasses.asdict."""
|
|
60
|
-
from
|
|
60
|
+
from pf.codemarkers.models import CodeMarker
|
|
61
61
|
|
|
62
62
|
m = CodeMarker(path="x.py", line=5, marker_type="HACK", text="HACK: workaround")
|
|
63
63
|
d = asdict(m)
|
|
@@ -71,7 +71,7 @@ class TestMarkerSummaryModel:
|
|
|
71
71
|
|
|
72
72
|
def test_defaults(self) -> None:
|
|
73
73
|
"""MarkerSummary fields default to zero/empty."""
|
|
74
|
-
from
|
|
74
|
+
from pf.codemarkers.models import MarkerSummary
|
|
75
75
|
|
|
76
76
|
s = MarkerSummary()
|
|
77
77
|
assert s.total_markers == 0
|
|
@@ -80,7 +80,7 @@ class TestMarkerSummaryModel:
|
|
|
80
80
|
|
|
81
81
|
def test_populated(self) -> None:
|
|
82
82
|
"""MarkerSummary with values."""
|
|
83
|
-
from
|
|
83
|
+
from pf.codemarkers.models import MarkerSummary
|
|
84
84
|
|
|
85
85
|
s = MarkerSummary(
|
|
86
86
|
total_markers=10, stale_markers=3,
|
|
@@ -95,7 +95,7 @@ class TestCodeMarkersResultModel:
|
|
|
95
95
|
|
|
96
96
|
def test_success_result(self) -> None:
|
|
97
97
|
"""Successful result has success=True and markers list."""
|
|
98
|
-
from
|
|
98
|
+
from pf.codemarkers.models import CodeMarker, CodeMarkersResult
|
|
99
99
|
|
|
100
100
|
r = CodeMarkersResult(
|
|
101
101
|
success=True, repo_name="test", repo_path="/tmp/test",
|
|
@@ -108,7 +108,7 @@ class TestCodeMarkersResultModel:
|
|
|
108
108
|
|
|
109
109
|
def test_error_result(self) -> None:
|
|
110
110
|
"""Error result has success=False and error message."""
|
|
111
|
-
from
|
|
111
|
+
from pf.codemarkers.models import CodeMarkersResult
|
|
112
112
|
|
|
113
113
|
r = CodeMarkersResult(
|
|
114
114
|
success=False, repo_name="bad", repo_path="/nonexistent",
|
|
@@ -119,7 +119,7 @@ class TestCodeMarkersResultModel:
|
|
|
119
119
|
|
|
120
120
|
def test_json_serializable(self) -> None:
|
|
121
121
|
"""Full result serializes to JSON via asdict."""
|
|
122
|
-
from
|
|
122
|
+
from pf.codemarkers.models import (
|
|
123
123
|
CodeMarker,
|
|
124
124
|
CodeMarkersResult,
|
|
125
125
|
MarkerSummary,
|
|
@@ -147,7 +147,7 @@ class TestGrepMarkers:
|
|
|
147
147
|
|
|
148
148
|
def test_finds_todo(self, tmp_path: Path) -> None:
|
|
149
149
|
"""Detects TODO comments."""
|
|
150
|
-
from
|
|
150
|
+
from pf.codemarkers.analyze import _grep_markers
|
|
151
151
|
|
|
152
152
|
f = tmp_path / "app.py"
|
|
153
153
|
f.write_text("x = 1\n# TODO: fix this\ny = 2\n")
|
|
@@ -158,7 +158,7 @@ class TestGrepMarkers:
|
|
|
158
158
|
|
|
159
159
|
def test_finds_fixme(self, tmp_path: Path) -> None:
|
|
160
160
|
"""Detects FIXME comments."""
|
|
161
|
-
from
|
|
161
|
+
from pf.codemarkers.analyze import _grep_markers
|
|
162
162
|
|
|
163
163
|
f = tmp_path / "bug.ts"
|
|
164
164
|
f.write_text("// FIXME: null check needed\n")
|
|
@@ -168,7 +168,7 @@ class TestGrepMarkers:
|
|
|
168
168
|
|
|
169
169
|
def test_finds_hack(self, tmp_path: Path) -> None:
|
|
170
170
|
"""Detects HACK comments."""
|
|
171
|
-
from
|
|
171
|
+
from pf.codemarkers.analyze import _grep_markers
|
|
172
172
|
|
|
173
173
|
f = tmp_path / "util.js"
|
|
174
174
|
f.write_text("/* HACK: temporary workaround */\n")
|
|
@@ -178,7 +178,7 @@ class TestGrepMarkers:
|
|
|
178
178
|
|
|
179
179
|
def test_finds_xxx(self, tmp_path: Path) -> None:
|
|
180
180
|
"""Detects XXX comments."""
|
|
181
|
-
from
|
|
181
|
+
from pf.codemarkers.analyze import _grep_markers
|
|
182
182
|
|
|
183
183
|
f = tmp_path / "danger.py"
|
|
184
184
|
f.write_text("# XXX: this is terrible\n")
|
|
@@ -188,7 +188,7 @@ class TestGrepMarkers:
|
|
|
188
188
|
|
|
189
189
|
def test_multiple_markers_same_file(self, tmp_path: Path) -> None:
|
|
190
190
|
"""Finds multiple markers in a single file."""
|
|
191
|
-
from
|
|
191
|
+
from pf.codemarkers.analyze import _grep_markers
|
|
192
192
|
|
|
193
193
|
f = tmp_path / "multi.py"
|
|
194
194
|
f.write_text("# TODO: first\nx = 1\n# FIXME: second\n# HACK: third\n")
|
|
@@ -199,7 +199,7 @@ class TestGrepMarkers:
|
|
|
199
199
|
|
|
200
200
|
def test_excludes_node_modules(self, tmp_path: Path) -> None:
|
|
201
201
|
"""Files matching exclude patterns are skipped."""
|
|
202
|
-
from
|
|
202
|
+
from pf.codemarkers.analyze import _grep_markers
|
|
203
203
|
|
|
204
204
|
nm = tmp_path / "node_modules" / "pkg"
|
|
205
205
|
nm.mkdir(parents=True)
|
|
@@ -213,7 +213,7 @@ class TestGrepMarkers:
|
|
|
213
213
|
|
|
214
214
|
def test_case_sensitive(self, tmp_path: Path) -> None:
|
|
215
215
|
"""Markers must be uppercase to match."""
|
|
216
|
-
from
|
|
216
|
+
from pf.codemarkers.analyze import _grep_markers
|
|
217
217
|
|
|
218
218
|
f = tmp_path / "lower.py"
|
|
219
219
|
f.write_text("# todo: lowercase should not match\n# TODO: uppercase matches\n")
|
|
@@ -223,7 +223,7 @@ class TestGrepMarkers:
|
|
|
223
223
|
|
|
224
224
|
def test_nested_directories(self, tmp_path: Path) -> None:
|
|
225
225
|
"""Scans recursively into subdirectories."""
|
|
226
|
-
from
|
|
226
|
+
from pf.codemarkers.analyze import _grep_markers
|
|
227
227
|
|
|
228
228
|
sub = tmp_path / "src" / "lib"
|
|
229
229
|
sub.mkdir(parents=True)
|
|
@@ -233,7 +233,7 @@ class TestGrepMarkers:
|
|
|
233
233
|
|
|
234
234
|
def test_empty_directory(self, tmp_path: Path) -> None:
|
|
235
235
|
"""Returns empty list for directory with no markers."""
|
|
236
|
-
from
|
|
236
|
+
from pf.codemarkers.analyze import _grep_markers
|
|
237
237
|
|
|
238
238
|
(tmp_path / "clean.py").write_text("x = 1\ny = 2\n")
|
|
239
239
|
markers = _grep_markers(tmp_path, excludes=[])
|
|
@@ -241,7 +241,7 @@ class TestGrepMarkers:
|
|
|
241
241
|
|
|
242
242
|
def test_binary_files_skipped(self, tmp_path: Path) -> None:
|
|
243
243
|
"""Binary files should not cause crashes."""
|
|
244
|
-
from
|
|
244
|
+
from pf.codemarkers.analyze import _grep_markers
|
|
245
245
|
|
|
246
246
|
(tmp_path / "image.png").write_bytes(b"\x89PNG\r\n\x1a\n" + b"\x00" * 100)
|
|
247
247
|
(tmp_path / "code.py").write_text("# TODO: real marker\n")
|
|
@@ -254,7 +254,7 @@ class TestParseBlameOutput:
|
|
|
254
254
|
|
|
255
255
|
def test_parses_author_and_time(self) -> None:
|
|
256
256
|
"""Extracts author name and author-time from porcelain output."""
|
|
257
|
-
from
|
|
257
|
+
from pf.codemarkers.analyze import _parse_blame_porcelain
|
|
258
258
|
|
|
259
259
|
porcelain = (
|
|
260
260
|
"abc123 1 1 1\n"
|
|
@@ -276,7 +276,7 @@ class TestParseBlameOutput:
|
|
|
276
276
|
|
|
277
277
|
def test_empty_output(self) -> None:
|
|
278
278
|
"""Returns empty dict for empty output."""
|
|
279
|
-
from
|
|
279
|
+
from pf.codemarkers.analyze import _parse_blame_porcelain
|
|
280
280
|
|
|
281
281
|
result = _parse_blame_porcelain("", line=1)
|
|
282
282
|
assert result == {} or result.get("author") == ""
|
|
@@ -288,7 +288,7 @@ class TestBatchBlame:
|
|
|
288
288
|
@pytest.mark.asyncio
|
|
289
289
|
async def test_blames_entire_file(self) -> None:
|
|
290
290
|
"""Blames the whole file and returns data for requested lines."""
|
|
291
|
-
from
|
|
291
|
+
from pf.codemarkers.analyze import _batch_blame_file
|
|
292
292
|
|
|
293
293
|
blame_output = (
|
|
294
294
|
"abc123 1 1 1\n"
|
|
@@ -314,7 +314,7 @@ class TestBatchBlame:
|
|
|
314
314
|
)
|
|
315
315
|
|
|
316
316
|
with patch(
|
|
317
|
-
"
|
|
317
|
+
"pf.codemarkers.analyze._run_git_command",
|
|
318
318
|
new_callable=AsyncMock,
|
|
319
319
|
return_value=(blame_output, "", 0),
|
|
320
320
|
):
|
|
@@ -329,10 +329,10 @@ class TestBatchBlame:
|
|
|
329
329
|
@pytest.mark.asyncio
|
|
330
330
|
async def test_git_blame_failure_returns_empty(self) -> None:
|
|
331
331
|
"""When git blame fails, returns empty dict for all lines."""
|
|
332
|
-
from
|
|
332
|
+
from pf.codemarkers.analyze import _batch_blame_file
|
|
333
333
|
|
|
334
334
|
with patch(
|
|
335
|
-
"
|
|
335
|
+
"pf.codemarkers.analyze._run_git_command",
|
|
336
336
|
new_callable=AsyncMock,
|
|
337
337
|
return_value=("", "fatal: not a git repo", 128),
|
|
338
338
|
):
|
|
@@ -346,7 +346,7 @@ class TestAnalyzeRepo:
|
|
|
346
346
|
@pytest.mark.asyncio
|
|
347
347
|
async def test_nonexistent_path(self) -> None:
|
|
348
348
|
"""Returns error result for nonexistent path."""
|
|
349
|
-
from
|
|
349
|
+
from pf.codemarkers.analyze import analyze_repo
|
|
350
350
|
|
|
351
351
|
result = await analyze_repo("bad", Path("/nonexistent/repo"), days=90)
|
|
352
352
|
assert result.success is False
|
|
@@ -355,13 +355,13 @@ class TestAnalyzeRepo:
|
|
|
355
355
|
@pytest.mark.asyncio
|
|
356
356
|
async def test_empty_repo(self, tmp_path: Path) -> None:
|
|
357
357
|
"""Returns success with empty markers for repo with no markers."""
|
|
358
|
-
from
|
|
358
|
+
from pf.codemarkers.analyze import analyze_repo
|
|
359
359
|
|
|
360
360
|
(tmp_path / ".git").mkdir()
|
|
361
361
|
(tmp_path / "clean.py").write_text("x = 1\n")
|
|
362
362
|
|
|
363
363
|
with patch(
|
|
364
|
-
"
|
|
364
|
+
"pf.codemarkers.analyze._batch_blame_file",
|
|
365
365
|
new_callable=AsyncMock,
|
|
366
366
|
return_value={},
|
|
367
367
|
):
|
|
@@ -372,7 +372,7 @@ class TestAnalyzeRepo:
|
|
|
372
372
|
@pytest.mark.asyncio
|
|
373
373
|
async def test_markers_enriched_with_blame(self, tmp_path: Path) -> None:
|
|
374
374
|
"""Markers get author, date, age_days from git blame."""
|
|
375
|
-
from
|
|
375
|
+
from pf.codemarkers.analyze import analyze_repo
|
|
376
376
|
|
|
377
377
|
(tmp_path / ".git").mkdir()
|
|
378
378
|
(tmp_path / "app.py").write_text("x = 1\n# TODO: fix this\ny = 2\n")
|
|
@@ -387,7 +387,7 @@ class TestAnalyzeRepo:
|
|
|
387
387
|
}
|
|
388
388
|
|
|
389
389
|
with patch(
|
|
390
|
-
"
|
|
390
|
+
"pf.codemarkers.analyze._batch_blame_file",
|
|
391
391
|
side_effect=mock_blame,
|
|
392
392
|
):
|
|
393
393
|
result = await analyze_repo("test", tmp_path, days=90)
|
|
@@ -399,7 +399,7 @@ class TestAnalyzeRepo:
|
|
|
399
399
|
@pytest.mark.asyncio
|
|
400
400
|
async def test_stale_threshold(self, tmp_path: Path) -> None:
|
|
401
401
|
"""Markers older than threshold are flagged is_stale=True."""
|
|
402
|
-
from
|
|
402
|
+
from pf.codemarkers.analyze import analyze_repo
|
|
403
403
|
|
|
404
404
|
(tmp_path / ".git").mkdir()
|
|
405
405
|
(tmp_path / "old.py").write_text("# TODO: ancient code\n")
|
|
@@ -411,7 +411,7 @@ class TestAnalyzeRepo:
|
|
|
411
411
|
return {1: {"author": "OldDev", "author_time": old_time}}
|
|
412
412
|
|
|
413
413
|
with patch(
|
|
414
|
-
"
|
|
414
|
+
"pf.codemarkers.analyze._batch_blame_file",
|
|
415
415
|
side_effect=mock_blame,
|
|
416
416
|
):
|
|
417
417
|
result = await analyze_repo("test", tmp_path, days=90)
|
|
@@ -421,7 +421,7 @@ class TestAnalyzeRepo:
|
|
|
421
421
|
@pytest.mark.asyncio
|
|
422
422
|
async def test_summary_computed(self, tmp_path: Path) -> None:
|
|
423
423
|
"""Result includes summary with counts by type."""
|
|
424
|
-
from
|
|
424
|
+
from pf.codemarkers.analyze import analyze_repo
|
|
425
425
|
|
|
426
426
|
(tmp_path / ".git").mkdir()
|
|
427
427
|
(tmp_path / "mix.py").write_text("# TODO: one\n# FIXME: two\n# TODO: three\n")
|
|
@@ -433,7 +433,7 @@ class TestAnalyzeRepo:
|
|
|
433
433
|
return {ln: {"author": "Dev", "author_time": recent} for ln in lines}
|
|
434
434
|
|
|
435
435
|
with patch(
|
|
436
|
-
"
|
|
436
|
+
"pf.codemarkers.analyze._batch_blame_file",
|
|
437
437
|
side_effect=mock_blame,
|
|
438
438
|
):
|
|
439
439
|
result = await analyze_repo("test", tmp_path, days=90)
|
|
@@ -446,7 +446,7 @@ class TestAnalyzeRepo:
|
|
|
446
446
|
@pytest.mark.asyncio
|
|
447
447
|
async def test_default_excludes_applied(self, tmp_path: Path) -> None:
|
|
448
448
|
"""DEFAULT_EXCLUDES filters out node_modules, dist, etc."""
|
|
449
|
-
from
|
|
449
|
+
from pf.codemarkers.analyze import analyze_repo
|
|
450
450
|
|
|
451
451
|
(tmp_path / ".git").mkdir()
|
|
452
452
|
nm = tmp_path / "node_modules" / "pkg"
|
|
@@ -461,7 +461,7 @@ class TestAnalyzeRepo:
|
|
|
461
461
|
return {ln: {"author": "Dev", "author_time": recent} for ln in lines}
|
|
462
462
|
|
|
463
463
|
with patch(
|
|
464
|
-
"
|
|
464
|
+
"pf.codemarkers.analyze._batch_blame_file",
|
|
465
465
|
side_effect=mock_blame,
|
|
466
466
|
):
|
|
467
467
|
result = await analyze_repo("test", tmp_path, days=90)
|
|
@@ -473,22 +473,22 @@ class TestShouldExclude:
|
|
|
473
473
|
"""_should_exclude matches file paths against glob patterns."""
|
|
474
474
|
|
|
475
475
|
def test_matches_node_modules(self) -> None:
|
|
476
|
-
from
|
|
476
|
+
from pf.codemarkers.analyze import _should_exclude
|
|
477
477
|
|
|
478
478
|
assert _should_exclude("node_modules/pkg/index.js", ["node_modules/*"]) is True
|
|
479
479
|
|
|
480
480
|
def test_matches_lock_file(self) -> None:
|
|
481
|
-
from
|
|
481
|
+
from pf.codemarkers.analyze import _should_exclude
|
|
482
482
|
|
|
483
483
|
assert _should_exclude("package-lock.json", ["package-lock.json"]) is True
|
|
484
484
|
|
|
485
485
|
def test_matches_glob_extension(self) -> None:
|
|
486
|
-
from
|
|
486
|
+
from pf.codemarkers.analyze import _should_exclude
|
|
487
487
|
|
|
488
488
|
assert _should_exclude("bundle.min.js", ["*.min.js"]) is True
|
|
489
489
|
|
|
490
490
|
def test_no_match(self) -> None:
|
|
491
|
-
from
|
|
491
|
+
from pf.codemarkers.analyze import _should_exclude
|
|
492
492
|
|
|
493
493
|
assert _should_exclude("src/app.py", ["node_modules/*", "dist/*"]) is False
|
|
494
494
|
|
|
@@ -503,15 +503,15 @@ class TestTableFormatter:
|
|
|
503
503
|
|
|
504
504
|
def test_empty_list(self) -> None:
|
|
505
505
|
"""Empty marker list produces 'no markers' message."""
|
|
506
|
-
from
|
|
506
|
+
from pf.codemarkers.formatters import format_marker_table
|
|
507
507
|
|
|
508
508
|
out = format_marker_table([])
|
|
509
509
|
assert "no" in out.lower() or "No" in out
|
|
510
510
|
|
|
511
511
|
def test_table_has_headers(self) -> None:
|
|
512
512
|
"""Table output includes column headers."""
|
|
513
|
-
from
|
|
514
|
-
from
|
|
513
|
+
from pf.codemarkers.formatters import format_marker_table
|
|
514
|
+
from pf.codemarkers.models import CodeMarker
|
|
515
515
|
|
|
516
516
|
markers = [
|
|
517
517
|
CodeMarker(path="a.py", line=1, marker_type="TODO", text="TODO: test",
|
|
@@ -524,8 +524,8 @@ class TestTableFormatter:
|
|
|
524
524
|
|
|
525
525
|
def test_top_n_limits_output(self) -> None:
|
|
526
526
|
"""Table respects top_n limit."""
|
|
527
|
-
from
|
|
528
|
-
from
|
|
527
|
+
from pf.codemarkers.formatters import format_marker_table
|
|
528
|
+
from pf.codemarkers.models import CodeMarker
|
|
529
529
|
|
|
530
530
|
markers = [
|
|
531
531
|
CodeMarker(path=f"f{i}.py", line=i, marker_type="TODO", text=f"TODO: {i}")
|
|
@@ -541,8 +541,8 @@ class TestJsonExport:
|
|
|
541
541
|
"""export_json serializes full result to JSON."""
|
|
542
542
|
|
|
543
543
|
def test_valid_json(self) -> None:
|
|
544
|
-
from
|
|
545
|
-
from
|
|
544
|
+
from pf.codemarkers.formatters import export_json
|
|
545
|
+
from pf.codemarkers.models import (
|
|
546
546
|
CodeMarker,
|
|
547
547
|
CodeMarkersResult,
|
|
548
548
|
MarkerSummary,
|
|
@@ -564,8 +564,8 @@ class TestCsvExport:
|
|
|
564
564
|
"""export_csv outputs CSV with headers."""
|
|
565
565
|
|
|
566
566
|
def test_csv_header_row(self) -> None:
|
|
567
|
-
from
|
|
568
|
-
from
|
|
567
|
+
from pf.codemarkers.formatters import export_csv
|
|
568
|
+
from pf.codemarkers.models import CodeMarker
|
|
569
569
|
|
|
570
570
|
markers = [
|
|
571
571
|
CodeMarker(path="a.py", line=1, marker_type="TODO", text="TODO: test"),
|
|
@@ -589,7 +589,7 @@ class TestCLI:
|
|
|
589
589
|
"""codemarkers group shows help."""
|
|
590
590
|
from click.testing import CliRunner
|
|
591
591
|
|
|
592
|
-
from
|
|
592
|
+
from pf.codemarkers.cli import codemarkers
|
|
593
593
|
|
|
594
594
|
runner = CliRunner()
|
|
595
595
|
result = runner.invoke(codemarkers, ["--help"])
|
|
@@ -600,7 +600,7 @@ class TestCLI:
|
|
|
600
600
|
"""analyze subcommand is registered."""
|
|
601
601
|
from click.testing import CliRunner
|
|
602
602
|
|
|
603
|
-
from
|
|
603
|
+
from pf.codemarkers.cli import codemarkers
|
|
604
604
|
|
|
605
605
|
runner = CliRunner()
|
|
606
606
|
result = runner.invoke(codemarkers, ["analyze", "--help"])
|
|
@@ -612,7 +612,7 @@ class TestCLI:
|
|
|
612
612
|
"""stale subcommand is registered."""
|
|
613
613
|
from click.testing import CliRunner
|
|
614
614
|
|
|
615
|
-
from
|
|
615
|
+
from pf.codemarkers.cli import codemarkers
|
|
616
616
|
|
|
617
617
|
runner = CliRunner()
|
|
618
618
|
result = runner.invoke(codemarkers, ["stale", "--help"])
|
|
@@ -622,7 +622,7 @@ class TestCLI:
|
|
|
622
622
|
"""summary subcommand is registered."""
|
|
623
623
|
from click.testing import CliRunner
|
|
624
624
|
|
|
625
|
-
from
|
|
625
|
+
from pf.codemarkers.cli import codemarkers
|
|
626
626
|
|
|
627
627
|
runner = CliRunner()
|
|
628
628
|
result = runner.invoke(codemarkers, ["summary", "--help"])
|
|
@@ -632,13 +632,13 @@ class TestCLI:
|
|
|
632
632
|
"""--format json produces JSON output."""
|
|
633
633
|
from click.testing import CliRunner
|
|
634
634
|
|
|
635
|
-
from
|
|
635
|
+
from pf.codemarkers.cli import codemarkers
|
|
636
636
|
|
|
637
637
|
runner = CliRunner()
|
|
638
638
|
with patch(
|
|
639
|
-
"
|
|
639
|
+
"pf.codemarkers.cli._run_analysis"
|
|
640
640
|
) as mock_run:
|
|
641
|
-
from
|
|
641
|
+
from pf.codemarkers.models import CodeMarkersResult, MarkerSummary
|
|
642
642
|
mock_run.return_value = CodeMarkersResult(
|
|
643
643
|
success=True, repo_name="test", repo_path="/tmp",
|
|
644
644
|
stale_threshold_days=90, markers=[],
|
|
@@ -651,7 +651,7 @@ class TestCLI:
|
|
|
651
651
|
|
|
652
652
|
|
|
653
653
|
class TestMainModule:
|
|
654
|
-
"""python -m
|
|
654
|
+
"""python -m pf.codemarkers works."""
|
|
655
655
|
|
|
656
656
|
def test_module_runnable(self) -> None:
|
|
657
657
|
"""Module can be invoked with --help."""
|
|
@@ -659,7 +659,7 @@ class TestMainModule:
|
|
|
659
659
|
import sys
|
|
660
660
|
|
|
661
661
|
result = subprocess.run(
|
|
662
|
-
[sys.executable, "-m", "
|
|
662
|
+
[sys.executable, "-m", "pf.codemarkers", "--help"],
|
|
663
663
|
capture_output=True, text=True, timeout=30,
|
|
664
664
|
)
|
|
665
665
|
assert result.returncode == 0
|
|
@@ -675,7 +675,7 @@ class TestModuleExports:
|
|
|
675
675
|
"""__init__.py re-exports key symbols."""
|
|
676
676
|
|
|
677
677
|
def test_exports_models(self) -> None:
|
|
678
|
-
from
|
|
678
|
+
from pf.codemarkers import (
|
|
679
679
|
CodeMarker,
|
|
680
680
|
CodeMarkersResult,
|
|
681
681
|
)
|
|
@@ -683,5 +683,5 @@ class TestModuleExports:
|
|
|
683
683
|
assert CodeMarkersResult is not None
|
|
684
684
|
|
|
685
685
|
def test_exports_analyze(self) -> None:
|
|
686
|
-
from
|
|
686
|
+
from pf.codemarkers import analyze_repo
|
|
687
687
|
assert callable(analyze_repo)
|