@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
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -8,7 +8,7 @@ Uses native Textual widgets (DataTable) instead of Rich renderables.
|
|
|
8
8
|
|
|
9
9
|
from __future__ import annotations
|
|
10
10
|
|
|
11
|
-
from datetime import
|
|
11
|
+
from datetime import UTC, datetime
|
|
12
12
|
from typing import Any
|
|
13
13
|
|
|
14
14
|
from rich.console import Console
|
|
@@ -19,6 +19,18 @@ from pennyfarthing_scripts.bikerack.base_panel import PANEL_ICONS, BasePanel
|
|
|
19
19
|
|
|
20
20
|
MAX_INPUT_LENGTH = 80
|
|
21
21
|
|
|
22
|
+
# Tool name → Rich style (matches GUI CSS custom properties)
|
|
23
|
+
_TOOL_COLORS: dict[str, str] = {
|
|
24
|
+
"read": "blue",
|
|
25
|
+
"write": "dark_orange",
|
|
26
|
+
"bash": "green",
|
|
27
|
+
"glob": "medium_purple1",
|
|
28
|
+
"grep": "dark_cyan",
|
|
29
|
+
"edit": "yellow",
|
|
30
|
+
"task": "hot_pink",
|
|
31
|
+
"skill": "dim",
|
|
32
|
+
}
|
|
33
|
+
|
|
22
34
|
# Shared fallback console for offline column/cell measurement
|
|
23
35
|
_FALLBACK_CONSOLE = Console()
|
|
24
36
|
|
|
@@ -58,8 +70,9 @@ class AuditLogPanel(BasePanel):
|
|
|
58
70
|
def handle_message(self, message: dict[str, Any] | None) -> None:
|
|
59
71
|
"""Handle incoming WebSocket messages for tool events.
|
|
60
72
|
|
|
61
|
-
|
|
62
|
-
|
|
73
|
+
Mutates the internal DataTable then delegates to
|
|
74
|
+
super().handle_message() which calls render_panel() →
|
|
75
|
+
post_message(DataReceived) for thread-safe Textual repaint.
|
|
63
76
|
"""
|
|
64
77
|
if not self._mounted or message is None:
|
|
65
78
|
return
|
|
@@ -81,6 +94,11 @@ class AuditLogPanel(BasePanel):
|
|
|
81
94
|
span = message.get("span")
|
|
82
95
|
if isinstance(span, dict):
|
|
83
96
|
self._add_row(span)
|
|
97
|
+
else:
|
|
98
|
+
return
|
|
99
|
+
|
|
100
|
+
# Trigger repaint through BasePanel's message system
|
|
101
|
+
super().handle_message(message)
|
|
84
102
|
|
|
85
103
|
def _add_row(self, span: dict[str, Any]) -> None:
|
|
86
104
|
"""Add a single tool event row to the DataTable."""
|
|
@@ -104,8 +122,32 @@ class AuditLogPanel(BasePanel):
|
|
|
104
122
|
self._table.add_row(time_str, tool_name, input_text, result)
|
|
105
123
|
|
|
106
124
|
def render_panel(self, payload: dict[str, Any]) -> Any:
|
|
107
|
-
"""
|
|
108
|
-
|
|
125
|
+
"""Render current DataTable rows as a Rich Table renderable."""
|
|
126
|
+
from rich.table import Table as RichTable
|
|
127
|
+
from rich.text import Text
|
|
128
|
+
|
|
129
|
+
if self._table.row_count == 0:
|
|
130
|
+
return Text("No audit events yet", style="dim italic")
|
|
131
|
+
|
|
132
|
+
rich_table = RichTable(show_header=True, expand=True, box=None)
|
|
133
|
+
rich_table.add_column("Time", style="dim", no_wrap=True)
|
|
134
|
+
rich_table.add_column("Tool", no_wrap=True)
|
|
135
|
+
rich_table.add_column("Input")
|
|
136
|
+
rich_table.add_column("Result", justify="center", no_wrap=True)
|
|
137
|
+
|
|
138
|
+
for row_key in reversed(list(self._table.rows)):
|
|
139
|
+
row_data = self._table.get_row(row_key)
|
|
140
|
+
time_str, tool_name, input_text, result = (str(c) for c in row_data)
|
|
141
|
+
tool_style = _TOOL_COLORS.get(tool_name.lower(), "bold cyan")
|
|
142
|
+
result_style = "green" if result == "\u2713" else "red" if result == "\u2717" else "dim"
|
|
143
|
+
rich_table.add_row(
|
|
144
|
+
time_str,
|
|
145
|
+
Text(tool_name, style=f"bold {tool_style}"),
|
|
146
|
+
Text(input_text, style="dim") if input_text else Text(""),
|
|
147
|
+
Text(result, style=result_style),
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
return rich_table
|
|
109
151
|
|
|
110
152
|
|
|
111
153
|
def _format_timestamp(ts: Any) -> str:
|
|
@@ -113,7 +155,7 @@ def _format_timestamp(ts: Any) -> str:
|
|
|
113
155
|
if ts is None:
|
|
114
156
|
return "\u2014"
|
|
115
157
|
try:
|
|
116
|
-
dt = datetime.fromtimestamp(float(ts) / 1000, tz=
|
|
158
|
+
dt = datetime.fromtimestamp(float(ts) / 1000, tz=UTC)
|
|
117
159
|
return dt.strftime("%H:%M:%S")
|
|
118
160
|
except (ValueError, TypeError, OSError):
|
|
119
161
|
return "\u2014"
|
|
@@ -24,8 +24,8 @@ def is_process_alive(pid: int) -> bool:
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
def cleanup_files(project_dir: Path) -> None:
|
|
27
|
-
"""Clean up .
|
|
28
|
-
for name in (".
|
|
27
|
+
"""Clean up .bikerack-port, .wheelhub-pid, and .wheelhub-gui-pid files."""
|
|
28
|
+
for name in (".bikerack-port", ".wheelhub-pid", ".wheelhub-gui-pid"):
|
|
29
29
|
try:
|
|
30
30
|
(project_dir / name).unlink()
|
|
31
31
|
except FileNotFoundError:
|
|
@@ -33,9 +33,9 @@ def cleanup_files(project_dir: Path) -> None:
|
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
def read_port_file(project_dir: Path) -> int | None:
|
|
36
|
-
"""Read port from .
|
|
36
|
+
"""Read port from .bikerack-port file. Returns None if not found."""
|
|
37
37
|
try:
|
|
38
|
-
return int((project_dir / ".
|
|
38
|
+
return int((project_dir / ".bikerack-port").read_text().strip())
|
|
39
39
|
except (FileNotFoundError, ValueError):
|
|
40
40
|
return None
|
|
41
41
|
|
|
@@ -104,8 +104,8 @@ def start_wheelhub(project_dir: Path) -> subprocess.Popen:
|
|
|
104
104
|
def poll_for_port_file(
|
|
105
105
|
project_dir: Path, timeout: float = 5.0, interval: float = 0.1
|
|
106
106
|
) -> int:
|
|
107
|
-
"""Poll for .
|
|
108
|
-
port_file = project_dir / ".
|
|
107
|
+
"""Poll for .bikerack-port file, return port number."""
|
|
108
|
+
port_file = project_dir / ".bikerack-port"
|
|
109
109
|
deadline = time.monotonic() + timeout
|
|
110
110
|
|
|
111
111
|
while True:
|
|
@@ -228,7 +228,7 @@ class SprintPanel(Widget):
|
|
|
228
228
|
"""Mark unmounted so WS callbacks are ignored."""
|
|
229
229
|
self._mounted = False
|
|
230
230
|
|
|
231
|
-
def focus(self, scroll_visible: bool = True) ->
|
|
231
|
+
def focus(self, scroll_visible: bool = True) -> SprintPanel:
|
|
232
232
|
"""Delegate focus to the tree widget."""
|
|
233
233
|
try:
|
|
234
234
|
tree = self.query_one("#sprint-tree", Tree)
|
|
@@ -107,9 +107,12 @@ def _parse_session_file(session_path: str) -> dict[str, Any]:
|
|
|
107
107
|
|
|
108
108
|
def _get_sprint_story_status(story_id: str) -> str | None:
|
|
109
109
|
"""Try to get story status from pf sprint CLI."""
|
|
110
|
+
import sys
|
|
111
|
+
|
|
110
112
|
try:
|
|
111
113
|
out = subprocess.run(
|
|
112
|
-
[
|
|
114
|
+
[sys.executable, "-m", "pennyfarthing_scripts.cli",
|
|
115
|
+
"sprint", "story", "field", story_id, "status"],
|
|
113
116
|
capture_output=True,
|
|
114
117
|
text=True,
|
|
115
118
|
timeout=10,
|
|
@@ -88,7 +88,8 @@ class StoryDetailScreen(Screen):
|
|
|
88
88
|
name = _format_assignee(assignee)
|
|
89
89
|
if name:
|
|
90
90
|
meta_parts.append(name)
|
|
91
|
-
|
|
91
|
+
separator = " \u00b7 "
|
|
92
|
+
header_text.append(f"\n{separator.join(meta_parts)}", style="dim")
|
|
92
93
|
yield Static(header_text, id="dossier-header")
|
|
93
94
|
|
|
94
95
|
# Context section (only if context files exist)
|
|
@@ -10,6 +10,7 @@ Panel navigation: Mount all panels, tab bar, keyboard switching, command palette
|
|
|
10
10
|
|
|
11
11
|
from __future__ import annotations
|
|
12
12
|
|
|
13
|
+
import os
|
|
13
14
|
from functools import partial
|
|
14
15
|
from pathlib import Path
|
|
15
16
|
from typing import Any
|
|
@@ -392,6 +393,11 @@ class BikeRackApp(App):
|
|
|
392
393
|
height: auto;
|
|
393
394
|
width: 1fr;
|
|
394
395
|
}
|
|
396
|
+
#project-dir {
|
|
397
|
+
height: 1;
|
|
398
|
+
padding: 0 1;
|
|
399
|
+
color: $text-muted;
|
|
400
|
+
}
|
|
395
401
|
Tabs {
|
|
396
402
|
dock: top;
|
|
397
403
|
}
|
|
@@ -444,8 +450,12 @@ class BikeRackApp(App):
|
|
|
444
450
|
self._programmatic_tab_count: int = 0
|
|
445
451
|
|
|
446
452
|
def compose(self) -> ComposeResult:
|
|
453
|
+
project_dir_name = Path(
|
|
454
|
+
os.environ.get("CYCLIST_PROJECT_DIR", os.getcwd())
|
|
455
|
+
).name
|
|
447
456
|
yield Header()
|
|
448
457
|
yield AgentHeader(id="agent-header")
|
|
458
|
+
yield Static(f"[dim]{project_dir_name}[/dim]", id="project-dir")
|
|
449
459
|
yield Tabs(*_build_panel_tabs(), id="tab-bar")
|
|
450
460
|
yield ConnectionStatus(
|
|
451
461
|
STATE_DISPLAY[ConnectionState.DISCONNECTED],
|
|
@@ -693,7 +703,7 @@ def main(
|
|
|
693
703
|
"""Launch BikeRack TUI as a standalone application.
|
|
694
704
|
|
|
695
705
|
Args:
|
|
696
|
-
port: Explicit WheelHub port. If None, reads from .
|
|
706
|
+
port: Explicit WheelHub port. If None, reads from .bikerack-port file.
|
|
697
707
|
project_dir: Project directory for port file discovery. Defaults to cwd.
|
|
698
708
|
"""
|
|
699
709
|
# Detect terminal image protocol BEFORE App.run() claims the terminal
|
|
@@ -703,7 +713,7 @@ def main(
|
|
|
703
713
|
|
|
704
714
|
if port is None:
|
|
705
715
|
if project_dir is not None:
|
|
706
|
-
port_file = project_dir / ".
|
|
716
|
+
port_file = project_dir / ".bikerack-port"
|
|
707
717
|
if port_file.exists():
|
|
708
718
|
try:
|
|
709
719
|
port = int(port_file.read_text().strip())
|
|
@@ -75,14 +75,14 @@ class WheelHubClient:
|
|
|
75
75
|
cb(new_state)
|
|
76
76
|
|
|
77
77
|
def discover_port(self) -> int:
|
|
78
|
-
"""Read port from .
|
|
78
|
+
"""Read port from .bikerack-port file, fallback to DEFAULT_PORT.
|
|
79
79
|
|
|
80
80
|
Priority: explicit port > port file > DEFAULT_PORT.
|
|
81
81
|
"""
|
|
82
82
|
if self._port is not None:
|
|
83
83
|
return self._port
|
|
84
84
|
if self._project_dir is not None:
|
|
85
|
-
port_file = self._project_dir / ".
|
|
85
|
+
port_file = self._project_dir / ".bikerack-port"
|
|
86
86
|
if port_file.exists():
|
|
87
87
|
try:
|
|
88
88
|
return int(port_file.read_text().strip())
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -82,11 +82,38 @@ def load_yaml_config(path: Path) -> dict[str, Any] | None:
|
|
|
82
82
|
return yaml.safe_load(f)
|
|
83
83
|
|
|
84
84
|
|
|
85
|
-
def load_pennyfarthing_config() -> dict[str, Any]:
|
|
85
|
+
def load_pennyfarthing_config(project_root: Path | None = None) -> dict[str, Any]:
|
|
86
86
|
"""Load .pennyfarthing/config.local.yaml.
|
|
87
87
|
|
|
88
|
+
Args:
|
|
89
|
+
project_root: Project root path (defaults to auto-detect)
|
|
90
|
+
|
|
88
91
|
Returns:
|
|
89
92
|
Config dict, or empty dict if not found
|
|
90
93
|
"""
|
|
91
|
-
|
|
94
|
+
root = project_root or get_project_root()
|
|
95
|
+
config_path = root / ".pennyfarthing" / "config.local.yaml"
|
|
92
96
|
return load_yaml_config(config_path) or {}
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def save_pennyfarthing_config_key(
|
|
100
|
+
key: str, value: Any, project_root: Path | None = None
|
|
101
|
+
) -> None:
|
|
102
|
+
"""Set a top-level key in .pennyfarthing/config.local.yaml.
|
|
103
|
+
|
|
104
|
+
Creates the file if it doesn't exist. Preserves existing keys.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
key: Top-level key (e.g., "sprint")
|
|
108
|
+
value: Value to set (dict, str, etc.)
|
|
109
|
+
project_root: Project root path (defaults to auto-detect)
|
|
110
|
+
"""
|
|
111
|
+
root = project_root or get_project_root()
|
|
112
|
+
config_path = root / ".pennyfarthing" / "config.local.yaml"
|
|
113
|
+
|
|
114
|
+
config = load_yaml_config(config_path) or {}
|
|
115
|
+
config[key] = value
|
|
116
|
+
|
|
117
|
+
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
118
|
+
with open(config_path, "w") as f:
|
|
119
|
+
yaml.dump(config, f, default_flow_style=False, sort_keys=False)
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -6,7 +6,7 @@ the bash wrapper dialogue-manager.sh interface.
|
|
|
6
6
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
|
-
from datetime import
|
|
9
|
+
from datetime import UTC, datetime
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
12
|
import click
|
|
@@ -44,7 +44,7 @@ def init(story_id: str, workflow: str, leader: str, partner: str) -> None:
|
|
|
44
44
|
workflow=workflow,
|
|
45
45
|
leader=leader,
|
|
46
46
|
partner=partner,
|
|
47
|
-
started_at=datetime.now(
|
|
47
|
+
started_at=datetime.now(UTC).strftime("%Y-%m-%dT%H:%M:%SZ"),
|
|
48
48
|
)
|
|
49
49
|
|
|
50
50
|
content = create_dialogue_content(header)
|
|
@@ -80,7 +80,7 @@ def append(story_id: str, question: str, recommendation: str, confidence: str) -
|
|
|
80
80
|
|
|
81
81
|
exchange = DialogueExchange(
|
|
82
82
|
number=next_num,
|
|
83
|
-
timestamp=datetime.now(
|
|
83
|
+
timestamp=datetime.now(UTC).strftime("%H:%M"),
|
|
84
84
|
leader="",
|
|
85
85
|
partner="",
|
|
86
86
|
question=question,
|
|
@@ -269,7 +269,7 @@ def detect_cyclist(project_dir: str | None = None) -> bool:
|
|
|
269
269
|
|
|
270
270
|
Checks:
|
|
271
271
|
1. CYCLIST env var set to '1' (Electron mode - definitive)
|
|
272
|
-
2. .
|
|
272
|
+
2. .bikerack-port file exists AND port is responding (Web mode)
|
|
273
273
|
"""
|
|
274
274
|
# Env var is definitive - set by Cyclist when it spawns Claude
|
|
275
275
|
if os.environ.get("CYCLIST") == "1":
|
|
@@ -284,8 +284,8 @@ def detect_cyclist(project_dir: str | None = None) -> bool:
|
|
|
284
284
|
)
|
|
285
285
|
|
|
286
286
|
port_files = [
|
|
287
|
-
Path(project_dir) / "packages" / "cyclist" / ".
|
|
288
|
-
Path(os.getcwd()) / ".
|
|
287
|
+
Path(project_dir) / "packages" / "cyclist" / ".bikerack-port",
|
|
288
|
+
Path(os.getcwd()) / ".bikerack-port",
|
|
289
289
|
]
|
|
290
290
|
|
|
291
291
|
for port_file in port_files:
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -10,7 +10,6 @@ Usage via CLI:
|
|
|
10
10
|
|
|
11
11
|
from __future__ import annotations
|
|
12
12
|
|
|
13
|
-
import re
|
|
14
13
|
from pathlib import Path
|
|
15
14
|
|
|
16
15
|
from pennyfarthing_scripts.common.config import get_project_root
|
|
@@ -70,8 +69,8 @@ def install_git_hooks(project_root: Path | None = None) -> int:
|
|
|
70
69
|
return 1
|
|
71
70
|
|
|
72
71
|
print("Installing git hooks with .d/ dispatcher pattern...")
|
|
73
|
-
print(
|
|
74
|
-
print(
|
|
72
|
+
print(" Source: pennyfarthing-dist/scripts/hooks/")
|
|
73
|
+
print(" Dest: .git/hooks/")
|
|
75
74
|
print()
|
|
76
75
|
|
|
77
76
|
for source_file, dest_name in HOOKS:
|
|
@@ -291,7 +291,7 @@ async def main(brief: bool = False) -> int:
|
|
|
291
291
|
Returns:
|
|
292
292
|
0 if all repos clean, 1 if any have changes/unpushed
|
|
293
293
|
"""
|
|
294
|
-
from pennyfarthing_scripts.git.repos import
|
|
294
|
+
from pennyfarthing_scripts.git.repos import get_repo_paths, load_repos_config
|
|
295
295
|
|
|
296
296
|
repos_with_upstream: list[tuple[str, Path, str]] = []
|
|
297
297
|
repo_paths = get_repo_paths()
|
|
@@ -199,7 +199,7 @@ def remove_worktree(name: str) -> int:
|
|
|
199
199
|
shutil.rmtree(wt_path)
|
|
200
200
|
|
|
201
201
|
# Prune worktree references
|
|
202
|
-
for
|
|
202
|
+
for _repo_name, cfg in repos.items():
|
|
203
203
|
full_path = (project_root / cfg.path).resolve()
|
|
204
204
|
if full_path.exists():
|
|
205
205
|
_git(["worktree", "prune"], full_path)
|
|
@@ -277,7 +277,7 @@ def show_worktree_status() -> int:
|
|
|
277
277
|
if repo_wt.exists():
|
|
278
278
|
branch, _ = _git(["branch", "--show-current"], repo_wt)
|
|
279
279
|
status_out, _ = _git(["status", "--short"], repo_wt)
|
|
280
|
-
count = len([
|
|
280
|
+
count = len([line for line in status_out.split("\n") if line.strip()]) if status_out else 0
|
|
281
281
|
print(f" {repo_name} ({cfg.repo_type}): {branch} ({count} uncommitted)")
|
|
282
282
|
|
|
283
283
|
# Check for session files referencing this worktree
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -30,7 +30,7 @@ import yaml
|
|
|
30
30
|
|
|
31
31
|
# WheelHub port file - central coordination server for all communication
|
|
32
32
|
# Per ADR-0004: "the hub where all communication converges"
|
|
33
|
-
CYCLIST_PORT_FILE = ".
|
|
33
|
+
CYCLIST_PORT_FILE = ".bikerack-port"
|
|
34
34
|
|
|
35
35
|
# Default port if file not found
|
|
36
36
|
DEFAULT_CYCLIST_PORT = 7431
|
|
@@ -48,7 +48,7 @@ def find_project_root(start_dir: Path | None = None) -> Path | None:
|
|
|
48
48
|
"""Find the project root by looking for marker files.
|
|
49
49
|
|
|
50
50
|
Searches for (in order):
|
|
51
|
-
1. .
|
|
51
|
+
1. .bikerack-port (WheelHub is running)
|
|
52
52
|
2. .pennyfarthing directory
|
|
53
53
|
3. .claude directory
|
|
54
54
|
|
|
@@ -84,7 +84,7 @@ def read_port_file(file_name: str, project_root: Path | None = None) -> int | No
|
|
|
84
84
|
"""Read a port number from a Cyclist port file.
|
|
85
85
|
|
|
86
86
|
Args:
|
|
87
|
-
file_name: Name of the port file (e.g. .
|
|
87
|
+
file_name: Name of the port file (e.g. .bikerack-port)
|
|
88
88
|
project_root: Project root directory (auto-detected if not provided)
|
|
89
89
|
|
|
90
90
|
Returns:
|
|
@@ -140,6 +140,7 @@ class CyclistSettings:
|
|
|
140
140
|
permission_mode: str = "manual" # plan, manual, accept
|
|
141
141
|
relay_mode: bool = False
|
|
142
142
|
bell_mode: bool = False
|
|
143
|
+
git_monitor: bool = False
|
|
143
144
|
theme: str | None = None
|
|
144
145
|
|
|
145
146
|
|
|
@@ -206,6 +207,10 @@ def load_settings(project_root: Path | None = None) -> CyclistSettings:
|
|
|
206
207
|
if "bell_mode" in workflow and isinstance(workflow["bell_mode"], bool):
|
|
207
208
|
settings.bell_mode = workflow["bell_mode"]
|
|
208
209
|
|
|
210
|
+
# Handle git_monitor
|
|
211
|
+
if "git_monitor" in workflow and isinstance(workflow["git_monitor"], bool):
|
|
212
|
+
settings.git_monitor = workflow["git_monitor"]
|
|
213
|
+
|
|
209
214
|
return settings
|
|
210
215
|
|
|
211
216
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|