@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
|
@@ -31,7 +31,7 @@ class TestComponentTokenCounting:
|
|
|
31
31
|
|
|
32
32
|
def test_load_tier_components_returns_token_counts(self, tmp_path: Path) -> None:
|
|
33
33
|
"""Test load_tier_components returns token counts for each component."""
|
|
34
|
-
from
|
|
34
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
35
35
|
|
|
36
36
|
self._setup_complete_project(tmp_path)
|
|
37
37
|
|
|
@@ -47,7 +47,7 @@ class TestComponentTokenCounting:
|
|
|
47
47
|
|
|
48
48
|
def test_token_counts_include_all_full_tier_components(self, tmp_path: Path) -> None:
|
|
49
49
|
"""Test FULL tier returns token counts for all components."""
|
|
50
|
-
from
|
|
50
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
51
51
|
|
|
52
52
|
self._setup_complete_project(tmp_path)
|
|
53
53
|
|
|
@@ -77,7 +77,7 @@ class TestComponentTokenCounting:
|
|
|
77
77
|
|
|
78
78
|
def test_token_counts_are_positive_for_loaded_components(self, tmp_path: Path) -> None:
|
|
79
79
|
"""Test that loaded components have positive token counts."""
|
|
80
|
-
from
|
|
80
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
81
81
|
|
|
82
82
|
self._setup_complete_project(tmp_path)
|
|
83
83
|
|
|
@@ -96,7 +96,7 @@ class TestComponentTokenCounting:
|
|
|
96
96
|
|
|
97
97
|
def test_token_counts_zero_for_missing_components(self, tmp_path: Path) -> None:
|
|
98
98
|
"""Test that missing optional components have zero token counts."""
|
|
99
|
-
from
|
|
99
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
100
100
|
|
|
101
101
|
# Minimal setup - only agent definition
|
|
102
102
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
@@ -119,7 +119,7 @@ class TestComponentTokenCounting:
|
|
|
119
119
|
|
|
120
120
|
def test_refresh_tier_only_counts_included_components(self, tmp_path: Path) -> None:
|
|
121
121
|
"""Test REFRESH tier only includes counts for its components."""
|
|
122
|
-
from
|
|
122
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
123
123
|
|
|
124
124
|
self._setup_complete_project(tmp_path)
|
|
125
125
|
|
|
@@ -144,7 +144,7 @@ class TestComponentTokenCounting:
|
|
|
144
144
|
|
|
145
145
|
def test_handoff_tier_only_counts_included_components(self, tmp_path: Path) -> None:
|
|
146
146
|
"""Test HANDOFF tier only includes counts for its components."""
|
|
147
|
-
from
|
|
147
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
148
148
|
|
|
149
149
|
self._setup_complete_project(tmp_path)
|
|
150
150
|
|
|
@@ -163,7 +163,7 @@ class TestComponentTokenCounting:
|
|
|
163
163
|
|
|
164
164
|
def test_minimal_tier_only_counts_workflow_state(self, tmp_path: Path) -> None:
|
|
165
165
|
"""Test MINIMAL tier only counts workflow state."""
|
|
166
|
-
from
|
|
166
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
167
167
|
|
|
168
168
|
self._setup_complete_project(tmp_path)
|
|
169
169
|
|
|
@@ -186,7 +186,7 @@ class TestComponentTokenCounting:
|
|
|
186
186
|
|
|
187
187
|
def test_total_tokens_is_sum_of_components(self, tmp_path: Path) -> None:
|
|
188
188
|
"""Test that total_tokens equals sum of component counts."""
|
|
189
|
-
from
|
|
189
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
190
190
|
|
|
191
191
|
self._setup_complete_project(tmp_path)
|
|
192
192
|
|
|
@@ -264,11 +264,11 @@ class TestTokenBreakdownOutput:
|
|
|
264
264
|
|
|
265
265
|
def test_json_output_includes_token_counts(self, tmp_path: Path, capsys) -> None:
|
|
266
266
|
"""Test JSON output includes token_counts object."""
|
|
267
|
-
from
|
|
267
|
+
from pf.prime.cli import prime
|
|
268
268
|
|
|
269
269
|
self._setup_project(tmp_path)
|
|
270
270
|
|
|
271
|
-
with patch("
|
|
271
|
+
with patch("pf.prime.cli.get_project_root", return_value=tmp_path):
|
|
272
272
|
result = prime(
|
|
273
273
|
agent_name="dev",
|
|
274
274
|
tier="FULL",
|
|
@@ -288,11 +288,11 @@ class TestTokenBreakdownOutput:
|
|
|
288
288
|
|
|
289
289
|
def test_json_output_includes_total_tokens(self, tmp_path: Path, capsys) -> None:
|
|
290
290
|
"""Test JSON output includes total_tokens field."""
|
|
291
|
-
from
|
|
291
|
+
from pf.prime.cli import prime
|
|
292
292
|
|
|
293
293
|
self._setup_project(tmp_path)
|
|
294
294
|
|
|
295
|
-
with patch("
|
|
295
|
+
with patch("pf.prime.cli.get_project_root", return_value=tmp_path):
|
|
296
296
|
result = prime(
|
|
297
297
|
agent_name="dev",
|
|
298
298
|
tier="FULL",
|
|
@@ -313,11 +313,11 @@ class TestTokenBreakdownOutput:
|
|
|
313
313
|
|
|
314
314
|
def test_json_token_counts_match_tier(self, tmp_path: Path, capsys) -> None:
|
|
315
315
|
"""Test JSON token counts reflect the tier's components."""
|
|
316
|
-
from
|
|
316
|
+
from pf.prime.cli import prime
|
|
317
317
|
|
|
318
318
|
self._setup_project(tmp_path)
|
|
319
319
|
|
|
320
|
-
with patch("
|
|
320
|
+
with patch("pf.prime.cli.get_project_root", return_value=tmp_path):
|
|
321
321
|
# MINIMAL tier
|
|
322
322
|
result = prime(
|
|
323
323
|
agent_name="dev",
|
|
@@ -342,12 +342,12 @@ class TestTokenBreakdownOutput:
|
|
|
342
342
|
|
|
343
343
|
def test_json_output_token_counts_per_component(self, tmp_path: Path, capsys) -> None:
|
|
344
344
|
"""Test JSON output has individual component counts."""
|
|
345
|
-
from
|
|
345
|
+
from pf.prime.cli import prime
|
|
346
346
|
|
|
347
347
|
self._setup_project(tmp_path)
|
|
348
348
|
|
|
349
|
-
with patch("
|
|
350
|
-
with patch("
|
|
349
|
+
with patch("pf.prime.cli.get_project_root", return_value=tmp_path):
|
|
350
|
+
with patch("pf.prime.loader.get_project_root", return_value=tmp_path):
|
|
351
351
|
result = prime(
|
|
352
352
|
agent_name="dev",
|
|
353
353
|
tier="FULL",
|
|
@@ -398,7 +398,7 @@ class TestTokenCountAccuracy:
|
|
|
398
398
|
|
|
399
399
|
def test_token_count_uses_tiktoken_or_approximation(self) -> None:
|
|
400
400
|
"""Test token counting uses tiktoken or reasonable approximation."""
|
|
401
|
-
from
|
|
401
|
+
from pf.prime.tiers import estimate_tokens
|
|
402
402
|
|
|
403
403
|
# Test string with known token characteristics
|
|
404
404
|
# "Hello, world!" is typically 4 tokens in cl100k_base
|
|
@@ -410,7 +410,7 @@ class TestTokenCountAccuracy:
|
|
|
410
410
|
|
|
411
411
|
def test_token_count_scales_with_text_length(self) -> None:
|
|
412
412
|
"""Test token count increases proportionally with text length."""
|
|
413
|
-
from
|
|
413
|
+
from pf.prime.tiers import estimate_tokens
|
|
414
414
|
|
|
415
415
|
short_text = "Hello"
|
|
416
416
|
medium_text = "Hello " * 10
|
|
@@ -425,14 +425,14 @@ class TestTokenCountAccuracy:
|
|
|
425
425
|
|
|
426
426
|
def test_token_count_handles_empty_string(self) -> None:
|
|
427
427
|
"""Test token counting handles empty string gracefully."""
|
|
428
|
-
from
|
|
428
|
+
from pf.prime.tiers import estimate_tokens
|
|
429
429
|
|
|
430
430
|
count = estimate_tokens("")
|
|
431
431
|
assert count == 0
|
|
432
432
|
|
|
433
433
|
def test_token_count_handles_unicode(self) -> None:
|
|
434
434
|
"""Test token counting handles unicode text."""
|
|
435
|
-
from
|
|
435
|
+
from pf.prime.tiers import estimate_tokens
|
|
436
436
|
|
|
437
437
|
# Unicode text (emojis typically use multiple tokens)
|
|
438
438
|
text = "Hello 👋 World 🌍"
|
|
@@ -443,7 +443,7 @@ class TestTokenCountAccuracy:
|
|
|
443
443
|
|
|
444
444
|
def test_token_count_handles_markdown(self) -> None:
|
|
445
445
|
"""Test token counting handles markdown formatting."""
|
|
446
|
-
from
|
|
446
|
+
from pf.prime.tiers import estimate_tokens
|
|
447
447
|
|
|
448
448
|
markdown = """# Heading
|
|
449
449
|
|
|
@@ -463,7 +463,7 @@ def hello():
|
|
|
463
463
|
|
|
464
464
|
def test_component_token_count_within_10_percent_of_actual(self, tmp_path: Path) -> None:
|
|
465
465
|
"""Test component token counts are within 10% of actual tiktoken count."""
|
|
466
|
-
from
|
|
466
|
+
from pf.prime.tiers import (
|
|
467
467
|
ContextTier,
|
|
468
468
|
estimate_tokens,
|
|
469
469
|
load_tier_components,
|
|
@@ -498,7 +498,7 @@ def hello():
|
|
|
498
498
|
|
|
499
499
|
def test_total_tokens_within_10_percent_of_sum(self, tmp_path: Path) -> None:
|
|
500
500
|
"""Test total_tokens is within 10% of manually summed content."""
|
|
501
|
-
from
|
|
501
|
+
from pf.prime.tiers import (
|
|
502
502
|
ContextTier,
|
|
503
503
|
load_tier_components,
|
|
504
504
|
)
|
|
@@ -537,26 +537,26 @@ class TestEstimateTokensFunction:
|
|
|
537
537
|
|
|
538
538
|
def test_estimate_tokens_exists(self) -> None:
|
|
539
539
|
"""Test estimate_tokens function is exported from tiers module."""
|
|
540
|
-
from
|
|
540
|
+
from pf.prime.tiers import estimate_tokens
|
|
541
541
|
assert callable(estimate_tokens)
|
|
542
542
|
|
|
543
543
|
def test_estimate_tokens_returns_int(self) -> None:
|
|
544
544
|
"""Test estimate_tokens returns an integer."""
|
|
545
|
-
from
|
|
545
|
+
from pf.prime.tiers import estimate_tokens
|
|
546
546
|
|
|
547
547
|
result = estimate_tokens("Hello, world!")
|
|
548
548
|
assert isinstance(result, int)
|
|
549
549
|
|
|
550
550
|
def test_estimate_tokens_positive_for_content(self) -> None:
|
|
551
551
|
"""Test estimate_tokens returns positive value for non-empty content."""
|
|
552
|
-
from
|
|
552
|
+
from pf.prime.tiers import estimate_tokens
|
|
553
553
|
|
|
554
554
|
result = estimate_tokens("Some content here")
|
|
555
555
|
assert result > 0
|
|
556
556
|
|
|
557
557
|
def test_estimate_tokens_deterministic(self) -> None:
|
|
558
558
|
"""Test estimate_tokens returns same result for same input."""
|
|
559
|
-
from
|
|
559
|
+
from pf.prime.tiers import estimate_tokens
|
|
560
560
|
|
|
561
561
|
text = "Consistent input text"
|
|
562
562
|
result1 = estimate_tokens(text)
|
|
@@ -148,7 +148,7 @@ class TestLoadReposTopology:
|
|
|
148
148
|
|
|
149
149
|
def test_loads_valid_topology(self, topology_project: Path) -> None:
|
|
150
150
|
"""Test loading repos.yaml with full topology fields returns formatted text."""
|
|
151
|
-
from
|
|
151
|
+
from pf.prime.loader import load_repos_topology
|
|
152
152
|
|
|
153
153
|
result = load_repos_topology(topology_project)
|
|
154
154
|
|
|
@@ -158,7 +158,7 @@ class TestLoadReposTopology:
|
|
|
158
158
|
|
|
159
159
|
def test_includes_repo_names(self, topology_project: Path) -> None:
|
|
160
160
|
"""Test formatted output includes repo names."""
|
|
161
|
-
from
|
|
161
|
+
from pf.prime.loader import load_repos_topology
|
|
162
162
|
|
|
163
163
|
result = load_repos_topology(topology_project)
|
|
164
164
|
|
|
@@ -168,7 +168,7 @@ class TestLoadReposTopology:
|
|
|
168
168
|
|
|
169
169
|
def test_includes_owns_patterns(self, topology_project: Path) -> None:
|
|
170
170
|
"""Test formatted output includes ownership glob patterns."""
|
|
171
|
-
from
|
|
171
|
+
from pf.prime.loader import load_repos_topology
|
|
172
172
|
|
|
173
173
|
result = load_repos_topology(topology_project)
|
|
174
174
|
|
|
@@ -178,7 +178,7 @@ class TestLoadReposTopology:
|
|
|
178
178
|
|
|
179
179
|
def test_includes_never_edit_zones(self, topology_project: Path) -> None:
|
|
180
180
|
"""Test formatted output includes never-edit paths."""
|
|
181
|
-
from
|
|
181
|
+
from pf.prime.loader import load_repos_topology
|
|
182
182
|
|
|
183
183
|
result = load_repos_topology(topology_project)
|
|
184
184
|
|
|
@@ -187,7 +187,7 @@ class TestLoadReposTopology:
|
|
|
187
187
|
|
|
188
188
|
def test_includes_ui_layer(self, topology_project: Path) -> None:
|
|
189
189
|
"""Test formatted output includes UI layer for each repo."""
|
|
190
|
-
from
|
|
190
|
+
from pf.prime.loader import load_repos_topology
|
|
191
191
|
|
|
192
192
|
result = load_repos_topology(topology_project)
|
|
193
193
|
|
|
@@ -197,7 +197,7 @@ class TestLoadReposTopology:
|
|
|
197
197
|
|
|
198
198
|
def test_includes_symlinks(self, topology_project: Path) -> None:
|
|
199
199
|
"""Test formatted output includes symlink mappings."""
|
|
200
|
-
from
|
|
200
|
+
from pf.prime.loader import load_repos_topology
|
|
201
201
|
|
|
202
202
|
result = load_repos_topology(topology_project)
|
|
203
203
|
|
|
@@ -206,7 +206,7 @@ class TestLoadReposTopology:
|
|
|
206
206
|
|
|
207
207
|
def test_includes_components_path(self, topology_project: Path) -> None:
|
|
208
208
|
"""Test formatted output includes components_path when present."""
|
|
209
|
-
from
|
|
209
|
+
from pf.prime.loader import load_repos_topology
|
|
210
210
|
|
|
211
211
|
result = load_repos_topology(topology_project)
|
|
212
212
|
|
|
@@ -215,7 +215,7 @@ class TestLoadReposTopology:
|
|
|
215
215
|
|
|
216
216
|
def test_returns_none_when_no_repos_yaml(self, tmp_path: Path) -> None:
|
|
217
217
|
"""Test returns None when repos.yaml doesn't exist."""
|
|
218
|
-
from
|
|
218
|
+
from pf.prime.loader import load_repos_topology
|
|
219
219
|
|
|
220
220
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
221
221
|
pf_dir.mkdir()
|
|
@@ -226,7 +226,7 @@ class TestLoadReposTopology:
|
|
|
226
226
|
|
|
227
227
|
def test_returns_none_when_no_pennyfarthing_dir(self, tmp_path: Path) -> None:
|
|
228
228
|
"""Test returns None when .pennyfarthing/ doesn't exist."""
|
|
229
|
-
from
|
|
229
|
+
from pf.prime.loader import load_repos_topology
|
|
230
230
|
|
|
231
231
|
result = load_repos_topology(tmp_path)
|
|
232
232
|
|
|
@@ -234,7 +234,7 @@ class TestLoadReposTopology:
|
|
|
234
234
|
|
|
235
235
|
def test_handles_invalid_yaml(self, tmp_path: Path) -> None:
|
|
236
236
|
"""Test gracefully handles invalid YAML content."""
|
|
237
|
-
from
|
|
237
|
+
from pf.prime.loader import load_repos_topology
|
|
238
238
|
|
|
239
239
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
240
240
|
pf_dir.mkdir()
|
|
@@ -246,7 +246,7 @@ class TestLoadReposTopology:
|
|
|
246
246
|
|
|
247
247
|
def test_handles_yaml_without_repos_key(self, tmp_path: Path) -> None:
|
|
248
248
|
"""Test handles YAML that has no 'repos' key."""
|
|
249
|
-
from
|
|
249
|
+
from pf.prime.loader import load_repos_topology
|
|
250
250
|
|
|
251
251
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
252
252
|
pf_dir.mkdir()
|
|
@@ -258,7 +258,7 @@ class TestLoadReposTopology:
|
|
|
258
258
|
|
|
259
259
|
def test_handles_empty_repos(self, tmp_path: Path) -> None:
|
|
260
260
|
"""Test handles repos.yaml with empty repos dict."""
|
|
261
|
-
from
|
|
261
|
+
from pf.prime.loader import load_repos_topology
|
|
262
262
|
|
|
263
263
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
264
264
|
pf_dir.mkdir()
|
|
@@ -270,7 +270,7 @@ class TestLoadReposTopology:
|
|
|
270
270
|
|
|
271
271
|
def test_backwards_compat_legacy_repos(self, legacy_project: Path) -> None:
|
|
272
272
|
"""Test repos without topology fields still produce output."""
|
|
273
|
-
from
|
|
273
|
+
from pf.prime.loader import load_repos_topology
|
|
274
274
|
|
|
275
275
|
result = load_repos_topology(legacy_project)
|
|
276
276
|
|
|
@@ -289,7 +289,7 @@ class TestFullTierTopology:
|
|
|
289
289
|
|
|
290
290
|
def test_full_tier_includes_repos_topology(self, full_project: Path) -> None:
|
|
291
291
|
"""Test FULL tier load_tier_components includes repos_topology."""
|
|
292
|
-
from
|
|
292
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
293
293
|
|
|
294
294
|
components = load_tier_components(
|
|
295
295
|
tier=ContextTier.FULL,
|
|
@@ -303,7 +303,7 @@ class TestFullTierTopology:
|
|
|
303
303
|
|
|
304
304
|
def test_full_tier_topology_has_token_count(self, full_project: Path) -> None:
|
|
305
305
|
"""Test FULL tier topology component has a token count estimate."""
|
|
306
|
-
from
|
|
306
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
307
307
|
|
|
308
308
|
components = load_tier_components(
|
|
309
309
|
tier=ContextTier.FULL,
|
|
@@ -319,14 +319,14 @@ class TestFullTierTopology:
|
|
|
319
319
|
self, full_project: Path, capsys
|
|
320
320
|
) -> None:
|
|
321
321
|
"""Test FULL tier text output includes topology section."""
|
|
322
|
-
from
|
|
322
|
+
from pf.prime.cli import prime
|
|
323
323
|
|
|
324
324
|
with patch(
|
|
325
|
-
"
|
|
325
|
+
"pf.prime.cli.get_project_root",
|
|
326
326
|
return_value=full_project,
|
|
327
327
|
):
|
|
328
328
|
with patch(
|
|
329
|
-
"
|
|
329
|
+
"pf.prime.loader.get_project_root",
|
|
330
330
|
return_value=full_project,
|
|
331
331
|
):
|
|
332
332
|
result = prime(
|
|
@@ -357,14 +357,14 @@ class TestJSONTopologyOutput:
|
|
|
357
357
|
"""Test JSON output includes topology in components list."""
|
|
358
358
|
import json
|
|
359
359
|
|
|
360
|
-
from
|
|
360
|
+
from pf.prime.cli import prime
|
|
361
361
|
|
|
362
362
|
with patch(
|
|
363
|
-
"
|
|
363
|
+
"pf.prime.cli.get_project_root",
|
|
364
364
|
return_value=full_project,
|
|
365
365
|
):
|
|
366
366
|
with patch(
|
|
367
|
-
"
|
|
367
|
+
"pf.prime.loader.get_project_root",
|
|
368
368
|
return_value=full_project,
|
|
369
369
|
):
|
|
370
370
|
result = prime(
|
|
@@ -390,14 +390,14 @@ class TestJSONTopologyOutput:
|
|
|
390
390
|
"""Test JSON topology component has token count."""
|
|
391
391
|
import json
|
|
392
392
|
|
|
393
|
-
from
|
|
393
|
+
from pf.prime.cli import prime
|
|
394
394
|
|
|
395
395
|
with patch(
|
|
396
|
-
"
|
|
396
|
+
"pf.prime.cli.get_project_root",
|
|
397
397
|
return_value=full_project,
|
|
398
398
|
):
|
|
399
399
|
with patch(
|
|
400
|
-
"
|
|
400
|
+
"pf.prime.loader.get_project_root",
|
|
401
401
|
return_value=full_project,
|
|
402
402
|
):
|
|
403
403
|
result = prime(
|
|
@@ -426,14 +426,14 @@ class TestJSONTopologyOutput:
|
|
|
426
426
|
"""Test JSON topology component has source path."""
|
|
427
427
|
import json
|
|
428
428
|
|
|
429
|
-
from
|
|
429
|
+
from pf.prime.cli import prime
|
|
430
430
|
|
|
431
431
|
with patch(
|
|
432
|
-
"
|
|
432
|
+
"pf.prime.cli.get_project_root",
|
|
433
433
|
return_value=full_project,
|
|
434
434
|
):
|
|
435
435
|
with patch(
|
|
436
|
-
"
|
|
436
|
+
"pf.prime.loader.get_project_root",
|
|
437
437
|
return_value=full_project,
|
|
438
438
|
):
|
|
439
439
|
result = prime(
|
|
@@ -467,7 +467,7 @@ class TestTopologyTierAvailability:
|
|
|
467
467
|
|
|
468
468
|
def test_full_tier_has_topology(self, full_project: Path) -> None:
|
|
469
469
|
"""Test FULL tier includes repos_topology."""
|
|
470
|
-
from
|
|
470
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
471
471
|
|
|
472
472
|
components = load_tier_components(
|
|
473
473
|
tier=ContextTier.FULL,
|
|
@@ -479,7 +479,7 @@ class TestTopologyTierAvailability:
|
|
|
479
479
|
|
|
480
480
|
def test_refresh_tier_has_topology(self, full_project: Path) -> None:
|
|
481
481
|
"""Test REFRESH tier includes repos_topology (session-independent)."""
|
|
482
|
-
from
|
|
482
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
483
483
|
|
|
484
484
|
components = load_tier_components(
|
|
485
485
|
tier=ContextTier.REFRESH,
|
|
@@ -491,7 +491,7 @@ class TestTopologyTierAvailability:
|
|
|
491
491
|
|
|
492
492
|
def test_handoff_tier_has_topology(self, full_project: Path) -> None:
|
|
493
493
|
"""Test HANDOFF tier includes repos_topology (agent needs orientation)."""
|
|
494
|
-
from
|
|
494
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
495
495
|
|
|
496
496
|
components = load_tier_components(
|
|
497
497
|
tier=ContextTier.HANDOFF,
|
|
@@ -503,7 +503,7 @@ class TestTopologyTierAvailability:
|
|
|
503
503
|
|
|
504
504
|
def test_minimal_tier_excludes_topology(self, full_project: Path) -> None:
|
|
505
505
|
"""Test MINIMAL tier does NOT include repos_topology."""
|
|
506
|
-
from
|
|
506
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
507
507
|
|
|
508
508
|
components = load_tier_components(
|
|
509
509
|
tier=ContextTier.MINIMAL,
|
|
@@ -524,7 +524,7 @@ class TestTopologyTokenCounting:
|
|
|
524
524
|
|
|
525
525
|
def test_topology_token_count_realistic(self, full_project: Path) -> None:
|
|
526
526
|
"""Test topology token count is in realistic range (100-500 tokens)."""
|
|
527
|
-
from
|
|
527
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
528
528
|
|
|
529
529
|
components = load_tier_components(
|
|
530
530
|
tier=ContextTier.FULL,
|
|
@@ -545,7 +545,7 @@ class TestTopologyTokenCounting:
|
|
|
545
545
|
|
|
546
546
|
def test_topology_included_in_total_tokens(self, full_project: Path) -> None:
|
|
547
547
|
"""Test topology tokens are included in total_tokens sum."""
|
|
548
|
-
from
|
|
548
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
549
549
|
|
|
550
550
|
components = load_tier_components(
|
|
551
551
|
tier=ContextTier.FULL,
|
|
@@ -564,7 +564,7 @@ class TestTopologyBackwardsCompat:
|
|
|
564
564
|
|
|
565
565
|
def test_project_without_repos_yaml_works(self, tmp_path: Path) -> None:
|
|
566
566
|
"""Test prime works fine when repos.yaml doesn't exist."""
|
|
567
|
-
from
|
|
567
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
568
568
|
|
|
569
569
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
570
570
|
pf_dir.mkdir()
|
|
@@ -587,7 +587,7 @@ class TestTopologyBackwardsCompat:
|
|
|
587
587
|
|
|
588
588
|
def test_legacy_repos_yaml_works(self, legacy_project: Path) -> None:
|
|
589
589
|
"""Test repos.yaml without topology fields doesn't break prime."""
|
|
590
|
-
from
|
|
590
|
+
from pf.prime.tiers import ContextTier, load_tier_components
|
|
591
591
|
|
|
592
592
|
# Add agent for tier loading
|
|
593
593
|
agents_dir = legacy_project / ".pennyfarthing" / "agents"
|
|
@@ -605,7 +605,7 @@ class TestTopologyBackwardsCompat:
|
|
|
605
605
|
|
|
606
606
|
def test_cli_component_header_for_topology(self) -> None:
|
|
607
607
|
"""Test _component_header returns correct header for repos_topology."""
|
|
608
|
-
from
|
|
608
|
+
from pf.prime.cli import _component_header
|
|
609
609
|
|
|
610
610
|
header = _component_header("repos_topology", "dev")
|
|
611
611
|
|
|
@@ -613,7 +613,7 @@ class TestTopologyBackwardsCompat:
|
|
|
613
613
|
|
|
614
614
|
def test_cli_component_source_for_topology(self) -> None:
|
|
615
615
|
"""Test _component_source returns correct path for repos_topology."""
|
|
616
|
-
from
|
|
616
|
+
from pf.prime.cli import _component_source
|
|
617
617
|
|
|
618
618
|
source = _component_source("repos_topology", "dev", Path("/fake"))
|
|
619
619
|
|
|
@@ -19,8 +19,8 @@ from __future__ import annotations
|
|
|
19
19
|
import time
|
|
20
20
|
from unittest.mock import MagicMock, patch
|
|
21
21
|
|
|
22
|
-
from
|
|
23
|
-
from
|
|
22
|
+
from pf.bikerack.tui import BikeRackApp
|
|
23
|
+
from pf.bikerack.ws_client import WheelHubClient
|
|
24
24
|
|
|
25
25
|
# ---------------------------------------------------------------------------
|
|
26
26
|
# Helpers
|
|
@@ -21,13 +21,13 @@ from unittest.mock import MagicMock, patch
|
|
|
21
21
|
|
|
22
22
|
from ruamel.yaml import YAML
|
|
23
23
|
|
|
24
|
-
from
|
|
24
|
+
from pf.bc.focus import (
|
|
25
25
|
VALID_PANELS,
|
|
26
26
|
get_last_panel,
|
|
27
27
|
save_last_panel,
|
|
28
28
|
)
|
|
29
|
-
from
|
|
30
|
-
from
|
|
29
|
+
from pf.bikerack.tui import BikeRackApp
|
|
30
|
+
from pf.bikerack.ws_client import WheelHubClient
|
|
31
31
|
|
|
32
32
|
# ---------------------------------------------------------------------------
|
|
33
33
|
# Helpers
|
|
@@ -241,7 +241,7 @@ class TestTuiRestore:
|
|
|
241
241
|
try:
|
|
242
242
|
with patch.object(BikeRackApp, "run_worker"), \
|
|
243
243
|
patch(
|
|
244
|
-
"
|
|
244
|
+
"pf.bikerack.tui.get_last_panel",
|
|
245
245
|
return_value={"success": True, "last_panel": "git"},
|
|
246
246
|
):
|
|
247
247
|
loop.run_until_complete(app.on_mount())
|
|
@@ -270,7 +270,7 @@ class TestTuiRestore:
|
|
|
270
270
|
try:
|
|
271
271
|
with patch.object(BikeRackApp, "run_worker"), \
|
|
272
272
|
patch(
|
|
273
|
-
"
|
|
273
|
+
"pf.bikerack.tui.get_last_panel",
|
|
274
274
|
return_value={"success": True, "last_panel": None},
|
|
275
275
|
):
|
|
276
276
|
loop.run_until_complete(app.on_mount())
|
|
@@ -293,7 +293,7 @@ class TestTuiRestore:
|
|
|
293
293
|
try:
|
|
294
294
|
with patch.object(BikeRackApp, "run_worker"), \
|
|
295
295
|
patch(
|
|
296
|
-
"
|
|
296
|
+
"pf.bikerack.tui.get_last_panel",
|
|
297
297
|
return_value={"success": False, "error": "File not found"},
|
|
298
298
|
):
|
|
299
299
|
loop.run_until_complete(app.on_mount())
|
|
@@ -320,7 +320,7 @@ class TestTuiPersist:
|
|
|
320
320
|
app = make_app()
|
|
321
321
|
|
|
322
322
|
with patch(
|
|
323
|
-
"
|
|
323
|
+
"pf.bikerack.tui.save_last_panel"
|
|
324
324
|
) as mock_save:
|
|
325
325
|
mock_save.return_value = {"success": True, "data": "git"}
|
|
326
326
|
app._handle_focus_message(focus_msg("git"))
|
|
@@ -333,7 +333,7 @@ class TestTuiPersist:
|
|
|
333
333
|
app._handle_focus_message(focus_msg("sprint"))
|
|
334
334
|
|
|
335
335
|
with patch(
|
|
336
|
-
"
|
|
336
|
+
"pf.bikerack.tui.save_last_panel"
|
|
337
337
|
) as mock_save:
|
|
338
338
|
app._handle_focus_message(focus_msg(None))
|
|
339
339
|
|
|
@@ -346,7 +346,7 @@ class TestTuiPersist:
|
|
|
346
346
|
app = make_app()
|
|
347
347
|
|
|
348
348
|
with patch(
|
|
349
|
-
"
|
|
349
|
+
"pf.bikerack.tui.save_last_panel"
|
|
350
350
|
) as mock_save:
|
|
351
351
|
mock_save.return_value = {"success": True}
|
|
352
352
|
app._handle_focus_message(focus_msg("sprint"))
|
|
@@ -363,7 +363,7 @@ class TestTuiPersist:
|
|
|
363
363
|
app = make_app()
|
|
364
364
|
|
|
365
365
|
with patch(
|
|
366
|
-
"
|
|
366
|
+
"pf.bikerack.tui.save_last_panel"
|
|
367
367
|
) as mock_save:
|
|
368
368
|
app._handle_focus_message(focus_msg("sprint", msg_type="init"))
|
|
369
369
|
|
|
@@ -21,11 +21,11 @@ from unittest.mock import patch
|
|
|
21
21
|
import pytest
|
|
22
22
|
from click.testing import CliRunner
|
|
23
23
|
|
|
24
|
-
from
|
|
25
|
-
from
|
|
24
|
+
from pf.cli import cli
|
|
25
|
+
from pf.workflow import get_workflow_state
|
|
26
26
|
|
|
27
27
|
# Mock path: workflow.cli imports from workflow.state, so mock at the source module
|
|
28
|
-
MOCK_PATH = "
|
|
28
|
+
MOCK_PATH = "pf.workflow.state.get_workflow_state"
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
class TestWorkflowCheckCLI:
|
|
@@ -289,9 +289,9 @@ class TestSubprocessExecution:
|
|
|
289
289
|
"""Tests verifying the CLI works as a subprocess (integration)."""
|
|
290
290
|
|
|
291
291
|
def test_module_runnable(self) -> None:
|
|
292
|
-
"""CLI should be runnable as python -m
|
|
292
|
+
"""CLI should be runnable as python -m pf.cli."""
|
|
293
293
|
result = subprocess.run(
|
|
294
|
-
[sys.executable, "-m", "
|
|
294
|
+
[sys.executable, "-m", "pf.cli", "workflow", "check"],
|
|
295
295
|
capture_output=True,
|
|
296
296
|
text=True,
|
|
297
297
|
timeout=30,
|
|
@@ -305,7 +305,7 @@ class TestSubprocessExecution:
|
|
|
305
305
|
[
|
|
306
306
|
sys.executable,
|
|
307
307
|
"-m",
|
|
308
|
-
"
|
|
308
|
+
"pf.cli",
|
|
309
309
|
"workflow",
|
|
310
310
|
"check",
|
|
311
311
|
"--json",
|
|
@@ -325,7 +325,7 @@ class TestSubprocessExecution:
|
|
|
325
325
|
[
|
|
326
326
|
sys.executable,
|
|
327
327
|
"-m",
|
|
328
|
-
"
|
|
328
|
+
"pf.cli",
|
|
329
329
|
"workflow",
|
|
330
330
|
"check",
|
|
331
331
|
"--help",
|