@pennyfarthing/core 11.3.8 → 11.5.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +4 -1
- package/packages/core/dist/cli/commands/cyclist.js +1 -1
- package/packages/core/dist/cli/commands/cyclist.js.map +1 -1
- package/packages/core/dist/cli/commands/cyclist.test.js +3 -3
- package/packages/core/dist/cli/commands/cyclist.test.js.map +1 -1
- package/packages/core/dist/cli/commands/doctor-persona-config-false-negative.test.d.ts +22 -0
- package/packages/core/dist/cli/commands/doctor-persona-config-false-negative.test.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/doctor-persona-config-false-negative.test.js +161 -0
- package/packages/core/dist/cli/commands/doctor-persona-config-false-negative.test.js.map +1 -0
- package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/doctor.js +101 -33
- package/packages/core/dist/cli/commands/doctor.js.map +1 -1
- package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/init.js +33 -13
- package/packages/core/dist/cli/commands/init.js.map +1 -1
- package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts +17 -0
- package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js +470 -0
- package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js.map +1 -0
- package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/update.js +68 -17
- package/packages/core/dist/cli/commands/update.js.map +1 -1
- package/packages/core/dist/cli/cyclist-migration.test.d.ts +16 -0
- package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +1 -0
- package/packages/core/dist/cli/cyclist-migration.test.js +229 -0
- package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -0
- package/packages/core/dist/cli/index.js +2 -21
- package/packages/core/dist/cli/index.js.map +1 -1
- package/packages/core/dist/cli/utils/node-modules.d.ts +7 -0
- package/packages/core/dist/cli/utils/node-modules.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/node-modules.js +39 -0
- package/packages/core/dist/cli/utils/node-modules.js.map +1 -1
- package/packages/core/dist/cli/utils/settings.d.ts +1 -1
- package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/settings.js +24 -21
- package/packages/core/dist/cli/utils/settings.js.map +1 -1
- package/packages/core/dist/cli/utils/stale-artifacts.d.ts +59 -0
- package/packages/core/dist/cli/utils/stale-artifacts.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/stale-artifacts.js +163 -0
- package/packages/core/dist/cli/utils/stale-artifacts.js.map +1 -0
- package/packages/core/dist/public/css/react.css +1 -1
- package/packages/core/dist/public/js/react/react.js +39 -39
- package/packages/core/dist/scripts/benchmark-integration.d.ts +182 -0
- package/packages/core/dist/scripts/benchmark-integration.d.ts.map +1 -0
- package/packages/core/dist/scripts/benchmark-integration.js +691 -0
- package/packages/core/dist/scripts/benchmark-integration.js.map +1 -0
- package/packages/core/dist/scripts/job-fair-aggregator.d.ts +150 -0
- package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +1 -0
- package/packages/core/dist/scripts/job-fair-aggregator.js +547 -0
- package/packages/core/dist/scripts/job-fair-aggregator.js.map +1 -0
- package/packages/core/dist/scripts/theme-detail.test.d.ts.map +1 -0
- package/packages/core/dist/scripts/theme-detail.test.js.map +1 -0
- package/packages/core/dist/server/api/context.d.ts.map +1 -1
- package/packages/core/dist/server/api/context.js +23 -5
- package/packages/core/dist/server/api/context.js.map +1 -1
- package/packages/core/dist/server/api/index.d.ts +0 -1
- package/packages/core/dist/server/api/index.d.ts.map +1 -1
- package/packages/core/dist/server/api/index.js +0 -2
- package/packages/core/dist/server/api/index.js.map +1 -1
- package/packages/core/dist/server/api/settings.d.ts.map +1 -1
- package/packages/core/dist/server/api/settings.js +6 -0
- package/packages/core/dist/server/api/settings.js.map +1 -1
- package/packages/core/dist/server/otlp-receiver.d.ts +0 -4
- package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
- package/packages/core/dist/server/otlp-receiver.js +0 -18
- package/packages/core/dist/server/otlp-receiver.js.map +1 -1
- package/packages/core/dist/server/otlp-receiver.test.js +0 -27
- package/packages/core/dist/server/otlp-receiver.test.js.map +1 -1
- package/packages/core/dist/server/server.d.ts +1 -1
- package/packages/core/dist/server/server.d.ts.map +1 -1
- package/packages/core/dist/server/server.js +2 -4
- package/packages/core/dist/server/server.js.map +1 -1
- package/packages/core/dist/workflow/cross-entity-validation.d.ts.map +1 -1
- package/packages/core/dist/workflow/cross-entity-validation.js.map +1 -1
- package/packages/core/src/public/App.tsx +354 -0
- package/packages/core/src/public/components/AgentLoadDialog.tsx +202 -0
- package/packages/core/src/public/components/AgentPopup.tsx +308 -0
- package/packages/core/src/public/components/ApprovalModal/ApprovalModal.css +35 -0
- package/packages/core/src/public/components/ApprovalModal/index.tsx +632 -0
- package/packages/core/src/public/components/BikeRackIndex.tsx +53 -0
- package/packages/core/src/public/components/BikeRackWorkspace.tsx +215 -0
- package/packages/core/src/public/components/CommandPalette.tsx +554 -0
- package/packages/core/src/public/components/ConfirmDialog.tsx +168 -0
- package/packages/core/src/public/components/ContextIndicator/ContextIndicator.css +85 -0
- package/packages/core/src/public/components/ContextIndicator/index.tsx +330 -0
- package/packages/core/src/public/components/ContextSparkline.tsx +56 -0
- package/packages/core/src/public/components/ControlBar.tsx +636 -0
- package/packages/core/src/public/components/DeadCodeDialog.tsx +169 -0
- package/packages/core/src/public/components/DiffViewer.tsx +585 -0
- package/packages/core/src/public/components/DockviewWorkspace.tsx +745 -0
- package/packages/core/src/public/components/Editor.tsx +630 -0
- package/packages/core/src/public/components/ErrorBoundary.tsx +67 -0
- package/packages/core/src/public/components/FileTree.tsx +379 -0
- package/packages/core/src/public/components/FullFileTree.tsx +237 -0
- package/packages/core/src/public/components/HealthGauge.tsx +181 -0
- package/packages/core/src/public/components/Message.tsx +225 -0
- package/packages/core/src/public/components/MessageList.tsx +98 -0
- package/packages/core/src/public/components/MessageView.tsx +400 -0
- package/packages/core/src/public/components/ModeSwitch/ModeSwitch.css +165 -0
- package/packages/core/src/public/components/ModeSwitch/index.tsx +372 -0
- package/packages/core/src/public/components/PersonaHeader.tsx +242 -0
- package/packages/core/src/public/components/ProjectInfoBar.tsx +45 -0
- package/packages/core/src/public/components/QuickActions.tsx +267 -0
- package/packages/core/src/public/components/SpanTimeline.tsx +352 -0
- package/packages/core/src/public/components/StandalonePanel.tsx +80 -0
- package/packages/core/src/public/components/StatsStrip.tsx +162 -0
- package/packages/core/src/public/components/StreamingContent.tsx +77 -0
- package/packages/core/src/public/components/SubagentSpan.tsx +180 -0
- package/packages/core/src/public/components/TandemPortrait.tsx +72 -0
- package/packages/core/src/public/components/ToolCallBlock.tsx +252 -0
- package/packages/core/src/public/components/ToolStack.tsx +209 -0
- package/packages/core/src/public/components/ToolStatus.tsx +57 -0
- package/packages/core/src/public/components/dialogs/CodeMarkersDialog.tsx +169 -0
- package/packages/core/src/public/components/dialogs/ComplexityDialog.tsx +163 -0
- package/packages/core/src/public/components/dialogs/DependenciesDialog.tsx +120 -0
- package/packages/core/src/public/components/dialogs/HotspotsDialog.tsx +451 -0
- package/packages/core/src/public/components/dialogs/ToolDialog.tsx +43 -0
- package/packages/core/src/public/components/panel-registry.ts +13 -0
- package/packages/core/src/public/components/panels/ACPanel.tsx +93 -0
- package/packages/core/src/public/components/panels/AcceptanceCriteriaPanel.tsx +104 -0
- package/packages/core/src/public/components/panels/AuditLogPanel.tsx +489 -0
- package/packages/core/src/public/components/panels/BikeLanePanel.tsx +214 -0
- package/packages/core/src/public/components/panels/DebugPanel.tsx +344 -0
- package/packages/core/src/public/components/panels/DiffView.tsx +109 -0
- package/packages/core/src/public/components/panels/DiffsPanel.tsx +56 -0
- package/packages/core/src/public/components/panels/GitPanel.tsx +260 -0
- package/packages/core/src/public/components/panels/HotspotsPanel.tsx +365 -0
- package/packages/core/src/public/components/panels/MessageFeed.tsx +39 -0
- package/packages/core/src/public/components/panels/MessagePanel.tsx +497 -0
- package/packages/core/src/public/components/panels/ProgressPanel.tsx +189 -0
- package/packages/core/src/public/components/panels/SettingsPanel.tsx +161 -0
- package/packages/core/src/public/components/panels/SprintPanel.tsx +731 -0
- package/packages/core/src/public/components/panels/TandemPanel.tsx +104 -0
- package/packages/core/src/public/components/panels/TaskTracker.tsx +48 -0
- package/packages/core/src/public/components/panels/TeamPanel.tsx +64 -0
- package/packages/core/src/public/components/panels/TeamRoster.tsx +67 -0
- package/packages/core/src/public/components/panels/TodoPanel.tsx +142 -0
- package/packages/core/src/public/components/panels/WorkflowPanel.tsx +224 -0
- package/packages/core/src/public/components/panels/index.ts +23 -0
- package/packages/core/src/public/components/ui/alert-dialog.tsx +139 -0
- package/packages/core/src/public/components/ui/badge.tsx +36 -0
- package/packages/core/src/public/components/ui/button.tsx +57 -0
- package/packages/core/src/public/components/ui/checkbox.tsx +28 -0
- package/packages/core/src/public/components/ui/collapsible.tsx +9 -0
- package/packages/core/src/public/components/ui/command.tsx +151 -0
- package/packages/core/src/public/components/ui/dialog.tsx +120 -0
- package/packages/core/src/public/components/ui/popover.tsx +31 -0
- package/packages/core/src/public/components/ui/progress.tsx +28 -0
- package/packages/core/src/public/components/ui/scroll-area.tsx +46 -0
- package/packages/core/src/public/components/ui/select.tsx +157 -0
- package/packages/core/src/public/components/ui/separator.tsx +29 -0
- package/packages/core/src/public/components/ui/skeleton.tsx +15 -0
- package/packages/core/src/public/components/ui/toggle-group.tsx +59 -0
- package/packages/core/src/public/components/ui/toggle.tsx +43 -0
- package/packages/core/src/public/components/ui/tooltip.tsx +30 -0
- package/packages/core/src/public/contexts/ClaudeContext.tsx +311 -0
- package/packages/core/src/public/contexts/MessageQueueContext.tsx +143 -0
- package/packages/core/src/public/css/theme-browser.css +550 -0
- package/packages/core/src/public/css/theme-system.css +630 -0
- package/packages/core/src/public/hooks/index.ts +46 -0
- package/packages/core/src/public/hooks/useAgentLoad.ts +105 -0
- package/packages/core/src/public/hooks/useClaude.ts +234 -0
- package/packages/core/src/public/hooks/useCodeMarkers.ts +101 -0
- package/packages/core/src/public/hooks/useColorScheme.ts +42 -0
- package/packages/core/src/public/hooks/useCommandHistory.ts +99 -0
- package/packages/core/src/public/hooks/useComplexity.ts +80 -0
- package/packages/core/src/public/hooks/useDeadCode.ts +99 -0
- package/packages/core/src/public/hooks/useDependencies.ts +82 -0
- package/packages/core/src/public/hooks/useDiffs.ts +143 -0
- package/packages/core/src/public/hooks/useFileBrowser.ts +73 -0
- package/packages/core/src/public/hooks/useFocusPanel.ts +137 -0
- package/packages/core/src/public/hooks/useGitStatus.ts +233 -0
- package/packages/core/src/public/hooks/useHealthScore.ts +71 -0
- package/packages/core/src/public/hooks/useHotspots.ts +123 -0
- package/packages/core/src/public/hooks/useLayoutPersistence.ts +141 -0
- package/packages/core/src/public/hooks/useMarkdownParser.ts +36 -0
- package/packages/core/src/public/hooks/useMarkerActions.ts +234 -0
- package/packages/core/src/public/hooks/useMessageQueue.ts +380 -0
- package/packages/core/src/public/hooks/useMessageStream.ts +131 -0
- package/packages/core/src/public/hooks/usePersona.ts +112 -0
- package/packages/core/src/public/hooks/usePlanModeExit.ts +105 -0
- package/packages/core/src/public/hooks/useResponsiveLayout.ts +173 -0
- package/packages/core/src/public/hooks/useSprint.ts +166 -0
- package/packages/core/src/public/hooks/useStatsStrip.ts +204 -0
- package/packages/core/src/public/hooks/useStory.ts +135 -0
- package/packages/core/src/public/hooks/useSubagentHelper.ts +64 -0
- package/packages/core/src/public/hooks/useSyntaxHighlighter.ts +52 -0
- package/packages/core/src/public/hooks/useTabCompletion.ts +124 -0
- package/packages/core/src/public/hooks/useTandemObservations.ts +165 -0
- package/packages/core/src/public/hooks/useTeamMembers.ts +273 -0
- package/packages/core/src/public/hooks/useTodos.ts +93 -0
- package/packages/core/src/public/hooks/useUserAvatar.ts +54 -0
- package/packages/core/src/public/images/cyclist-dark.png +0 -0
- package/packages/core/src/public/images/cyclist-light.png +0 -0
- package/packages/core/src/public/images/cyclist-tandem-source.png +0 -0
- package/packages/core/src/public/index.html +14 -0
- package/packages/core/src/public/index.tsx +10 -0
- package/packages/core/src/public/lib/utils.ts +6 -0
- package/packages/core/src/public/styles/dockview-theme.css +376 -0
- package/packages/core/src/public/styles/tailwind.css +4353 -0
- package/packages/core/src/public/types/message.ts +51 -0
- package/packages/core/src/public/utils/avatar-service.ts +73 -0
- package/packages/core/src/public/utils/color-presets.ts +940 -0
- package/packages/core/src/public/utils/font-presets.ts +362 -0
- package/packages/core/src/public/utils/formatDuration.ts +14 -0
- package/packages/core/src/public/utils/markdown.ts +249 -0
- package/packages/core/src/public/utils/messageFilters.ts +128 -0
- package/packages/core/src/public/utils/slash-commands.ts +341 -0
- package/packages/core/src/public/utils/subagent-display.ts +146 -0
- package/packages/core/src/public/utils/syntax.ts +219 -0
- package/packages/core/src/public/utils/toolIntentSummarizer.ts +199 -0
- package/packages/core/src/public/utils/toolStackGrouper.ts +106 -0
- package/packages/core/src/public/utils/toolTypeColors.ts +45 -0
- package/pennyfarthing-dist/guides/bikerack.md +94 -0
- package/pennyfarthing-dist/personas/themes/firefly.yaml +12 -12
- package/pennyfarthing-dist/pf/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/context.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/context.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/hooks.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/jira.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/jira_sync.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/output.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/patch_mode.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/session_start_hook.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/sprint.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/workflow.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bc/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/bc/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bc/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/bc/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bc/__pycache__/focus.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/bc/__pycache__/focus.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bc/__pycache__/split.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bc/cli.py +0 -2
- package/pennyfarthing-dist/pf/bc/focus.py +0 -2
- package/pennyfarthing-dist/pf/bikerack/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/audit_log_panel.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/context_meter_footer.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/events.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/launcher.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/story_detail_widget.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bikerack/base_panel.py +0 -1
- package/pennyfarthing-dist/pf/bikerack/context_meter_footer.py +115 -35
- package/pennyfarthing-dist/pf/bikerack/events.py +1 -7
- package/pennyfarthing-dist/pf/bikerack/git_panel.py +273 -10
- package/pennyfarthing-dist/pf/bikerack/portrait_resolver.py +35 -2
- package/pennyfarthing-dist/pf/bikerack/progress_panel.py +54 -0
- package/pennyfarthing-dist/pf/bikerack/sprint_panel.py +116 -1
- package/pennyfarthing-dist/pf/bikerack/story_detail_screen.py +10 -105
- package/pennyfarthing-dist/pf/bikerack/story_detail_widget.py +167 -0
- package/pennyfarthing-dist/pf/bikerack/tui.py +141 -66
- package/pennyfarthing-dist/pf/bmad/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bmad/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/bmad/cli.py +0 -1
- package/pennyfarthing-dist/pf/bmad/importer.py +0 -1
- package/pennyfarthing-dist/pf/bmad/parser.py +15 -10
- package/pennyfarthing-dist/pf/bmad/sync.py +1 -3
- package/pennyfarthing-dist/pf/bmad/test_parser.py +0 -4
- package/pennyfarthing-dist/pf/bmad/test_sync.py +0 -3
- package/pennyfarthing-dist/pf/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/brownfield/cli.py +1 -1
- package/pennyfarthing-dist/pf/cli.py +145 -111
- package/pennyfarthing-dist/pf/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/common/__init__.py +2 -0
- package/pennyfarthing-dist/pf/common/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/common/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/common/__pycache__/config.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/common/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/common/__pycache__/output.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/common/__pycache__/output.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/common/__pycache__/pr_config.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/common/__pycache__/themes.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/common/config.py +43 -0
- package/pennyfarthing-dist/pf/common/pr_config.py +27 -2
- package/pennyfarthing-dist/pf/common/themes.py +7 -5
- package/pennyfarthing-dist/pf/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/complexity/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/complexity/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/consultation/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/consultation/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/consultation/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/consultation/__pycache__/dialogue_manager.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/context.py +1 -1
- package/pennyfarthing-dist/pf/deadcode/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/deadcode/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/deadcode/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/dependencies/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/epic/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/epic/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/epic/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/epic/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/git/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/git/__pycache__/create_branches.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/git/__pycache__/status_all.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/git/hooks_installer.py +7 -6
- package/pennyfarthing-dist/pf/git_group/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/git_group/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/git_group/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/handoff/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/handoff/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/handoff/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/handoff/__pycache__/marker.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/handoff/__pycache__/phase_check.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/handoff/gate_file.py +5 -1
- package/pennyfarthing-dist/pf/healthscore/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/healthscore/__pycache__/analyze.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/healthscore/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/healthscore/__pycache__/models.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/healthscore/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/bell_mode.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/context_breaker.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/context_warning.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/cyclist_pretooluse.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/pre_edit_check.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/reflector_check.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/schema_validation.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/session_start.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/sprint_yaml_validation.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/statusline.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hooks/statusline.py +11 -0
- package/pennyfarthing-dist/pf/hotspots/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hotspots/__pycache__/analyze.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hotspots/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/hotspots/__pycache__/models.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/hotspots/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__init__.py +0 -6
- package/pennyfarthing-dist/pf/jira/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/bidirectional.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/claim.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/claim.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/client.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/client.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/compat.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/create.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/create.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/epic.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/epic.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/mappings.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/operations.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/operations.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/reconcile.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/story.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/story.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/sync.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/__pycache__/sync.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/jira/claim.py +14 -44
- package/pennyfarthing-dist/pf/jira/cli.py +124 -14
- package/pennyfarthing-dist/pf/jira/client.py +51 -87
- package/pennyfarthing-dist/pf/jira/reconcile.py +1 -1
- package/pennyfarthing-dist/pf/jira/story.py +6 -4
- package/pennyfarthing-dist/pf/jira/sync.py +2 -2
- package/pennyfarthing-dist/pf/launch/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/launch/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/launch/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/launch/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/migration/__init__.py +1 -1
- package/pennyfarthing-dist/pf/migration/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/migration/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/migration/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/migration/__pycache__/session.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/migration/__pycache__/skill.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/migration/__pycache__/step.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/migration/__pycache__/validate.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/migration/cli.py +0 -1
- package/pennyfarthing-dist/pf/package/__init__.py +0 -0
- package/pennyfarthing-dist/pf/package/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/package/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/package/__pycache__/discovery.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/package/__pycache__/portraits.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/package/cli.py +186 -0
- package/pennyfarthing-dist/pf/package/discovery.py +130 -0
- package/pennyfarthing-dist/pf/package/portraits.py +243 -0
- package/pennyfarthing-dist/pf/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/preflight/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/preflight/__pycache__/finish.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/prime/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/prime/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/prime/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/prime/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/prime/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/prime/__pycache__/persona.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/prime/__pycache__/session.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/prime/__pycache__/tiers.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/prime/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/prime/loader.py +21 -7
- package/pennyfarthing-dist/pf/prime/workflow.py +11 -3
- package/pennyfarthing-dist/pf/release/__init__.py +0 -0
- package/pennyfarthing-dist/pf/release/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/release/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/release/__pycache__/deprecate.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/release/__pycache__/dry_run.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/release/cli.py +112 -0
- package/pennyfarthing-dist/pf/release/deprecate.py +187 -0
- package/pennyfarthing-dist/pf/release/dry_run.py +187 -0
- package/pennyfarthing-dist/pf/session/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/session/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/session/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/session/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/settings/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/settings/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/settings/__pycache__/settings.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/settings/settings.py +44 -8
- package/pennyfarthing-dist/pf/sprint/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/archive.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/archive.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/epic_add.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/epic_update.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/loader.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/shard_merge.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/status.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/status.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/story_add.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/story_update.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/validate_cmd.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/validator.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/validator.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/work.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/work.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/yaml_io.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/sprint/cli.py +1 -1
- package/pennyfarthing-dist/pf/sprint/loader.py +6 -74
- package/pennyfarthing-dist/pf/sprint/shard_merge.py +126 -0
- package/pennyfarthing-dist/pf/sprint/story_finish.py +18 -4
- package/pennyfarthing-dist/pf/sprint/validator.py +7 -7
- package/pennyfarthing-dist/pf/sprint/yaml_io.py +8 -53
- package/pennyfarthing-dist/pf/story/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/story/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/story/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/story/__pycache__/create.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/story/__pycache__/size.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/story/__pycache__/template.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_108_1_gate_migration.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_confidence_sm_evaluation.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_confidence_sm_gate.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_dialogue_manager.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/pf/tests/test_cli_modules.py +32 -137
- package/pennyfarthing-dist/pf/tests/test_codemarkers.py +0 -15
- package/pennyfarthing-dist/pf/tests/test_dist_root.py +720 -0
- package/pennyfarthing-dist/pf/tests/test_package_structure.py +24 -70
- package/pennyfarthing-dist/pf/tests/test_sprint_validator.py +44 -0
- package/pennyfarthing-dist/pf/theme/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/theme/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/theme/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/theme/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/validate/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/validate/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/validate/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/validate/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/validate/adapters/__pycache__/tandem_awareness.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/validate/adapters/agent.py +11 -1
- package/pennyfarthing-dist/pf/validate/adapters/skill_command.py +15 -4
- package/pennyfarthing-dist/pf/validate/adapters/tandem_awareness.py +7 -1
- package/pennyfarthing-dist/pf/validate/adapters/team_mode.py +8 -2
- package/pennyfarthing-dist/pf/validate/adapters/workflow.py +12 -2
- package/pennyfarthing-dist/pf/workflow/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/workflow/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/workflow/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/workflow/__pycache__/scale.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/workflow/__pycache__/scale.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pf/workflow/__pycache__/state.cpython-311.pyc +0 -0
- package/pennyfarthing-dist/pf/workflow/__pycache__/state.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/pyproject.toml +1 -1
- package/pennyfarthing-dist/scripts/core/check-context.sh +2 -2
- package/pennyfarthing-dist/scripts/git/changelog-links.sh +216 -0
- package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/scripts/lib/README.md +0 -1
- package/pennyfarthing-dist/scripts/lib/find-root.sh +1 -1
- package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -1
- package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +67 -13
- package/pennyfarthing-dist/scripts/portraits/generate-tandem-portraits.sh +7 -3
- package/pennyfarthing-dist/scripts/workflow/check.py +4 -6
- package/pennyfarthing-dist/scripts/workflow/complete-step.py +2 -2
- package/pennyfarthing-dist/skills/skill-registry.yaml +19 -0
- package/pennyfarthing-dist/workflows/patch.yaml +5 -6
- package/pennyfarthing-dist/workflows/tdd-tandem.yaml +27 -2
- package/packages/core/dist/workflow/__test_context_watch__/.session/.tandem-turn-counter +0 -1
- package/packages/core/dist/workflow/__test_context_watch__/.session/95-6-session.md +0 -3
- package/packages/core/dist/workflow/__test_context_watch__/.session/95-6-tandem-architect.md +0 -6
- package/packages/core/dist/workflow/__test_file_watch__/.session/95-4-tandem-architect.md +0 -6
- package/packages/core/dist/workflow/__test_file_watch__/workdir/trigger.ts +0 -1
- package/packages/core/dist/workflow/__test_tool_watch__/.session/95-5-tandem-architect.md +0 -6
- package/packages/core/dist/workflow/__test_tool_watch__/.session/95-5-tandem-toolcalls.jsonl +0 -1
- package/packages/core/dist/workflow/team-lifecycle.d.ts +0 -169
- package/packages/core/dist/workflow/team-lifecycle.d.ts.map +0 -1
- package/packages/core/dist/workflow/team-lifecycle.js +0 -217
- package/packages/core/dist/workflow/team-lifecycle.js.map +0 -1
- package/packages/core/dist/workflow/team-lifecycle.test.d.ts +0 -20
- package/packages/core/dist/workflow/team-lifecycle.test.d.ts.map +0 -1
- package/packages/core/dist/workflow/team-lifecycle.test.js +0 -966
- package/packages/core/dist/workflow/team-lifecycle.test.js.map +0 -1
- package/pennyfarthing-dist/pf/bikerack/background_panel.py +0 -162
- package/pennyfarthing-dist/pf/bikerack/changed_panel.py +0 -201
- package/pennyfarthing-dist/pf/brownfield/__main__.py +0 -8
- package/pennyfarthing-dist/pf/config.py +0 -21
- package/pennyfarthing-dist/pf/hooks.py +0 -32
- package/pennyfarthing-dist/pf/jira_bidirectional_sync.py +0 -37
- package/pennyfarthing-dist/pf/jira_epic_creation.py +0 -30
- package/pennyfarthing-dist/pf/jira_sync.py +0 -36
- package/pennyfarthing-dist/pf/jira_sync_story.py +0 -30
- package/pennyfarthing-dist/pf/migration/__main__.py +0 -10
- package/pennyfarthing-dist/pf/output.py +0 -37
- package/pennyfarthing-dist/pf/theme/__main__.py +0 -6
- package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -177
|
@@ -273,7 +273,7 @@ def work(story_id: str | None, dry_run: bool):
|
|
|
273
273
|
click.echo(f"Points: {story.get('points')}")
|
|
274
274
|
click.echo("Status: Available")
|
|
275
275
|
else:
|
|
276
|
-
error_msg = result.get("error")
|
|
276
|
+
error_msg = result.get("error")
|
|
277
277
|
raise click.ClickException(f"Not available: {error_msg}")
|
|
278
278
|
|
|
279
279
|
|
|
@@ -8,7 +8,6 @@ Provides access to sprint data with support for:
|
|
|
8
8
|
- Sharded per-epic format: epic-{ref}.yaml shard files
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
-
import warnings
|
|
12
11
|
from pathlib import Path
|
|
13
12
|
from typing import Any
|
|
14
13
|
|
|
@@ -23,13 +22,9 @@ from pf.common.config import (
|
|
|
23
22
|
def _merge_epic_shards(data: dict[str, Any], sprint_dir: Path) -> dict[str, Any]:
|
|
24
23
|
"""Merge sharded epic files into the sprint data structure.
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
Also discovers unindexed shard files on disk (epic-*.yaml files not
|
|
31
|
-
referenced in the epics list) and appends them so orphan shards are
|
|
32
|
-
never invisible to the CLI.
|
|
25
|
+
Thin wrapper around shard_merge.merge_epic_shards() that uses
|
|
26
|
+
load_yaml_config as the file loader. Kept as a named function
|
|
27
|
+
for any external importers (e.g. validator.py).
|
|
33
28
|
|
|
34
29
|
Args:
|
|
35
30
|
data: Sprint data with possible string refs in epics
|
|
@@ -38,72 +33,9 @@ def _merge_epic_shards(data: dict[str, Any], sprint_dir: Path) -> dict[str, Any]
|
|
|
38
33
|
Returns:
|
|
39
34
|
Sprint data with full epic dicts
|
|
40
35
|
"""
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
# Track loaded epic identities to prevent duplicates
|
|
46
|
-
loaded_shard_files: set[Path] = set()
|
|
47
|
-
loaded_epic_ids: set[str] = set()
|
|
48
|
-
merged_epics = []
|
|
49
|
-
for ref in epics:
|
|
50
|
-
if not isinstance(ref, str):
|
|
51
|
-
merged_epics.append(ref)
|
|
52
|
-
continue
|
|
53
|
-
|
|
54
|
-
epic_file = sprint_dir / f"epic-{ref}.yaml"
|
|
55
|
-
if epic_file.exists():
|
|
56
|
-
epic_data = load_yaml_config(epic_file)
|
|
57
|
-
if epic_data is not None:
|
|
58
|
-
merged_epics.append(epic_data)
|
|
59
|
-
loaded_shard_files.add(epic_file.resolve())
|
|
60
|
-
# Track both id and jira key (normalized) for dedup
|
|
61
|
-
eid = str(epic_data.get("id", "")).replace("epic-", "")
|
|
62
|
-
if eid:
|
|
63
|
-
loaded_epic_ids.add(eid)
|
|
64
|
-
jira_key = str(epic_data.get("jira", ""))
|
|
65
|
-
if jira_key:
|
|
66
|
-
loaded_epic_ids.add(jira_key)
|
|
67
|
-
else:
|
|
68
|
-
warnings.warn(
|
|
69
|
-
f"Sprint epic ref '{ref}' not found: {epic_file}",
|
|
70
|
-
stacklevel=2,
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
# Collect epic refs owned by initiatives so we don't warn about them.
|
|
74
|
-
initiative_refs: set[str] = set()
|
|
75
|
-
for init_file in sorted(sprint_dir.glob("initiative-*.yaml")):
|
|
76
|
-
init_data = load_yaml_config(init_file)
|
|
77
|
-
if init_data and isinstance(init_data, dict):
|
|
78
|
-
for ref in init_data.get("epics", []):
|
|
79
|
-
if isinstance(ref, str):
|
|
80
|
-
initiative_refs.add(ref)
|
|
81
|
-
# Also add normalized form (strip "epic-" prefix)
|
|
82
|
-
initiative_refs.add(ref.replace("epic-", ""))
|
|
83
|
-
|
|
84
|
-
# Log unindexed shard files on disk (but do NOT auto-merge —
|
|
85
|
-
# orphan shards may belong to future initiatives).
|
|
86
|
-
for shard_file in sorted(sprint_dir.glob("epic-*.yaml")):
|
|
87
|
-
if shard_file.resolve() in loaded_shard_files:
|
|
88
|
-
continue
|
|
89
|
-
epic_data = load_yaml_config(shard_file)
|
|
90
|
-
if epic_data is None or not isinstance(epic_data, dict) or "id" not in epic_data:
|
|
91
|
-
continue
|
|
92
|
-
eid = str(epic_data.get("id", "")).replace("epic-", "")
|
|
93
|
-
jira_key = str(epic_data.get("jira", ""))
|
|
94
|
-
if eid in loaded_epic_ids or (jira_key and jira_key in loaded_epic_ids):
|
|
95
|
-
continue
|
|
96
|
-
# Skip shards owned by initiatives (not orphans)
|
|
97
|
-
if eid in initiative_refs or jira_key in initiative_refs:
|
|
98
|
-
continue
|
|
99
|
-
# Warn only about truly orphaned shards
|
|
100
|
-
warnings.warn(
|
|
101
|
-
f"Unindexed shard {shard_file.name} (epic {eid}) not in epics list — skipping",
|
|
102
|
-
stacklevel=2,
|
|
103
|
-
)
|
|
104
|
-
|
|
105
|
-
data["epics"] = merged_epics
|
|
106
|
-
return data
|
|
36
|
+
from pf.sprint.shard_merge import merge_epic_shards
|
|
37
|
+
|
|
38
|
+
return merge_epic_shards(data, sprint_dir, load_file=load_yaml_config)
|
|
107
39
|
|
|
108
40
|
|
|
109
41
|
def load_sprint(project_root: Path | None = None) -> dict[str, Any] | None:
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"""Canonical shard merging for sprint YAML files.
|
|
2
|
+
|
|
3
|
+
Provides a single merge_epic_shards() implementation used by both:
|
|
4
|
+
- yaml_io.py (ruamel.yaml, preserves comments/ordering)
|
|
5
|
+
- loader.py (yaml.safe_load, plain dicts)
|
|
6
|
+
|
|
7
|
+
The caller passes a `load_file` callable so each consumer keeps
|
|
8
|
+
its preferred YAML library.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import warnings
|
|
12
|
+
from collections.abc import Callable, Mapping
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def merge_epic_shards(
|
|
18
|
+
data: Any,
|
|
19
|
+
sprint_dir: Path,
|
|
20
|
+
*,
|
|
21
|
+
load_file: Callable[[Path], Any],
|
|
22
|
+
make_list: Callable[[], Any] | None = None,
|
|
23
|
+
) -> Any:
|
|
24
|
+
"""Merge sharded epic files into sprint data.
|
|
25
|
+
|
|
26
|
+
When the epics list contains string references (e.g. "MSSCI-14298"
|
|
27
|
+
or "epic-40"), loads each epic-{ref}.yaml shard and replaces the
|
|
28
|
+
string with the full epic data.
|
|
29
|
+
|
|
30
|
+
Also detects unindexed shard files on disk. Shards owned by
|
|
31
|
+
initiatives (initiative-*.yaml) are silently skipped; truly
|
|
32
|
+
orphaned shards emit a warning.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
data: Sprint data with possible string refs in epics.
|
|
36
|
+
sprint_dir: Directory containing shard files.
|
|
37
|
+
load_file: Callable that reads a YAML file and returns parsed data.
|
|
38
|
+
For ruamel.yaml callers this returns CommentedMap;
|
|
39
|
+
for yaml.safe_load callers this returns plain dicts.
|
|
40
|
+
make_list: Optional callable returning an empty list-like container.
|
|
41
|
+
Defaults to ``list``. Pass ``CommentedSeq`` for ruamel.yaml.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
Sprint data with full epic dicts merged in.
|
|
45
|
+
"""
|
|
46
|
+
epics = data.get("epics", [])
|
|
47
|
+
if not epics or not isinstance(epics[0], str):
|
|
48
|
+
return data
|
|
49
|
+
|
|
50
|
+
if make_list is None:
|
|
51
|
+
make_list = list
|
|
52
|
+
|
|
53
|
+
loaded_shard_files: set[Path] = set()
|
|
54
|
+
loaded_epic_ids: set[str] = set()
|
|
55
|
+
merged_epics = make_list()
|
|
56
|
+
|
|
57
|
+
for ref in epics:
|
|
58
|
+
if not isinstance(ref, str):
|
|
59
|
+
merged_epics.append(ref)
|
|
60
|
+
continue
|
|
61
|
+
|
|
62
|
+
shard_file = sprint_dir / f"epic-{ref}.yaml"
|
|
63
|
+
if shard_file.exists():
|
|
64
|
+
try:
|
|
65
|
+
epic_data = load_file(shard_file)
|
|
66
|
+
except Exception:
|
|
67
|
+
warnings.warn(
|
|
68
|
+
f"Failed to load shard {shard_file.name}",
|
|
69
|
+
stacklevel=2,
|
|
70
|
+
)
|
|
71
|
+
continue
|
|
72
|
+
|
|
73
|
+
if epic_data is None:
|
|
74
|
+
continue
|
|
75
|
+
|
|
76
|
+
merged_epics.append(epic_data)
|
|
77
|
+
loaded_shard_files.add(shard_file.resolve())
|
|
78
|
+
|
|
79
|
+
eid = str(epic_data.get("id", "")).replace("epic-", "")
|
|
80
|
+
if eid:
|
|
81
|
+
loaded_epic_ids.add(eid)
|
|
82
|
+
jira_key = str(epic_data.get("jira", ""))
|
|
83
|
+
if jira_key:
|
|
84
|
+
loaded_epic_ids.add(jira_key)
|
|
85
|
+
else:
|
|
86
|
+
warnings.warn(
|
|
87
|
+
f"Sprint epic ref '{ref}' not found: {shard_file}",
|
|
88
|
+
stacklevel=2,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Collect epic refs owned by initiatives so we don't warn about them.
|
|
92
|
+
initiative_refs: set[str] = set()
|
|
93
|
+
for init_file in sorted(sprint_dir.glob("initiative-*.yaml")):
|
|
94
|
+
try:
|
|
95
|
+
init_data = load_file(init_file)
|
|
96
|
+
except Exception:
|
|
97
|
+
continue
|
|
98
|
+
if init_data and isinstance(init_data, Mapping):
|
|
99
|
+
for ref in init_data.get("epics", []):
|
|
100
|
+
if isinstance(ref, str):
|
|
101
|
+
initiative_refs.add(ref)
|
|
102
|
+
initiative_refs.add(ref.replace("epic-", ""))
|
|
103
|
+
|
|
104
|
+
# Warn about truly orphaned shard files (not in index, not in initiatives).
|
|
105
|
+
for shard_file in sorted(sprint_dir.glob("epic-*.yaml")):
|
|
106
|
+
if shard_file.resolve() in loaded_shard_files:
|
|
107
|
+
continue
|
|
108
|
+
try:
|
|
109
|
+
epic_data = load_file(shard_file)
|
|
110
|
+
except Exception:
|
|
111
|
+
continue
|
|
112
|
+
if epic_data is None or not isinstance(epic_data, Mapping) or "id" not in epic_data:
|
|
113
|
+
continue
|
|
114
|
+
eid = str(epic_data.get("id", "")).replace("epic-", "")
|
|
115
|
+
jira_key = str(epic_data.get("jira", ""))
|
|
116
|
+
if eid in loaded_epic_ids or (jira_key and jira_key in loaded_epic_ids):
|
|
117
|
+
continue
|
|
118
|
+
if eid in initiative_refs or jira_key in initiative_refs:
|
|
119
|
+
continue
|
|
120
|
+
warnings.warn(
|
|
121
|
+
f"Unindexed shard {shard_file.name} (epic {eid}) not in epics list — skipping",
|
|
122
|
+
stacklevel=2,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
data["epics"] = merged_epics
|
|
126
|
+
return data
|
|
@@ -133,10 +133,14 @@ def finish_story(
|
|
|
133
133
|
)
|
|
134
134
|
|
|
135
135
|
if dry_run:
|
|
136
|
+
from pf.common.pr_config import get_pr_merge_mode
|
|
137
|
+
|
|
136
138
|
steps.append({"step": 1, "action": f"Archive session → {archive_dir / archive_name}"})
|
|
137
139
|
if dialogue_path.exists():
|
|
138
140
|
steps.append({"step": "1b", "action": f"Archive dialogue → {archive_dir / dialogue_archive_name}"})
|
|
139
|
-
if pr_number:
|
|
141
|
+
if pr_number and get_pr_merge_mode() == "human":
|
|
142
|
+
steps.append({"step": 2, "action": f"PR #{pr_number} — waiting for human review and merge"})
|
|
143
|
+
elif pr_number:
|
|
140
144
|
steps.append({"step": 2, "action": f"Merge PR #{pr_number} (squash, delete branch)"})
|
|
141
145
|
else:
|
|
142
146
|
steps.append({"step": 2, "action": "No PR to merge"})
|
|
@@ -162,7 +166,15 @@ def finish_story(
|
|
|
162
166
|
steps.append({"step": "1b", "action": "archive_dialogue", "dest": str(dialogue_dest)})
|
|
163
167
|
|
|
164
168
|
# --- Step 2: Merge PR ---
|
|
165
|
-
|
|
169
|
+
from pf.common.pr_config import get_pr_merge_mode
|
|
170
|
+
|
|
171
|
+
pr_merge_mode = get_pr_merge_mode()
|
|
172
|
+
if pr_number and pr_merge_mode == "human":
|
|
173
|
+
steps.append({
|
|
174
|
+
"step": 2, "action": "merge_pr", "pr": pr_number,
|
|
175
|
+
"mode": "human", "message": f"PR #{pr_number} ready for human review and merge",
|
|
176
|
+
})
|
|
177
|
+
elif pr_number:
|
|
166
178
|
result = _run(["gh", "pr", "merge", pr_number, "--squash", "--delete-branch"])
|
|
167
179
|
if result.returncode == 0:
|
|
168
180
|
steps.append({"step": 2, "action": "merge_pr", "pr": pr_number})
|
|
@@ -173,8 +185,10 @@ def finish_story(
|
|
|
173
185
|
|
|
174
186
|
# --- Step 3: Transition Jira ---
|
|
175
187
|
if jira_key:
|
|
176
|
-
|
|
177
|
-
|
|
188
|
+
from pf.jira.client import get_client
|
|
189
|
+
|
|
190
|
+
jira_result = get_client().transition_sync(jira_key, "Done")
|
|
191
|
+
if jira_result.get("success"):
|
|
178
192
|
steps.append({"step": 3, "action": "jira_done", "key": jira_key})
|
|
179
193
|
else:
|
|
180
194
|
steps.append({"step": 3, "action": "jira_done", "key": jira_key, "warning": "Already Done or failed"})
|
|
@@ -66,11 +66,11 @@ class ValidationResult:
|
|
|
66
66
|
|
|
67
67
|
VALID_SPRINT_STATUSES = {"active", "closed"}
|
|
68
68
|
VALID_STORY_STATUSES = {"backlog", "ready", "in_progress", "done", "canceled", "planning"}
|
|
69
|
-
JIRA_KEY_PATTERN = re.compile(r"^
|
|
69
|
+
JIRA_KEY_PATTERN = re.compile(r"^[A-Z][A-Z0-9_]+-\d+(\s*/\s*[A-Z][A-Z0-9_]+-\d+)*$")
|
|
70
70
|
ISO_DATE_PATTERN = re.compile(r"^\d{4}-\d{2}-\d{2}$")
|
|
71
71
|
|
|
72
72
|
# Required fields for sprint section
|
|
73
|
-
REQUIRED_SPRINT_FIELDS = {"
|
|
73
|
+
REQUIRED_SPRINT_FIELDS = {"goal", "start_date", "end_date", "status"}
|
|
74
74
|
|
|
75
75
|
# Required fields for story
|
|
76
76
|
REQUIRED_STORY_FIELDS = {"id", "title", "status", "points"}
|
|
@@ -103,7 +103,7 @@ def validate_sprint(data: dict[str, Any]) -> ValidationResult:
|
|
|
103
103
|
"""Validate sprint-level structure and fields.
|
|
104
104
|
|
|
105
105
|
Validates:
|
|
106
|
-
- Required fields present (
|
|
106
|
+
- Required fields present (goal, start_date, end_date, status)
|
|
107
107
|
- status is valid value (active, closed)
|
|
108
108
|
- dates are ISO format
|
|
109
109
|
|
|
@@ -159,7 +159,7 @@ def validate_story(story: dict[str, Any], epic_id: str, story_index: int = 0) ->
|
|
|
159
159
|
- Required fields present (id, title, status, points)
|
|
160
160
|
- status is valid value (backlog, ready, in_progress, done, canceled)
|
|
161
161
|
- points is numeric
|
|
162
|
-
- jira key follows pattern
|
|
162
|
+
- jira key follows PROJECT-NUMBER pattern if present
|
|
163
163
|
- branch follows convention if present
|
|
164
164
|
|
|
165
165
|
Args:
|
|
@@ -204,7 +204,7 @@ def validate_story(story: dict[str, Any], epic_id: str, story_index: int = 0) ->
|
|
|
204
204
|
jira_key = str(story["jira"])
|
|
205
205
|
if not JIRA_KEY_PATTERN.match(jira_key):
|
|
206
206
|
result.add_error(
|
|
207
|
-
f"Invalid Jira key format '{jira_key}'. Expected MSSCI-
|
|
207
|
+
f"Invalid Jira key format '{jira_key}'. Expected PROJECT-NUMBER format (e.g., DPGD-17, MSSCI-12345)",
|
|
208
208
|
f"{base_path}.jira",
|
|
209
209
|
)
|
|
210
210
|
|
|
@@ -286,7 +286,7 @@ def validate_epic_shard(epic: dict[str, Any]) -> ValidationResult:
|
|
|
286
286
|
- stories is a list
|
|
287
287
|
- Each story has required fields (id, title, points, status)
|
|
288
288
|
- No duplicate story IDs within the epic
|
|
289
|
-
- jira key follows
|
|
289
|
+
- jira key follows PROJECT-NUMBER pattern if present
|
|
290
290
|
|
|
291
291
|
Args:
|
|
292
292
|
epic: Epic shard dict to validate
|
|
@@ -328,7 +328,7 @@ def validate_epic_shard(epic: dict[str, Any]) -> ValidationResult:
|
|
|
328
328
|
jira_key = str(epic["jira"])
|
|
329
329
|
if not JIRA_KEY_PATTERN.match(jira_key):
|
|
330
330
|
result.add_error(
|
|
331
|
-
f"Invalid Jira key format '{jira_key}'. Expected MSSCI-
|
|
331
|
+
f"Invalid Jira key format '{jira_key}'. Expected PROJECT-NUMBER format (e.g., DPGD-17, MSSCI-12345)",
|
|
332
332
|
"epic.jira",
|
|
333
333
|
)
|
|
334
334
|
|
|
@@ -36,7 +36,7 @@ EPIC_KEY_ORDER: list[str] = [
|
|
|
36
36
|
|
|
37
37
|
STORY_KEY_ORDER: list[str] = [
|
|
38
38
|
"id", "jira", "title", "description", "points", "priority",
|
|
39
|
-
"status", "in_sprint", "assigned_to", "started", "repos",
|
|
39
|
+
"refs", "status", "in_sprint", "assigned_to", "started", "repos",
|
|
40
40
|
"workflow", "acceptance_criteria", "completed", "pr",
|
|
41
41
|
"delivered_in", "notes",
|
|
42
42
|
]
|
|
@@ -107,59 +107,14 @@ def read_sprint(path: Path) -> CommentedMap:
|
|
|
107
107
|
"""
|
|
108
108
|
data = _read_yaml_file(path)
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
if not epics or not isinstance(epics[0], str):
|
|
112
|
-
return data
|
|
113
|
-
|
|
114
|
-
sprint_dir = path.parent
|
|
115
|
-
|
|
116
|
-
# Track loaded epic identities to prevent duplicates
|
|
117
|
-
loaded_shard_files: set[Path] = set()
|
|
118
|
-
loaded_epic_ids: set[str] = set()
|
|
119
|
-
merged_epics = CommentedSeq()
|
|
120
|
-
for ref in epics:
|
|
121
|
-
if isinstance(ref, str):
|
|
122
|
-
shard_file = sprint_dir / f"epic-{ref}.yaml"
|
|
123
|
-
if shard_file.exists():
|
|
124
|
-
epic_data = _read_yaml_file(shard_file)
|
|
125
|
-
merged_epics.append(epic_data)
|
|
126
|
-
loaded_shard_files.add(shard_file.resolve())
|
|
127
|
-
# Track both id and jira key (normalized) for dedup
|
|
128
|
-
eid = str(epic_data.get("id", "")).replace("epic-", "")
|
|
129
|
-
if eid:
|
|
130
|
-
loaded_epic_ids.add(eid)
|
|
131
|
-
jira_key = str(epic_data.get("jira", ""))
|
|
132
|
-
if jira_key:
|
|
133
|
-
loaded_epic_ids.add(jira_key)
|
|
134
|
-
else:
|
|
135
|
-
merged_epics.append(ref)
|
|
136
|
-
|
|
137
|
-
# Log unindexed shard files on disk (but do NOT auto-merge them —
|
|
138
|
-
# orphan shards may belong to future initiatives and should not be
|
|
139
|
-
# pulled into the current sprint automatically).
|
|
140
|
-
for shard_file in sorted(sprint_dir.glob("epic-*.yaml")):
|
|
141
|
-
if shard_file.resolve() in loaded_shard_files:
|
|
142
|
-
continue
|
|
143
|
-
try:
|
|
144
|
-
epic_data = _read_yaml_file(shard_file)
|
|
145
|
-
except (FileNotFoundError, ValueError):
|
|
146
|
-
continue
|
|
147
|
-
if not isinstance(epic_data, Mapping) or "id" not in epic_data:
|
|
148
|
-
continue
|
|
149
|
-
eid = str(epic_data.get("id", "")).replace("epic-", "")
|
|
150
|
-
jira_key = str(epic_data.get("jira", ""))
|
|
151
|
-
if eid in loaded_epic_ids or (jira_key and jira_key in loaded_epic_ids):
|
|
152
|
-
continue
|
|
153
|
-
# Warn but don't merge — these are intentionally excluded
|
|
154
|
-
import sys
|
|
155
|
-
print(
|
|
156
|
-
f" NOTE: Unindexed shard {shard_file.name} (epic {eid}) "
|
|
157
|
-
f"not in epics list — skipping",
|
|
158
|
-
file=sys.stderr,
|
|
159
|
-
)
|
|
110
|
+
from pf.sprint.shard_merge import merge_epic_shards
|
|
160
111
|
|
|
161
|
-
|
|
162
|
-
|
|
112
|
+
return merge_epic_shards(
|
|
113
|
+
data,
|
|
114
|
+
path.parent,
|
|
115
|
+
load_file=_read_yaml_file,
|
|
116
|
+
make_list=CommentedSeq,
|
|
117
|
+
)
|
|
163
118
|
|
|
164
119
|
|
|
165
120
|
def _sort_mapping(data: CommentedMap, key_order: list[str]) -> CommentedMap:
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_confidence_sm_gate.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_dialogue_manager.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|
package/pennyfarthing-dist/pf/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc
ADDED
|
Binary file
|