@pennyfarthing/core 10.0.5 → 10.2.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 +19 -22
- package/package.json +17 -11
- package/packages/core/dist/cli/commands/doctor-file-layout.test.js.map +1 -1
- package/packages/core/dist/cli/commands/doctor-legacy.test.js +24 -0
- package/packages/core/dist/cli/commands/doctor-legacy.test.js.map +1 -1
- package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/doctor.js +346 -13
- package/packages/core/dist/cli/commands/doctor.js.map +1 -1
- package/packages/core/dist/cli/commands/e2e-fresh-install.test.js +1 -1
- package/packages/core/dist/cli/commands/e2e-fresh-install.test.js.map +1 -1
- package/packages/core/dist/cli/commands/e2e-upgrade.test.js +1 -1
- package/packages/core/dist/cli/commands/e2e-upgrade.test.js.map +1 -1
- package/packages/core/dist/cli/commands/hooks-consolidation.test.js +2 -2
- package/packages/core/dist/cli/commands/hooks-consolidation.test.js.map +1 -1
- package/packages/core/dist/cli/commands/init-consolidation.test.js.map +1 -1
- package/packages/core/dist/cli/commands/init.d.ts +7 -0
- package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/init.js +41 -8
- package/packages/core/dist/cli/commands/init.js.map +1 -1
- package/packages/core/dist/cli/commands/uninstall.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/uninstall.js +24 -13
- package/packages/core/dist/cli/commands/uninstall.js.map +1 -1
- package/packages/core/dist/cli/commands/update-consolidation.test.js +0 -10
- package/packages/core/dist/cli/commands/update-consolidation.test.js.map +1 -1
- package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/update.js +26 -0
- package/packages/core/dist/cli/commands/update.js.map +1 -1
- package/packages/core/dist/cli/index.js +1 -1
- package/packages/core/dist/cli/index.js.map +1 -1
- package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -1
- package/packages/core/dist/cli/theme-maker.test.js +64 -115
- package/packages/core/dist/cli/theme-maker.test.js.map +1 -1
- package/packages/core/dist/cli/utils/python.d.ts +22 -0
- package/packages/core/dist/cli/utils/python.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/python.js +102 -0
- package/packages/core/dist/cli/utils/python.js.map +1 -0
- package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/settings.js +10 -0
- package/packages/core/dist/cli/utils/settings.js.map +1 -1
- package/packages/core/dist/index.d.ts +1 -1
- package/packages/core/dist/index.d.ts.map +1 -1
- package/packages/core/dist/index.js +2 -2
- package/packages/core/dist/index.js.map +1 -1
- package/packages/core/dist/plugins/plugin-discovery.d.ts +116 -0
- package/packages/core/dist/plugins/plugin-discovery.d.ts.map +1 -0
- package/packages/core/dist/plugins/plugin-discovery.js +165 -0
- package/packages/core/dist/plugins/plugin-discovery.js.map +1 -0
- package/packages/core/dist/plugins/plugin-discovery.test.d.ts +22 -0
- package/packages/core/dist/plugins/plugin-discovery.test.d.ts.map +1 -0
- package/packages/core/dist/plugins/plugin-discovery.test.js +498 -0
- package/packages/core/dist/plugins/plugin-discovery.test.js.map +1 -0
- package/packages/core/dist/scripts/generate-spider-report.js.map +1 -1
- package/packages/core/dist/workflow/context-watch.d.ts +80 -0
- package/packages/core/dist/workflow/context-watch.d.ts.map +1 -0
- package/packages/core/dist/workflow/context-watch.js +235 -0
- package/packages/core/dist/workflow/context-watch.js.map +1 -0
- package/packages/core/dist/workflow/context-watch.test.d.ts +1 -0
- package/packages/core/dist/workflow/context-watch.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/context-watch.test.js +746 -0
- package/packages/core/dist/workflow/context-watch.test.js.map +1 -0
- package/packages/core/dist/workflow/file-watch.d.ts +82 -0
- package/packages/core/dist/workflow/file-watch.d.ts.map +1 -0
- package/packages/core/dist/workflow/file-watch.js +198 -0
- package/packages/core/dist/workflow/file-watch.js.map +1 -0
- package/packages/core/dist/workflow/file-watch.test.d.ts +21 -0
- package/packages/core/dist/workflow/file-watch.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/file-watch.test.js +469 -0
- package/packages/core/dist/workflow/file-watch.test.js.map +1 -0
- package/packages/core/dist/workflow/observation-writer.d.ts +79 -0
- package/packages/core/dist/workflow/observation-writer.d.ts.map +1 -0
- package/packages/core/dist/workflow/observation-writer.js +97 -0
- package/packages/core/dist/workflow/observation-writer.js.map +1 -0
- package/packages/core/dist/workflow/observation-writer.test.d.ts +18 -0
- package/packages/core/dist/workflow/observation-writer.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/observation-writer.test.js +424 -0
- package/packages/core/dist/workflow/observation-writer.test.js.map +1 -0
- package/packages/core/dist/workflow/story-workflow-routing.test.js +4 -2
- package/packages/core/dist/workflow/story-workflow-routing.test.js.map +1 -1
- package/packages/core/dist/workflow/tandem-lifecycle.d.ts +117 -0
- package/packages/core/dist/workflow/tandem-lifecycle.d.ts.map +1 -0
- package/packages/core/dist/workflow/tandem-lifecycle.js +186 -0
- package/packages/core/dist/workflow/tandem-lifecycle.js.map +1 -0
- package/packages/core/dist/workflow/tandem-lifecycle.test.d.ts +16 -0
- package/packages/core/dist/workflow/tandem-lifecycle.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/tandem-lifecycle.test.js +531 -0
- package/packages/core/dist/workflow/tandem-lifecycle.test.js.map +1 -0
- package/packages/core/dist/workflow/tool-watch.d.ts +68 -0
- package/packages/core/dist/workflow/tool-watch.d.ts.map +1 -0
- package/packages/core/dist/workflow/tool-watch.js +166 -0
- package/packages/core/dist/workflow/tool-watch.js.map +1 -0
- package/packages/core/dist/workflow/tool-watch.test.d.ts +18 -0
- package/packages/core/dist/workflow/tool-watch.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/tool-watch.test.js +718 -0
- package/packages/core/dist/workflow/tool-watch.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-migration.test.js +8 -4
- package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.d.ts +7 -0
- package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.js +44 -0
- package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.test.js +192 -0
- package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -1
- package/pennyfarthing-dist/agents/README.md +1 -3
- package/pennyfarthing-dist/agents/architect.md +0 -6
- package/pennyfarthing-dist/agents/devops.md +0 -6
- package/pennyfarthing-dist/agents/handoff.md +18 -3
- package/pennyfarthing-dist/agents/orchestrator.md +0 -6
- package/pennyfarthing-dist/agents/pm.md +0 -6
- package/pennyfarthing-dist/agents/sm-finish.md +1 -1
- package/pennyfarthing-dist/agents/sm-handoff.md +27 -4
- package/pennyfarthing-dist/agents/sm.md +11 -11
- package/pennyfarthing-dist/agents/tandem-backseat.md +119 -0
- package/pennyfarthing-dist/commands/architect.md +11 -3
- package/pennyfarthing-dist/commands/close-epic.md +24 -131
- package/pennyfarthing-dist/commands/create-theme.md +14 -24
- package/pennyfarthing-dist/commands/dev.md +11 -3
- package/pennyfarthing-dist/commands/devops.md +11 -3
- package/pennyfarthing-dist/commands/health-check.md +1 -3
- package/pennyfarthing-dist/commands/help.md +8 -12
- package/pennyfarthing-dist/commands/list-themes.md +14 -16
- package/pennyfarthing-dist/commands/orchestrator.md +11 -3
- package/pennyfarthing-dist/commands/parallel-work.md +1 -3
- package/pennyfarthing-dist/commands/pm.md +11 -3
- package/pennyfarthing-dist/commands/prime.md +6 -6
- package/pennyfarthing-dist/commands/reviewer.md +11 -3
- package/pennyfarthing-dist/commands/run-ci.md +1 -1
- package/pennyfarthing-dist/commands/set-theme.md +14 -51
- package/pennyfarthing-dist/commands/setup.md +5 -1
- package/pennyfarthing-dist/commands/show-theme.md +14 -16
- package/pennyfarthing-dist/commands/sm.md +11 -3
- package/pennyfarthing-dist/commands/tea.md +11 -3
- package/pennyfarthing-dist/commands/tech-writer.md +11 -3
- package/pennyfarthing-dist/commands/theme-maker.md +14 -671
- package/pennyfarthing-dist/commands/theme.md +95 -0
- package/pennyfarthing-dist/commands/ux-designer.md +11 -3
- package/pennyfarthing-dist/commands/work.md +3 -5
- package/pennyfarthing-dist/guides/agent-behavior.md +62 -6
- package/pennyfarthing-dist/guides/agent-coordination.md +11 -13
- package/pennyfarthing-dist/guides/agent-template-tactical.md +2 -3
- package/pennyfarthing-dist/guides/bikelane.md +3 -2
- package/pennyfarthing-dist/guides/command-tag-taxonomy.md +212 -0
- package/pennyfarthing-dist/guides/hooks.md +5 -5
- package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +3 -3
- package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +9 -59
- package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +4 -5
- package/pennyfarthing-dist/guides/prime.md +2 -2
- package/pennyfarthing-dist/guides/scale-levels.md +4 -6
- package/pennyfarthing-dist/guides/skill-schema.md +4 -4
- package/pennyfarthing-dist/guides/tandem-protocol.md +158 -0
- package/pennyfarthing-dist/personas/themes/discworld.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/fifth-element.yaml +295 -0
- package/pennyfarthing-dist/scripts/README.md +1 -1
- package/pennyfarthing-dist/scripts/core/agent-session.sh +6 -2
- package/pennyfarthing-dist/scripts/core/check-context.sh +0 -0
- package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -0
- package/pennyfarthing-dist/scripts/core/phase-check-start.sh +0 -0
- package/pennyfarthing-dist/scripts/core/prime.sh +8 -10
- package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -0
- package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -0
- package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -0
- package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +8 -6
- package/pennyfarthing-dist/scripts/git/release.sh +0 -0
- package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -0
- package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +131 -54
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/post-merge.sh +32 -15
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +4 -3
- package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/pre-push.sh +11 -5
- package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -0
- package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/common.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/logging.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/retry.sh +0 -0
- package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -0
- package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/README.md +1 -1
- package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -0
- package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -0
- package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/statusline.sh +50 -8
- package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +1 -2
- package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +0 -0
- package/pennyfarthing-dist/scripts/story/create-story.sh +0 -0
- package/pennyfarthing-dist/scripts/story/size-story.sh +0 -0
- package/pennyfarthing-dist/scripts/story/story-template.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +5 -5
- package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +3 -79
- package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/theme/README.md +1 -1
- package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -0
- package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -1
- package/pennyfarthing-dist/scripts/workflow/README.md +2 -2
- package/pennyfarthing-dist/scripts/workflow/check.py +0 -0
- package/pennyfarthing-dist/scripts/workflow/check.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/complete-step.py +0 -0
- package/pennyfarthing-dist/scripts/workflow/finish-story.sh +10 -144
- package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -0
- package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -0
- package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +2 -2
- package/pennyfarthing-dist/skills/skill-registry.schema.json +8 -0
- package/pennyfarthing-dist/skills/skill-registry.yaml +21 -17
- package/pennyfarthing-dist/skills/sprint/skill.md +25 -2
- package/pennyfarthing-dist/skills/story/scripts/create-story.sh +0 -0
- package/pennyfarthing-dist/skills/story/scripts/size-story.sh +0 -0
- package/pennyfarthing-dist/skills/story/scripts/story-template.sh +0 -0
- package/pennyfarthing-dist/skills/theme/skill.md +290 -75
- package/pennyfarthing-dist/skills/theme-creation/SKILL.md +23 -166
- package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/skill.md +27 -4
- package/pennyfarthing-dist/templates/agent-scopes.yaml.template +0 -11
- package/pennyfarthing-dist/templates/auto-load-sm.sh.template +14 -0
- package/pennyfarthing-dist/templates/settings.local.json.template +9 -0
- package/pennyfarthing-dist/workflows/2party-tdd.yaml +399 -0
- package/pennyfarthing-dist/workflows/architecture/workflow.yaml +65 -0
- package/pennyfarthing-dist/workflows/bdd-tandem.yaml +70 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +41 -24
- package/pennyfarthing-dist/workflows/tdd-tandem.yaml +61 -0
- 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__/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__/schema_validation_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bellmode_hook.py +202 -47
- package/pennyfarthing_scripts/brownfield/__init__.py +6 -6
- package/pennyfarthing_scripts/brownfield/__main__.py +1 -0
- 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/brownfield/cli.py +0 -1
- package/pennyfarthing_scripts/brownfield/discover.py +1 -2
- package/pennyfarthing_scripts/cli.py +23 -3
- package/pennyfarthing_scripts/codemarkers/__init__.py +23 -0
- package/pennyfarthing_scripts/codemarkers/__main__.py +6 -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/codemarkers/analyze.py +501 -0
- package/pennyfarthing_scripts/codemarkers/cli.py +179 -0
- package/pennyfarthing_scripts/codemarkers/formatters.py +88 -0
- package/pennyfarthing_scripts/codemarkers/models.py +60 -0
- package/pennyfarthing_scripts/common/__init__.py +8 -9
- 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 +1 -1
- package/pennyfarthing_scripts/complexity/__init__.py +15 -0
- package/pennyfarthing_scripts/complexity/__main__.py +6 -0
- 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/complexity/analyze.py +207 -0
- package/pennyfarthing_scripts/complexity/cli.py +82 -0
- package/pennyfarthing_scripts/complexity/formatters.py +64 -0
- package/pennyfarthing_scripts/complexity/models.py +32 -0
- package/pennyfarthing_scripts/context.py +14 -15
- package/pennyfarthing_scripts/deadcode/__init__.py +6 -0
- package/pennyfarthing_scripts/deadcode/__main__.py +6 -0
- 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/deadcode/analyze.py +322 -0
- package/pennyfarthing_scripts/deadcode/cli.py +163 -0
- package/pennyfarthing_scripts/deadcode/formatters.py +106 -0
- package/pennyfarthing_scripts/deadcode/models.py +54 -0
- package/pennyfarthing_scripts/dependencies/__init__.py +20 -0
- package/pennyfarthing_scripts/dependencies/__main__.py +5 -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/dependencies/analyze.py +155 -0
- package/pennyfarthing_scripts/dependencies/cli.py +76 -0
- package/pennyfarthing_scripts/dependencies/formatters.py +63 -0
- package/pennyfarthing_scripts/dependencies/models.py +39 -0
- package/pennyfarthing_scripts/git/__init__.py +5 -5
- 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__/status_all.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/create_branches.py +3 -2
- package/pennyfarthing_scripts/git/status_all.py +1 -1
- package/pennyfarthing_scripts/healthscore/__init__.py +21 -0
- package/pennyfarthing_scripts/healthscore/__main__.py +14 -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/healthscore/analyze.py +591 -0
- package/pennyfarthing_scripts/healthscore/cli.py +80 -0
- package/pennyfarthing_scripts/healthscore/formatters.py +46 -0
- package/pennyfarthing_scripts/healthscore/models.py +43 -0
- package/pennyfarthing_scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
- package/pennyfarthing_scripts/hooks.py +8 -11
- package/pennyfarthing_scripts/hotspots/__init__.py +6 -6
- 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/hotspots/analyze.py +155 -14
- package/pennyfarthing_scripts/hotspots/cli.py +12 -10
- package/pennyfarthing_scripts/hotspots/models.py +0 -1
- package/pennyfarthing_scripts/jira/__init__.py +15 -17
- 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/jira/bidirectional.py +44 -18
- package/pennyfarthing_scripts/jira/claim.py +21 -0
- package/pennyfarthing_scripts/jira/cli.py +6 -3
- package/pennyfarthing_scripts/jira/client.py +32 -4
- package/pennyfarthing_scripts/jira/create.py +45 -1
- package/pennyfarthing_scripts/jira/epic.py +3 -2
- package/pennyfarthing_scripts/jira/reconcile.py +0 -1
- package/pennyfarthing_scripts/jira/story.py +2 -0
- package/pennyfarthing_scripts/jira/sync.py +1 -1
- 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/migration/skill.py +0 -1
- package/pennyfarthing_scripts/migration/step.py +0 -1
- package/pennyfarthing_scripts/migration/validate.py +8 -5
- package/pennyfarthing_scripts/patch_mode.py +2 -2
- package/pennyfarthing_scripts/preflight/__init__.py +1 -1
- 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/preflight/finish.py +0 -1
- package/pennyfarthing_scripts/pretooluse_hook.py +6 -7
- 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__/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__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/cli.py +5 -1
- package/pennyfarthing_scripts/prime/loader.py +2 -3
- package/pennyfarthing_scripts/prime/persona.py +2 -1
- package/pennyfarthing_scripts/prime/tiers.py +4 -4
- package/pennyfarthing_scripts/schema_validation_hook.py +2 -3
- package/pennyfarthing_scripts/sprint/__init__.py +10 -12
- package/pennyfarthing_scripts/sprint/__main__.py +2 -2
- 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__/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/archive.py +0 -1
- package/pennyfarthing_scripts/sprint/archive_epic.py +198 -97
- package/pennyfarthing_scripts/sprint/cli.py +62 -46
- package/pennyfarthing_scripts/sprint/epic_add.py +8 -1
- package/pennyfarthing_scripts/sprint/import_epic.py +42 -18
- package/pennyfarthing_scripts/sprint/loader.py +6 -0
- package/pennyfarthing_scripts/sprint/status.py +1 -2
- package/pennyfarthing_scripts/sprint/story_add.py +202 -27
- package/pennyfarthing_scripts/sprint/story_finish.py +209 -0
- package/pennyfarthing_scripts/sprint/story_update.py +11 -3
- package/pennyfarthing_scripts/sprint/validate_cmd.py +0 -1
- package/pennyfarthing_scripts/sprint/validator.py +120 -6
- package/pennyfarthing_scripts/sprint/work.py +28 -7
- package/pennyfarthing_scripts/sprint/yaml_io.py +10 -2
- package/pennyfarthing_scripts/story/__init__.py +14 -16
- 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/story/size.py +0 -1
- package/pennyfarthing_scripts/story/template.py +0 -1
- package/pennyfarthing_scripts/swebench.py +1 -2
- 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_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_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_git_utils.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_sprint_package.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_validate_cmd.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_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/conftest.py +1 -2
- package/pennyfarthing_scripts/tests/test_brownfield.py +10 -13
- package/pennyfarthing_scripts/tests/test_cli_modules.py +0 -4
- package/pennyfarthing_scripts/tests/test_codemarkers.py +687 -0
- package/pennyfarthing_scripts/tests/test_common.py +9 -4
- package/pennyfarthing_scripts/tests/test_epic_shard_validation.py +699 -0
- package/pennyfarthing_scripts/tests/test_git_utils.py +10 -13
- package/pennyfarthing_scripts/tests/test_healthscore.py +516 -0
- package/pennyfarthing_scripts/tests/test_jira_package.py +0 -3
- package/pennyfarthing_scripts/tests/test_package_structure.py +3 -16
- package/pennyfarthing_scripts/tests/test_patch_mode.py +7 -11
- package/pennyfarthing_scripts/tests/test_prime.py +39 -21
- package/pennyfarthing_scripts/tests/test_sprint_package.py +3 -8
- package/pennyfarthing_scripts/tests/test_sprint_validator.py +53 -5
- package/pennyfarthing_scripts/tests/test_story_add.py +3 -7
- package/pennyfarthing_scripts/tests/test_story_package.py +0 -3
- package/pennyfarthing_scripts/tests/test_story_update.py +5 -10
- package/pennyfarthing_scripts/tests/test_tiers.py +18 -17
- package/pennyfarthing_scripts/tests/test_token_counting.py +19 -13
- package/pennyfarthing_scripts/tests/test_validate_cmd.py +2 -7
- package/pennyfarthing_scripts/tests/test_workflow_check.py +0 -2
- package/pennyfarthing_scripts/tests/test_yaml_io.py +0 -3
- package/pennyfarthing_scripts/theme/__init__.py +5 -0
- package/pennyfarthing_scripts/theme/__main__.py +6 -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/theme/cli.py +287 -0
- package/pennyfarthing_scripts/validate/__init__.py +21 -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/__init__.py +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__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/agent.py +239 -0
- package/pennyfarthing_scripts/validate/adapters/schema.py +30 -0
- package/pennyfarthing_scripts/validate/adapters/skill_command.py +292 -0
- package/pennyfarthing_scripts/validate/adapters/sprint.py +69 -0
- package/pennyfarthing_scripts/validate/adapters/workflow.py +320 -0
- package/pennyfarthing_scripts/validate/cli.py +141 -0
- package/pennyfarthing_scripts/welcome_hook.py +2 -3
- package/pennyfarthing_scripts/workflow.py +3 -3
- package/scripts/README.md +41 -0
- package/pennyfarthing-dist/agents/workflow-status-check.md +0 -96
- package/pennyfarthing-dist/commands/benchmark-control.md +0 -69
- package/pennyfarthing-dist/commands/benchmark.md +0 -485
- package/pennyfarthing-dist/commands/job-fair.md +0 -102
- package/pennyfarthing-dist/commands/solo.md +0 -447
- package/pennyfarthing-dist/guides/benchmarks.md +0 -62
- package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/scripts/test/ensure-swebench-data.sh +0 -59
- package/pennyfarthing-dist/scripts/test/ground-truth-judge.py +0 -220
- package/pennyfarthing-dist/scripts/test/swebench-judge.py +0 -374
- package/pennyfarthing-dist/scripts/test/test-cache.sh +0 -165
- package/pennyfarthing-dist/scripts/test/test-setup.sh +0 -337
- package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +0 -13
- package/pennyfarthing-dist/scripts/theme/compute_theme_tiers.py +0 -402
- package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +0 -97
- package/pennyfarthing-dist/skills/finalize-run/SKILL.md +0 -261
- package/pennyfarthing-dist/skills/judge/SKILL.md +0 -644
- package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +0 -187
- package/pennyfarthing-dist/workflows/dev-story/checklist.md +0 -80
- package/pennyfarthing-dist/workflows/dev-story/instructions.xml +0 -410
- package/pennyfarthing-dist/workflows/dev-story/workflow.yaml +0 -50
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +0 -201
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +0 -156
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +0 -140
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +0 -203
- package/pennyfarthing-dist/workflows/quick-spec/tech-spec-template.md +0 -74
- package/pennyfarthing-dist/workflows/quick-spec/workflow.yaml +0 -27
- package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/pretooluse_hook.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/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_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Output formatters for health score results.
|
|
3
|
+
|
|
4
|
+
Supports table, JSON, and CSV output — no external dependencies.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import csv
|
|
10
|
+
import io
|
|
11
|
+
import json
|
|
12
|
+
from dataclasses import asdict
|
|
13
|
+
|
|
14
|
+
from pennyfarthing_scripts.healthscore.models import HealthscoreResult
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def format_table(result: HealthscoreResult) -> str:
|
|
18
|
+
"""Format health score results as column-aligned table."""
|
|
19
|
+
lines = [
|
|
20
|
+
f"Health Score: {result.composite_score:.1f} / 100",
|
|
21
|
+
"",
|
|
22
|
+
f"{'Dimension':<30} {'Score':>6} {'Weight':>6}",
|
|
23
|
+
f"{'-' * 30} {'------':>6} {'------':>6}",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
for dim in result.dimensions:
|
|
27
|
+
score_str = f"{dim.score:.1f}" if dim.score is not None else "N/A"
|
|
28
|
+
weight_pct = f"{dim.weight * 100:.0f}%"
|
|
29
|
+
lines.append(f"{dim.name:<30} {score_str:>6} {weight_pct:>6}")
|
|
30
|
+
|
|
31
|
+
return "\n".join(lines)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def export_json(result: HealthscoreResult) -> str:
|
|
35
|
+
"""Serialize result to JSON string."""
|
|
36
|
+
return json.dumps(asdict(result), indent=2, default=str)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def export_csv(result: HealthscoreResult) -> str:
|
|
40
|
+
"""Export dimension scores as CSV."""
|
|
41
|
+
buf = io.StringIO()
|
|
42
|
+
writer = csv.writer(buf)
|
|
43
|
+
writer.writerow(["dimension", "score", "weight", "error"])
|
|
44
|
+
for dim in result.dimensions:
|
|
45
|
+
writer.writerow([dim.name, dim.score, dim.weight, dim.error or ""])
|
|
46
|
+
return buf.getvalue()
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Data models for health score analysis results.
|
|
3
|
+
|
|
4
|
+
Follows ADR-0008 result pattern — structured dataclasses with success/error fields.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass, field
|
|
10
|
+
|
|
11
|
+
# Default weights for each dimension (must sum to 1.0)
|
|
12
|
+
DEFAULT_WEIGHTS: dict[str, float] = {
|
|
13
|
+
"churn": 0.15,
|
|
14
|
+
"todo_density": 0.15,
|
|
15
|
+
"complexity": 0.15,
|
|
16
|
+
"test_gaps": 0.15,
|
|
17
|
+
"dead_code": 0.10,
|
|
18
|
+
"deprecation_debt": 0.10,
|
|
19
|
+
"dependency_freshness": 0.10,
|
|
20
|
+
"agent_context_efficiency": 0.10,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass
|
|
25
|
+
class DimensionScore:
|
|
26
|
+
"""Score for a single health dimension."""
|
|
27
|
+
|
|
28
|
+
name: str
|
|
29
|
+
score: float | None = None # 0-100, None if unavailable
|
|
30
|
+
weight: float = 0.0
|
|
31
|
+
error: str | None = None
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class HealthscoreResult:
|
|
36
|
+
"""Composite health score following ADR-0008 pattern."""
|
|
37
|
+
|
|
38
|
+
success: bool
|
|
39
|
+
composite_score: float = 0.0 # 0-100 weighted average
|
|
40
|
+
target_path: str = ""
|
|
41
|
+
dimensions: list[DimensionScore] = field(default_factory=list)
|
|
42
|
+
cached: bool = False
|
|
43
|
+
error: str | None = None
|
|
File without changes
|
|
@@ -16,15 +16,14 @@ Story: MSSCI-12409 - Hook consistency and relay mode compatibility
|
|
|
16
16
|
import json
|
|
17
17
|
import os
|
|
18
18
|
import sys
|
|
19
|
-
import urllib.request
|
|
20
19
|
import urllib.error
|
|
20
|
+
import urllib.request
|
|
21
21
|
from dataclasses import dataclass
|
|
22
22
|
from pathlib import Path
|
|
23
23
|
from typing import Any
|
|
24
24
|
|
|
25
25
|
import yaml
|
|
26
26
|
|
|
27
|
-
|
|
28
27
|
# =============================================================================
|
|
29
28
|
# Port File Constants
|
|
30
29
|
# =============================================================================
|
|
@@ -413,19 +412,17 @@ def read_stdin_json() -> dict[str, Any]:
|
|
|
413
412
|
def is_cyclist_running(project_root: Path | None = None) -> bool:
|
|
414
413
|
"""Check if Cyclist server is running.
|
|
415
414
|
|
|
416
|
-
Checks
|
|
417
|
-
|
|
415
|
+
Checks the CYCLIST environment variable set by ClaudeService when
|
|
416
|
+
spawning Claude inside Cyclist. No file I/O, no HTTP, no signals —
|
|
417
|
+
this runs on every tool invocation and must be instant.
|
|
418
418
|
|
|
419
|
-
|
|
420
|
-
|
|
419
|
+
The project_root parameter is kept for backward compatibility but
|
|
420
|
+
is no longer used.
|
|
421
421
|
|
|
422
422
|
Returns:
|
|
423
|
-
True if
|
|
423
|
+
True if running inside a Cyclist-spawned Claude process
|
|
424
424
|
"""
|
|
425
|
-
|
|
426
|
-
if not root:
|
|
427
|
-
return False
|
|
428
|
-
return (root / CYCLIST_PORT_FILE).exists()
|
|
425
|
+
return os.environ.get("CYCLIST") == "1"
|
|
429
426
|
|
|
430
427
|
|
|
431
428
|
def should_auto_approve(settings: CyclistSettings) -> bool:
|
|
@@ -6,18 +6,18 @@ bug fix concentration, and multi-author churn — indicators of code hotspots th
|
|
|
6
6
|
may benefit from refactoring attention.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
+
from pennyfarthing_scripts.hotspots.analyze import (
|
|
10
|
+
analyze_all_repos,
|
|
11
|
+
analyze_repo,
|
|
12
|
+
calculate_hotspot_score,
|
|
13
|
+
is_bug_fix_commit,
|
|
14
|
+
)
|
|
9
15
|
from pennyfarthing_scripts.hotspots.models import (
|
|
10
16
|
DirectoryHotspot,
|
|
11
17
|
FileHotspot,
|
|
12
18
|
HotspotResult,
|
|
13
19
|
MultiRepoHotspotResult,
|
|
14
20
|
)
|
|
15
|
-
from pennyfarthing_scripts.hotspots.analyze import (
|
|
16
|
-
analyze_repo,
|
|
17
|
-
analyze_all_repos,
|
|
18
|
-
calculate_hotspot_score,
|
|
19
|
-
is_bug_fix_commit,
|
|
20
|
-
)
|
|
21
21
|
|
|
22
22
|
__all__ = [
|
|
23
23
|
"DirectoryHotspot",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Core hotspot analysis engine.
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
Uses PyDriller to mine git history, computes per-file metrics, and produces
|
|
5
|
+
scored hotspot results. Falls back to raw git log parsing if PyDriller is unavailable.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
10
|
import asyncio
|
|
11
11
|
import fnmatch
|
|
12
|
+
import logging
|
|
12
13
|
import re
|
|
13
14
|
from collections import defaultdict
|
|
14
|
-
from datetime import datetime,
|
|
15
|
+
from datetime import UTC, datetime, timedelta
|
|
15
16
|
from pathlib import Path
|
|
16
17
|
|
|
17
18
|
from pennyfarthing_scripts.hotspots.models import (
|
|
@@ -21,6 +22,8 @@ from pennyfarthing_scripts.hotspots.models import (
|
|
|
21
22
|
MultiRepoHotspotResult,
|
|
22
23
|
)
|
|
23
24
|
|
|
25
|
+
logger = logging.getLogger("hotspots")
|
|
26
|
+
|
|
24
27
|
# Scoring weights (must sum to 1.0)
|
|
25
28
|
WEIGHT_BUG_FIXES = 0.35
|
|
26
29
|
WEIGHT_CHANGES = 0.30
|
|
@@ -39,6 +42,50 @@ DEFAULT_EXCLUDES = [
|
|
|
39
42
|
"*.map",
|
|
40
43
|
"package-lock.json",
|
|
41
44
|
"pnpm-lock.yaml",
|
|
45
|
+
# Dotfiles
|
|
46
|
+
".*",
|
|
47
|
+
# Images
|
|
48
|
+
"*.png",
|
|
49
|
+
"*.jpg",
|
|
50
|
+
"*.jpeg",
|
|
51
|
+
"*.gif",
|
|
52
|
+
"*.svg",
|
|
53
|
+
"*.ico",
|
|
54
|
+
# Fonts
|
|
55
|
+
"*.woff",
|
|
56
|
+
"*.woff2",
|
|
57
|
+
"*.ttf",
|
|
58
|
+
"*.eot",
|
|
59
|
+
# Generated files
|
|
60
|
+
"*.d.ts",
|
|
61
|
+
"*.snap",
|
|
62
|
+
"*.d.ts.map",
|
|
63
|
+
# CI config
|
|
64
|
+
".github/*",
|
|
65
|
+
# Sprint/session operational files (not code quality signals)
|
|
66
|
+
"sprint/*",
|
|
67
|
+
".session/*",
|
|
68
|
+
# Config/manifest files — high churn but not code quality signals
|
|
69
|
+
"package.json",
|
|
70
|
+
"*/package.json",
|
|
71
|
+
"tsconfig.json",
|
|
72
|
+
"*/tsconfig.json",
|
|
73
|
+
"tsconfig.*.json",
|
|
74
|
+
"*/tsconfig.*.json",
|
|
75
|
+
# Documentation — frequently edited but not code hotspots
|
|
76
|
+
"*.md",
|
|
77
|
+
"CLAUDE.md",
|
|
78
|
+
"*/CLAUDE.md",
|
|
79
|
+
"CLAUDE-*.md",
|
|
80
|
+
"*/CLAUDE-*.md",
|
|
81
|
+
"README.md",
|
|
82
|
+
"*/README.md",
|
|
83
|
+
"CHANGELOG.md",
|
|
84
|
+
"*/CHANGELOG.md",
|
|
85
|
+
"docs/*",
|
|
86
|
+
# YAML config (sprint, workflow, etc.)
|
|
87
|
+
"*.yaml",
|
|
88
|
+
"*.yml",
|
|
42
89
|
]
|
|
43
90
|
|
|
44
91
|
# Regex for identifying bug-fix commits
|
|
@@ -266,6 +313,8 @@ async def analyze_repo(
|
|
|
266
313
|
) -> HotspotResult:
|
|
267
314
|
"""Analyze a single repository for code hotspots.
|
|
268
315
|
|
|
316
|
+
Uses PyDriller for git mining when available, falls back to raw git log parsing.
|
|
317
|
+
|
|
269
318
|
Args:
|
|
270
319
|
name: Display name for the repository
|
|
271
320
|
path: Path to the git repository
|
|
@@ -288,6 +337,87 @@ async def analyze_repo(
|
|
|
288
337
|
error=f"Path not found: {resolved}",
|
|
289
338
|
)
|
|
290
339
|
|
|
340
|
+
try:
|
|
341
|
+
return await _analyze_repo_pydriller(name, resolved, days, all_excludes)
|
|
342
|
+
except ImportError:
|
|
343
|
+
logger.info("[hotspots] PyDriller not available, using git log fallback")
|
|
344
|
+
return await _analyze_repo_gitlog(name, resolved, days, all_excludes, branch)
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
async def _analyze_repo_pydriller(
|
|
348
|
+
name: str,
|
|
349
|
+
resolved: Path,
|
|
350
|
+
days: int,
|
|
351
|
+
all_excludes: list[str],
|
|
352
|
+
) -> HotspotResult:
|
|
353
|
+
"""PyDriller-backed hotspot analysis."""
|
|
354
|
+
from pydriller import Repository
|
|
355
|
+
|
|
356
|
+
since = datetime.now(UTC) - timedelta(days=days)
|
|
357
|
+
now = datetime.now(UTC)
|
|
358
|
+
|
|
359
|
+
file_metrics: dict[str, dict] = defaultdict(
|
|
360
|
+
lambda: {
|
|
361
|
+
"change_count": 0,
|
|
362
|
+
"bug_fix_count": 0,
|
|
363
|
+
"authors": set(),
|
|
364
|
+
"lines_added": 0,
|
|
365
|
+
"lines_deleted": 0,
|
|
366
|
+
"last_changed": "",
|
|
367
|
+
}
|
|
368
|
+
)
|
|
369
|
+
|
|
370
|
+
def _collect() -> int:
|
|
371
|
+
commit_count = 0
|
|
372
|
+
repo = Repository(str(resolved), since=since)
|
|
373
|
+
for commit in repo.traverse_commits():
|
|
374
|
+
commit_count += 1
|
|
375
|
+
is_fix = is_bug_fix_commit(commit.msg)
|
|
376
|
+
commit_date = commit.committer_date.isoformat()
|
|
377
|
+
|
|
378
|
+
for mod in commit.modified_files:
|
|
379
|
+
fpath = mod.new_path or mod.old_path
|
|
380
|
+
if not fpath:
|
|
381
|
+
continue
|
|
382
|
+
if _should_exclude(fpath, all_excludes):
|
|
383
|
+
continue
|
|
384
|
+
|
|
385
|
+
m = file_metrics[fpath]
|
|
386
|
+
m["change_count"] += 1
|
|
387
|
+
if is_fix:
|
|
388
|
+
m["bug_fix_count"] += 1
|
|
389
|
+
m["authors"].add(commit.author.name)
|
|
390
|
+
m["lines_added"] += mod.added_lines
|
|
391
|
+
m["lines_deleted"] += mod.deleted_lines
|
|
392
|
+
if not m["last_changed"] or commit_date > m["last_changed"]:
|
|
393
|
+
m["last_changed"] = commit_date
|
|
394
|
+
return commit_count
|
|
395
|
+
|
|
396
|
+
loop = asyncio.get_event_loop()
|
|
397
|
+
commit_count = await loop.run_in_executor(None, _collect)
|
|
398
|
+
logger.info("[hotspots] PyDriller: %d commits, %d files after filtering",
|
|
399
|
+
commit_count, len(file_metrics))
|
|
400
|
+
|
|
401
|
+
if not file_metrics:
|
|
402
|
+
return HotspotResult(
|
|
403
|
+
success=True,
|
|
404
|
+
repo_name=name,
|
|
405
|
+
repo_path=str(resolved),
|
|
406
|
+
time_window_days=days,
|
|
407
|
+
commit_count=commit_count,
|
|
408
|
+
)
|
|
409
|
+
|
|
410
|
+
return _build_hotspot_result(name, resolved, days, commit_count, file_metrics, now)
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
async def _analyze_repo_gitlog(
|
|
414
|
+
name: str,
|
|
415
|
+
resolved: Path,
|
|
416
|
+
days: int,
|
|
417
|
+
all_excludes: list[str],
|
|
418
|
+
branch: str,
|
|
419
|
+
) -> HotspotResult:
|
|
420
|
+
"""Fallback: raw git log parsing."""
|
|
291
421
|
stdout, stderr, rc = await _run_git_log(resolved, days, branch)
|
|
292
422
|
|
|
293
423
|
if rc != 0:
|
|
@@ -310,7 +440,6 @@ async def analyze_repo(
|
|
|
310
440
|
commit_count=0,
|
|
311
441
|
)
|
|
312
442
|
|
|
313
|
-
# Aggregate per-file metrics
|
|
314
443
|
file_metrics: dict[str, dict] = defaultdict(
|
|
315
444
|
lambda: {
|
|
316
445
|
"change_count": 0,
|
|
@@ -322,7 +451,7 @@ async def analyze_repo(
|
|
|
322
451
|
}
|
|
323
452
|
)
|
|
324
453
|
|
|
325
|
-
now = datetime.now(
|
|
454
|
+
now = datetime.now(UTC)
|
|
326
455
|
|
|
327
456
|
for commit in commits:
|
|
328
457
|
is_fix = is_bug_fix_commit(commit["message"])
|
|
@@ -338,7 +467,6 @@ async def analyze_repo(
|
|
|
338
467
|
m["authors"].add(commit["author"])
|
|
339
468
|
m["lines_added"] += file_info["added"]
|
|
340
469
|
m["lines_deleted"] += file_info["deleted"]
|
|
341
|
-
# Track most recent change date
|
|
342
470
|
if not m["last_changed"] or commit["date"] > m["last_changed"]:
|
|
343
471
|
m["last_changed"] = commit["date"]
|
|
344
472
|
|
|
@@ -351,7 +479,18 @@ async def analyze_repo(
|
|
|
351
479
|
commit_count=len(commits),
|
|
352
480
|
)
|
|
353
481
|
|
|
354
|
-
|
|
482
|
+
return _build_hotspot_result(name, resolved, days, len(commits), file_metrics, now)
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
def _build_hotspot_result(
|
|
486
|
+
name: str,
|
|
487
|
+
resolved: Path,
|
|
488
|
+
days: int,
|
|
489
|
+
commit_count: int,
|
|
490
|
+
file_metrics: dict[str, dict],
|
|
491
|
+
now: datetime,
|
|
492
|
+
) -> HotspotResult:
|
|
493
|
+
"""Build scored HotspotResult from aggregated file metrics."""
|
|
355
494
|
max_changes = max(m["change_count"] for m in file_metrics.values())
|
|
356
495
|
max_bugs = max(m["bug_fix_count"] for m in file_metrics.values()) or 1
|
|
357
496
|
max_authors = max(len(m["authors"]) for m in file_metrics.values())
|
|
@@ -359,13 +498,11 @@ async def analyze_repo(
|
|
|
359
498
|
m["lines_added"] + m["lines_deleted"] for m in file_metrics.values()
|
|
360
499
|
) or 1
|
|
361
500
|
|
|
362
|
-
# Build FileHotspot list with scores
|
|
363
501
|
file_hotspots = []
|
|
364
502
|
for fpath, m in file_metrics.items():
|
|
365
503
|
churn = m["lines_added"] + m["lines_deleted"]
|
|
366
504
|
|
|
367
|
-
|
|
368
|
-
age_days = days # default to full window
|
|
505
|
+
age_days = days
|
|
369
506
|
if m["last_changed"]:
|
|
370
507
|
try:
|
|
371
508
|
last_dt = datetime.fromisoformat(m["last_changed"])
|
|
@@ -400,10 +537,7 @@ async def analyze_repo(
|
|
|
400
537
|
)
|
|
401
538
|
)
|
|
402
539
|
|
|
403
|
-
# Sort by score descending
|
|
404
540
|
file_hotspots.sort(key=lambda h: h.hotspot_score, reverse=True)
|
|
405
|
-
|
|
406
|
-
# Aggregate directories
|
|
407
541
|
directory_hotspots = _aggregate_by_directory(file_hotspots)
|
|
408
542
|
|
|
409
543
|
return HotspotResult(
|
|
@@ -411,7 +545,7 @@ async def analyze_repo(
|
|
|
411
545
|
repo_name=name,
|
|
412
546
|
repo_path=str(resolved),
|
|
413
547
|
time_window_days=days,
|
|
414
|
-
commit_count=
|
|
548
|
+
commit_count=commit_count,
|
|
415
549
|
file_hotspots=file_hotspots,
|
|
416
550
|
directory_hotspots=directory_hotspots,
|
|
417
551
|
)
|
|
@@ -422,6 +556,7 @@ async def analyze_all_repos(
|
|
|
422
556
|
days: int = 90,
|
|
423
557
|
excludes: list[str] | None = None,
|
|
424
558
|
branch: str = "--all",
|
|
559
|
+
skip_types: list[str] | None = None,
|
|
425
560
|
) -> MultiRepoHotspotResult:
|
|
426
561
|
"""Analyze all repos found under project root in parallel.
|
|
427
562
|
|
|
@@ -432,6 +567,7 @@ async def analyze_all_repos(
|
|
|
432
567
|
days: Time window in days
|
|
433
568
|
excludes: Additional file patterns to exclude
|
|
434
569
|
branch: Branch spec
|
|
570
|
+
skip_types: Repo types to exclude (e.g. ["orchestrator"])
|
|
435
571
|
|
|
436
572
|
Returns:
|
|
437
573
|
MultiRepoHotspotResult with per-repo results
|
|
@@ -446,6 +582,11 @@ async def analyze_all_repos(
|
|
|
446
582
|
# Extract repos from repos.yaml
|
|
447
583
|
for repo_name, repo_config in repos_yaml.items():
|
|
448
584
|
if isinstance(repo_config, dict):
|
|
585
|
+
# Filter by type if skip_types is provided
|
|
586
|
+
if skip_types:
|
|
587
|
+
repo_type = repo_config.get("type")
|
|
588
|
+
if repo_type and repo_type in skip_types:
|
|
589
|
+
continue
|
|
449
590
|
repo_path = repo_config.get("path", repo_name)
|
|
450
591
|
else:
|
|
451
592
|
repo_path = str(repo_config)
|
|
@@ -38,15 +38,17 @@ def _common_options(fn):
|
|
|
38
38
|
fn = click.option("--output", "output_file", type=click.Path(), help="Write output to file")(fn)
|
|
39
39
|
fn = click.option("--exclude", multiple=True, help="Additional exclude patterns (repeatable)")(fn)
|
|
40
40
|
fn = click.option("--branch", default="--all", show_default=True, help="Branch spec for git log")(fn)
|
|
41
|
+
fn = click.option("--skip-type", "skip_type", multiple=True, help="Skip repos by type (repeatable, e.g. --skip-type orchestrator)")(fn)
|
|
41
42
|
return fn
|
|
42
43
|
|
|
43
44
|
|
|
44
|
-
def _run_analysis(repo: str | None, repo_path: str | None, days: int, exclude: tuple, branch: str):
|
|
45
|
+
def _run_analysis(repo: str | None, repo_path: str | None, days: int, exclude: tuple, branch: str, skip_type: tuple = ()):
|
|
45
46
|
"""Run analysis and return result."""
|
|
46
|
-
from pennyfarthing_scripts.hotspots.analyze import analyze_all_repos, analyze_repo
|
|
47
47
|
from pennyfarthing_scripts.common.config import get_project_root
|
|
48
|
+
from pennyfarthing_scripts.hotspots.analyze import analyze_all_repos, analyze_repo
|
|
48
49
|
|
|
49
50
|
excludes = list(exclude) if exclude else None
|
|
51
|
+
skip_types = list(skip_type) if skip_type else None
|
|
50
52
|
|
|
51
53
|
if repo_path:
|
|
52
54
|
# Standalone analysis of a specific path
|
|
@@ -75,7 +77,7 @@ def _run_analysis(repo: str | None, repo_path: str | None, days: int, exclude: t
|
|
|
75
77
|
# All repos
|
|
76
78
|
project_root = get_project_root()
|
|
77
79
|
return asyncio.run(
|
|
78
|
-
analyze_all_repos(project_root, days, excludes, branch)
|
|
80
|
+
analyze_all_repos(project_root, days, excludes, branch, skip_types)
|
|
79
81
|
)
|
|
80
82
|
|
|
81
83
|
|
|
@@ -88,7 +90,7 @@ def _output_result(result, fmt: str, output_file: str | None, top: int, mode: st
|
|
|
88
90
|
format_file_table,
|
|
89
91
|
format_summary,
|
|
90
92
|
)
|
|
91
|
-
from pennyfarthing_scripts.hotspots.models import
|
|
93
|
+
from pennyfarthing_scripts.hotspots.models import MultiRepoHotspotResult
|
|
92
94
|
|
|
93
95
|
# Collect all repo results
|
|
94
96
|
if isinstance(result, MultiRepoHotspotResult):
|
|
@@ -130,23 +132,23 @@ def _output_result(result, fmt: str, output_file: str | None, top: int, mode: st
|
|
|
130
132
|
|
|
131
133
|
@hotspots.command()
|
|
132
134
|
@_common_options
|
|
133
|
-
def analyze(repo, repo_path, days, top, fmt, output_file, exclude, branch):
|
|
135
|
+
def analyze(repo, repo_path, days, top, fmt, output_file, exclude, branch, skip_type):
|
|
134
136
|
"""Full hotspot analysis — files and directories."""
|
|
135
|
-
result = _run_analysis(repo, repo_path, days, exclude, branch)
|
|
137
|
+
result = _run_analysis(repo, repo_path, days, exclude, branch, skip_type)
|
|
136
138
|
_output_result(result, fmt, output_file, top, "analyze")
|
|
137
139
|
|
|
138
140
|
|
|
139
141
|
@hotspots.command()
|
|
140
142
|
@_common_options
|
|
141
|
-
def files(repo, repo_path, days, top, fmt, output_file, exclude, branch):
|
|
143
|
+
def files(repo, repo_path, days, top, fmt, output_file, exclude, branch, skip_type):
|
|
142
144
|
"""File-level hotspot report."""
|
|
143
|
-
result = _run_analysis(repo, repo_path, days, exclude, branch)
|
|
145
|
+
result = _run_analysis(repo, repo_path, days, exclude, branch, skip_type)
|
|
144
146
|
_output_result(result, fmt, output_file, top, "files")
|
|
145
147
|
|
|
146
148
|
|
|
147
149
|
@hotspots.command()
|
|
148
150
|
@_common_options
|
|
149
|
-
def dirs(repo, repo_path, days, top, fmt, output_file, exclude, branch):
|
|
151
|
+
def dirs(repo, repo_path, days, top, fmt, output_file, exclude, branch, skip_type):
|
|
150
152
|
"""Directory-level hotspot report."""
|
|
151
|
-
result = _run_analysis(repo, repo_path, days, exclude, branch)
|
|
153
|
+
result = _run_analysis(repo, repo_path, days, exclude, branch, skip_type)
|
|
152
154
|
_output_result(result, fmt, output_file, top, "dirs")
|
|
@@ -20,6 +20,21 @@ Usage:
|
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
22
|
# Re-export from client for backwards compatibility
|
|
23
|
+
# Import submodules to make them accessible
|
|
24
|
+
# CLI entry point - import module, not function, so "from jira import cli" gets the module
|
|
25
|
+
from pennyfarthing_scripts.jira import (
|
|
26
|
+
bidirectional,
|
|
27
|
+
claim,
|
|
28
|
+
cli,
|
|
29
|
+
client,
|
|
30
|
+
create,
|
|
31
|
+
epic,
|
|
32
|
+
operations,
|
|
33
|
+
reconcile,
|
|
34
|
+
story,
|
|
35
|
+
sync,
|
|
36
|
+
)
|
|
37
|
+
from pennyfarthing_scripts.jira.cli import main
|
|
23
38
|
from pennyfarthing_scripts.jira.client import (
|
|
24
39
|
# Constants
|
|
25
40
|
GITHUB_TO_JIRA_MAP,
|
|
@@ -44,23 +59,6 @@ from pennyfarthing_scripts.jira.client import (
|
|
|
44
59
|
update_issue_status,
|
|
45
60
|
)
|
|
46
61
|
|
|
47
|
-
# Import submodules to make them accessible
|
|
48
|
-
from pennyfarthing_scripts.jira import (
|
|
49
|
-
bidirectional,
|
|
50
|
-
claim,
|
|
51
|
-
client,
|
|
52
|
-
create,
|
|
53
|
-
epic,
|
|
54
|
-
operations,
|
|
55
|
-
reconcile,
|
|
56
|
-
story,
|
|
57
|
-
sync,
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
# CLI entry point - import module, not function, so "from jira import cli" gets the module
|
|
61
|
-
from pennyfarthing_scripts.jira import cli
|
|
62
|
-
from pennyfarthing_scripts.jira.cli import main
|
|
63
|
-
|
|
64
62
|
__all__ = [
|
|
65
63
|
# Constants
|
|
66
64
|
"GITHUB_TO_JIRA_MAP",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|