@pennyfarthing/core 11.3.3 → 11.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +3 -2
- package/packages/core/dist/workflow/__test_context_watch__/.session/.tandem-turn-counter +1 -0
- package/packages/core/dist/workflow/__test_context_watch__/.session/95-6-session.md +3 -0
- package/packages/core/dist/workflow/__test_context_watch__/.session/95-6-tandem-architect.md +6 -0
- package/packages/core/dist/workflow/__test_file_watch__/.session/95-4-tandem-architect.md +6 -0
- package/packages/core/dist/workflow/__test_file_watch__/workdir/trigger.ts +1 -0
- package/packages/core/dist/workflow/__test_tool_watch__/.session/95-5-tandem-architect.md +6 -0
- package/packages/core/dist/workflow/__test_tool_watch__/.session/95-5-tandem-toolcalls.jsonl +1 -0
- package/packages/core/dist/workflow/cross-entity-validation.d.ts +117 -0
- package/packages/core/dist/workflow/cross-entity-validation.d.ts.map +1 -0
- package/packages/core/dist/workflow/cross-entity-validation.js +148 -0
- package/packages/core/dist/workflow/cross-entity-validation.js.map +1 -0
- package/packages/core/dist/workflow/cross-entity-validation.test.d.ts +10 -0
- package/packages/core/dist/workflow/cross-entity-validation.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/cross-entity-validation.test.js +512 -0
- package/packages/core/dist/workflow/cross-entity-validation.test.js.map +1 -0
- package/pennyfarthing-dist/agents/sm-finish.md +2 -2
- package/pennyfarthing-dist/agents/testing-runner.md +1 -1
- package/pennyfarthing-dist/commands/pf-prime.md +1 -1
- package/pennyfarthing-dist/guides/agent-behavior.md +1 -1
- package/pennyfarthing-dist/guides/bikerack.md +1 -1
- package/pennyfarthing-dist/guides/brownfield-tools.md +7 -7
- package/pennyfarthing-dist/guides/gates.md +3 -3
- package/pennyfarthing-dist/guides/handoff-cli.md +6 -6
- package/pennyfarthing-dist/guides/prime.md +6 -6
- package/pennyfarthing-dist/guides/scale-levels.md +1 -1
- package/pennyfarthing-dist/personas/themes/firefly.yaml +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/CLAUDE.md +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/README.md +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/__pycache__/context.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/__pycache__/focus.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/__pycache__/split.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/cli.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/focus.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/split.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bellmode_hook.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/__init__.py +1 -1
- package/pennyfarthing-dist/pf/bikerack/__main__.py +5 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/audit_log_panel.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/background_panel.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/changed_panel.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/cli.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/context_meter_footer.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/debug_panel.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/diffs_panel.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/git_panel.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/launcher.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/portrait_resolver.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/progress_panel.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/sprint_panel.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/story_detail_data.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/story_detail_screen.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/tui.py +17 -17
- package/pennyfarthing-dist/pf/bmad/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/cli.py +7 -7
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/importer.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/sync.py +9 -9
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/test_parser.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/test_sync.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/brownfield/__init__.py +1 -1
- package/pennyfarthing-dist/pf/brownfield/__main__.py +8 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/brownfield/cli.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/cli.py +24 -24
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/codemarkers/__init__.py +2 -2
- package/pennyfarthing-dist/pf/codemarkers/__main__.py +6 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/codemarkers/analyze.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/codemarkers/cli.py +8 -8
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/codemarkers/formatters.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/__init__.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/__pycache__/config.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/__pycache__/output.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/pr_config.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/themes.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/complexity/__init__.py +2 -2
- package/pennyfarthing-dist/pf/complexity/__main__.py +6 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/complexity/analyze.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/complexity/cli.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/complexity/formatters.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/config.py +2 -2
- package/pennyfarthing-dist/pf/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/consultation/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/consultation/cli.py +5 -5
- package/pennyfarthing-dist/pf/deadcode/__main__.py +6 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/analyze.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/cli.py +8 -8
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/formatters.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/dependencies/__init__.py +2 -2
- package/pennyfarthing-dist/pf/dependencies/__main__.py +5 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/dependencies/analyze.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/dependencies/cli.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/dependencies/formatters.py +1 -1
- package/pennyfarthing-dist/pf/epic/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/epic/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/gate/cli.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/__init__.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/create_branches.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/hooks_installer.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/repos.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/status_all.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/worktree.py +3 -3
- package/pennyfarthing-dist/pf/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git_group/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git_group/cli.py +10 -10
- package/pennyfarthing-dist/pf/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/cli.py +5 -5
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/marker.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/phase_check.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/__init__.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/__main__.py +2 -2
- package/pennyfarthing-dist/pf/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/__pycache__/models.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/analyze.py +8 -8
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/cli.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/formatters.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/bell_mode.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/cli.py +11 -11
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/context_breaker.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/context_warning.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/cyclist_pretooluse.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/schema_validation.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/session_start.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/sprint_yaml_validation.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/statusline.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/__init__.py +2 -2
- package/pennyfarthing-dist/pf/hotspots/__main__.py +6 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/__pycache__/models.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/analyze.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/cli.py +5 -5
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/formatters.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__init__.py +5 -5
- package/pennyfarthing-dist/pf/jira/__main__.py +10 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/claim.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/client.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/create.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/epic.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/operations.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/story.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/sync.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/bidirectional.py +9 -9
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/claim.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/cli.py +15 -15
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/client.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/create.py +5 -5
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/epic.py +6 -6
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/operations.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/reconcile.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/story.py +6 -6
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/sync.py +5 -5
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira_bidirectional_sync.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira_epic_creation.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira_sync.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira_sync_story.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/launch/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/launch/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/launch/cli.py +7 -7
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/__init__.py +5 -5
- package/pennyfarthing-dist/pf/migration/__main__.py +10 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/cli.py +6 -6
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/validate.py +7 -7
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/output.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/patch_mode.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/preflight/__init__.py +1 -1
- package/pennyfarthing-dist/pf/preflight/__main__.py +10 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/preflight/cli.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/pretooluse_hook.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/__init__.py +7 -7
- package/pennyfarthing-dist/pf/prime/__main__.py +8 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/cli.py +9 -9
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/heatmap.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/loader.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/persona.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/session.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/tiers.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/workflow.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/schema_validation_hook.py +1 -1
- package/pennyfarthing-dist/pf/session/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/session/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/session/cli.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/session_start_hook.py +1 -1
- package/pennyfarthing-dist/pf/settings/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/settings/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/settings/cli.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/settings/settings.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__init__.py +5 -5
- package/pennyfarthing-dist/pf/sprint/__main__.py +10 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/archive.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/loader.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/status.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/validator.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/work.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/archive.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/archive_epic.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/cli.py +41 -41
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/epic_add.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/epic_update.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/import_epic.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/loader.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/status.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/story_add.py +5 -5
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/story_finish.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/story_update.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/validate_cmd.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/validator.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/work.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/story/__init__.py +7 -7
- package/pennyfarthing-dist/pf/story/__main__.py +10 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/story/cli.py +4 -4
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/story/create.py +2 -2
- package/pennyfarthing-dist/pf/tests/__init__.py +1 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/conftest.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_108_1_gate_migration.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_108_2_remove_handoff_fallback.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_archive_epic.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_bc.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_bikerack.py +39 -39
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_brownfield.py +6 -6
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_cli_modules.py +20 -20
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_cli_normalization.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_codemarkers.py +60 -60
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_common.py +17 -17
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_confidence_sm_evaluation.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_confidence_sm_gate.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_dialogue_manager.py +11 -11
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_epic_shard_validation.py +15 -15
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_gate_file_resolution.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_gate_runner.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_git_utils.py +8 -8
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_handoff_cli.py +12 -12
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_handoff_e2e.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_healthscore.py +20 -20
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_jira_package.py +29 -29
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_package_structure.py +42 -42
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_patch_mode.py +22 -22
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_prime.py +41 -41
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_resolve_gate_file_field.py +1 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_sprint_package.py +30 -30
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_sprint_panel.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_sprint_validator.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_story_add.py +11 -11
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_story_package.py +12 -12
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_story_update.py +16 -16
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_tiers.py +72 -72
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_token_counting.py +28 -28
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_topology_loader.py +37 -37
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_tui_focus.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_tui_panel_persistence.py +10 -10
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_validate_cmd.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_version_sentinel.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_workflow_check.py +7 -7
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_workflow_list_team.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_yaml_io.py +1 -1
- package/pennyfarthing-dist/pf/theme/__main__.py +6 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/theme/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/theme/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/theme/cli.py +6 -6
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/agent.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/schema.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/skill_command.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/sprint.py +2 -2
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/tandem_awareness.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/team_mode.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/workflow.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/cli.py +9 -9
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/welcome_hook.py +1 -1
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/__init__.py +3 -3
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/__pycache__/cli.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/__pycache__/scale.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/__pycache__/state.cpython-314.pyc +0 -0
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/cli.py +18 -18
- package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/helpers.py +1 -1
- package/pennyfarthing-dist/pyproject.toml +18 -0
- package/pennyfarthing-dist/scripts/core/agent-session.sh +3 -3
- package/pennyfarthing-dist/scripts/core/check-context.sh +8 -8
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +3 -3
- package/pennyfarthing-dist/scripts/jira/README.md +1 -1
- package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +1 -1
- package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +1 -1
- package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +1 -1
- package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +1 -1
- package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +1 -1
- package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +1 -1
- package/pennyfarthing-dist/scripts/lib/common.sh +3 -3
- package/pennyfarthing-dist/scripts/lib/run-pf.sh +11 -13
- package/pennyfarthing-dist/scripts/sprint/README.md +1 -1
- package/pennyfarthing-dist/scripts/story/create-story.sh +1 -1
- package/pennyfarthing-dist/scripts/story/size-story.sh +1 -1
- package/pennyfarthing-dist/scripts/story/story-template.sh +1 -1
- package/pennyfarthing-dist/scripts/theme/list-themes.sh +3 -3
- package/pennyfarthing-dist/templates/pyproject.toml +3 -3
- package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__main__.py +0 -5
- package/pennyfarthing_scripts/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/audit_log_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/context_meter_footer.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/events.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/portrait.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bmad/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bmad/__pycache__/parser.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bmad/__pycache__/sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bmad/__pycache__/test_parser.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/bmad/__pycache__/test_sync.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__main__.py +0 -8
- package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__main__.py +0 -6
- package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__main__.py +0 -6
- package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__main__.py +0 -6
- package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__main__.py +0 -5
- package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/epic/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/gate/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/gate/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/gate/__pycache__/validate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/hooks_installer.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/repos.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/worktree.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/phase_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__main__.py +0 -6
- package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__main__.py +0 -10
- package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__main__.py +0 -10
- package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__main__.py +0 -10
- package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__main__.py +0 -8
- package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/heatmap.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/session/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/settings/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/settings/__pycache__/settings.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__main__.py +0 -10
- package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__main__.py +0 -10
- package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__init__.py +0 -1
- package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_108_2_remove_handoff_fallback.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_confidence_sm_evaluation.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_confidence_sm_gate.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_gate_file_resolution.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_gate_runner.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_resolve_gate_file_field.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_list_team.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_list_team.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/theme/__main__.py +0 -6
- package/pennyfarthing_scripts/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/tandem_awareness.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/team_mode.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/team_lifecycle.cpython-314.pyc +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/base_panel.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/events.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/ws_client.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/parser.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/brownfield/discover.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/codemarkers/models.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/config.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/output.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/complexity/models.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/consultation/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/consultation/dialogue_manager.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/context.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/models.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/dependencies/models.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/epic/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/epic/cli.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/gate/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/gate/validate.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git_group/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/complete_phase.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/gate_file.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/gate_runner.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/resolve_gate.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/models.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/cyclist-pretooluse-hook.sh +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/pre_edit_check.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/reflector_check.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/session_stop.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/models.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/launch/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/session.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/skill.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/step.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/preflight/finish.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/models.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/version_sentinel.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/session/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/settings/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/yaml_io.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/story/size.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/story/template.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/swebench.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/theme/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/__init__.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/scale.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/state.py +0 -0
- /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/team_lifecycle.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Tests for common/ shared utilities 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 common/ package provides shared utilities
|
|
6
6
|
that work correctly when imported from the new location.
|
|
@@ -20,7 +20,7 @@ class TestOutputModule:
|
|
|
20
20
|
|
|
21
21
|
def test_success_prints_green_prefix(self) -> None:
|
|
22
22
|
"""success() should print with [OK] prefix."""
|
|
23
|
-
from
|
|
23
|
+
from pf.common import output
|
|
24
24
|
|
|
25
25
|
buffer = io.StringIO()
|
|
26
26
|
# Force color support for testing
|
|
@@ -33,7 +33,7 @@ class TestOutputModule:
|
|
|
33
33
|
|
|
34
34
|
def test_info_prints_blue_prefix(self) -> None:
|
|
35
35
|
"""info() should print with [INFO] prefix."""
|
|
36
|
-
from
|
|
36
|
+
from pf.common import output
|
|
37
37
|
|
|
38
38
|
buffer = io.StringIO()
|
|
39
39
|
output.info("Info message", file=buffer)
|
|
@@ -43,7 +43,7 @@ class TestOutputModule:
|
|
|
43
43
|
|
|
44
44
|
def test_warn_prints_yellow_prefix(self) -> None:
|
|
45
45
|
"""warn() should print with [WARN] prefix."""
|
|
46
|
-
from
|
|
46
|
+
from pf.common import output
|
|
47
47
|
|
|
48
48
|
buffer = io.StringIO()
|
|
49
49
|
output.warn("Warning message", file=buffer)
|
|
@@ -53,7 +53,7 @@ class TestOutputModule:
|
|
|
53
53
|
|
|
54
54
|
def test_error_prints_red_prefix(self) -> None:
|
|
55
55
|
"""error() should print with [ERROR] prefix."""
|
|
56
|
-
from
|
|
56
|
+
from pf.common import output
|
|
57
57
|
|
|
58
58
|
buffer = io.StringIO()
|
|
59
59
|
output.error("Error message", file=buffer)
|
|
@@ -63,7 +63,7 @@ class TestOutputModule:
|
|
|
63
63
|
|
|
64
64
|
def test_no_color_env_disables_colors(self) -> None:
|
|
65
65
|
"""NO_COLOR environment variable should disable colors."""
|
|
66
|
-
from
|
|
66
|
+
from pf.common import output
|
|
67
67
|
|
|
68
68
|
with patch.dict(os.environ, {"NO_COLOR": "1"}):
|
|
69
69
|
buffer = io.StringIO()
|
|
@@ -74,7 +74,7 @@ class TestOutputModule:
|
|
|
74
74
|
|
|
75
75
|
def test_force_color_env_enables_colors(self) -> None:
|
|
76
76
|
"""FORCE_COLOR environment variable should enable colors."""
|
|
77
|
-
from
|
|
77
|
+
from pf.common import output
|
|
78
78
|
|
|
79
79
|
with patch.dict(os.environ, {"FORCE_COLOR": "1"}, clear=False):
|
|
80
80
|
# Remove NO_COLOR if present
|
|
@@ -83,7 +83,7 @@ class TestOutputModule:
|
|
|
83
83
|
|
|
84
84
|
def test_header_prints_decorated_line(self) -> None:
|
|
85
85
|
"""header() should print decorated header."""
|
|
86
|
-
from
|
|
86
|
+
from pf.common import output
|
|
87
87
|
|
|
88
88
|
buffer = io.StringIO()
|
|
89
89
|
output.header("Test Header", char="=", width=40, file=buffer)
|
|
@@ -94,7 +94,7 @@ class TestOutputModule:
|
|
|
94
94
|
|
|
95
95
|
def test_divider_prints_line(self) -> None:
|
|
96
96
|
"""divider() should print a line."""
|
|
97
|
-
from
|
|
97
|
+
from pf.common import output
|
|
98
98
|
|
|
99
99
|
buffer = io.StringIO()
|
|
100
100
|
output.divider(char="-", width=20, file=buffer)
|
|
@@ -108,7 +108,7 @@ class TestConfigModule:
|
|
|
108
108
|
|
|
109
109
|
def test_get_project_root_finds_pennyfarthing_dir(self) -> None:
|
|
110
110
|
"""get_project_root() should find .pennyfarthing directory."""
|
|
111
|
-
from
|
|
111
|
+
from pf.common import config
|
|
112
112
|
|
|
113
113
|
# This test assumes we're running from within the pennyfarthing project
|
|
114
114
|
root = config.get_project_root()
|
|
@@ -117,7 +117,7 @@ class TestConfigModule:
|
|
|
117
117
|
|
|
118
118
|
def test_get_project_root_raises_if_not_found(self) -> None:
|
|
119
119
|
"""get_project_root() should raise if no .pennyfarthing found."""
|
|
120
|
-
from
|
|
120
|
+
from pf.common import config
|
|
121
121
|
|
|
122
122
|
# Clear env vars that bypass the directory walk
|
|
123
123
|
env_overrides = {"PROJECT_ROOT": "", "CLAUDE_PROJECT_DIR": ""}
|
|
@@ -131,7 +131,7 @@ class TestConfigModule:
|
|
|
131
131
|
|
|
132
132
|
def test_load_yaml_config_returns_dict(self) -> None:
|
|
133
133
|
"""load_yaml_config() should return parsed YAML as dict."""
|
|
134
|
-
from
|
|
134
|
+
from pf.common import config
|
|
135
135
|
|
|
136
136
|
# Test with existing sprint file
|
|
137
137
|
root = config.get_project_root()
|
|
@@ -143,20 +143,20 @@ class TestConfigModule:
|
|
|
143
143
|
|
|
144
144
|
def test_load_yaml_config_returns_none_if_missing(self) -> None:
|
|
145
145
|
"""load_yaml_config() should return None for missing files."""
|
|
146
|
-
from
|
|
146
|
+
from pf.common import config
|
|
147
147
|
|
|
148
148
|
result = config.load_yaml_config(Path("/nonexistent/file.yaml"))
|
|
149
149
|
assert result is None
|
|
150
150
|
|
|
151
151
|
def test_find_project_root_alias(self) -> None:
|
|
152
152
|
"""find_project_root should be an alias for get_project_root."""
|
|
153
|
-
from
|
|
153
|
+
from pf.common import config
|
|
154
154
|
|
|
155
155
|
assert config.find_project_root == config.get_project_root
|
|
156
156
|
|
|
157
157
|
def test_load_pennyfarthing_config_returns_dict(self) -> None:
|
|
158
158
|
"""load_pennyfarthing_config() should return config or empty dict."""
|
|
159
|
-
from
|
|
159
|
+
from pf.common import config
|
|
160
160
|
|
|
161
161
|
result = config.load_pennyfarthing_config()
|
|
162
162
|
assert isinstance(result, dict)
|
|
@@ -167,7 +167,7 @@ class TestColorsClass:
|
|
|
167
167
|
|
|
168
168
|
def test_colors_has_expected_constants(self) -> None:
|
|
169
169
|
"""Colors class should have standard ANSI color codes."""
|
|
170
|
-
from
|
|
170
|
+
from pf.common.output import Colors
|
|
171
171
|
|
|
172
172
|
assert hasattr(Colors, "RED")
|
|
173
173
|
assert hasattr(Colors, "GREEN")
|
|
@@ -179,7 +179,7 @@ class TestColorsClass:
|
|
|
179
179
|
|
|
180
180
|
def test_colors_are_ansi_escape_codes(self) -> None:
|
|
181
181
|
"""Color constants should be ANSI escape sequences."""
|
|
182
|
-
from
|
|
182
|
+
from pf.common.output import Colors
|
|
183
183
|
|
|
184
184
|
assert Colors.RED.startswith("\x1b[")
|
|
185
185
|
assert Colors.RESET == "\x1b[0m"
|
package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_confidence_sm_evaluation.py
RENAMED
|
@@ -28,7 +28,7 @@ import pytest
|
|
|
28
28
|
# ---------------------------------------------------------------------------
|
|
29
29
|
|
|
30
30
|
_THIS_DIR = Path(__file__).resolve().parent
|
|
31
|
-
_SCRIPTS_DIR = _THIS_DIR.parent #
|
|
31
|
+
_SCRIPTS_DIR = _THIS_DIR.parent # pf/
|
|
32
32
|
_FRAMEWORK_ROOT = _SCRIPTS_DIR.parent # pennyfarthing/
|
|
33
33
|
_EVAL_FILE = (
|
|
34
34
|
_FRAMEWORK_ROOT
|
|
@@ -25,8 +25,8 @@ from pathlib import Path
|
|
|
25
25
|
|
|
26
26
|
import pytest
|
|
27
27
|
|
|
28
|
-
from
|
|
29
|
-
from
|
|
28
|
+
from pf.handoff.gate_file import resolve_gate_file
|
|
29
|
+
from pf.handoff.gate_runner import parse_gate_file
|
|
30
30
|
|
|
31
31
|
# ---------------------------------------------------------------------------
|
|
32
32
|
# Fixtures
|
|
@@ -38,7 +38,7 @@ GATE_NAME = "confidence"
|
|
|
38
38
|
# In the dogfooding context, the project root is the orchestrator, so we need
|
|
39
39
|
# to resolve paths relative to this test file.
|
|
40
40
|
_THIS_DIR = Path(__file__).resolve().parent
|
|
41
|
-
_SCRIPTS_DIR = _THIS_DIR.parent #
|
|
41
|
+
_SCRIPTS_DIR = _THIS_DIR.parent # pf/
|
|
42
42
|
_FRAMEWORK_ROOT = _SCRIPTS_DIR.parent # pennyfarthing/
|
|
43
43
|
_GATE_FILE = _FRAMEWORK_ROOT / "pennyfarthing-dist" / "gates" / f"{GATE_NAME}.md"
|
|
44
44
|
|
|
@@ -4,7 +4,7 @@ RED state tests for the Python dialogue file persistence layer.
|
|
|
4
4
|
Ported from packages/core/src/consultation/dialogue-manager.test.ts.
|
|
5
5
|
|
|
6
6
|
Acceptance Criteria:
|
|
7
|
-
AC1:
|
|
7
|
+
AC1: pf/consultation/ package with dialogue_manager.py
|
|
8
8
|
implementing: create, format, parse, summary, append, update_outcome,
|
|
9
9
|
refresh_summary, archive
|
|
10
10
|
AC2: pf consultation Click CLI group with subcommands: init, append,
|
|
@@ -12,7 +12,7 @@ Acceptance Criteria:
|
|
|
12
12
|
AC3: All 6 ACs from 86-3 still pass — same file format, behavior, output
|
|
13
13
|
AC4: Tests ported to pytest in this file
|
|
14
14
|
|
|
15
|
-
Run with: pytest
|
|
15
|
+
Run with: pytest pf/tests/test_dialogue_manager.py -v
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
18
|
from __future__ import annotations
|
|
@@ -21,7 +21,7 @@ from pathlib import Path
|
|
|
21
21
|
|
|
22
22
|
from click.testing import CliRunner
|
|
23
23
|
|
|
24
|
-
from
|
|
24
|
+
from pf.consultation.dialogue_manager import (
|
|
25
25
|
DialogueExchange,
|
|
26
26
|
DialogueHeader,
|
|
27
27
|
DialogueResult,
|
|
@@ -746,45 +746,45 @@ class TestConsultationCLI:
|
|
|
746
746
|
self.runner = CliRunner()
|
|
747
747
|
|
|
748
748
|
def test_consultation_group_exists(self):
|
|
749
|
-
from
|
|
749
|
+
from pf.cli import cli
|
|
750
750
|
|
|
751
751
|
result = self.runner.invoke(cli, ["consultation", "--help"])
|
|
752
752
|
assert result.exit_code == 0
|
|
753
753
|
assert "consultation" in result.output.lower() or "dialogue" in result.output.lower()
|
|
754
754
|
|
|
755
755
|
def test_init_subcommand_exists(self):
|
|
756
|
-
from
|
|
756
|
+
from pf.cli import cli
|
|
757
757
|
|
|
758
758
|
result = self.runner.invoke(cli, ["consultation", "init", "--help"])
|
|
759
759
|
assert result.exit_code == 0
|
|
760
760
|
|
|
761
761
|
def test_append_subcommand_exists(self):
|
|
762
|
-
from
|
|
762
|
+
from pf.cli import cli
|
|
763
763
|
|
|
764
764
|
result = self.runner.invoke(cli, ["consultation", "append", "--help"])
|
|
765
765
|
assert result.exit_code == 0
|
|
766
766
|
|
|
767
767
|
def test_outcome_subcommand_exists(self):
|
|
768
|
-
from
|
|
768
|
+
from pf.cli import cli
|
|
769
769
|
|
|
770
770
|
result = self.runner.invoke(cli, ["consultation", "outcome", "--help"])
|
|
771
771
|
assert result.exit_code == 0
|
|
772
772
|
|
|
773
773
|
def test_summarize_subcommand_exists(self):
|
|
774
|
-
from
|
|
774
|
+
from pf.cli import cli
|
|
775
775
|
|
|
776
776
|
result = self.runner.invoke(cli, ["consultation", "summarize", "--help"])
|
|
777
777
|
assert result.exit_code == 0
|
|
778
778
|
|
|
779
779
|
def test_archive_subcommand_exists(self):
|
|
780
|
-
from
|
|
780
|
+
from pf.cli import cli
|
|
781
781
|
|
|
782
782
|
result = self.runner.invoke(cli, ["consultation", "archive", "--help"])
|
|
783
783
|
assert result.exit_code == 0
|
|
784
784
|
|
|
785
785
|
def test_init_creates_dialogue_file(self, tmp_path: Path):
|
|
786
786
|
"""CLI init should create a dialogue file in .session/."""
|
|
787
|
-
from
|
|
787
|
+
from pf.cli import cli
|
|
788
788
|
|
|
789
789
|
with self.runner.isolated_filesystem(temp_dir=tmp_path):
|
|
790
790
|
session_dir = Path(".session")
|
|
@@ -799,7 +799,7 @@ class TestConsultationCLI:
|
|
|
799
799
|
assert dialogue_file.exists()
|
|
800
800
|
|
|
801
801
|
def test_init_output_confirms_creation(self, tmp_path: Path):
|
|
802
|
-
from
|
|
802
|
+
from pf.cli import cli
|
|
803
803
|
|
|
804
804
|
with self.runner.isolated_filesystem(temp_dir=tmp_path):
|
|
805
805
|
Path(".session").mkdir()
|
|
@@ -19,14 +19,14 @@ from typing import Any
|
|
|
19
19
|
import pytest
|
|
20
20
|
import yaml
|
|
21
21
|
|
|
22
|
-
from
|
|
22
|
+
from pf.sprint.validator import (
|
|
23
23
|
REQUIRED_EPIC_SHARD_FIELDS,
|
|
24
24
|
REQUIRED_SHARD_STORY_FIELDS,
|
|
25
25
|
ValidationResult,
|
|
26
26
|
validate_epic_shard,
|
|
27
27
|
validate_sprint_file,
|
|
28
28
|
)
|
|
29
|
-
from
|
|
29
|
+
from pf.sprint.yaml_io import _get_epic_ref
|
|
30
30
|
|
|
31
31
|
# =============================================================================
|
|
32
32
|
# Fixtures
|
|
@@ -359,7 +359,7 @@ class TestWritePathValidatorIntegration:
|
|
|
359
359
|
|
|
360
360
|
def test_epic_add_validates_before_write(self, tmp_path: Path) -> None:
|
|
361
361
|
"""epic_add.add_epic() should reject invalid epics before writing."""
|
|
362
|
-
from
|
|
362
|
+
from pf.sprint.epic_add import add_epic
|
|
363
363
|
|
|
364
364
|
# Create a minimal sprint index
|
|
365
365
|
index = tmp_path / "current-sprint.yaml"
|
|
@@ -377,7 +377,7 @@ class TestWritePathValidatorIntegration:
|
|
|
377
377
|
|
|
378
378
|
def test_epic_add_valid_epic_succeeds(self, tmp_path: Path) -> None:
|
|
379
379
|
"""epic_add.add_epic() should accept valid epics."""
|
|
380
|
-
from
|
|
380
|
+
from pf.sprint.epic_add import add_epic
|
|
381
381
|
|
|
382
382
|
index = tmp_path / "current-sprint.yaml"
|
|
383
383
|
index.write_text("sprint:\n name: Test\nepics: []\n")
|
|
@@ -392,7 +392,7 @@ class TestWritePathValidatorIntegration:
|
|
|
392
392
|
|
|
393
393
|
def test_import_epic_validates_before_write(self, tmp_path: Path) -> None:
|
|
394
394
|
"""import_epic() validates generated YAML before writing to future.yaml."""
|
|
395
|
-
from
|
|
395
|
+
from pf.sprint.import_epic import import_epic
|
|
396
396
|
|
|
397
397
|
# Create a markdown file with an epic
|
|
398
398
|
md_file = tmp_path / "epics.md"
|
|
@@ -432,7 +432,7 @@ class TestWritePathValidatorIntegration:
|
|
|
432
432
|
"""
|
|
433
433
|
import inspect
|
|
434
434
|
|
|
435
|
-
from
|
|
435
|
+
from pf.sprint import cli
|
|
436
436
|
|
|
437
437
|
# epic_promote is a Click Command; inspect the underlying callback
|
|
438
438
|
source = inspect.getsource(cli.epic_promote.callback)
|
|
@@ -445,7 +445,7 @@ class TestWritePathValidatorIntegration:
|
|
|
445
445
|
"""
|
|
446
446
|
import inspect
|
|
447
447
|
|
|
448
|
-
from
|
|
448
|
+
from pf.jira.create import create_epic_in_jira
|
|
449
449
|
|
|
450
450
|
source = inspect.getsource(create_epic_in_jira)
|
|
451
451
|
assert "validate_epic_shard" in source
|
|
@@ -465,7 +465,7 @@ class TestLoaderWarnings:
|
|
|
465
465
|
|
|
466
466
|
def test_missing_shard_emits_warning(self, tmp_path: Path) -> None:
|
|
467
467
|
"""Unresolvable shard ref should emit a warning, not silently skip."""
|
|
468
|
-
from
|
|
468
|
+
from pf.sprint.loader import _merge_epic_shards
|
|
469
469
|
|
|
470
470
|
data = {
|
|
471
471
|
"epics": ["MSSCI-99999"], # Doesn't exist
|
|
@@ -480,7 +480,7 @@ class TestLoaderWarnings:
|
|
|
480
480
|
|
|
481
481
|
def test_missing_shard_excluded_from_result(self, tmp_path: Path) -> None:
|
|
482
482
|
"""Missing shard refs should not appear in the merged epics list."""
|
|
483
|
-
from
|
|
483
|
+
from pf.sprint.loader import _merge_epic_shards
|
|
484
484
|
|
|
485
485
|
data = {"epics": ["MSSCI-99999"]}
|
|
486
486
|
|
|
@@ -492,7 +492,7 @@ class TestLoaderWarnings:
|
|
|
492
492
|
|
|
493
493
|
def test_valid_shard_loaded_missing_shard_warned(self, tmp_path: Path) -> None:
|
|
494
494
|
"""Mix of valid and missing shards: load valid, warn on missing."""
|
|
495
|
-
from
|
|
495
|
+
from pf.sprint.loader import _merge_epic_shards
|
|
496
496
|
|
|
497
497
|
# Create one valid shard
|
|
498
498
|
shard = tmp_path / "epic-MSSCI-14298.yaml"
|
|
@@ -514,7 +514,7 @@ class TestLoaderWarnings:
|
|
|
514
514
|
|
|
515
515
|
def test_non_sharded_data_unchanged(self, tmp_path: Path) -> None:
|
|
516
516
|
"""Non-sharded data (epics are dicts) should pass through unchanged."""
|
|
517
|
-
from
|
|
517
|
+
from pf.sprint.loader import _merge_epic_shards
|
|
518
518
|
|
|
519
519
|
data = {
|
|
520
520
|
"epics": [
|
|
@@ -582,7 +582,7 @@ class TestJiraIdempotencyGuard:
|
|
|
582
582
|
"""Source code should contain duplicate title search logic."""
|
|
583
583
|
import inspect
|
|
584
584
|
|
|
585
|
-
from
|
|
585
|
+
from pf.jira.create import create_epic_in_jira
|
|
586
586
|
|
|
587
587
|
source = inspect.getsource(create_epic_in_jira)
|
|
588
588
|
# Should search for existing epic with same title
|
|
@@ -592,7 +592,7 @@ class TestJiraIdempotencyGuard:
|
|
|
592
592
|
"""create_epic_in_jira should accept a force parameter."""
|
|
593
593
|
import inspect
|
|
594
594
|
|
|
595
|
-
from
|
|
595
|
+
from pf.jira.create import create_epic_in_jira
|
|
596
596
|
|
|
597
597
|
sig = inspect.signature(create_epic_in_jira)
|
|
598
598
|
assert "force" in sig.parameters
|
|
@@ -601,7 +601,7 @@ class TestJiraIdempotencyGuard:
|
|
|
601
601
|
"""force parameter should default to False (safe by default)."""
|
|
602
602
|
import inspect
|
|
603
603
|
|
|
604
|
-
from
|
|
604
|
+
from pf.jira.create import create_epic_in_jira
|
|
605
605
|
|
|
606
606
|
sig = inspect.signature(create_epic_in_jira)
|
|
607
607
|
assert sig.parameters["force"].default is False
|
|
@@ -619,7 +619,7 @@ class TestValidationIntegration:
|
|
|
619
619
|
self, tmp_path: Path, valid_epic_shard_with_jira: dict[str, Any]
|
|
620
620
|
) -> None:
|
|
621
621
|
"""Valid shard passes validation, writes correctly, reads back."""
|
|
622
|
-
from
|
|
622
|
+
from pf.sprint.yaml_io import _get_epic_ref
|
|
623
623
|
|
|
624
624
|
# Validate
|
|
625
625
|
result = validate_epic_shard(valid_epic_shard_with_jira)
|
|
@@ -19,7 +19,7 @@ from pathlib import Path
|
|
|
19
19
|
|
|
20
20
|
import pytest
|
|
21
21
|
|
|
22
|
-
from
|
|
22
|
+
from pf.handoff.gate_file import resolve_gate_file
|
|
23
23
|
|
|
24
24
|
# ---------------------------------------------------------------------------
|
|
25
25
|
# Fixtures: Project structure
|
|
@@ -21,7 +21,7 @@ from unittest.mock import AsyncMock, patch
|
|
|
21
21
|
|
|
22
22
|
import pytest
|
|
23
23
|
|
|
24
|
-
from
|
|
24
|
+
from pf.git.create_branches import (
|
|
25
25
|
BranchAction,
|
|
26
26
|
BranchResult,
|
|
27
27
|
create_feature_branches,
|
|
@@ -30,7 +30,7 @@ from pennyfarthing_scripts.git.create_branches import (
|
|
|
30
30
|
filter_repos,
|
|
31
31
|
format_results,
|
|
32
32
|
)
|
|
33
|
-
from
|
|
33
|
+
from pf.git.status_all import (
|
|
34
34
|
RepoStatus,
|
|
35
35
|
format_status_brief,
|
|
36
36
|
format_status_full,
|
|
@@ -240,7 +240,7 @@ class TestGetAllRepoStatus:
|
|
|
240
240
|
) -> None:
|
|
241
241
|
"""get_all_repo_status should use asyncio.gather for parallelism."""
|
|
242
242
|
with patch(
|
|
243
|
-
"
|
|
243
|
+
"pf.git.status_all.get_repo_status",
|
|
244
244
|
new_callable=AsyncMock,
|
|
245
245
|
) as mock_get_status:
|
|
246
246
|
mock_get_status.return_value = RepoStatus(
|
|
@@ -534,7 +534,7 @@ class TestCreateFeatureBranches:
|
|
|
534
534
|
) -> None:
|
|
535
535
|
"""create_feature_branches should use asyncio.gather for parallelism."""
|
|
536
536
|
with patch(
|
|
537
|
-
"
|
|
537
|
+
"pf.git.create_branches.create_or_checkout_branch",
|
|
538
538
|
new_callable=AsyncMock,
|
|
539
539
|
) as mock_create:
|
|
540
540
|
mock_create.return_value = BranchResult(
|
|
@@ -790,8 +790,8 @@ class TestCrossPlatformCompatibility:
|
|
|
790
790
|
def test_no_shell_specific_commands(self) -> None:
|
|
791
791
|
"""Implementation should not use shell-specific commands."""
|
|
792
792
|
# This is more of a code review check, but we can verify the modules exist
|
|
793
|
-
import
|
|
794
|
-
import
|
|
793
|
+
import pf.git.create_branches as branch_mod
|
|
794
|
+
import pf.git.status_all as status_mod
|
|
795
795
|
|
|
796
796
|
# Modules should exist and be importable
|
|
797
797
|
assert status_mod is not None
|
|
@@ -824,7 +824,7 @@ class TestAsyncPerformance:
|
|
|
824
824
|
repos = [(f"repo-{i}", Path(f"/repo-{i}")) for i in range(3)]
|
|
825
825
|
|
|
826
826
|
with patch(
|
|
827
|
-
"
|
|
827
|
+
"pf.git.status_all.get_repo_status",
|
|
828
828
|
side_effect=mock_get_status,
|
|
829
829
|
):
|
|
830
830
|
await get_all_repo_status(repos)
|
|
@@ -853,7 +853,7 @@ class TestAsyncPerformance:
|
|
|
853
853
|
repos = [(f"repo-{i}", Path(f"/repo-{i}")) for i in range(3)]
|
|
854
854
|
|
|
855
855
|
with patch(
|
|
856
|
-
"
|
|
856
|
+
"pf.git.create_branches.create_or_checkout_branch",
|
|
857
857
|
side_effect=mock_create_branch,
|
|
858
858
|
):
|
|
859
859
|
await create_feature_branches(repos, "feature/test")
|
|
@@ -12,7 +12,7 @@ Acceptance Criteria:
|
|
|
12
12
|
checks assessment, returns structured RESOLVE_RESULT
|
|
13
13
|
- [AC2] complete-phase atomically updates session file (temp+mv) with
|
|
14
14
|
phase transition, timestamps, and history tables
|
|
15
|
-
- [AC3] Python module in
|
|
15
|
+
- [AC3] Python module in pf.handoff
|
|
16
16
|
- [AC4] stdout is the only communication channel — no side-channel files
|
|
17
17
|
- [AC5] Exit codes: 0 = ready/skip, 1 = blocked
|
|
18
18
|
- [AC6] YAML parsing via PyYAML
|
|
@@ -30,9 +30,9 @@ import pytest
|
|
|
30
30
|
import yaml
|
|
31
31
|
from click.testing import CliRunner
|
|
32
32
|
|
|
33
|
-
from
|
|
34
|
-
from
|
|
35
|
-
from
|
|
33
|
+
from pf.cli import cli
|
|
34
|
+
from pf.handoff.complete_phase import complete_phase
|
|
35
|
+
from pf.handoff.resolve_gate import resolve_gate
|
|
36
36
|
|
|
37
37
|
# ---------------------------------------------------------------------------
|
|
38
38
|
# Fixtures: Workflow YAML data
|
|
@@ -277,7 +277,7 @@ class TestResolveGateReady:
|
|
|
277
277
|
) -> None:
|
|
278
278
|
"""AC5: Exit code 0 when gate resolves to ready."""
|
|
279
279
|
with patch(
|
|
280
|
-
"
|
|
280
|
+
"pf.handoff.resolve_gate.resolve_gate",
|
|
281
281
|
return_value={
|
|
282
282
|
"status": "ready",
|
|
283
283
|
"gate_type": "tests_pass",
|
|
@@ -319,7 +319,7 @@ class TestResolveGateBlocked:
|
|
|
319
319
|
def test_blocked_exit_code_one(self, runner: CliRunner) -> None:
|
|
320
320
|
"""AC5: Exit code 1 when gate resolves to blocked."""
|
|
321
321
|
with patch(
|
|
322
|
-
"
|
|
322
|
+
"pf.handoff.resolve_gate.resolve_gate",
|
|
323
323
|
return_value={
|
|
324
324
|
"status": "blocked",
|
|
325
325
|
"gate_type": "tests_pass",
|
|
@@ -356,7 +356,7 @@ class TestResolveGateSkip:
|
|
|
356
356
|
def test_skip_exit_code_zero(self, runner: CliRunner) -> None:
|
|
357
357
|
"""AC5: Exit code 0 for skip status."""
|
|
358
358
|
with patch(
|
|
359
|
-
"
|
|
359
|
+
"pf.handoff.resolve_gate.resolve_gate",
|
|
360
360
|
return_value={
|
|
361
361
|
"status": "skip",
|
|
362
362
|
"gate_type": "manual",
|
|
@@ -459,7 +459,7 @@ class TestResolveGateCLIOutput:
|
|
|
459
459
|
def test_cli_output_is_valid_yaml(self, runner: CliRunner) -> None:
|
|
460
460
|
"""AC6: CLI output should be parseable YAML."""
|
|
461
461
|
with patch(
|
|
462
|
-
"
|
|
462
|
+
"pf.handoff.resolve_gate.resolve_gate",
|
|
463
463
|
return_value={
|
|
464
464
|
"status": "ready",
|
|
465
465
|
"gate_type": "tests_pass",
|
|
@@ -479,7 +479,7 @@ class TestResolveGateCLIOutput:
|
|
|
479
479
|
def test_cli_output_wraps_in_resolve_result_key(self, runner: CliRunner) -> None:
|
|
480
480
|
"""AC4: Output should be wrapped in RESOLVE_RESULT key."""
|
|
481
481
|
with patch(
|
|
482
|
-
"
|
|
482
|
+
"pf.handoff.resolve_gate.resolve_gate",
|
|
483
483
|
return_value={
|
|
484
484
|
"status": "ready",
|
|
485
485
|
"gate_type": "tests_pass",
|
|
@@ -742,7 +742,7 @@ class TestCompletePhaseOutputContract:
|
|
|
742
742
|
def test_cli_output_is_valid_yaml(self, runner: CliRunner) -> None:
|
|
743
743
|
"""AC6: CLI output should be parseable YAML."""
|
|
744
744
|
with patch(
|
|
745
|
-
"
|
|
745
|
+
"pf.handoff.complete_phase.complete_phase",
|
|
746
746
|
return_value={
|
|
747
747
|
"status": "success",
|
|
748
748
|
"session_file": ".session/105-1-session.md",
|
|
@@ -768,7 +768,7 @@ class TestCompletePhaseOutputContract:
|
|
|
768
768
|
def test_cli_exit_code_zero_on_success(self, runner: CliRunner) -> None:
|
|
769
769
|
"""AC5: Exit code 0 on successful phase completion."""
|
|
770
770
|
with patch(
|
|
771
|
-
"
|
|
771
|
+
"pf.handoff.complete_phase.complete_phase",
|
|
772
772
|
return_value={
|
|
773
773
|
"status": "success",
|
|
774
774
|
"session_file": ".session/105-1-session.md",
|
|
@@ -804,7 +804,7 @@ class TestCompletePhaseErrors:
|
|
|
804
804
|
def test_error_exit_code_one(self, runner: CliRunner) -> None:
|
|
805
805
|
"""AC5: Exit code 1 on error."""
|
|
806
806
|
with patch(
|
|
807
|
-
"
|
|
807
|
+
"pf.handoff.complete_phase.complete_phase",
|
|
808
808
|
return_value={
|
|
809
809
|
"status": "error",
|
|
810
810
|
"session_file": None,
|
|
@@ -25,8 +25,8 @@ from pathlib import Path
|
|
|
25
25
|
import pytest
|
|
26
26
|
import yaml
|
|
27
27
|
|
|
28
|
-
from
|
|
29
|
-
from
|
|
28
|
+
from pf.handoff.complete_phase import complete_phase
|
|
29
|
+
from pf.handoff.resolve_gate import resolve_gate
|
|
30
30
|
|
|
31
31
|
# ---------------------------------------------------------------------------
|
|
32
32
|
# Workflow definitions (matching real workflow YAMLs)
|