@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
|
@@ -21,8 +21,8 @@ from datetime import date
|
|
|
21
21
|
from pathlib import Path
|
|
22
22
|
from typing import Any
|
|
23
23
|
|
|
24
|
-
from
|
|
25
|
-
from
|
|
24
|
+
from pf.sprint.loader import find_epic, find_story
|
|
25
|
+
from pf.sprint.yaml_io import read_sprint, write_sprint
|
|
26
26
|
|
|
27
27
|
SESSION_FIELD_RE = re.compile(r"\*\*(\w[\w\s]*):\*\*\s*(.*)")
|
|
28
28
|
|
|
@@ -202,7 +202,7 @@ def finish_story(
|
|
|
202
202
|
|
|
203
203
|
# --- Step 5: Archive completed epics ---
|
|
204
204
|
result = _run(
|
|
205
|
-
[sys.executable, "-m", "
|
|
205
|
+
[sys.executable, "-m", "pf.cli", "sprint", "epic", "archive"],
|
|
206
206
|
cwd=str(project_root),
|
|
207
207
|
)
|
|
208
208
|
steps.append({"step": 5, "action": "archive_epics", "ran": True})
|
|
@@ -14,9 +14,9 @@ from typing import Any
|
|
|
14
14
|
|
|
15
15
|
import click
|
|
16
16
|
|
|
17
|
-
from
|
|
18
|
-
from
|
|
19
|
-
from
|
|
17
|
+
from pf.sprint.loader import find_epic, find_story
|
|
18
|
+
from pf.sprint.validator import VALID_STORY_STATUSES, validate_full_sprint
|
|
19
|
+
from pf.sprint.yaml_io import read_sprint, write_sprint
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
def update_story(
|
|
@@ -192,7 +192,7 @@ def story_update_command(
|
|
|
192
192
|
) -> None:
|
|
193
193
|
"""Update a story's fields by ID."""
|
|
194
194
|
if sprint_file is None:
|
|
195
|
-
from
|
|
195
|
+
from pf.common.config import get_project_root
|
|
196
196
|
path = get_project_root() / "sprint" / "current-sprint.yaml"
|
|
197
197
|
else:
|
|
198
198
|
path = Path(sprint_file)
|
|
@@ -15,7 +15,7 @@ from pathlib import Path
|
|
|
15
15
|
import click
|
|
16
16
|
import yaml
|
|
17
17
|
|
|
18
|
-
from
|
|
18
|
+
from pf.sprint.validator import (
|
|
19
19
|
REQUIRED_INITIATIVE_FIELDS,
|
|
20
20
|
VALID_INITIATIVE_STATUSES,
|
|
21
21
|
ValidationResult,
|
|
@@ -23,7 +23,7 @@ from pennyfarthing_scripts.sprint.validator import (
|
|
|
23
23
|
validate_full_sprint,
|
|
24
24
|
validate_future,
|
|
25
25
|
)
|
|
26
|
-
from
|
|
26
|
+
from pf.sprint.yaml_io import (
|
|
27
27
|
EPIC_KEY_ORDER,
|
|
28
28
|
SPRINT_KEY_ORDER,
|
|
29
29
|
STORY_KEY_ORDER,
|
|
@@ -614,7 +614,7 @@ def validate_sprint_file(file_path: Path, *, strict: bool = False) -> Validation
|
|
|
614
614
|
return result
|
|
615
615
|
|
|
616
616
|
# Merge sharded epic files if present, capturing warnings in strict mode
|
|
617
|
-
from
|
|
617
|
+
from pf.sprint.loader import _merge_epic_shards
|
|
618
618
|
if strict:
|
|
619
619
|
import warnings as _warnings
|
|
620
620
|
with _warnings.catch_warnings(record=True) as caught:
|
|
@@ -660,7 +660,7 @@ def main() -> int:
|
|
|
660
660
|
"""CLI entry point for sprint validation.
|
|
661
661
|
|
|
662
662
|
Usage:
|
|
663
|
-
python -m
|
|
663
|
+
python -m pf.sprint.validator [file_path]
|
|
664
664
|
|
|
665
665
|
If no file_path is provided, validates sprint/current-sprint.yaml.
|
|
666
666
|
|
|
@@ -669,7 +669,7 @@ def main() -> int:
|
|
|
669
669
|
"""
|
|
670
670
|
import sys
|
|
671
671
|
|
|
672
|
-
from
|
|
672
|
+
from pf.common.config import get_project_root
|
|
673
673
|
|
|
674
674
|
# Determine file to validate
|
|
675
675
|
if len(sys.argv) > 1:
|
|
@@ -6,7 +6,7 @@ Provides functions for starting and managing work on stories.
|
|
|
6
6
|
|
|
7
7
|
from typing import Any
|
|
8
8
|
|
|
9
|
-
from
|
|
9
|
+
from pf.sprint.loader import (
|
|
10
10
|
get_stories_by_status,
|
|
11
11
|
get_story_by_id,
|
|
12
12
|
)
|
|
@@ -34,7 +34,7 @@ def check_story(story_id: str) -> dict[str, Any]:
|
|
|
34
34
|
|
|
35
35
|
# Check if assigned to someone else
|
|
36
36
|
if assigned:
|
|
37
|
-
from
|
|
37
|
+
from pf.jira.client import get_current_user_email
|
|
38
38
|
|
|
39
39
|
current_user = get_current_user_email()
|
|
40
40
|
if assigned != current_user:
|
|
@@ -94,8 +94,8 @@ def get_next_story() -> dict[str, Any]:
|
|
|
94
94
|
Returns:
|
|
95
95
|
Dict with next story details or error
|
|
96
96
|
"""
|
|
97
|
-
from
|
|
98
|
-
from
|
|
97
|
+
from pf.jira.client import get_current_user_email
|
|
98
|
+
from pf.sprint.loader import get_all_stories
|
|
99
99
|
|
|
100
100
|
current_user = get_current_user_email()
|
|
101
101
|
all_stories = get_all_stories()
|
|
@@ -8,33 +8,33 @@ This package provides:
|
|
|
8
8
|
|
|
9
9
|
Usage:
|
|
10
10
|
# Use the modules
|
|
11
|
-
from
|
|
11
|
+
from pf.story import get_sizing_guidelines, get_template
|
|
12
12
|
|
|
13
13
|
# Use CLI
|
|
14
|
-
python -m
|
|
14
|
+
python -m pf.story <subcommand> [args]
|
|
15
15
|
"""
|
|
16
16
|
|
|
17
17
|
# Re-export common functions
|
|
18
18
|
# Import submodules
|
|
19
19
|
# CLI entry point - import module, not function, so "from story import cli" gets the module
|
|
20
|
-
from
|
|
20
|
+
from pf.story import (
|
|
21
21
|
cli,
|
|
22
22
|
create,
|
|
23
23
|
size,
|
|
24
24
|
template,
|
|
25
25
|
)
|
|
26
|
-
from
|
|
27
|
-
from
|
|
26
|
+
from pf.story.cli import main
|
|
27
|
+
from pf.story.create import (
|
|
28
28
|
create_story,
|
|
29
29
|
generate_story_yaml,
|
|
30
30
|
validate_points,
|
|
31
31
|
)
|
|
32
|
-
from
|
|
32
|
+
from pf.story.size import (
|
|
33
33
|
SIZING_GUIDELINES,
|
|
34
34
|
format_size_info,
|
|
35
35
|
get_sizing_guidelines,
|
|
36
36
|
)
|
|
37
|
-
from
|
|
37
|
+
from pf.story.template import (
|
|
38
38
|
TEMPLATES,
|
|
39
39
|
format_template,
|
|
40
40
|
get_all_templates,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Story CLI - Fan-out CLI for story operations.
|
|
3
3
|
|
|
4
4
|
Usage:
|
|
5
|
-
python -m
|
|
5
|
+
python -m pf.story <subcommand> [args]
|
|
6
6
|
|
|
7
7
|
Subcommands:
|
|
8
8
|
size Show sizing guidelines
|
|
@@ -16,19 +16,19 @@ import sys
|
|
|
16
16
|
|
|
17
17
|
def size(args: list[str]) -> int:
|
|
18
18
|
"""Show sizing guidelines."""
|
|
19
|
-
from
|
|
19
|
+
from pf.story.size import main as size_main
|
|
20
20
|
return size_main(args)
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
def template(args: list[str]) -> int:
|
|
24
24
|
"""Show story templates."""
|
|
25
|
-
from
|
|
25
|
+
from pf.story.template import main as template_main
|
|
26
26
|
return template_main(args)
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
def create(args: list[str]) -> int:
|
|
30
30
|
"""Create a new story."""
|
|
31
|
-
from
|
|
31
|
+
from pf.story.create import main as create_main
|
|
32
32
|
return create_main(args)
|
|
33
33
|
|
|
34
34
|
|
|
@@ -6,8 +6,8 @@ Provides functions for creating new stories.
|
|
|
6
6
|
|
|
7
7
|
from typing import Any
|
|
8
8
|
|
|
9
|
-
from
|
|
10
|
-
from
|
|
9
|
+
from pf.story.size import SIZING_GUIDELINES
|
|
10
|
+
from pf.story.template import format_template
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
def generate_story_yaml(
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Tests for pf package reorganization."""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""Pytest configuration for
|
|
1
|
+
"""Pytest configuration for pf tests.
|
|
2
2
|
|
|
3
|
-
Story 63-9: Reorganize
|
|
3
|
+
Story 63-9: Reorganize pf into fan-out CLI pattern.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
import sys
|
|
@@ -44,7 +44,7 @@ def mock_jira_client() -> Generator:
|
|
|
44
44
|
mock_client.get_issue_async.return_value = mock_client.get_issue_sync.return_value
|
|
45
45
|
mock_client.create_issue_sync.return_value = {"key": "MSSCI-12346", "id": "10001"}
|
|
46
46
|
|
|
47
|
-
with patch("
|
|
47
|
+
with patch("pf.jira.client.JiraClient", return_value=mock_client):
|
|
48
48
|
yield mock_client
|
|
49
49
|
|
|
50
50
|
|
|
@@ -20,14 +20,14 @@ from pathlib import Path
|
|
|
20
20
|
import pytest
|
|
21
21
|
import yaml
|
|
22
22
|
|
|
23
|
-
from
|
|
24
|
-
from
|
|
23
|
+
from pf.handoff.gate_file import resolve_gate_file
|
|
24
|
+
from pf.handoff.resolve_gate import resolve_gate
|
|
25
25
|
|
|
26
26
|
# ---------------------------------------------------------------------------
|
|
27
27
|
# Paths
|
|
28
28
|
# ---------------------------------------------------------------------------
|
|
29
29
|
|
|
30
|
-
DIST_DIR = Path(__file__).resolve().parents[2]
|
|
30
|
+
DIST_DIR = Path(__file__).resolve().parents[2]
|
|
31
31
|
GATES_DIR = DIST_DIR / "gates"
|
|
32
32
|
WORKFLOWS_DIR = DIST_DIR / "workflows"
|
|
33
33
|
|
package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_108_2_remove_handoff_fallback.py
RENAMED
|
@@ -25,13 +25,13 @@ from pathlib import Path
|
|
|
25
25
|
import pytest
|
|
26
26
|
import yaml
|
|
27
27
|
|
|
28
|
-
from
|
|
28
|
+
from pf.handoff.resolve_gate import resolve_gate
|
|
29
29
|
|
|
30
30
|
# ---------------------------------------------------------------------------
|
|
31
31
|
# Paths
|
|
32
32
|
# ---------------------------------------------------------------------------
|
|
33
33
|
|
|
34
|
-
DIST_DIR = Path(__file__).resolve().parents[2]
|
|
34
|
+
DIST_DIR = Path(__file__).resolve().parents[2]
|
|
35
35
|
AGENTS_DIR = DIST_DIR / "agents"
|
|
36
36
|
WORKFLOWS_DIR = DIST_DIR / "workflows"
|
|
37
37
|
GATES_DIR = DIST_DIR / "gates"
|
|
@@ -8,13 +8,13 @@ from typing import Any
|
|
|
8
8
|
|
|
9
9
|
import pytest
|
|
10
10
|
|
|
11
|
-
from
|
|
11
|
+
from pf.sprint.archive_epic import (
|
|
12
12
|
_load_archive_file,
|
|
13
13
|
_write_archive_file,
|
|
14
14
|
archive_epic,
|
|
15
15
|
is_epic_complete,
|
|
16
16
|
)
|
|
17
|
-
from
|
|
17
|
+
from pf.sprint.yaml_io import _make_yaml, _write_yaml_file
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
@pytest.fixture
|
|
@@ -29,7 +29,7 @@ from unittest.mock import MagicMock, patch
|
|
|
29
29
|
|
|
30
30
|
import pytest
|
|
31
31
|
|
|
32
|
-
from
|
|
32
|
+
from pf.bikerack.launcher import (
|
|
33
33
|
build_otel_env,
|
|
34
34
|
cleanup_files,
|
|
35
35
|
exec_claude,
|
|
@@ -55,7 +55,7 @@ class TestStartWheelHub:
|
|
|
55
55
|
|
|
56
56
|
def test_starts_subprocess(self, tmp_path: Path) -> None:
|
|
57
57
|
"""start_wheelhub should return a Popen object (background process)."""
|
|
58
|
-
with patch("
|
|
58
|
+
with patch("pf.bikerack.launcher.subprocess.Popen") as mock_popen:
|
|
59
59
|
mock_proc = MagicMock()
|
|
60
60
|
mock_proc.pid = 12345
|
|
61
61
|
mock_popen.return_value = mock_proc
|
|
@@ -67,7 +67,7 @@ class TestStartWheelHub:
|
|
|
67
67
|
|
|
68
68
|
def test_sets_is_bikerack_env(self, tmp_path: Path) -> None:
|
|
69
69
|
"""start_wheelhub should set IS_BIKERACK=1 in subprocess env."""
|
|
70
|
-
with patch("
|
|
70
|
+
with patch("pf.bikerack.launcher.subprocess.Popen") as mock_popen:
|
|
71
71
|
mock_popen.return_value = MagicMock(pid=12345)
|
|
72
72
|
|
|
73
73
|
start_wheelhub(tmp_path)
|
|
@@ -80,7 +80,7 @@ class TestStartWheelHub:
|
|
|
80
80
|
|
|
81
81
|
def test_sets_project_dir_env(self, tmp_path: Path) -> None:
|
|
82
82
|
"""start_wheelhub should set CYCLIST_PROJECT_DIR in subprocess env."""
|
|
83
|
-
with patch("
|
|
83
|
+
with patch("pf.bikerack.launcher.subprocess.Popen") as mock_popen:
|
|
84
84
|
mock_popen.return_value = MagicMock(pid=12345)
|
|
85
85
|
|
|
86
86
|
start_wheelhub(tmp_path)
|
|
@@ -91,7 +91,7 @@ class TestStartWheelHub:
|
|
|
91
91
|
|
|
92
92
|
def test_process_is_background(self, tmp_path: Path) -> None:
|
|
93
93
|
"""start_wheelhub should not block (background process)."""
|
|
94
|
-
with patch("
|
|
94
|
+
with patch("pf.bikerack.launcher.subprocess.Popen") as mock_popen:
|
|
95
95
|
mock_popen.return_value = MagicMock(pid=12345)
|
|
96
96
|
|
|
97
97
|
result = start_wheelhub(tmp_path)
|
|
@@ -237,7 +237,7 @@ class TestExecClaude:
|
|
|
237
237
|
"""exec_claude should call os.execvpe (not subprocess.Popen)."""
|
|
238
238
|
otel_env = build_otel_env(2898)
|
|
239
239
|
|
|
240
|
-
with patch("
|
|
240
|
+
with patch("pf.bikerack.launcher.os.execvpe") as mock_exec:
|
|
241
241
|
# execvpe never returns, so mock it
|
|
242
242
|
mock_exec.side_effect = SystemExit(0)
|
|
243
243
|
|
|
@@ -250,7 +250,7 @@ class TestExecClaude:
|
|
|
250
250
|
"""exec_claude should exec the 'claude' binary."""
|
|
251
251
|
otel_env = build_otel_env(2898)
|
|
252
252
|
|
|
253
|
-
with patch("
|
|
253
|
+
with patch("pf.bikerack.launcher.os.execvpe") as mock_exec:
|
|
254
254
|
mock_exec.side_effect = SystemExit(0)
|
|
255
255
|
|
|
256
256
|
with pytest.raises(SystemExit):
|
|
@@ -264,7 +264,7 @@ class TestExecClaude:
|
|
|
264
264
|
"""exec_claude should merge OTEL vars into current environment."""
|
|
265
265
|
otel_env = {"CLAUDE_CODE_ENABLE_TELEMETRY": "1", "OTEL_LOGS_EXPORTER": "otlp"}
|
|
266
266
|
|
|
267
|
-
with patch("
|
|
267
|
+
with patch("pf.bikerack.launcher.os.execvpe") as mock_exec:
|
|
268
268
|
mock_exec.side_effect = SystemExit(0)
|
|
269
269
|
|
|
270
270
|
with pytest.raises(SystemExit):
|
|
@@ -283,10 +283,10 @@ class TestExecClaude:
|
|
|
283
283
|
"""exec_claude must NOT use subprocess (CE-4: exec, not spawn)."""
|
|
284
284
|
otel_env = build_otel_env(2898)
|
|
285
285
|
|
|
286
|
-
with patch("
|
|
286
|
+
with patch("pf.bikerack.launcher.os.execvpe") as mock_exec:
|
|
287
287
|
mock_exec.side_effect = SystemExit(0)
|
|
288
288
|
|
|
289
|
-
with patch("
|
|
289
|
+
with patch("pf.bikerack.launcher.subprocess.Popen") as mock_popen:
|
|
290
290
|
with pytest.raises(SystemExit):
|
|
291
291
|
exec_claude(otel_env)
|
|
292
292
|
|
|
@@ -303,7 +303,7 @@ class TestCleanupRegistration:
|
|
|
303
303
|
|
|
304
304
|
def test_registers_atexit_handler(self, tmp_path: Path) -> None:
|
|
305
305
|
"""register_cleanup should register an atexit handler."""
|
|
306
|
-
with patch("
|
|
306
|
+
with patch("pf.bikerack.launcher.atexit.register") as mock_register:
|
|
307
307
|
register_cleanup(tmp_path, pid=12345)
|
|
308
308
|
|
|
309
309
|
mock_register.assert_called_once()
|
|
@@ -320,13 +320,13 @@ class TestCleanupRegistration:
|
|
|
320
320
|
|
|
321
321
|
cleanup_func = _call_cleanup
|
|
322
322
|
|
|
323
|
-
with patch("
|
|
323
|
+
with patch("pf.bikerack.launcher.atexit.register", side_effect=capture_handler):
|
|
324
324
|
register_cleanup(tmp_path, pid=12345)
|
|
325
325
|
|
|
326
326
|
assert cleanup_func is not None, "atexit handler not registered"
|
|
327
327
|
|
|
328
|
-
with patch("
|
|
329
|
-
with patch("
|
|
328
|
+
with patch("pf.bikerack.launcher.os.kill") as mock_kill:
|
|
329
|
+
with patch("pf.bikerack.launcher.os.path.exists", return_value=True):
|
|
330
330
|
# Simulate cleanup
|
|
331
331
|
try:
|
|
332
332
|
cleanup_func()
|
|
@@ -354,10 +354,10 @@ class TestCleanupRegistration:
|
|
|
354
354
|
|
|
355
355
|
cleanup_func = _call_cleanup
|
|
356
356
|
|
|
357
|
-
with patch("
|
|
357
|
+
with patch("pf.bikerack.launcher.atexit.register", side_effect=capture_handler):
|
|
358
358
|
register_cleanup(tmp_path, pid=12345)
|
|
359
359
|
|
|
360
|
-
with patch("
|
|
360
|
+
with patch("pf.bikerack.launcher.os.kill"):
|
|
361
361
|
try:
|
|
362
362
|
cleanup_func()
|
|
363
363
|
except (ProcessLookupError, OSError):
|
|
@@ -380,10 +380,10 @@ class TestCleanupRegistration:
|
|
|
380
380
|
|
|
381
381
|
cleanup_func = _call_cleanup
|
|
382
382
|
|
|
383
|
-
with patch("
|
|
383
|
+
with patch("pf.bikerack.launcher.atexit.register", side_effect=capture_handler):
|
|
384
384
|
register_cleanup(tmp_path, pid=12345)
|
|
385
385
|
|
|
386
|
-
with patch("
|
|
386
|
+
with patch("pf.bikerack.launcher.os.kill"):
|
|
387
387
|
try:
|
|
388
388
|
cleanup_func()
|
|
389
389
|
except (ProcessLookupError, OSError):
|
|
@@ -446,8 +446,8 @@ class TestStopBikeRack:
|
|
|
446
446
|
(tmp_path / ".bikerack-port").write_text("2898")
|
|
447
447
|
(tmp_path / ".wheelhub-pid").write_text("12345")
|
|
448
448
|
|
|
449
|
-
with patch("
|
|
450
|
-
with patch("
|
|
449
|
+
with patch("pf.bikerack.launcher.os.kill") as mock_kill:
|
|
450
|
+
with patch("pf.bikerack.launcher.is_process_alive", return_value=True):
|
|
451
451
|
stop_bikerack(tmp_path)
|
|
452
452
|
|
|
453
453
|
mock_kill.assert_called_with(12345, signal.SIGTERM)
|
|
@@ -458,8 +458,8 @@ class TestStopBikeRack:
|
|
|
458
458
|
port_file.write_text("2898")
|
|
459
459
|
(tmp_path / ".wheelhub-pid").write_text("12345")
|
|
460
460
|
|
|
461
|
-
with patch("
|
|
462
|
-
with patch("
|
|
461
|
+
with patch("pf.bikerack.launcher.os.kill"):
|
|
462
|
+
with patch("pf.bikerack.launcher.is_process_alive", return_value=True):
|
|
463
463
|
stop_bikerack(tmp_path)
|
|
464
464
|
|
|
465
465
|
assert not port_file.exists()
|
|
@@ -470,8 +470,8 @@ class TestStopBikeRack:
|
|
|
470
470
|
pid_file = tmp_path / ".wheelhub-pid"
|
|
471
471
|
pid_file.write_text("12345")
|
|
472
472
|
|
|
473
|
-
with patch("
|
|
474
|
-
with patch("
|
|
473
|
+
with patch("pf.bikerack.launcher.os.kill"):
|
|
474
|
+
with patch("pf.bikerack.launcher.is_process_alive", return_value=True):
|
|
475
475
|
stop_bikerack(tmp_path)
|
|
476
476
|
|
|
477
477
|
assert not pid_file.exists()
|
|
@@ -481,8 +481,8 @@ class TestStopBikeRack:
|
|
|
481
481
|
(tmp_path / ".bikerack-port").write_text("2898")
|
|
482
482
|
(tmp_path / ".wheelhub-pid").write_text("12345")
|
|
483
483
|
|
|
484
|
-
with patch("
|
|
485
|
-
with patch("
|
|
484
|
+
with patch("pf.bikerack.launcher.os.kill"):
|
|
485
|
+
with patch("pf.bikerack.launcher.is_process_alive", return_value=True):
|
|
486
486
|
result = stop_bikerack(tmp_path)
|
|
487
487
|
|
|
488
488
|
assert result["success"] is True
|
|
@@ -509,7 +509,7 @@ class TestStatus:
|
|
|
509
509
|
(tmp_path / ".bikerack-port").write_text("2898")
|
|
510
510
|
(tmp_path / ".wheelhub-pid").write_text("12345")
|
|
511
511
|
|
|
512
|
-
with patch("
|
|
512
|
+
with patch("pf.bikerack.launcher.is_process_alive", return_value=True):
|
|
513
513
|
result = get_status(tmp_path)
|
|
514
514
|
|
|
515
515
|
assert result["running"] is True
|
|
@@ -527,7 +527,7 @@ class TestStatus:
|
|
|
527
527
|
(tmp_path / ".bikerack-port").write_text("2898")
|
|
528
528
|
(tmp_path / ".wheelhub-pid").write_text("12345")
|
|
529
529
|
|
|
530
|
-
with patch("
|
|
530
|
+
with patch("pf.bikerack.launcher.is_process_alive", return_value=True):
|
|
531
531
|
result = get_status(tmp_path)
|
|
532
532
|
|
|
533
533
|
assert "http://localhost:2898/bikerack" in result.get("dashboard", "")
|
|
@@ -537,7 +537,7 @@ class TestStatus:
|
|
|
537
537
|
(tmp_path / ".bikerack-port").write_text("2898")
|
|
538
538
|
(tmp_path / ".wheelhub-pid").write_text("99999")
|
|
539
539
|
|
|
540
|
-
with patch("
|
|
540
|
+
with patch("pf.bikerack.launcher.is_process_alive", return_value=False):
|
|
541
541
|
result = get_status(tmp_path)
|
|
542
542
|
|
|
543
543
|
assert result["running"] is False
|
|
@@ -556,7 +556,7 @@ class TestAlreadyRunning:
|
|
|
556
556
|
(tmp_path / ".bikerack-port").write_text("2898")
|
|
557
557
|
(tmp_path / ".wheelhub-pid").write_text("12345")
|
|
558
558
|
|
|
559
|
-
with patch("
|
|
559
|
+
with patch("pf.bikerack.launcher.is_process_alive", return_value=True):
|
|
560
560
|
running, pid, port = is_already_running(tmp_path)
|
|
561
561
|
|
|
562
562
|
assert running is True
|
|
@@ -576,7 +576,7 @@ class TestAlreadyRunning:
|
|
|
576
576
|
(tmp_path / ".bikerack-port").write_text("2898")
|
|
577
577
|
(tmp_path / ".wheelhub-pid").write_text("99999")
|
|
578
578
|
|
|
579
|
-
with patch("
|
|
579
|
+
with patch("pf.bikerack.launcher.is_process_alive", return_value=False):
|
|
580
580
|
running, pid, port = is_already_running(tmp_path)
|
|
581
581
|
|
|
582
582
|
assert running is False
|
|
@@ -588,7 +588,7 @@ class TestAlreadyRunning:
|
|
|
588
588
|
port_file.write_text("2898")
|
|
589
589
|
pid_file.write_text("99999")
|
|
590
590
|
|
|
591
|
-
with patch("
|
|
591
|
+
with patch("pf.bikerack.launcher.is_process_alive", return_value=False):
|
|
592
592
|
is_already_running(tmp_path)
|
|
593
593
|
|
|
594
594
|
assert not port_file.exists(), "Stale port file should be cleaned up"
|
|
@@ -608,8 +608,8 @@ class TestExitCodes:
|
|
|
608
608
|
(tmp_path / ".bikerack-port").write_text("2898")
|
|
609
609
|
(tmp_path / ".wheelhub-pid").write_text("12345")
|
|
610
610
|
|
|
611
|
-
with patch("
|
|
612
|
-
with patch("
|
|
611
|
+
with patch("pf.bikerack.launcher.is_process_alive", return_value=True):
|
|
612
|
+
with patch("pf.bikerack.launcher.is_already_running",
|
|
613
613
|
return_value=(True, 12345, 2898)):
|
|
614
614
|
# The start flow should detect already-running and exit 2
|
|
615
615
|
# This tests the logic, not the full CLI flow
|
|
@@ -651,7 +651,7 @@ class TestBikeRackCLI:
|
|
|
651
651
|
def test_bikerack_cli_help(self) -> None:
|
|
652
652
|
"""bikerack CLI should show help with --help."""
|
|
653
653
|
result = subprocess.run(
|
|
654
|
-
[sys.executable, "-m", "
|
|
654
|
+
[sys.executable, "-m", "pf.bikerack", "--help"],
|
|
655
655
|
capture_output=True,
|
|
656
656
|
text=True,
|
|
657
657
|
timeout=30,
|
|
@@ -664,7 +664,7 @@ class TestBikeRackCLI:
|
|
|
664
664
|
def test_bikerack_has_start_subcommand(self) -> None:
|
|
665
665
|
"""bikerack CLI should have start subcommand."""
|
|
666
666
|
result = subprocess.run(
|
|
667
|
-
[sys.executable, "-m", "
|
|
667
|
+
[sys.executable, "-m", "pf.bikerack", "start", "--help"],
|
|
668
668
|
capture_output=True,
|
|
669
669
|
text=True,
|
|
670
670
|
timeout=30,
|
|
@@ -676,7 +676,7 @@ class TestBikeRackCLI:
|
|
|
676
676
|
def test_bikerack_has_stop_subcommand(self) -> None:
|
|
677
677
|
"""bikerack CLI should have stop subcommand."""
|
|
678
678
|
result = subprocess.run(
|
|
679
|
-
[sys.executable, "-m", "
|
|
679
|
+
[sys.executable, "-m", "pf.bikerack", "stop", "--help"],
|
|
680
680
|
capture_output=True,
|
|
681
681
|
text=True,
|
|
682
682
|
timeout=30,
|
|
@@ -688,7 +688,7 @@ class TestBikeRackCLI:
|
|
|
688
688
|
def test_bikerack_has_status_subcommand(self) -> None:
|
|
689
689
|
"""bikerack CLI should have status subcommand."""
|
|
690
690
|
result = subprocess.run(
|
|
691
|
-
[sys.executable, "-m", "
|
|
691
|
+
[sys.executable, "-m", "pf.bikerack", "status", "--help"],
|
|
692
692
|
capture_output=True,
|
|
693
693
|
text=True,
|
|
694
694
|
timeout=30,
|
|
@@ -702,7 +702,7 @@ class TestBikeRackCLI:
|
|
|
702
702
|
# Running without subcommand should behave like 'start'
|
|
703
703
|
# Since start is not implemented, it should error
|
|
704
704
|
result = subprocess.run(
|
|
705
|
-
[sys.executable, "-m", "
|
|
705
|
+
[sys.executable, "-m", "pf.bikerack"],
|
|
706
706
|
capture_output=True,
|
|
707
707
|
text=True,
|
|
708
708
|
timeout=30,
|
|
@@ -20,7 +20,7 @@ from pathlib import Path
|
|
|
20
20
|
|
|
21
21
|
import pytest
|
|
22
22
|
|
|
23
|
-
from
|
|
23
|
+
from pf.brownfield import (
|
|
24
24
|
DepthLevel,
|
|
25
25
|
DiscoveryResult,
|
|
26
26
|
ProjectType,
|
|
@@ -34,7 +34,7 @@ from pennyfarthing_scripts.brownfield import (
|
|
|
34
34
|
generate_tech_stack_doc,
|
|
35
35
|
scan_directory_structure,
|
|
36
36
|
)
|
|
37
|
-
from
|
|
37
|
+
from pf.brownfield.discover import (
|
|
38
38
|
ArchitecturePattern,
|
|
39
39
|
DirectoryNode,
|
|
40
40
|
TechStackItem,
|
|
@@ -664,7 +664,7 @@ class TestBrownfieldCLI:
|
|
|
664
664
|
def test_cli_help(self) -> None:
|
|
665
665
|
"""CLI should show help with --help."""
|
|
666
666
|
result = subprocess.run(
|
|
667
|
-
[sys.executable, "-m", "
|
|
667
|
+
[sys.executable, "-m", "pf.brownfield", "--help"],
|
|
668
668
|
capture_output=True,
|
|
669
669
|
text=True,
|
|
670
670
|
timeout=30,
|
|
@@ -676,7 +676,7 @@ class TestBrownfieldCLI:
|
|
|
676
676
|
def test_cli_scan_subcommand_help(self) -> None:
|
|
677
677
|
"""CLI should have scan subcommand."""
|
|
678
678
|
result = subprocess.run(
|
|
679
|
-
[sys.executable, "-m", "
|
|
679
|
+
[sys.executable, "-m", "pf.brownfield", "scan", "--help"],
|
|
680
680
|
capture_output=True,
|
|
681
681
|
text=True,
|
|
682
682
|
timeout=30,
|
|
@@ -688,7 +688,7 @@ class TestBrownfieldCLI:
|
|
|
688
688
|
"""CLI scan should accept path argument."""
|
|
689
689
|
result = subprocess.run(
|
|
690
690
|
[
|
|
691
|
-
sys.executable, "-m", "
|
|
691
|
+
sys.executable, "-m", "pf.brownfield",
|
|
692
692
|
"scan", str(node_project), "--depth", "quick"
|
|
693
693
|
],
|
|
694
694
|
capture_output=True,
|
|
@@ -706,7 +706,7 @@ class TestBrownfieldCLI:
|
|
|
706
706
|
|
|
707
707
|
result = subprocess.run(
|
|
708
708
|
[
|
|
709
|
-
sys.executable, "-m", "
|
|
709
|
+
sys.executable, "-m", "pf.brownfield",
|
|
710
710
|
"scan", str(node_project),
|
|
711
711
|
"--output", str(output_dir),
|
|
712
712
|
"--depth", "quick"
|