@pennyfarthing/core 11.2.1 → 11.2.2
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 +100 -40
- package/package.json +1 -1
- package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/doctor.js +121 -28
- package/packages/core/dist/cli/commands/doctor.js.map +1 -1
- package/packages/core/dist/cli/utils/settings.d.ts +0 -4
- package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/settings.js +31 -26
- package/packages/core/dist/cli/utils/settings.js.map +1 -1
- package/packages/core/dist/consultation/dialogue-manager.d.ts +1 -1
- package/packages/core/dist/consultation/dialogue-manager.d.ts.map +1 -1
- package/packages/core/dist/consultation/dialogue-manager.js +1 -1
- package/packages/core/dist/consultation/dialogue-manager.js.map +1 -1
- package/packages/core/dist/consultation/dialogue-manager.test.js.map +1 -1
- package/packages/core/dist/consultation/tandem-metrics.test.js.map +1 -1
- package/packages/core/dist/public/css/react.css +1 -1
- package/packages/core/dist/public/js/react/react.js +9 -9
- package/packages/core/dist/server/api/git.d.ts.map +1 -1
- package/packages/core/dist/server/api/git.js +0 -1
- package/packages/core/dist/server/api/git.js.map +1 -1
- package/packages/core/dist/server/api/index.d.ts +2 -0
- package/packages/core/dist/server/api/index.d.ts.map +1 -1
- package/packages/core/dist/server/api/index.js +2 -0
- package/packages/core/dist/server/api/index.js.map +1 -1
- package/packages/core/dist/server/api/project-info.d.ts +11 -0
- package/packages/core/dist/server/api/project-info.d.ts.map +1 -0
- package/packages/core/dist/server/api/project-info.js +18 -0
- package/packages/core/dist/server/api/project-info.js.map +1 -0
- package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
- package/packages/core/dist/server/otlp-receiver.js +18 -1
- package/packages/core/dist/server/otlp-receiver.js.map +1 -1
- package/packages/core/dist/server/otlp-receiver.test.js +1 -1
- package/packages/core/dist/server/otlp-receiver.test.js.map +1 -1
- package/packages/core/dist/server/server.d.ts.map +1 -1
- package/packages/core/dist/server/server.js +3 -2
- package/packages/core/dist/server/server.js.map +1 -1
- package/packages/core/dist/server/server.test.d.ts +1 -1
- package/packages/core/dist/server/server.test.js +8 -8
- package/packages/core/dist/server/settings.d.ts +1 -0
- package/packages/core/dist/server/settings.d.ts.map +1 -1
- package/packages/core/dist/server/settings.js +13 -0
- package/packages/core/dist/server/settings.js.map +1 -1
- package/packages/core/dist/workflow/team-lifecycle.d.ts +169 -0
- package/packages/core/dist/workflow/team-lifecycle.d.ts.map +1 -0
- package/packages/core/dist/workflow/team-lifecycle.js +217 -0
- package/packages/core/dist/workflow/team-lifecycle.js.map +1 -0
- package/packages/core/dist/workflow/team-lifecycle.test.d.ts +20 -0
- package/packages/core/dist/workflow/team-lifecycle.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/team-lifecycle.test.js +966 -0
- package/packages/core/dist/workflow/team-lifecycle.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-team-templates.test.d.ts +17 -0
- package/packages/core/dist/workflow/workflow-team-templates.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-team-templates.test.js +275 -0
- package/packages/core/dist/workflow/workflow-team-templates.test.js.map +1 -0
- package/pennyfarthing-dist/agents/dev.md +15 -2
- package/pennyfarthing-dist/agents/reviewer.md +17 -4
- package/pennyfarthing-dist/agents/sm-finish.md +1 -1
- package/pennyfarthing-dist/agents/sm-setup.md +7 -7
- package/pennyfarthing-dist/agents/sm.md +12 -12
- package/pennyfarthing-dist/agents/tea.md +2 -2
- package/pennyfarthing-dist/agents/testing-runner.md +1 -1
- package/pennyfarthing-dist/commands/pf-architect.md +1 -1
- package/pennyfarthing-dist/commands/pf-ba.md +1 -1
- package/pennyfarthing-dist/commands/pf-chore.md +2 -2
- package/pennyfarthing-dist/commands/pf-dev.md +1 -1
- package/pennyfarthing-dist/commands/pf-devops.md +1 -1
- package/pennyfarthing-dist/commands/pf-epic.md +6 -6
- package/pennyfarthing-dist/commands/pf-git.md +10 -10
- package/pennyfarthing-dist/commands/pf-health-check.md +1 -1
- package/pennyfarthing-dist/commands/pf-help.md +12 -12
- package/pennyfarthing-dist/commands/pf-orchestrator.md +1 -1
- package/pennyfarthing-dist/commands/pf-pm.md +1 -1
- package/pennyfarthing-dist/commands/pf-prime.md +8 -8
- package/pennyfarthing-dist/commands/pf-reviewer.md +1 -1
- package/pennyfarthing-dist/commands/pf-session.md +7 -7
- package/pennyfarthing-dist/commands/pf-sm.md +1 -1
- package/pennyfarthing-dist/commands/pf-sprint.md +7 -7
- package/pennyfarthing-dist/commands/pf-tea.md +1 -1
- package/pennyfarthing-dist/commands/pf-tech-writer.md +1 -1
- package/pennyfarthing-dist/commands/pf-theme.md +9 -9
- package/pennyfarthing-dist/commands/pf-ux-designer.md +1 -1
- package/pennyfarthing-dist/commands/pf-work.md +1 -1
- package/pennyfarthing-dist/guides/agent-behavior.md +70 -19
- package/pennyfarthing-dist/guides/agent-coordination.md +10 -10
- package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -6
- package/pennyfarthing-dist/guides/agent-template-tactical.md +1 -1
- package/pennyfarthing-dist/guides/bell-mode.md +1 -1
- package/pennyfarthing-dist/guides/bikerack.md +10 -10
- package/pennyfarthing-dist/guides/brownfield-tools.md +24 -24
- package/pennyfarthing-dist/guides/command-tag-taxonomy.md +1 -1
- package/pennyfarthing-dist/guides/gate-schema.md +2 -2
- package/pennyfarthing-dist/guides/gates.md +3 -3
- package/pennyfarthing-dist/guides/handoff-cli.md +8 -8
- package/pennyfarthing-dist/guides/hooks.md +27 -27
- package/pennyfarthing-dist/guides/prime.md +2 -2
- package/pennyfarthing-dist/guides/reflector.md +1 -1
- package/pennyfarthing-dist/guides/skill-schema.md +6 -6
- package/pennyfarthing-dist/guides/tandem-protocol.md +3 -3
- package/pennyfarthing-dist/guides/workflow-schema.md +1 -1
- package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
- package/pennyfarthing-dist/guides/xml-tags.md +8 -8
- package/pennyfarthing-dist/scripts/README.md +4 -4
- package/pennyfarthing-dist/scripts/core/agent-session.sh +2 -5
- package/pennyfarthing-dist/scripts/core/check-context.sh +1 -1
- package/pennyfarthing-dist/scripts/core/pf.sh +5 -0
- package/pennyfarthing-dist/scripts/core/phase-check-start.sh +2 -5
- package/pennyfarthing-dist/scripts/core/prime.sh +2 -25
- package/pennyfarthing-dist/scripts/git/README.md +14 -14
- package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +2 -3
- package/pennyfarthing-dist/scripts/git/git-status-all.sh +2 -3
- package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +2 -3
- package/pennyfarthing-dist/scripts/git/worktree-manager.sh +2 -4
- package/pennyfarthing-dist/scripts/hooks/README.md +6 -6
- package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/context-warning.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +5 -4
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +2 -1
- package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/session-start.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/session-stop.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +3 -4
- package/pennyfarthing-dist/scripts/lib/env.sh +34 -0
- package/pennyfarthing-dist/scripts/lib/run-pf.sh +39 -0
- package/pennyfarthing-dist/scripts/misc/README.md +1 -1
- package/pennyfarthing-dist/scripts/misc/statusline.sh +3 -3
- package/pennyfarthing-dist/scripts/sprint/README.md +21 -21
- package/pennyfarthing-dist/scripts/workflow/README.md +2 -2
- package/pennyfarthing-dist/scripts/workflow/finish-story.sh +2 -16
- package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +3 -3
- package/pennyfarthing-dist/skills/pf-bc/examples.md +23 -23
- package/pennyfarthing-dist/skills/pf-bc/skill.md +17 -17
- package/pennyfarthing-dist/skills/pf-bc/usage.md +8 -8
- package/pennyfarthing-dist/skills/pf-jira/SKILL.md +15 -15
- package/pennyfarthing-dist/skills/pf-jira/examples.md +48 -48
- package/pennyfarthing-dist/skills/pf-jira/usage.md +15 -15
- package/pennyfarthing-dist/skills/pf-sprint/examples.md +80 -80
- package/pennyfarthing-dist/skills/pf-sprint/skill.md +35 -35
- package/pennyfarthing-dist/skills/pf-sprint/usage.md +30 -30
- package/pennyfarthing-dist/skills/pf-theme/examples.md +15 -15
- package/pennyfarthing-dist/skills/pf-theme/skill.md +6 -6
- package/pennyfarthing-dist/skills/pf-theme/usage.md +5 -5
- package/pennyfarthing-dist/skills/pf-workflow/examples.md +27 -27
- package/pennyfarthing-dist/skills/pf-workflow/skill.md +11 -11
- package/pennyfarthing-dist/skills/pf-workflow/usage.md +11 -11
- package/pennyfarthing-dist/skills/skill-registry.yaml +19 -19
- package/pennyfarthing-dist/templates/settings.local.json.template +11 -11
- package/pennyfarthing-dist/workflows/bdd-team.yaml +89 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +1 -1
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +1 -1
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +1 -1
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
- package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +47 -0
- package/pennyfarthing-dist/workflows/tdd-team.yaml +80 -0
- package/pennyfarthing_scripts/__init__.py +1 -1
- package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/context.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/bc/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/split.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/cli.py +2 -2
- package/pennyfarthing_scripts/bellmode_hook.py +2 -5
- package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
- 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__/cli.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__/launcher.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/bikerack/audit_log_panel.py +48 -6
- package/pennyfarthing_scripts/bikerack/launcher.py +6 -6
- package/pennyfarthing_scripts/bikerack/progress_panel.py +0 -1
- package/pennyfarthing_scripts/bikerack/sprint_panel.py +1 -1
- package/pennyfarthing_scripts/bikerack/story_detail_data.py +4 -1
- package/pennyfarthing_scripts/bikerack/story_detail_screen.py +2 -1
- package/pennyfarthing_scripts/bikerack/tui.py +12 -2
- package/pennyfarthing_scripts/bikerack/ws_client.py +2 -2
- 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/__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__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/config.py +29 -2
- 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/consultation/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/consultation/cli.py +3 -3
- package/pennyfarthing_scripts/context.py +3 -3
- package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
- 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__/cli.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/__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/epic/__pycache__/cli.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/hooks_installer.py +2 -3
- package/pennyfarthing_scripts/git/status_all.py +1 -1
- package/pennyfarthing_scripts/git/worktree.py +2 -2
- package/pennyfarthing_scripts/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/cli.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__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__init__.py +8 -3
- package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.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/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/bell_mode.py +0 -1
- package/pennyfarthing_scripts/hooks/pre_edit_check.py +0 -1
- package/pennyfarthing_scripts/hooks/reflector_check.py +1 -2
- package/pennyfarthing_scripts/hooks/schema_validation.py +0 -1
- package/pennyfarthing_scripts/hooks/session_start.py +6 -8
- package/pennyfarthing_scripts/hooks/statusline.py +10 -1
- package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-314.pyc +0 -0
- 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/__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/__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/prime/heatmap.py +3 -15
- package/pennyfarthing_scripts/session/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/session/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/cli.py +121 -0
- package/pennyfarthing_scripts/sprint/loader.py +154 -3
- package/pennyfarthing_scripts/sprint/story_update.py +7 -0
- 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/__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_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_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/test_bikerack.py +26 -26
- package/pennyfarthing_scripts/tests/test_dialogue_manager.py +0 -1
- package/pennyfarthing_scripts/tests/test_workflow_list_team.py +147 -0
- package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
- 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/validate/adapters/team_mode.py +323 -0
- package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/team_lifecycle.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/cli.py +15 -14
- package/pennyfarthing_scripts/workflow/state.py +0 -1
- package/pennyfarthing_scripts/workflow/team_lifecycle.py +3 -4
- package/packages/core/dist/cli/cyclist-migration.test.d.ts +0 -16
- package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +0 -1
- package/packages/core/dist/cli/cyclist-migration.test.js +0 -229
- package/packages/core/dist/cli/cyclist-migration.test.js.map +0 -1
- package/packages/core/dist/scripts/benchmark-integration.d.ts +0 -182
- package/packages/core/dist/scripts/benchmark-integration.d.ts.map +0 -1
- package/packages/core/dist/scripts/benchmark-integration.js +0 -691
- package/packages/core/dist/scripts/benchmark-integration.js.map +0 -1
- package/packages/core/dist/scripts/job-fair-aggregator.d.ts +0 -150
- package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +0 -1
- package/packages/core/dist/scripts/job-fair-aggregator.js +0 -547
- package/packages/core/dist/scripts/job-fair-aggregator.js.map +0 -1
- package/packages/core/dist/scripts/theme-detail.test.d.ts.map +0 -1
- package/packages/core/dist/scripts/theme-detail.test.js.map +0 -1
- package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/consultation/__pycache__/dialogue_manager.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_108_1_gate_migration.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_dialogue_manager.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Sprint YAML parsing utilities for Pennyfarthing scripts.
|
|
3
3
|
|
|
4
|
-
Provides access to sprint
|
|
5
|
-
|
|
4
|
+
Provides access to sprint data with support for:
|
|
5
|
+
- Default sprint: sprint/current-sprint.yaml
|
|
6
|
+
- Multi-sprint registry: sprint/sprints.yaml with per-user preference
|
|
7
|
+
stored in .pennyfarthing/config.local.yaml
|
|
8
|
+
- Sharded per-epic format: epic-{ref}.yaml shard files
|
|
6
9
|
"""
|
|
7
10
|
|
|
8
11
|
import warnings
|
|
9
12
|
from pathlib import Path
|
|
10
13
|
from typing import Any
|
|
11
14
|
|
|
12
|
-
from pennyfarthing_scripts.common.config import
|
|
15
|
+
from pennyfarthing_scripts.common.config import (
|
|
16
|
+
get_project_root,
|
|
17
|
+
load_pennyfarthing_config,
|
|
18
|
+
load_yaml_config,
|
|
19
|
+
save_pennyfarthing_config_key,
|
|
20
|
+
)
|
|
13
21
|
|
|
14
22
|
|
|
15
23
|
def _merge_epic_shards(data: dict[str, Any], sprint_dir: Path) -> dict[str, Any]:
|
|
@@ -101,6 +109,12 @@ def _merge_epic_shards(data: dict[str, Any], sprint_dir: Path) -> dict[str, Any]
|
|
|
101
109
|
def load_sprint(project_root: Path | None = None) -> dict[str, Any] | None:
|
|
102
110
|
"""Load sprint data from project root.
|
|
103
111
|
|
|
112
|
+
Resolution order:
|
|
113
|
+
1. Check .pennyfarthing/config.local.yaml for sprint.active preference
|
|
114
|
+
2. If set, look up the sprint in sprint/sprints.yaml registry
|
|
115
|
+
3. Load the referenced sprint file (resolved relative to sprint/)
|
|
116
|
+
4. If no preference or no registry, fall back to sprint/current-sprint.yaml
|
|
117
|
+
|
|
104
118
|
Supports both monolithic and sharded epic formats. When epics are
|
|
105
119
|
string references, the corresponding epic-{ref}.yaml files are
|
|
106
120
|
loaded and merged transparently.
|
|
@@ -113,6 +127,30 @@ def load_sprint(project_root: Path | None = None) -> dict[str, Any] | None:
|
|
|
113
127
|
"""
|
|
114
128
|
root = project_root or get_project_root()
|
|
115
129
|
sprint_dir = root / "sprint"
|
|
130
|
+
|
|
131
|
+
# Check for per-user sprint preference
|
|
132
|
+
active_name = get_active_sprint_name(root)
|
|
133
|
+
if active_name:
|
|
134
|
+
registry = load_sprint_registry(root)
|
|
135
|
+
if registry:
|
|
136
|
+
sprints = registry.get("sprints", {})
|
|
137
|
+
sprint_entry = sprints.get(active_name)
|
|
138
|
+
if sprint_entry and sprint_entry.get("file"):
|
|
139
|
+
sprint_path = (sprint_dir / sprint_entry["file"]).resolve()
|
|
140
|
+
if sprint_path.exists():
|
|
141
|
+
data = load_yaml_config(sprint_path)
|
|
142
|
+
if data is not None:
|
|
143
|
+
# Inject registry metadata for downstream consumers
|
|
144
|
+
data["_registry"] = {
|
|
145
|
+
"name": active_name,
|
|
146
|
+
"type": sprint_entry.get("type", "project"),
|
|
147
|
+
"context_root": sprint_entry.get("context_root"),
|
|
148
|
+
"session_root": sprint_entry.get("session_root"),
|
|
149
|
+
"docs": sprint_entry.get("docs", {}),
|
|
150
|
+
}
|
|
151
|
+
return _merge_epic_shards(data, sprint_path.parent)
|
|
152
|
+
|
|
153
|
+
# Default: load sprint/current-sprint.yaml
|
|
116
154
|
sprint_path = sprint_dir / "current-sprint.yaml"
|
|
117
155
|
data = load_yaml_config(sprint_path)
|
|
118
156
|
if data is None:
|
|
@@ -121,6 +159,119 @@ def load_sprint(project_root: Path | None = None) -> dict[str, Any] | None:
|
|
|
121
159
|
return _merge_epic_shards(data, sprint_dir)
|
|
122
160
|
|
|
123
161
|
|
|
162
|
+
def load_sprint_registry(project_root: Path | None = None) -> dict[str, Any] | None:
|
|
163
|
+
"""Load sprint registry from sprint/sprints.yaml.
|
|
164
|
+
|
|
165
|
+
The sprint registry indexes multiple parallel sprints (e.g., a main
|
|
166
|
+
project sprint and research spike sprints). Each entry maps a sprint
|
|
167
|
+
name to its YAML file path, type, and metadata.
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
project_root: Project root path (defaults to auto-detect)
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
Registry data as dict, or None if no registry exists
|
|
174
|
+
"""
|
|
175
|
+
root = project_root or get_project_root()
|
|
176
|
+
registry_path = root / "sprint" / "sprints.yaml"
|
|
177
|
+
return load_yaml_config(registry_path)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def get_active_sprint_name(project_root: Path | None = None) -> str | None:
|
|
181
|
+
"""Get the name of the currently active sprint.
|
|
182
|
+
|
|
183
|
+
Reads the per-user preference from .pennyfarthing/config.local.yaml
|
|
184
|
+
(sprint.active key). Returns None if no preference is set, meaning
|
|
185
|
+
the default sprint/current-sprint.yaml should be used.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
project_root: Project root path (defaults to auto-detect)
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
Active sprint name, or None if using the default sprint
|
|
192
|
+
"""
|
|
193
|
+
root = project_root or get_project_root()
|
|
194
|
+
config = load_pennyfarthing_config(root)
|
|
195
|
+
sprint_config = config.get("sprint", {})
|
|
196
|
+
if isinstance(sprint_config, dict):
|
|
197
|
+
return sprint_config.get("active")
|
|
198
|
+
return None
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def switch_sprint(name: str, project_root: Path | None = None) -> dict[str, Any]:
|
|
202
|
+
"""Switch the active sprint by updating the per-user preference.
|
|
203
|
+
|
|
204
|
+
Validates the sprint name against sprint/sprints.yaml, then writes
|
|
205
|
+
the selection to .pennyfarthing/config.local.yaml (gitignored,
|
|
206
|
+
per-user). Does not modify any shared repo files.
|
|
207
|
+
|
|
208
|
+
Use name "default" to clear the preference and revert to the
|
|
209
|
+
project's sprint/current-sprint.yaml.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
name: Sprint name from the registry (e.g., "main", "ocsf-rs1")
|
|
213
|
+
or "default" to clear the preference
|
|
214
|
+
project_root: Project root path (defaults to auto-detect)
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
Dict with 'success', 'message', and optional 'error' or 'sprint'
|
|
218
|
+
"""
|
|
219
|
+
root = project_root or get_project_root()
|
|
220
|
+
|
|
221
|
+
# "default" clears the preference
|
|
222
|
+
if name == "default":
|
|
223
|
+
config = load_pennyfarthing_config(root)
|
|
224
|
+
sprint_config = config.get("sprint", {})
|
|
225
|
+
if isinstance(sprint_config, dict) and "active" in sprint_config:
|
|
226
|
+
del sprint_config["active"]
|
|
227
|
+
if not sprint_config:
|
|
228
|
+
save_pennyfarthing_config_key("sprint", {}, root)
|
|
229
|
+
else:
|
|
230
|
+
save_pennyfarthing_config_key("sprint", sprint_config, root)
|
|
231
|
+
return {
|
|
232
|
+
"success": True,
|
|
233
|
+
"message": "Cleared sprint preference — using default sprint/current-sprint.yaml",
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
registry = load_sprint_registry(root)
|
|
237
|
+
|
|
238
|
+
if registry is None:
|
|
239
|
+
return {"success": False, "error": "No sprint registry found (sprint/sprints.yaml)"}
|
|
240
|
+
|
|
241
|
+
sprints = registry.get("sprints", {})
|
|
242
|
+
if name not in sprints:
|
|
243
|
+
available = ", ".join(sprints.keys())
|
|
244
|
+
return {"success": False, "error": f"Unknown sprint: {name}. Available: {available}"}
|
|
245
|
+
|
|
246
|
+
sprint_entry = sprints[name]
|
|
247
|
+
sprint_file = sprint_entry.get("file")
|
|
248
|
+
if not sprint_file:
|
|
249
|
+
return {"success": False, "error": f"Sprint '{name}' has no file configured"}
|
|
250
|
+
|
|
251
|
+
# Verify the target sprint file exists
|
|
252
|
+
sprint_dir = root / "sprint"
|
|
253
|
+
target_path = (sprint_dir / sprint_file).resolve()
|
|
254
|
+
if not target_path.exists():
|
|
255
|
+
return {
|
|
256
|
+
"success": False,
|
|
257
|
+
"error": f"Sprint file not found: {sprint_file} (resolved to {target_path})",
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
# Write preference to config.local.yaml (per-user, gitignored)
|
|
261
|
+
config = load_pennyfarthing_config(root)
|
|
262
|
+
sprint_config = config.get("sprint", {})
|
|
263
|
+
if not isinstance(sprint_config, dict):
|
|
264
|
+
sprint_config = {}
|
|
265
|
+
sprint_config["active"] = name
|
|
266
|
+
save_pennyfarthing_config_key("sprint", sprint_config, root)
|
|
267
|
+
|
|
268
|
+
return {
|
|
269
|
+
"success": True,
|
|
270
|
+
"message": f"Switched to sprint: {name}",
|
|
271
|
+
"sprint": sprint_entry,
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
|
|
124
275
|
def find_epic(sprint_data: dict[str, Any], epic_num: str) -> dict[str, Any] | None:
|
|
125
276
|
"""Find epic in sprint data (handles various ID formats).
|
|
126
277
|
|
|
@@ -30,6 +30,7 @@ def update_story(
|
|
|
30
30
|
completed_date: str | None = None,
|
|
31
31
|
started_date: str | None = None,
|
|
32
32
|
workflow: str | None = None,
|
|
33
|
+
description: str | None = None,
|
|
33
34
|
review_findings: str | None = None,
|
|
34
35
|
review_verdict: str | None = None,
|
|
35
36
|
dry_run: bool = False,
|
|
@@ -46,6 +47,7 @@ def update_story(
|
|
|
46
47
|
completed_date: Completed date (ISO format)
|
|
47
48
|
started_date: Started date (ISO format)
|
|
48
49
|
workflow: Workflow type (tdd, trivial, bdd, agent-docs)
|
|
50
|
+
description: Story description text
|
|
49
51
|
review_findings: Reviewer findings text
|
|
50
52
|
review_verdict: Review verdict (approved, rejected, pending)
|
|
51
53
|
dry_run: If True, report changes without writing
|
|
@@ -101,6 +103,8 @@ def update_story(
|
|
|
101
103
|
story["started"] = started_date
|
|
102
104
|
if workflow is not None:
|
|
103
105
|
story["workflow"] = workflow
|
|
106
|
+
if description is not None:
|
|
107
|
+
story["description"] = description
|
|
104
108
|
if review_findings is not None:
|
|
105
109
|
story["review_findings"] = review_findings
|
|
106
110
|
if review_verdict is not None:
|
|
@@ -166,6 +170,7 @@ def update_story(
|
|
|
166
170
|
@click.option("--priority", default=None)
|
|
167
171
|
@click.option("--started", "started_date", default=None)
|
|
168
172
|
@click.option("--workflow", default=None)
|
|
173
|
+
@click.option("--description", default=None, help="Story description text")
|
|
169
174
|
@click.option("--review-findings", default=None, help="Reviewer findings text")
|
|
170
175
|
@click.option("--review-verdict", type=click.Choice(["approved", "rejected", "pending"]), default=None)
|
|
171
176
|
@click.option("--dry-run", is_flag=True)
|
|
@@ -179,6 +184,7 @@ def story_update_command(
|
|
|
179
184
|
priority: str | None,
|
|
180
185
|
started_date: str | None,
|
|
181
186
|
workflow: str | None,
|
|
187
|
+
description: str | None,
|
|
182
188
|
review_findings: str | None,
|
|
183
189
|
review_verdict: str | None,
|
|
184
190
|
dry_run: bool,
|
|
@@ -201,6 +207,7 @@ def story_update_command(
|
|
|
201
207
|
completed_date=completed_date,
|
|
202
208
|
started_date=started_date,
|
|
203
209
|
workflow=workflow,
|
|
210
|
+
description=description,
|
|
204
211
|
review_findings=review_findings,
|
|
205
212
|
review_verdict=review_verdict,
|
|
206
213
|
dry_run=dry_run,
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc
CHANGED
|
Binary file
|
package/pennyfarthing_scripts/tests/__pycache__/test_workflow_list_team.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
|
@@ -5,14 +5,14 @@ Epic: 101 — BikeRack Mode (ADR-0024)
|
|
|
5
5
|
|
|
6
6
|
Acceptance Criteria:
|
|
7
7
|
- [AC1] `pf bikerack start` starts WheelHub background with IS_BIKERACK=1
|
|
8
|
-
- [AC2] Polls for .
|
|
8
|
+
- [AC2] Polls for .bikerack-port file (100ms interval, 5s timeout)
|
|
9
9
|
- [AC3] Sets exactly 5 OTEL env vars from discovered port (Rule 5)
|
|
10
10
|
- [AC4] Uses exec (not spawn) for Claude CLI (CE-4)
|
|
11
11
|
- [AC5] trap EXIT registered before exec to kill WheelHub PID (Rule 8)
|
|
12
12
|
- [AC6] Writes .wheelhub-pid after spawning WheelHub
|
|
13
13
|
- [AC7] `pf bikerack stop` reads PID, sends SIGTERM, deletes files
|
|
14
14
|
- [AC8] `pf bikerack status` shows running state (PID, port, uptime)
|
|
15
|
-
- [AC9] Error if already running (.
|
|
15
|
+
- [AC9] Error if already running (.bikerack-port exists with live PID)
|
|
16
16
|
- [AC10] Exit code 1 if WheelHub fails to start, 2 if already running
|
|
17
17
|
- [AC11] Prints dashboard URL on startup
|
|
18
18
|
- [AC12] `just bikerack` works as alias
|
|
@@ -101,7 +101,7 @@ class TestStartWheelHub:
|
|
|
101
101
|
|
|
102
102
|
|
|
103
103
|
# ---------------------------------------------------------------------------
|
|
104
|
-
# AC2: Polls for .
|
|
104
|
+
# AC2: Polls for .bikerack-port file (100ms interval, 5s timeout)
|
|
105
105
|
# ---------------------------------------------------------------------------
|
|
106
106
|
|
|
107
107
|
|
|
@@ -110,7 +110,7 @@ class TestPortFilePolling:
|
|
|
110
110
|
|
|
111
111
|
def test_returns_port_when_file_exists(self, tmp_path: Path) -> None:
|
|
112
112
|
"""poll_for_port_file should return port number from file."""
|
|
113
|
-
port_file = tmp_path / ".
|
|
113
|
+
port_file = tmp_path / ".bikerack-port"
|
|
114
114
|
port_file.write_text("2898")
|
|
115
115
|
|
|
116
116
|
result = poll_for_port_file(tmp_path)
|
|
@@ -125,7 +125,7 @@ class TestPortFilePolling:
|
|
|
125
125
|
|
|
126
126
|
def test_waits_for_file_to_appear(self, tmp_path: Path) -> None:
|
|
127
127
|
"""poll_for_port_file should poll until file appears."""
|
|
128
|
-
port_file = tmp_path / ".
|
|
128
|
+
port_file = tmp_path / ".bikerack-port"
|
|
129
129
|
|
|
130
130
|
# Simulate file appearing after short delay
|
|
131
131
|
call_count = [0]
|
|
@@ -160,7 +160,7 @@ class TestPortFilePolling:
|
|
|
160
160
|
|
|
161
161
|
def test_reads_integer_port(self, tmp_path: Path) -> None:
|
|
162
162
|
"""poll_for_port_file should parse port as integer."""
|
|
163
|
-
port_file = tmp_path / ".
|
|
163
|
+
port_file = tmp_path / ".bikerack-port"
|
|
164
164
|
port_file.write_text("3000\n") # Trailing newline should be handled
|
|
165
165
|
|
|
166
166
|
result = poll_for_port_file(tmp_path)
|
|
@@ -340,8 +340,8 @@ class TestCleanupRegistration:
|
|
|
340
340
|
assert kill_args[1] == signal.SIGTERM
|
|
341
341
|
|
|
342
342
|
def test_cleanup_removes_port_file(self, tmp_path: Path) -> None:
|
|
343
|
-
"""Registered cleanup should delete .
|
|
344
|
-
port_file = tmp_path / ".
|
|
343
|
+
"""Registered cleanup should delete .bikerack-port file."""
|
|
344
|
+
port_file = tmp_path / ".bikerack-port"
|
|
345
345
|
port_file.write_text("2898")
|
|
346
346
|
|
|
347
347
|
cleanup_func = None
|
|
@@ -363,7 +363,7 @@ class TestCleanupRegistration:
|
|
|
363
363
|
except (ProcessLookupError, OSError):
|
|
364
364
|
pass
|
|
365
365
|
|
|
366
|
-
assert not port_file.exists(), ".
|
|
366
|
+
assert not port_file.exists(), ".bikerack-port should be deleted by cleanup"
|
|
367
367
|
|
|
368
368
|
def test_cleanup_removes_pid_file(self, tmp_path: Path) -> None:
|
|
369
369
|
"""Registered cleanup should delete .wheelhub-pid file."""
|
|
@@ -443,7 +443,7 @@ class TestStopBikeRack:
|
|
|
443
443
|
def test_sends_sigterm_to_pid(self, tmp_path: Path) -> None:
|
|
444
444
|
"""stop_bikerack should send SIGTERM to the WheelHub PID."""
|
|
445
445
|
# Setup: create port and pid files
|
|
446
|
-
(tmp_path / ".
|
|
446
|
+
(tmp_path / ".bikerack-port").write_text("2898")
|
|
447
447
|
(tmp_path / ".wheelhub-pid").write_text("12345")
|
|
448
448
|
|
|
449
449
|
with patch("pennyfarthing_scripts.bikerack.launcher.os.kill") as mock_kill:
|
|
@@ -453,8 +453,8 @@ class TestStopBikeRack:
|
|
|
453
453
|
mock_kill.assert_called_with(12345, signal.SIGTERM)
|
|
454
454
|
|
|
455
455
|
def test_deletes_port_file(self, tmp_path: Path) -> None:
|
|
456
|
-
"""stop_bikerack should delete .
|
|
457
|
-
port_file = tmp_path / ".
|
|
456
|
+
"""stop_bikerack should delete .bikerack-port."""
|
|
457
|
+
port_file = tmp_path / ".bikerack-port"
|
|
458
458
|
port_file.write_text("2898")
|
|
459
459
|
(tmp_path / ".wheelhub-pid").write_text("12345")
|
|
460
460
|
|
|
@@ -466,7 +466,7 @@ class TestStopBikeRack:
|
|
|
466
466
|
|
|
467
467
|
def test_deletes_pid_file(self, tmp_path: Path) -> None:
|
|
468
468
|
"""stop_bikerack should delete .wheelhub-pid."""
|
|
469
|
-
(tmp_path / ".
|
|
469
|
+
(tmp_path / ".bikerack-port").write_text("2898")
|
|
470
470
|
pid_file = tmp_path / ".wheelhub-pid"
|
|
471
471
|
pid_file.write_text("12345")
|
|
472
472
|
|
|
@@ -478,7 +478,7 @@ class TestStopBikeRack:
|
|
|
478
478
|
|
|
479
479
|
def test_returns_success_dict(self, tmp_path: Path) -> None:
|
|
480
480
|
"""stop_bikerack should return {success: True, pid: N, message: str}."""
|
|
481
|
-
(tmp_path / ".
|
|
481
|
+
(tmp_path / ".bikerack-port").write_text("2898")
|
|
482
482
|
(tmp_path / ".wheelhub-pid").write_text("12345")
|
|
483
483
|
|
|
484
484
|
with patch("pennyfarthing_scripts.bikerack.launcher.os.kill"):
|
|
@@ -506,7 +506,7 @@ class TestStatus:
|
|
|
506
506
|
|
|
507
507
|
def test_returns_running_state(self, tmp_path: Path) -> None:
|
|
508
508
|
"""get_status should detect running BikeRack."""
|
|
509
|
-
(tmp_path / ".
|
|
509
|
+
(tmp_path / ".bikerack-port").write_text("2898")
|
|
510
510
|
(tmp_path / ".wheelhub-pid").write_text("12345")
|
|
511
511
|
|
|
512
512
|
with patch("pennyfarthing_scripts.bikerack.launcher.is_process_alive", return_value=True):
|
|
@@ -524,7 +524,7 @@ class TestStatus:
|
|
|
524
524
|
|
|
525
525
|
def test_includes_dashboard_url(self, tmp_path: Path) -> None:
|
|
526
526
|
"""get_status should include dashboard URL when running."""
|
|
527
|
-
(tmp_path / ".
|
|
527
|
+
(tmp_path / ".bikerack-port").write_text("2898")
|
|
528
528
|
(tmp_path / ".wheelhub-pid").write_text("12345")
|
|
529
529
|
|
|
530
530
|
with patch("pennyfarthing_scripts.bikerack.launcher.is_process_alive", return_value=True):
|
|
@@ -534,7 +534,7 @@ class TestStatus:
|
|
|
534
534
|
|
|
535
535
|
def test_detects_stale_pid(self, tmp_path: Path) -> None:
|
|
536
536
|
"""get_status should detect stale PID (file exists, process dead)."""
|
|
537
|
-
(tmp_path / ".
|
|
537
|
+
(tmp_path / ".bikerack-port").write_text("2898")
|
|
538
538
|
(tmp_path / ".wheelhub-pid").write_text("99999")
|
|
539
539
|
|
|
540
540
|
with patch("pennyfarthing_scripts.bikerack.launcher.is_process_alive", return_value=False):
|
|
@@ -544,7 +544,7 @@ class TestStatus:
|
|
|
544
544
|
|
|
545
545
|
|
|
546
546
|
# ---------------------------------------------------------------------------
|
|
547
|
-
# AC9: Error if already running (.
|
|
547
|
+
# AC9: Error if already running (.bikerack-port exists with live PID)
|
|
548
548
|
# ---------------------------------------------------------------------------
|
|
549
549
|
|
|
550
550
|
|
|
@@ -553,7 +553,7 @@ class TestAlreadyRunning:
|
|
|
553
553
|
|
|
554
554
|
def test_detects_running_instance(self, tmp_path: Path) -> None:
|
|
555
555
|
"""is_already_running should return True when port file + live PID."""
|
|
556
|
-
(tmp_path / ".
|
|
556
|
+
(tmp_path / ".bikerack-port").write_text("2898")
|
|
557
557
|
(tmp_path / ".wheelhub-pid").write_text("12345")
|
|
558
558
|
|
|
559
559
|
with patch("pennyfarthing_scripts.bikerack.launcher.is_process_alive", return_value=True):
|
|
@@ -573,7 +573,7 @@ class TestAlreadyRunning:
|
|
|
573
573
|
|
|
574
574
|
def test_not_running_when_stale_pid(self, tmp_path: Path) -> None:
|
|
575
575
|
"""is_already_running should return False when PID is dead (stale)."""
|
|
576
|
-
(tmp_path / ".
|
|
576
|
+
(tmp_path / ".bikerack-port").write_text("2898")
|
|
577
577
|
(tmp_path / ".wheelhub-pid").write_text("99999")
|
|
578
578
|
|
|
579
579
|
with patch("pennyfarthing_scripts.bikerack.launcher.is_process_alive", return_value=False):
|
|
@@ -583,7 +583,7 @@ class TestAlreadyRunning:
|
|
|
583
583
|
|
|
584
584
|
def test_cleans_stale_files(self, tmp_path: Path) -> None:
|
|
585
585
|
"""is_already_running should clean up stale files when PID is dead."""
|
|
586
|
-
port_file = tmp_path / ".
|
|
586
|
+
port_file = tmp_path / ".bikerack-port"
|
|
587
587
|
pid_file = tmp_path / ".wheelhub-pid"
|
|
588
588
|
port_file.write_text("2898")
|
|
589
589
|
pid_file.write_text("99999")
|
|
@@ -605,7 +605,7 @@ class TestExitCodes:
|
|
|
605
605
|
|
|
606
606
|
def test_exit_code_2_when_already_running(self, tmp_path: Path) -> None:
|
|
607
607
|
"""Start should raise SystemExit(2) when already running."""
|
|
608
|
-
(tmp_path / ".
|
|
608
|
+
(tmp_path / ".bikerack-port").write_text("2898")
|
|
609
609
|
(tmp_path / ".wheelhub-pid").write_text("12345")
|
|
610
610
|
|
|
611
611
|
with patch("pennyfarthing_scripts.bikerack.launcher.is_process_alive", return_value=True):
|
|
@@ -736,8 +736,8 @@ class TestCleanupFiles:
|
|
|
736
736
|
"""Utility: cleanup_files removes port and PID files."""
|
|
737
737
|
|
|
738
738
|
def test_removes_port_file(self, tmp_path: Path) -> None:
|
|
739
|
-
"""cleanup_files should remove .
|
|
740
|
-
port_file = tmp_path / ".
|
|
739
|
+
"""cleanup_files should remove .bikerack-port."""
|
|
740
|
+
port_file = tmp_path / ".bikerack-port"
|
|
741
741
|
port_file.write_text("2898")
|
|
742
742
|
|
|
743
743
|
cleanup_files(tmp_path)
|
|
@@ -764,7 +764,7 @@ class TestReadPortFile:
|
|
|
764
764
|
|
|
765
765
|
def test_reads_port(self, tmp_path: Path) -> None:
|
|
766
766
|
"""read_port_file should return port as integer."""
|
|
767
|
-
(tmp_path / ".
|
|
767
|
+
(tmp_path / ".bikerack-port").write_text("2898")
|
|
768
768
|
|
|
769
769
|
result = read_port_file(tmp_path)
|
|
770
770
|
|
|
@@ -778,7 +778,7 @@ class TestReadPortFile:
|
|
|
778
778
|
|
|
779
779
|
def test_handles_trailing_whitespace(self, tmp_path: Path) -> None:
|
|
780
780
|
"""read_port_file should handle trailing newlines/spaces."""
|
|
781
|
-
(tmp_path / ".
|
|
781
|
+
(tmp_path / ".bikerack-port").write_text("2898\n")
|
|
782
782
|
|
|
783
783
|
result = read_port_file(tmp_path)
|
|
784
784
|
|