@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,4 +1,4 @@
|
|
|
1
|
-
"""Tests for
|
|
1
|
+
"""Tests for pf.prime module.
|
|
2
2
|
|
|
3
3
|
Tests context loading for prime command.
|
|
4
4
|
"""
|
|
@@ -8,8 +8,8 @@ from unittest.mock import patch
|
|
|
8
8
|
|
|
9
9
|
import pytest
|
|
10
10
|
|
|
11
|
-
from
|
|
12
|
-
from
|
|
11
|
+
from pf.prime.cli import main, prime
|
|
12
|
+
from pf.prime.loader import (
|
|
13
13
|
_extract_session_parts,
|
|
14
14
|
_find_session_file,
|
|
15
15
|
load_agent_definition,
|
|
@@ -105,8 +105,8 @@ class TestLoadSprintContext:
|
|
|
105
105
|
pf_dir.mkdir()
|
|
106
106
|
|
|
107
107
|
# Test
|
|
108
|
-
with patch("
|
|
109
|
-
with patch("
|
|
108
|
+
with patch("pf.prime.loader.get_project_root", return_value=tmp_path):
|
|
109
|
+
with patch("pf.sprint.loader.get_project_root", return_value=tmp_path):
|
|
110
110
|
result = load_sprint_context(tmp_path)
|
|
111
111
|
|
|
112
112
|
# Verify
|
|
@@ -236,7 +236,7 @@ Work complete.
|
|
|
236
236
|
""")
|
|
237
237
|
|
|
238
238
|
# Test
|
|
239
|
-
with patch("
|
|
239
|
+
with patch("pf.prime.loader.get_project_root", return_value=tmp_path):
|
|
240
240
|
result = load_session_context(tmp_path)
|
|
241
241
|
|
|
242
242
|
# Verify
|
|
@@ -337,7 +337,7 @@ class TestPrimeFunction:
|
|
|
337
337
|
(agents_dir / "dev.md").write_text("Agent content here")
|
|
338
338
|
|
|
339
339
|
# Test
|
|
340
|
-
with patch("
|
|
340
|
+
with patch("pf.prime.cli.get_project_root", return_value=tmp_path):
|
|
341
341
|
result = prime(agent_name="dev", quiet=True, project_root=tmp_path)
|
|
342
342
|
|
|
343
343
|
# Verify
|
|
@@ -359,7 +359,7 @@ class TestMainCLI:
|
|
|
359
359
|
def test_minimal_flag(self, capsys) -> None:
|
|
360
360
|
"""Test --minimal flag."""
|
|
361
361
|
# With minimal, should just return 0 without any output
|
|
362
|
-
with patch("
|
|
362
|
+
with patch("pf.prime.cli.get_project_root") as mock_root:
|
|
363
363
|
mock_root.return_value = Path("/tmp/test")
|
|
364
364
|
result = main(["--minimal"])
|
|
365
365
|
|
|
@@ -377,7 +377,7 @@ class TestMainCLI:
|
|
|
377
377
|
(agents_dir / "tea.md").write_text("# TEA Agent\nTest content")
|
|
378
378
|
|
|
379
379
|
# Test
|
|
380
|
-
with patch("
|
|
380
|
+
with patch("pf.prime.cli.get_project_root", return_value=tmp_path):
|
|
381
381
|
result = main(["--agent", "tea"])
|
|
382
382
|
|
|
383
383
|
# Verify
|
|
@@ -388,7 +388,7 @@ class TestMainCLI:
|
|
|
388
388
|
def test_project_not_found_error(self, capsys) -> None:
|
|
389
389
|
"""Test error handling when project root not found."""
|
|
390
390
|
with patch(
|
|
391
|
-
"
|
|
391
|
+
"pf.prime.cli.get_project_root",
|
|
392
392
|
side_effect=FileNotFoundError("No project found"),
|
|
393
393
|
):
|
|
394
394
|
result = main([])
|
|
@@ -408,8 +408,8 @@ class TestWorkflowStateDetection:
|
|
|
408
408
|
|
|
409
409
|
def test_detect_finish_state(self, tmp_path: Path) -> None:
|
|
410
410
|
"""Test detecting FINISH_STATE when phase is approved."""
|
|
411
|
-
from
|
|
412
|
-
from
|
|
411
|
+
from pf.prime.models import WorkflowState
|
|
412
|
+
from pf.prime.workflow import detect_workflow_state
|
|
413
413
|
|
|
414
414
|
# Setup
|
|
415
415
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
@@ -439,8 +439,8 @@ class TestWorkflowStateDetection:
|
|
|
439
439
|
"""Test detecting IN_PROGRESS_STATE with active phase."""
|
|
440
440
|
import yaml
|
|
441
441
|
|
|
442
|
-
from
|
|
443
|
-
from
|
|
442
|
+
from pf.prime.models import WorkflowState
|
|
443
|
+
from pf.prime.workflow import detect_workflow_state
|
|
444
444
|
|
|
445
445
|
# Setup
|
|
446
446
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
@@ -487,8 +487,8 @@ class TestWorkflowStateDetection:
|
|
|
487
487
|
"""Test detecting NEW_WORK_STATE with backlog stories."""
|
|
488
488
|
import yaml
|
|
489
489
|
|
|
490
|
-
from
|
|
491
|
-
from
|
|
490
|
+
from pf.prime.models import WorkflowState
|
|
491
|
+
from pf.prime.workflow import detect_workflow_state
|
|
492
492
|
|
|
493
493
|
# Setup
|
|
494
494
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
@@ -519,8 +519,8 @@ class TestWorkflowStateDetection:
|
|
|
519
519
|
"""Test detecting EMPTY_BACKLOG_STATE with no backlog."""
|
|
520
520
|
import yaml
|
|
521
521
|
|
|
522
|
-
from
|
|
523
|
-
from
|
|
522
|
+
from pf.prime.models import WorkflowState
|
|
523
|
+
from pf.prime.workflow import detect_workflow_state
|
|
524
524
|
|
|
525
525
|
# Setup
|
|
526
526
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
@@ -551,7 +551,7 @@ class TestParseSessionHeader:
|
|
|
551
551
|
|
|
552
552
|
def test_parse_standard_header(self, tmp_path: Path) -> None:
|
|
553
553
|
"""Test parsing a standard session header."""
|
|
554
|
-
from
|
|
554
|
+
from pf.prime.workflow import parse_session_header
|
|
555
555
|
|
|
556
556
|
session_file = tmp_path / "MSSCI-12345-session.md"
|
|
557
557
|
session_file.write_text("""# MSSCI-12345: Test Story
|
|
@@ -572,7 +572,7 @@ class TestParseSessionHeader:
|
|
|
572
572
|
|
|
573
573
|
def test_parse_approved_phase(self, tmp_path: Path) -> None:
|
|
574
574
|
"""Test parsing phase with APPROVED status."""
|
|
575
|
-
from
|
|
575
|
+
from pf.prime.workflow import parse_session_header
|
|
576
576
|
|
|
577
577
|
session_file = tmp_path / "63-1-session.md"
|
|
578
578
|
session_file.write_text("""# Session
|
|
@@ -591,8 +591,8 @@ class TestCheckRedirect:
|
|
|
591
591
|
|
|
592
592
|
def test_redirect_when_wrong_agent(self) -> None:
|
|
593
593
|
"""Test redirect is detected when wrong agent is activated."""
|
|
594
|
-
from
|
|
595
|
-
from
|
|
594
|
+
from pf.prime.models import WorkflowState, WorkflowStatus
|
|
595
|
+
from pf.prime.workflow import check_redirect
|
|
596
596
|
|
|
597
597
|
status = WorkflowStatus(
|
|
598
598
|
state=WorkflowState.IN_PROGRESS_STATE,
|
|
@@ -610,8 +610,8 @@ class TestCheckRedirect:
|
|
|
610
610
|
|
|
611
611
|
def test_no_redirect_when_correct_agent(self) -> None:
|
|
612
612
|
"""Test no redirect when correct agent is activated."""
|
|
613
|
-
from
|
|
614
|
-
from
|
|
613
|
+
from pf.prime.models import WorkflowState, WorkflowStatus
|
|
614
|
+
from pf.prime.workflow import check_redirect
|
|
615
615
|
|
|
616
616
|
status = WorkflowStatus(
|
|
617
617
|
state=WorkflowState.IN_PROGRESS_STATE,
|
|
@@ -625,8 +625,8 @@ class TestCheckRedirect:
|
|
|
625
625
|
|
|
626
626
|
def test_no_redirect_for_new_work(self) -> None:
|
|
627
627
|
"""Test no redirect for NEW_WORK_STATE."""
|
|
628
|
-
from
|
|
629
|
-
from
|
|
628
|
+
from pf.prime.models import WorkflowState, WorkflowStatus
|
|
629
|
+
from pf.prime.workflow import check_redirect
|
|
630
630
|
|
|
631
631
|
status = WorkflowStatus(
|
|
632
632
|
state=WorkflowState.NEW_WORK_STATE,
|
|
@@ -650,7 +650,7 @@ class TestPersonaLoading:
|
|
|
650
650
|
"""Test loading persona from theme YAML."""
|
|
651
651
|
import yaml
|
|
652
652
|
|
|
653
|
-
from
|
|
653
|
+
from pf.prime.persona import load_persona
|
|
654
654
|
|
|
655
655
|
# Setup
|
|
656
656
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
@@ -687,7 +687,7 @@ class TestPersonaLoading:
|
|
|
687
687
|
|
|
688
688
|
def test_load_persona_no_theme(self, tmp_path: Path) -> None:
|
|
689
689
|
"""Test load_persona returns None when no theme configured."""
|
|
690
|
-
from
|
|
690
|
+
from pf.prime.persona import load_persona
|
|
691
691
|
|
|
692
692
|
# Setup - no config
|
|
693
693
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
@@ -704,7 +704,7 @@ class TestPersonaLoading:
|
|
|
704
704
|
"""Test getting crew manifest for handoff reference."""
|
|
705
705
|
import yaml
|
|
706
706
|
|
|
707
|
-
from
|
|
707
|
+
from pf.prime.persona import get_crew_manifest
|
|
708
708
|
|
|
709
709
|
# Setup
|
|
710
710
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
@@ -736,8 +736,8 @@ class TestPersonaLoading:
|
|
|
736
736
|
|
|
737
737
|
def test_format_persona_output(self) -> None:
|
|
738
738
|
"""Test formatting persona as XML."""
|
|
739
|
-
from
|
|
740
|
-
from
|
|
739
|
+
from pf.prime.models import CrewMember, Persona
|
|
740
|
+
from pf.prime.persona import format_persona_output
|
|
741
741
|
|
|
742
742
|
persona = Persona(
|
|
743
743
|
character="Naomi Nagata",
|
|
@@ -769,7 +769,7 @@ class TestSessionRegistration:
|
|
|
769
769
|
|
|
770
770
|
def test_register_session(self, tmp_path: Path) -> None:
|
|
771
771
|
"""Test registering a new session."""
|
|
772
|
-
from
|
|
772
|
+
from pf.prime.session import register_session
|
|
773
773
|
|
|
774
774
|
# Setup
|
|
775
775
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
@@ -789,7 +789,7 @@ class TestSessionRegistration:
|
|
|
789
789
|
|
|
790
790
|
def test_register_session_generates_id(self, tmp_path: Path) -> None:
|
|
791
791
|
"""Test that session ID is generated if not provided."""
|
|
792
|
-
from
|
|
792
|
+
from pf.prime.session import register_session
|
|
793
793
|
|
|
794
794
|
# Setup
|
|
795
795
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
@@ -806,7 +806,7 @@ class TestSessionRegistration:
|
|
|
806
806
|
"""Test cleanup of old session files."""
|
|
807
807
|
import time
|
|
808
808
|
|
|
809
|
-
from
|
|
809
|
+
from pf.prime.session import cleanup_old_sessions
|
|
810
810
|
|
|
811
811
|
# Setup
|
|
812
812
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
@@ -836,7 +836,7 @@ class TestSessionRegistration:
|
|
|
836
836
|
|
|
837
837
|
def test_get_session_agent(self, tmp_path: Path) -> None:
|
|
838
838
|
"""Test getting agent name for a session."""
|
|
839
|
-
from
|
|
839
|
+
from pf.prime.session import get_session_agent
|
|
840
840
|
|
|
841
841
|
# Setup
|
|
842
842
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
@@ -853,7 +853,7 @@ class TestSessionRegistration:
|
|
|
853
853
|
|
|
854
854
|
def test_unregister_session(self, tmp_path: Path) -> None:
|
|
855
855
|
"""Test unregistering a session."""
|
|
856
|
-
from
|
|
856
|
+
from pf.prime.session import unregister_session
|
|
857
857
|
|
|
858
858
|
# Setup
|
|
859
859
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
@@ -997,7 +997,7 @@ class TestCLIFlagsV2:
|
|
|
997
997
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
998
998
|
pf_dir.mkdir()
|
|
999
999
|
|
|
1000
|
-
with patch("
|
|
1000
|
+
with patch("pf.prime.cli.get_project_root", return_value=tmp_path):
|
|
1001
1001
|
result = main(["--json", "--no-workflow", "--no-register"])
|
|
1002
1002
|
|
|
1003
1003
|
assert result == 0
|
|
@@ -1025,7 +1025,7 @@ class TestCLIFlagsV2:
|
|
|
1025
1025
|
"agents": {"dev": {"character": "Test", "style": "s", "role": "r"}}
|
|
1026
1026
|
}))
|
|
1027
1027
|
|
|
1028
|
-
with patch("
|
|
1028
|
+
with patch("pf.prime.cli.get_project_root", return_value=tmp_path):
|
|
1029
1029
|
result = main(["--agent", "dev", "--no-persona", "--no-workflow", "--no-register"])
|
|
1030
1030
|
|
|
1031
1031
|
assert result == 0
|
|
@@ -1040,7 +1040,7 @@ class TestCLIFlagsV2:
|
|
|
1040
1040
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
1041
1041
|
pf_dir.mkdir()
|
|
1042
1042
|
|
|
1043
|
-
with patch("
|
|
1043
|
+
with patch("pf.prime.cli.get_project_root", return_value=tmp_path):
|
|
1044
1044
|
result = main(["--no-workflow", "--no-register"])
|
|
1045
1045
|
|
|
1046
1046
|
assert result == 0
|
|
@@ -1050,7 +1050,7 @@ class TestCLIFlagsV2:
|
|
|
1050
1050
|
|
|
1051
1051
|
def test_session_id_flag(self, tmp_path: Path) -> None:
|
|
1052
1052
|
"""Test --session-id flag uses explicit ID."""
|
|
1053
|
-
from
|
|
1053
|
+
from pf.prime.session import get_session_agent
|
|
1054
1054
|
|
|
1055
1055
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
1056
1056
|
pf_dir.mkdir()
|
|
@@ -1058,7 +1058,7 @@ class TestCLIFlagsV2:
|
|
|
1058
1058
|
agents_dir.mkdir()
|
|
1059
1059
|
(agents_dir / "sm.md").write_text("# SM Agent\nScrum Master")
|
|
1060
1060
|
|
|
1061
|
-
with patch("
|
|
1061
|
+
with patch("pf.prime.cli.get_project_root", return_value=tmp_path):
|
|
1062
1062
|
result = main(["--agent", "sm", "--session-id", "explicit-123", "--no-workflow"])
|
|
1063
1063
|
|
|
1064
1064
|
assert result == 0
|
package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_resolve_gate_file_field.py
RENAMED
|
@@ -28,7 +28,7 @@ from pathlib import Path
|
|
|
28
28
|
import pytest
|
|
29
29
|
import yaml
|
|
30
30
|
|
|
31
|
-
from
|
|
31
|
+
from pf.handoff.resolve_gate import resolve_gate
|
|
32
32
|
|
|
33
33
|
# ---------------------------------------------------------------------------
|
|
34
34
|
# Fixtures: Workflow YAML data with gate.file support
|
|
@@ -324,7 +324,6 @@ class TestTddWorkflowMigration:
|
|
|
324
324
|
"""Load the actual tdd.yaml from pennyfarthing-dist."""
|
|
325
325
|
tdd_path = (
|
|
326
326
|
Path(__file__).resolve().parents[2]
|
|
327
|
-
/ "pennyfarthing-dist"
|
|
328
327
|
/ "workflows"
|
|
329
328
|
/ "tdd.yaml"
|
|
330
329
|
)
|
|
@@ -415,7 +414,6 @@ class TestResolveGateWithRealTddYaml:
|
|
|
415
414
|
"""Create a project that uses the actual tdd.yaml from pennyfarthing-dist."""
|
|
416
415
|
tdd_source = (
|
|
417
416
|
Path(__file__).resolve().parents[2]
|
|
418
|
-
/ "pennyfarthing-dist"
|
|
419
417
|
/ "workflows"
|
|
420
418
|
/ "tdd.yaml"
|
|
421
419
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Tests for sprint/ library package.
|
|
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 sprint/ package modules work correctly
|
|
6
6
|
after reorganization from flat modules.
|
|
@@ -15,7 +15,7 @@ class TestSprintLoader:
|
|
|
15
15
|
|
|
16
16
|
def test_load_sprint_returns_dict(self) -> None:
|
|
17
17
|
"""load_sprint should return sprint data as dict."""
|
|
18
|
-
from
|
|
18
|
+
from pf.sprint.loader import load_sprint
|
|
19
19
|
|
|
20
20
|
result = load_sprint()
|
|
21
21
|
|
|
@@ -25,8 +25,8 @@ class TestSprintLoader:
|
|
|
25
25
|
|
|
26
26
|
def test_load_sprint_with_custom_root(self) -> None:
|
|
27
27
|
"""load_sprint should accept custom project root."""
|
|
28
|
-
from
|
|
29
|
-
from
|
|
28
|
+
from pf.common.config import get_project_root
|
|
29
|
+
from pf.sprint.loader import load_sprint
|
|
30
30
|
|
|
31
31
|
root = get_project_root()
|
|
32
32
|
result = load_sprint(project_root=root)
|
|
@@ -35,7 +35,7 @@ class TestSprintLoader:
|
|
|
35
35
|
|
|
36
36
|
def test_find_epic_by_number(self) -> None:
|
|
37
37
|
"""find_epic should find epic by number."""
|
|
38
|
-
from
|
|
38
|
+
from pf.sprint.loader import find_epic
|
|
39
39
|
|
|
40
40
|
sprint_data = {
|
|
41
41
|
"epics": [
|
|
@@ -56,7 +56,7 @@ class TestSprintLoader:
|
|
|
56
56
|
|
|
57
57
|
def test_find_epic_returns_none_if_not_found(self) -> None:
|
|
58
58
|
"""find_epic should return None if epic not found."""
|
|
59
|
-
from
|
|
59
|
+
from pf.sprint.loader import find_epic
|
|
60
60
|
|
|
61
61
|
sprint_data = {"epics": [{"id": "epic-63", "title": "Test Epic"}]}
|
|
62
62
|
|
|
@@ -65,7 +65,7 @@ class TestSprintLoader:
|
|
|
65
65
|
|
|
66
66
|
def test_find_epic_handles_empty_data(self) -> None:
|
|
67
67
|
"""find_epic should handle empty or None data."""
|
|
68
|
-
from
|
|
68
|
+
from pf.sprint.loader import find_epic
|
|
69
69
|
|
|
70
70
|
assert find_epic(None, "63") is None
|
|
71
71
|
assert find_epic({}, "63") is None
|
|
@@ -73,7 +73,7 @@ class TestSprintLoader:
|
|
|
73
73
|
|
|
74
74
|
def test_find_story_in_epic(self) -> None:
|
|
75
75
|
"""find_story should find story within an epic."""
|
|
76
|
-
from
|
|
76
|
+
from pf.sprint.loader import find_story
|
|
77
77
|
|
|
78
78
|
epic = {
|
|
79
79
|
"id": "epic-63",
|
|
@@ -89,7 +89,7 @@ class TestSprintLoader:
|
|
|
89
89
|
|
|
90
90
|
def test_find_story_returns_none_if_not_found(self) -> None:
|
|
91
91
|
"""find_story should return None if story not found."""
|
|
92
|
-
from
|
|
92
|
+
from pf.sprint.loader import find_story
|
|
93
93
|
|
|
94
94
|
epic = {"id": "epic-63", "stories": [{"id": "63-1", "title": "Story"}]}
|
|
95
95
|
|
|
@@ -98,7 +98,7 @@ class TestSprintLoader:
|
|
|
98
98
|
|
|
99
99
|
def test_get_all_stories_returns_flat_list(self) -> None:
|
|
100
100
|
"""get_all_stories should return flat list from all epics."""
|
|
101
|
-
from
|
|
101
|
+
from pf.sprint.loader import get_all_stories
|
|
102
102
|
|
|
103
103
|
# With actual sprint data loaded
|
|
104
104
|
stories = get_all_stories()
|
|
@@ -108,7 +108,7 @@ class TestSprintLoader:
|
|
|
108
108
|
|
|
109
109
|
def test_get_story_by_id(self) -> None:
|
|
110
110
|
"""get_story_by_id should find story across all epics."""
|
|
111
|
-
from
|
|
111
|
+
from pf.sprint.loader import get_story_by_id
|
|
112
112
|
|
|
113
113
|
# This relies on actual sprint data
|
|
114
114
|
result = get_story_by_id("nonexistent-99")
|
|
@@ -116,14 +116,14 @@ class TestSprintLoader:
|
|
|
116
116
|
|
|
117
117
|
def test_get_stories_by_status(self) -> None:
|
|
118
118
|
"""get_stories_by_status should filter by status."""
|
|
119
|
-
from
|
|
119
|
+
from pf.sprint.loader import get_stories_by_status
|
|
120
120
|
|
|
121
121
|
result = get_stories_by_status("backlog")
|
|
122
122
|
assert isinstance(result, list)
|
|
123
123
|
|
|
124
124
|
def test_get_story_field(self) -> None:
|
|
125
125
|
"""get_story_field should extract field from story."""
|
|
126
|
-
from
|
|
126
|
+
from pf.sprint.loader import get_story_field
|
|
127
127
|
|
|
128
128
|
sprint_data = {
|
|
129
129
|
"epics": [
|
|
@@ -142,7 +142,7 @@ class TestSprintLoader:
|
|
|
142
142
|
|
|
143
143
|
def test_load_current_sprint_alias(self) -> None:
|
|
144
144
|
"""load_current_sprint should be alias for load_sprint."""
|
|
145
|
-
from
|
|
145
|
+
from pf.sprint.loader import (
|
|
146
146
|
load_current_sprint,
|
|
147
147
|
load_sprint,
|
|
148
148
|
)
|
|
@@ -152,14 +152,14 @@ class TestSprintLoader:
|
|
|
152
152
|
|
|
153
153
|
def test_get_sprint_info(self) -> None:
|
|
154
154
|
"""get_sprint_info should return sprint metadata."""
|
|
155
|
-
from
|
|
155
|
+
from pf.sprint.loader import get_sprint_info
|
|
156
156
|
|
|
157
157
|
result = get_sprint_info()
|
|
158
158
|
assert isinstance(result, dict)
|
|
159
159
|
|
|
160
160
|
def test_get_epic_by_id(self) -> None:
|
|
161
161
|
"""get_epic_by_id should find epic by ID."""
|
|
162
|
-
from
|
|
162
|
+
from pf.sprint.loader import get_epic_by_id
|
|
163
163
|
|
|
164
164
|
# Test with nonexistent ID
|
|
165
165
|
result = get_epic_by_id("nonexistent-epic")
|
|
@@ -171,7 +171,7 @@ class TestSprintStatus:
|
|
|
171
171
|
|
|
172
172
|
def test_get_sprint_status_returns_dict(self) -> None:
|
|
173
173
|
"""get_sprint_status should return status information."""
|
|
174
|
-
from
|
|
174
|
+
from pf.sprint.status import get_sprint_status
|
|
175
175
|
|
|
176
176
|
result = get_sprint_status()
|
|
177
177
|
|
|
@@ -182,7 +182,7 @@ class TestSprintStatus:
|
|
|
182
182
|
|
|
183
183
|
def test_format_status(self) -> None:
|
|
184
184
|
"""format_status should return formatted string."""
|
|
185
|
-
from
|
|
185
|
+
from pf.sprint.status import format_status
|
|
186
186
|
|
|
187
187
|
status = {
|
|
188
188
|
"total_stories": 10,
|
|
@@ -202,7 +202,7 @@ class TestSprintWork:
|
|
|
202
202
|
|
|
203
203
|
def test_check_story_returns_availability(self) -> None:
|
|
204
204
|
"""check_story should return story availability info."""
|
|
205
|
-
from
|
|
205
|
+
from pf.sprint.work import check_story
|
|
206
206
|
|
|
207
207
|
result = check_story("nonexistent-99")
|
|
208
208
|
|
|
@@ -211,7 +211,7 @@ class TestSprintWork:
|
|
|
211
211
|
|
|
212
212
|
def test_start_work_validates_story(self) -> None:
|
|
213
213
|
"""start_work should validate story exists."""
|
|
214
|
-
from
|
|
214
|
+
from pf.sprint.work import start_work
|
|
215
215
|
|
|
216
216
|
result = start_work("nonexistent-99", dry_run=True)
|
|
217
217
|
|
|
@@ -283,7 +283,7 @@ stories:
|
|
|
283
283
|
|
|
284
284
|
def test_load_sprint_merges_shards(self, tmp_path: Path) -> None:
|
|
285
285
|
"""load_sprint should merge sharded epic files into full dicts."""
|
|
286
|
-
from
|
|
286
|
+
from pf.sprint.loader import load_sprint
|
|
287
287
|
|
|
288
288
|
root = self._create_sharded_sprint(tmp_path)
|
|
289
289
|
data = load_sprint(project_root=root)
|
|
@@ -296,7 +296,7 @@ stories:
|
|
|
296
296
|
|
|
297
297
|
def test_load_sprint_merges_stories(self, tmp_path: Path) -> None:
|
|
298
298
|
"""Merged epics should contain their stories."""
|
|
299
|
-
from
|
|
299
|
+
from pf.sprint.loader import load_sprint
|
|
300
300
|
|
|
301
301
|
root = self._create_sharded_sprint(tmp_path)
|
|
302
302
|
data = load_sprint(project_root=root)
|
|
@@ -307,7 +307,7 @@ stories:
|
|
|
307
307
|
|
|
308
308
|
def test_load_sprint_non_sharded_unchanged(self, tmp_path: Path) -> None:
|
|
309
309
|
"""load_sprint should pass through non-sharded data unchanged."""
|
|
310
|
-
from
|
|
310
|
+
from pf.sprint.loader import load_sprint
|
|
311
311
|
|
|
312
312
|
sprint_dir = tmp_path / "sprint"
|
|
313
313
|
sprint_dir.mkdir()
|
|
@@ -338,11 +338,11 @@ epics:
|
|
|
338
338
|
|
|
339
339
|
def test_get_all_stories_with_shards(self, tmp_path: Path) -> None:
|
|
340
340
|
"""get_all_stories should return stories from merged shards."""
|
|
341
|
-
from
|
|
341
|
+
from pf.sprint.loader import get_all_stories
|
|
342
342
|
|
|
343
343
|
root = self._create_sharded_sprint(tmp_path)
|
|
344
344
|
|
|
345
|
-
with patch("
|
|
345
|
+
with patch("pf.sprint.loader.get_project_root", return_value=root):
|
|
346
346
|
stories = get_all_stories()
|
|
347
347
|
|
|
348
348
|
assert len(stories) == 3
|
|
@@ -353,7 +353,7 @@ epics:
|
|
|
353
353
|
|
|
354
354
|
def test_find_epic_with_jira_id(self, tmp_path: Path) -> None:
|
|
355
355
|
"""find_epic should work with Jira-style epic IDs after merge."""
|
|
356
|
-
from
|
|
356
|
+
from pf.sprint.loader import find_epic, load_sprint
|
|
357
357
|
|
|
358
358
|
root = self._create_sharded_sprint(tmp_path)
|
|
359
359
|
data = load_sprint(project_root=root)
|
|
@@ -364,7 +364,7 @@ epics:
|
|
|
364
364
|
|
|
365
365
|
def test_backlog_count_with_shards(self, tmp_path: Path) -> None:
|
|
366
366
|
"""get_backlog_count should count stories from merged shards."""
|
|
367
|
-
from
|
|
367
|
+
from pf.prime.workflow import get_backlog_count
|
|
368
368
|
|
|
369
369
|
root = self._create_sharded_sprint(tmp_path)
|
|
370
370
|
count = get_backlog_count(root)
|
|
@@ -374,10 +374,10 @@ epics:
|
|
|
374
374
|
|
|
375
375
|
def test_backlog_count_defensive_on_strings(self) -> None:
|
|
376
376
|
"""get_backlog_count should not crash on string epics."""
|
|
377
|
-
from
|
|
377
|
+
from pf.prime.workflow import get_backlog_count
|
|
378
378
|
|
|
379
379
|
fake_data = {"epics": ["MSSCI-14298", "MSSCI-14317"]}
|
|
380
|
-
with patch("
|
|
380
|
+
with patch("pf.sprint.loader.load_sprint", return_value=fake_data):
|
|
381
381
|
count = get_backlog_count(Path("/fake"))
|
|
382
382
|
|
|
383
383
|
assert count == 0
|
|
@@ -388,7 +388,7 @@ class TestSprintArchive:
|
|
|
388
388
|
|
|
389
389
|
def test_archive_story_validates_story(self) -> None:
|
|
390
390
|
"""archive_story should validate story exists."""
|
|
391
|
-
from
|
|
391
|
+
from pf.sprint.archive import archive_story
|
|
392
392
|
|
|
393
393
|
result = archive_story("nonexistent-99", dry_run=True)
|
|
394
394
|
|
|
@@ -23,7 +23,7 @@ from unittest.mock import MagicMock, patch
|
|
|
23
23
|
import pytest
|
|
24
24
|
from rich.text import Text
|
|
25
25
|
|
|
26
|
-
from
|
|
26
|
+
from pf.bikerack.sprint_panel import (
|
|
27
27
|
SprintPanel,
|
|
28
28
|
_build_epic_label,
|
|
29
29
|
_build_story_label,
|
|
@@ -524,7 +524,7 @@ class TestDefaultPanel:
|
|
|
524
524
|
|
|
525
525
|
async def test_bikerack_app_mounts_sprint_panel(self) -> None:
|
|
526
526
|
"""BikeRackApp should mount SprintPanel in main-content on startup."""
|
|
527
|
-
from
|
|
527
|
+
from pf.bikerack.tui import BikeRackApp
|
|
528
528
|
|
|
529
529
|
mock_client = MagicMock()
|
|
530
530
|
mock_client.connect = MagicMock(return_value=_noop_coroutine())
|
|
@@ -20,11 +20,11 @@ import pytest
|
|
|
20
20
|
from click.testing import CliRunner
|
|
21
21
|
from ruamel.yaml.comments import CommentedMap
|
|
22
22
|
|
|
23
|
-
from
|
|
23
|
+
from pf.sprint.story_add import (
|
|
24
24
|
add_story,
|
|
25
25
|
generate_story_id,
|
|
26
26
|
)
|
|
27
|
-
from
|
|
27
|
+
from pf.sprint.yaml_io import (
|
|
28
28
|
STORY_KEY_ORDER,
|
|
29
29
|
read_sprint,
|
|
30
30
|
)
|
|
@@ -605,7 +605,7 @@ class TestFileValidation:
|
|
|
605
605
|
|
|
606
606
|
def test_file_valid_after_insertion(self, sprint_file: Path) -> None:
|
|
607
607
|
"""Sprint file should pass validation after a successful add."""
|
|
608
|
-
from
|
|
608
|
+
from pf.sprint.validator import validate_full_sprint
|
|
609
609
|
|
|
610
610
|
add_story(
|
|
611
611
|
sprint_path=sprint_file,
|
|
@@ -697,13 +697,13 @@ class TestCLIIntegration:
|
|
|
697
697
|
"""story_add_command should be importable and be a Click command."""
|
|
698
698
|
import click
|
|
699
699
|
|
|
700
|
-
from
|
|
700
|
+
from pf.sprint.story_add import story_add_command
|
|
701
701
|
|
|
702
702
|
assert isinstance(story_add_command, click.BaseCommand)
|
|
703
703
|
|
|
704
704
|
def test_basic_add_via_cli(self, runner: CliRunner, sprint_file: Path) -> None:
|
|
705
705
|
"""Basic CLI invocation should add a story successfully."""
|
|
706
|
-
from
|
|
706
|
+
from pf.sprint.story_add import story_add_command
|
|
707
707
|
|
|
708
708
|
result = runner.invoke(story_add_command, [
|
|
709
709
|
"--sprint-file", str(sprint_file),
|
|
@@ -714,7 +714,7 @@ class TestCLIIntegration:
|
|
|
714
714
|
|
|
715
715
|
def test_cli_with_jira_option(self, runner: CliRunner, sprint_file: Path) -> None:
|
|
716
716
|
"""--jira option should set the jira field."""
|
|
717
|
-
from
|
|
717
|
+
from pf.sprint.story_add import story_add_command
|
|
718
718
|
|
|
719
719
|
result = runner.invoke(story_add_command, [
|
|
720
720
|
"--sprint-file", str(sprint_file),
|
|
@@ -730,7 +730,7 @@ class TestCLIIntegration:
|
|
|
730
730
|
|
|
731
731
|
def test_cli_with_type_option(self, runner: CliRunner, sprint_file: Path) -> None:
|
|
732
732
|
"""--type option should set the story type."""
|
|
733
|
-
from
|
|
733
|
+
from pf.sprint.story_add import story_add_command
|
|
734
734
|
|
|
735
735
|
result = runner.invoke(story_add_command, [
|
|
736
736
|
"--sprint-file", str(sprint_file),
|
|
@@ -742,7 +742,7 @@ class TestCLIIntegration:
|
|
|
742
742
|
|
|
743
743
|
def test_cli_with_priority_option(self, runner: CliRunner, sprint_file: Path) -> None:
|
|
744
744
|
"""--priority option should override default P1."""
|
|
745
|
-
from
|
|
745
|
+
from pf.sprint.story_add import story_add_command
|
|
746
746
|
|
|
747
747
|
result = runner.invoke(story_add_command, [
|
|
748
748
|
"--sprint-file", str(sprint_file),
|
|
@@ -758,7 +758,7 @@ class TestCLIIntegration:
|
|
|
758
758
|
|
|
759
759
|
def test_cli_with_workflow_option(self, runner: CliRunner, sprint_file: Path) -> None:
|
|
760
760
|
"""--workflow option should override default tdd."""
|
|
761
|
-
from
|
|
761
|
+
from pf.sprint.story_add import story_add_command
|
|
762
762
|
|
|
763
763
|
result = runner.invoke(story_add_command, [
|
|
764
764
|
"--sprint-file", str(sprint_file),
|
|
@@ -776,7 +776,7 @@ class TestCLIIntegration:
|
|
|
776
776
|
self, runner: CliRunner, sprint_file: Path
|
|
777
777
|
) -> None:
|
|
778
778
|
"""Specifying a non-existent epic should produce non-zero exit code."""
|
|
779
|
-
from
|
|
779
|
+
from pf.sprint.story_add import story_add_command
|
|
780
780
|
|
|
781
781
|
result = runner.invoke(story_add_command, [
|
|
782
782
|
"--sprint-file", str(sprint_file),
|
|
@@ -787,7 +787,7 @@ class TestCLIIntegration:
|
|
|
787
787
|
|
|
788
788
|
def test_cli_success_output(self, runner: CliRunner, sprint_file: Path) -> None:
|
|
789
789
|
"""Successful add should show the new story ID."""
|
|
790
|
-
from
|
|
790
|
+
from pf.sprint.story_add import story_add_command
|
|
791
791
|
|
|
792
792
|
result = runner.invoke(story_add_command, [
|
|
793
793
|
"--sprint-file", str(sprint_file),
|