@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
|
@@ -30,7 +30,6 @@ Opus Agent (strategic)
|
|
|
30
30
|
│
|
|
31
31
|
└── Delegates mechanical work via Task tool
|
|
32
32
|
│
|
|
33
|
-
├── workflow-status-check (state detection)
|
|
34
33
|
├── sm-setup (research backlog or setup story)
|
|
35
34
|
├── sm-finish (preflight checks or execute finish)
|
|
36
35
|
├── sm-handoff (SM→TEA/Dev with Jira/branch verification)
|
|
@@ -54,7 +53,7 @@ The key insight: **Make critical behaviors AUTOMATIC via subagent delegation** r
|
|
|
54
53
|
└────────┬─────────┘
|
|
55
54
|
│
|
|
56
55
|
│ Task tool invocation
|
|
57
|
-
│ subagent_type: "
|
|
56
|
+
│ subagent_type: "sm-setup"
|
|
58
57
|
│
|
|
59
58
|
▼
|
|
60
59
|
┌──────────────────┐
|
|
@@ -87,8 +86,6 @@ The key insight: **Make critical behaviors AUTOMATIC via subagent delegation** r
|
|
|
87
86
|
┌─────────────────────────────────────────────────────────────────────────┐
|
|
88
87
|
│ CATEGORY │ SUBAGENT │ PURPOSE │
|
|
89
88
|
├───────────────────┼────────────────────────┼────────────────────────────┤
|
|
90
|
-
│ State Detection │ workflow-status-check │ Scan files, report state │
|
|
91
|
-
├───────────────────┼────────────────────────┼────────────────────────────┤
|
|
92
89
|
│ Setup/Init │ sm-setup │ Research or setup (MODE) │
|
|
93
90
|
│ │ sm-handoff │ SM→TEA/Dev with Jira/branch│
|
|
94
91
|
├───────────────────┼────────────────────────┼────────────────────────────┤
|
|
@@ -109,14 +106,14 @@ Use Claude Code's Task tool with the `subagent_type` parameter:
|
|
|
109
106
|
|
|
110
107
|
```yaml
|
|
111
108
|
Task tool:
|
|
112
|
-
subagent_type: "
|
|
109
|
+
subagent_type: "sm-setup"
|
|
113
110
|
model: "haiku" # Optional, defaults to haiku
|
|
114
|
-
description: "
|
|
111
|
+
description: "Research backlog"
|
|
115
112
|
prompt: |
|
|
116
|
-
|
|
113
|
+
MODE: research
|
|
117
114
|
PROJECT_ROOT: $CLAUDE_PROJECT_DIR
|
|
118
115
|
|
|
119
|
-
Scan
|
|
116
|
+
Scan sprint backlog and report available stories.
|
|
120
117
|
```
|
|
121
118
|
|
|
122
119
|
### Placeholder Substitution
|
|
@@ -185,47 +182,6 @@ $CLAUDE_PROJECT_DIR (set by SessionStart hook)
|
|
|
185
182
|
[Retry pattern and escalation format]
|
|
186
183
|
```
|
|
187
184
|
|
|
188
|
-
### Real Example: workflow-status-check
|
|
189
|
-
|
|
190
|
-
**Definition** (from `agents/workflow-status-check.md:14-45`):
|
|
191
|
-
|
|
192
|
-
```bash
|
|
193
|
-
# Step 1: Scan Session Files
|
|
194
|
-
ls -la .session/*-session.md 2>/dev/null
|
|
195
|
-
|
|
196
|
-
for f in .session/*-session.md; do
|
|
197
|
-
[ -f "$f" ] && head -50 "$f"
|
|
198
|
-
done
|
|
199
|
-
|
|
200
|
-
# Extract: Story ID, Phase, Status, Branch, Jira key
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
**State Determination** (lines 89-100):
|
|
204
|
-
|
|
205
|
-
```
|
|
206
|
-
Rules applied in order:
|
|
207
|
-
1. MISSING_EPIC_CONTEXT: No epic context AND no sessions
|
|
208
|
-
2. FINISH_STATE: Phase=approved OR (Phase=review AND Status=approved)
|
|
209
|
-
3. NEW_WORK_STATE: No sessions AND no in_progress stories
|
|
210
|
-
4. IN_PROGRESS_STATE: Session exists with active phase
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
**Output** (lines 129-183):
|
|
214
|
-
|
|
215
|
-
```markdown
|
|
216
|
-
## Workflow Status Report
|
|
217
|
-
|
|
218
|
-
### Detected State
|
|
219
|
-
**{STATE}**
|
|
220
|
-
|
|
221
|
-
### Active Work Sessions
|
|
222
|
-
| Story | Phase | Status | Days Active |
|
|
223
|
-
|-------|-------|--------|-------------|
|
|
224
|
-
|
|
225
|
-
### Agent Guidance
|
|
226
|
-
**For {CALLING_AGENT}:** {specific action}
|
|
227
|
-
```
|
|
228
|
-
|
|
229
185
|
### Real Example: tea-handoff
|
|
230
186
|
|
|
231
187
|
**Pre-flight Verification** (from `agents/tea-handoff.md:29-40`):
|
|
@@ -281,7 +237,6 @@ The Opus agent reads this report and decides next steps—it doesn't re-execute
|
|
|
281
237
|
|
|
282
238
|
| Scenario | Subagent | Why |
|
|
283
239
|
|----------|----------|-----|
|
|
284
|
-
| Determining workflow state | `workflow-status-check` | Scanning files is mechanical |
|
|
285
240
|
| Creating branches/sessions | `sm-setup MODE=setup` | Git operations are deterministic |
|
|
286
241
|
| Verifying test state | `testing-runner` | Test execution is mechanical |
|
|
287
242
|
| Updating session files | `handoff` | State updates must be reliable |
|
|
@@ -353,11 +308,7 @@ Recommended fix: [what calling agent should do]
|
|
|
353
308
|
|
|
354
309
|
### Never Silently Fail
|
|
355
310
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
> If partial failure, report what worked and mark unknowns. **Never silently fail.**
|
|
359
|
-
|
|
360
|
-
Subagents must always return a result, even if partial. The calling agent decides how to proceed.
|
|
311
|
+
Subagents must always return a result, even if partial. The calling agent decides how to proceed. **Never silently fail.**
|
|
361
312
|
|
|
362
313
|
## Anti-Patterns
|
|
363
314
|
|
|
@@ -424,13 +375,13 @@ prompt: |
|
|
|
424
375
|
|
|
425
376
|
**Wrong:**
|
|
426
377
|
```
|
|
427
|
-
Opus spawns
|
|
378
|
+
Opus spawns sm-setup, ignores output, proceeds anyway
|
|
428
379
|
```
|
|
429
380
|
|
|
430
381
|
**Correct:**
|
|
431
382
|
```
|
|
432
|
-
Opus spawns
|
|
433
|
-
→ Reads
|
|
383
|
+
Opus spawns sm-setup
|
|
384
|
+
→ Reads result (backlog stories, setup confirmation, etc.)
|
|
434
385
|
→ Branches logic based on result
|
|
435
386
|
```
|
|
436
387
|
|
|
@@ -463,7 +414,6 @@ If edit fails:
|
|
|
463
414
|
## References
|
|
464
415
|
|
|
465
416
|
### Subagent Definitions
|
|
466
|
-
- State Detection: `agents/workflow-status-check.md`
|
|
467
417
|
- SM Setup/Research: `agents/sm-setup.md`
|
|
468
418
|
- SM Finish: `agents/sm-finish.md`
|
|
469
419
|
- SM Handoff: `agents/sm-handoff.md`
|
|
@@ -158,7 +158,7 @@ The session file (`.session/{story-id}-session.md`) tracks state:
|
|
|
158
158
|
**Files:** `agents/sm.md`
|
|
159
159
|
|
|
160
160
|
Key behaviors:
|
|
161
|
-
-
|
|
161
|
+
- Reads workflow state from prime activation output
|
|
162
162
|
- Creates story context with technical approach
|
|
163
163
|
- Routes to TEA (standard) or Dev (trivial)
|
|
164
164
|
- Handles finish flow when story approved
|
|
@@ -291,7 +291,7 @@ Session file tracks rejection count and issues.
|
|
|
291
291
|
### Missing Epic Context
|
|
292
292
|
|
|
293
293
|
```
|
|
294
|
-
User runs /new-work →
|
|
294
|
+
User runs /new-work → prime detects no epic context
|
|
295
295
|
→ Returns MISSING_EPIC_CONTEXT state
|
|
296
296
|
→ Blocks until user runs /start-epic
|
|
297
297
|
```
|
|
@@ -315,7 +315,7 @@ This prevents context overflow mid-flow.
|
|
|
315
315
|
|
|
316
316
|
If a session file exists but work was interrupted:
|
|
317
317
|
|
|
318
|
-
1.
|
|
318
|
+
1. Prime detects `IN_PROGRESS_STATE` in activation output
|
|
319
319
|
2. Reports which agent should resume
|
|
320
320
|
3. User decides: continue or abandon
|
|
321
321
|
|
|
@@ -393,8 +393,7 @@ Each story: 5-15 files, focused changes
|
|
|
393
393
|
- TEA Agent: `agents/tea.md`
|
|
394
394
|
- Dev Agent: `agents/dev.md`
|
|
395
395
|
- Reviewer Agent: `agents/reviewer.md`
|
|
396
|
-
-
|
|
397
|
-
- Tactical Agent Behavior: `guides/tactical-agent-behavior.md`
|
|
396
|
+
- Agent Behavior: `guides/agent-behavior.md`
|
|
398
397
|
|
|
399
398
|
---
|
|
400
399
|
|
|
@@ -52,8 +52,8 @@ Prime selects a context tier based on session state to manage token overhead:
|
|
|
52
52
|
## Invocation
|
|
53
53
|
|
|
54
54
|
```bash
|
|
55
|
-
# From agent commands (via CLI)
|
|
56
|
-
|
|
55
|
+
# From agent commands (via pf CLI)
|
|
56
|
+
pf agent start "<agent>" --quiet
|
|
57
57
|
|
|
58
58
|
# TypeScript API (from Cyclist)
|
|
59
59
|
getPrimeContext(agentName, projectDir)
|
|
@@ -7,7 +7,7 @@ Pennyfarthing uses scale levels (0-4) to route work to appropriate workflows. Sc
|
|
|
7
7
|
| Level | Scope | Story Count | Workflow | Required Artifacts |
|
|
8
8
|
|-------|-------|-------------|----------|-------------------|
|
|
9
9
|
| **0** | fix, bug, typo, small change, patch | 1 | `trivial` | None |
|
|
10
|
-
| **1** | simple, basic, small feature, add | 1-10 | `
|
|
10
|
+
| **1** | simple, basic, small feature, add | 1-10 | `prd` | tech-spec |
|
|
11
11
|
| **2** | dashboard, several features, admin panel | 5-15 | `prd` | PRD |
|
|
12
12
|
| **3** | platform, integration, complex, system | 12-40 | `prd` | PRD + architecture |
|
|
13
13
|
| **4** | enterprise, multi-tenant, multiple products | 40+ | `prd` | Full BMAD process |
|
|
@@ -38,8 +38,7 @@ When you describe work to Pennyfarthing, the scale level is detected from keywor
|
|
|
38
38
|
| Level | Workflow | Description |
|
|
39
39
|
|-------|----------|-------------|
|
|
40
40
|
| 0 | `trivial` | Direct fix, no planning artifacts |
|
|
41
|
-
| 1 | `
|
|
42
|
-
| 2-4 | `prd` | Full PRD workflow with gates |
|
|
41
|
+
| 1-4 | `prd` | PRD workflow with gates |
|
|
43
42
|
|
|
44
43
|
## Required Artifacts
|
|
45
44
|
|
|
@@ -47,7 +46,7 @@ When you describe work to Pennyfarthing, the scale level is detected from keywor
|
|
|
47
46
|
Just fix it. No planning documents required.
|
|
48
47
|
|
|
49
48
|
### Level 1: Tech-Spec
|
|
50
|
-
|
|
49
|
+
Lightweight PRD producing implementation-ready technical specification.
|
|
51
50
|
|
|
52
51
|
### Level 2: PRD
|
|
53
52
|
Product Requirements Document. Architecture is optional.
|
|
@@ -102,7 +101,7 @@ info = get_scale_level_info(level)
|
|
|
102
101
|
| Description | Detected Level | Workflow |
|
|
103
102
|
|-------------|----------------|----------|
|
|
104
103
|
| "Fix the login bug" | 0 | trivial |
|
|
105
|
-
| "Add a logout button" | 1 |
|
|
104
|
+
| "Add a logout button" | 1 | prd |
|
|
106
105
|
| "Build an admin dashboard" | 2 | prd |
|
|
107
106
|
| "New platform for data processing" | 3 | prd |
|
|
108
107
|
| "Enterprise multi-tenant SaaS" | 4 | prd |
|
|
@@ -111,4 +110,3 @@ info = get_scale_level_info(level)
|
|
|
111
110
|
|
|
112
111
|
- [Workflow Skill](/workflow) - Workflow management commands
|
|
113
112
|
- [PRD Workflow](../workflows/prd/) - Full PRD stepped workflow
|
|
114
|
-
- [Quick-Spec Workflow](../workflows/quick-spec/) - Lightweight spec workflow
|
|
@@ -292,7 +292,7 @@ Never manually edit sprint YAML. Use the provided commands.
|
|
|
292
292
|
Add a new story to an epic.
|
|
293
293
|
|
|
294
294
|
<run>
|
|
295
|
-
|
|
295
|
+
pf sprint story add <epic-id> "<title>" <points>
|
|
296
296
|
</run>
|
|
297
297
|
|
|
298
298
|
<args>
|
|
@@ -304,7 +304,7 @@ python3 -m pennyfarthing_scripts.cli sprint story add <epic-id> "<title>" <point
|
|
|
304
304
|
</args>
|
|
305
305
|
|
|
306
306
|
<example>
|
|
307
|
-
|
|
307
|
+
pf sprint story add epic-76 "Add user authentication" 3
|
|
308
308
|
</example>
|
|
309
309
|
|
|
310
310
|
<output>
|
|
@@ -322,7 +322,7 @@ After creating, use `/sprint story size` for sizing guidelines.
|
|
|
322
322
|
Complete a story after PR merge.
|
|
323
323
|
|
|
324
324
|
<run>
|
|
325
|
-
|
|
325
|
+
pf sprint story finish <story-id>
|
|
326
326
|
</run>
|
|
327
327
|
|
|
328
328
|
<args>
|
|
@@ -332,7 +332,7 @@ python3 -m pennyfarthing_scripts.cli sprint story finish <story-id>
|
|
|
332
332
|
</args>
|
|
333
333
|
|
|
334
334
|
<example>
|
|
335
|
-
|
|
335
|
+
pf sprint story finish MSSCI-12052
|
|
336
336
|
# Archives story, updates Jira, cleans session files
|
|
337
337
|
</example>
|
|
338
338
|
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Tandem Protocol Guide
|
|
2
|
+
|
|
3
|
+
Tandem mode pairs a background observer ("backseat") with the primary agent during a workflow phase. The backseat watches the primary agent's work and writes observations to a shared file. The PostToolUse hook automatically injects those observations into the primary agent's context.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
Primary Agent (Opus) Backseat Agent (Haiku, background)
|
|
9
|
+
│ │
|
|
10
|
+
├── works on story ├── watches via git diff / file reads
|
|
11
|
+
│ │
|
|
12
|
+
│ ├── writes observation to
|
|
13
|
+
│ │ .session/{story}-tandem-{partner}.md
|
|
14
|
+
│ │
|
|
15
|
+
├── PostToolUse hook fires ────┤
|
|
16
|
+
│ bell-mode-hook.sh detects │
|
|
17
|
+
│ new observation, injects │
|
|
18
|
+
│ "[Tandem] Character: ..." │
|
|
19
|
+
│ │
|
|
20
|
+
├── surfaces in own voice │
|
|
21
|
+
│ "The Caterpillar notes..." │
|
|
22
|
+
│ │
|
|
23
|
+
└── terminates backseat ───────┘
|
|
24
|
+
before handoff
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Prerequisites
|
|
28
|
+
|
|
29
|
+
- Workflow must have `tandem:` block on the phase (e.g., `tdd-tandem`, `bdd-tandem`)
|
|
30
|
+
- Session file must contain `**Tandem:** {partner} ({scope})` line (written by handoff subagent)
|
|
31
|
+
|
|
32
|
+
No configuration required. Tandem injection is always active in the PostToolUse hook — the presence of observation files in `.session/` is the only signal needed. Works in both CLI and Cyclist.
|
|
33
|
+
|
|
34
|
+
## How It Works
|
|
35
|
+
|
|
36
|
+
### 1. Detection
|
|
37
|
+
|
|
38
|
+
On activation, agents check the session file for a `**Tandem:**` line:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
**Tandem:** architect (file-watch)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
If present, the agent spawns a backseat observer. If absent, tandem is a complete no-op.
|
|
45
|
+
|
|
46
|
+
### 2. Persona Resolution
|
|
47
|
+
|
|
48
|
+
The backseat agent plays its character from the active theme:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
THEME=$(yq '.theme' .pennyfarthing/config.local.yaml)
|
|
52
|
+
CHARACTER=$(yq ".agents.{PARTNER}.character" .pennyfarthing/personas/themes/${THEME}.yaml)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 3. Observation File Initialization
|
|
56
|
+
|
|
57
|
+
The primary agent creates the observation file before spawning the backseat:
|
|
58
|
+
|
|
59
|
+
```markdown
|
|
60
|
+
# Tandem Observations: {STORY_ID}
|
|
61
|
+
**Observer:** {PARTNER} ({CHARACTER})
|
|
62
|
+
**Phase:** {PHASE}
|
|
63
|
+
**Started:** {ISO_TIMESTAMP}
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
File path: `.session/{STORY_ID}-tandem-{PARTNER}.md`
|
|
69
|
+
|
|
70
|
+
### 4. Backseat Spawn
|
|
71
|
+
|
|
72
|
+
Via the Task tool:
|
|
73
|
+
|
|
74
|
+
```yaml
|
|
75
|
+
subagent_type: "general-purpose"
|
|
76
|
+
model: "haiku"
|
|
77
|
+
run_in_background: true
|
|
78
|
+
prompt: |
|
|
79
|
+
Read .pennyfarthing/agents/tandem-backseat.md for your instructions.
|
|
80
|
+
|
|
81
|
+
PARTNER: "{PARTNER}"
|
|
82
|
+
CHARACTER: "{CHARACTER}"
|
|
83
|
+
STORY_ID: "{STORY_ID}"
|
|
84
|
+
SCOPE: "{SCOPE}"
|
|
85
|
+
OBSERVATION_FILE: ".session/{STORY_ID}-tandem-{PARTNER}.md"
|
|
86
|
+
SESSION_FILE: ".session/{STORY_ID}-session.md"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 5. Observation Injection
|
|
90
|
+
|
|
91
|
+
The PostToolUse hook (tandem injection runs unconditionally, no config required):
|
|
92
|
+
1. Checks `.session/*-tandem-*.md` files for mtime changes
|
|
93
|
+
2. Parses the latest `## [HH:MM] Observation` block
|
|
94
|
+
3. Extracts the persona from the `**Observer:**` header
|
|
95
|
+
4. Injects as: `[Tandem] {Character}: {observation text}`
|
|
96
|
+
|
|
97
|
+
### 6. Surfacing Observations
|
|
98
|
+
|
|
99
|
+
When the primary agent receives a tandem injection, it surfaces the observation in its own voice using the backseat's character name:
|
|
100
|
+
|
|
101
|
+
> "The Caterpillar notes that `UserService.ts:42` returns null instead of the result object AC-3 requires."
|
|
102
|
+
|
|
103
|
+
### 7. Cleanup
|
|
104
|
+
|
|
105
|
+
Before handoff, the primary agent terminates the backseat background task. This must happen before spawning the handoff subagent.
|
|
106
|
+
|
|
107
|
+
## Observation Scopes
|
|
108
|
+
|
|
109
|
+
| Scope | What the backseat monitors |
|
|
110
|
+
|-------|---------------------------|
|
|
111
|
+
| `file-watch` | `git diff --stat`, changed file inspection, pattern drift |
|
|
112
|
+
| `tool-watch` | Tool call log (`.session/{story}-tool-log.md`), test failures, edit patterns |
|
|
113
|
+
| `context-watch` | Session file progress, AC coverage, scope drift |
|
|
114
|
+
|
|
115
|
+
## Observation File Format
|
|
116
|
+
|
|
117
|
+
Each entry follows this format (matches `observation-writer.ts`):
|
|
118
|
+
|
|
119
|
+
```markdown
|
|
120
|
+
## [HH:MM] Observation
|
|
121
|
+
**Trigger:** {scope}: {detail}
|
|
122
|
+
{observation text}
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Tandem Workflow Pairings
|
|
128
|
+
|
|
129
|
+
From `tdd-tandem.yaml`:
|
|
130
|
+
|
|
131
|
+
| Phase | Primary | Backseat | Scope |
|
|
132
|
+
|-------|---------|----------|-------|
|
|
133
|
+
| red | TEA | Architect | file-watch |
|
|
134
|
+
| green | Dev | TEA | file-watch |
|
|
135
|
+
| review | Reviewer | PM | file-watch |
|
|
136
|
+
|
|
137
|
+
From `bdd-tandem.yaml`:
|
|
138
|
+
|
|
139
|
+
| Phase | Primary | Backseat | Scope |
|
|
140
|
+
|-------|---------|----------|-------|
|
|
141
|
+
| design | UX Designer | Architect | file-watch |
|
|
142
|
+
| red | TEA | Architect | file-watch |
|
|
143
|
+
| green | Dev | UX Designer | file-watch |
|
|
144
|
+
| review | Reviewer | PM | file-watch |
|
|
145
|
+
|
|
146
|
+
## Related Infrastructure
|
|
147
|
+
|
|
148
|
+
| Component | Status | Purpose |
|
|
149
|
+
|-----------|--------|---------|
|
|
150
|
+
| `tandem-lifecycle.ts` | Built | Library module for future WheelHub integration |
|
|
151
|
+
| `observation-writer.ts` | Built | TypeScript API for observation file I/O |
|
|
152
|
+
| `file-watch.ts` | Built | File system change detection |
|
|
153
|
+
| `tool-watch.ts` | Built | Tool call log monitoring |
|
|
154
|
+
| `bell-mode-hook.sh` | Built | PostToolUse hook with tandem injection |
|
|
155
|
+
| `bellmode_hook.py` | Built | Python implementation of bell mode hook |
|
|
156
|
+
| `statusline.sh` | Built | CLI statusline with tandem indicator |
|
|
157
|
+
| `tandem-backseat.md` | Built | Backseat agent prompt template |
|
|
158
|
+
| `agent-behavior.md` | Built | Shared agent behavior with tandem protocol |
|
|
@@ -12,7 +12,7 @@ theme:
|
|
|
12
12
|
default_emoji_use: minimal
|
|
13
13
|
default_humor: enabled
|
|
14
14
|
character_immersion: high
|
|
15
|
-
user_title: Citizen of Ankh-Morpork
|
|
15
|
+
user_title: Citizen of Ankh-Morpork
|
|
16
16
|
portrait_style: ", ink and wash illustration, satirical fantasy, whimsical yet serious"
|
|
17
17
|
tier: A
|
|
18
18
|
dimensions:
|