@pennyfarthing/core 7.0.2 → 7.4.1
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/LICENSE +14 -0
- package/README.md +2 -2
- package/package.json +11 -10
- package/packages/core/dist/cli/commands/cyclist.d.ts +2 -2
- package/packages/core/dist/cli/commands/cyclist.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/cyclist.js +8 -9
- package/packages/core/dist/cli/commands/cyclist.js.map +1 -1
- package/packages/core/dist/cli/commands/cyclist.test.js +6 -4
- package/packages/core/dist/cli/commands/cyclist.test.js.map +1 -1
- package/packages/core/dist/cli/commands/init.js +4 -3
- package/packages/core/dist/cli/commands/init.js.map +1 -1
- package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/update.js +15 -139
- package/packages/core/dist/cli/commands/update.js.map +1 -1
- package/packages/core/dist/cli/cyclist-migration.test.js +4 -3
- package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -1
- package/packages/core/dist/cli/utils/constants.d.ts +7 -1
- package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/constants.js +4 -2
- package/packages/core/dist/cli/utils/constants.js.map +1 -1
- package/packages/core/dist/cli/utils/node-modules.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/node-modules.js +2 -1
- package/packages/core/dist/cli/utils/node-modules.js.map +1 -1
- package/packages/core/dist/cli/utils/themes.d.ts +1 -4
- package/packages/core/dist/cli/utils/themes.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/themes.js +2 -22
- package/packages/core/dist/cli/utils/themes.js.map +1 -1
- package/packages/core/dist/cli/utils/themes.test.d.ts +3 -3
- package/packages/core/dist/cli/utils/themes.test.js +16 -13
- package/packages/core/dist/cli/utils/themes.test.js.map +1 -1
- package/packages/core/dist/cli/workspace.test.js +11 -9
- package/packages/core/dist/cli/workspace.test.js.map +1 -1
- package/packages/core/dist/index.d.ts +1 -0
- package/packages/core/dist/index.d.ts.map +1 -1
- package/packages/core/dist/index.js +10 -0
- package/packages/core/dist/index.js.map +1 -1
- package/packages/core/dist/jira/jira-epic-creation.d.ts +109 -0
- package/packages/core/dist/jira/jira-epic-creation.d.ts.map +1 -0
- package/packages/core/dist/jira/jira-epic-creation.js +253 -0
- package/packages/core/dist/jira/jira-epic-creation.js.map +1 -0
- package/packages/core/dist/jira/jira-epic-creation.test.d.ts +16 -0
- package/packages/core/dist/jira/jira-epic-creation.test.d.ts.map +1 -0
- package/packages/core/dist/jira/jira-epic-creation.test.js +387 -0
- package/packages/core/dist/jira/jira-epic-creation.test.js.map +1 -0
- package/packages/core/dist/jira/jira-sprint-sync.d.ts +247 -0
- package/packages/core/dist/jira/jira-sprint-sync.d.ts.map +1 -0
- package/packages/core/dist/jira/jira-sprint-sync.js +670 -0
- package/packages/core/dist/jira/jira-sprint-sync.js.map +1 -0
- package/packages/core/dist/jira/jira-sprint-sync.test.d.ts +16 -0
- package/packages/core/dist/jira/jira-sprint-sync.test.d.ts.map +1 -0
- package/packages/core/dist/jira/jira-sprint-sync.test.js +845 -0
- package/packages/core/dist/jira/jira-sprint-sync.test.js.map +1 -0
- package/packages/core/dist/scripts/generate-spider.d.ts +11 -1
- package/packages/core/dist/scripts/generate-spider.d.ts.map +1 -1
- package/packages/core/dist/scripts/generate-spider.js +24 -1
- package/packages/core/dist/scripts/generate-spider.js.map +1 -1
- package/packages/core/dist/scripts/generate-spider.test.js +6 -4
- package/packages/core/dist/scripts/generate-spider.test.js.map +1 -1
- package/packages/core/dist/workflow/gate-handler.d.ts +94 -0
- package/packages/core/dist/workflow/gate-handler.d.ts.map +1 -0
- package/packages/core/dist/workflow/gate-handler.js +189 -0
- package/packages/core/dist/workflow/gate-handler.js.map +1 -0
- package/packages/core/dist/workflow/gate-handler.test.d.ts +14 -0
- package/packages/core/dist/workflow/gate-handler.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/gate-handler.test.js +543 -0
- package/packages/core/dist/workflow/gate-handler.test.js.map +1 -0
- package/packages/core/dist/workflow/generic-handoff.d.ts +46 -0
- package/packages/core/dist/workflow/generic-handoff.d.ts.map +1 -1
- package/packages/core/dist/workflow/generic-handoff.js +53 -0
- package/packages/core/dist/workflow/generic-handoff.js.map +1 -1
- package/packages/core/dist/workflow/generic-handoff.test.js +2 -2
- package/packages/core/dist/workflow/generic-handoff.test.js.map +1 -1
- package/packages/core/dist/workflow/handoff.d.ts +281 -0
- package/packages/core/dist/workflow/handoff.d.ts.map +1 -0
- package/packages/core/dist/workflow/handoff.js +411 -0
- package/packages/core/dist/workflow/handoff.js.map +1 -0
- package/packages/core/dist/workflow/handoff.test.d.ts +21 -0
- package/packages/core/dist/workflow/handoff.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/handoff.test.js +499 -0
- package/packages/core/dist/workflow/handoff.test.js.map +1 -0
- package/packages/core/dist/workflow/index.d.ts +16 -0
- package/packages/core/dist/workflow/index.d.ts.map +1 -0
- package/packages/core/dist/workflow/index.js +24 -0
- package/packages/core/dist/workflow/index.js.map +1 -0
- package/packages/core/dist/workflow/session-state.d.ts +92 -0
- package/packages/core/dist/workflow/session-state.d.ts.map +1 -0
- package/packages/core/dist/workflow/session-state.js +198 -0
- package/packages/core/dist/workflow/session-state.js.map +1 -0
- package/packages/core/dist/workflow/session-state.test.d.ts +8 -0
- package/packages/core/dist/workflow/session-state.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/session-state.test.js +551 -0
- package/packages/core/dist/workflow/session-state.test.js.map +1 -0
- package/packages/core/dist/workflow/sm-subagents.test.d.ts +2 -2
- package/packages/core/dist/workflow/sm-subagents.test.js +6 -6
- package/packages/core/dist/workflow/sm-subagents.test.js.map +1 -1
- package/packages/core/dist/workflow/step-parser.d.ts +45 -0
- package/packages/core/dist/workflow/step-parser.d.ts.map +1 -0
- package/packages/core/dist/workflow/step-parser.js +147 -0
- package/packages/core/dist/workflow/step-parser.js.map +1 -0
- package/packages/core/dist/workflow/step-parser.test.d.ts +14 -0
- package/packages/core/dist/workflow/step-parser.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/step-parser.test.js +470 -0
- package/packages/core/dist/workflow/step-parser.test.js.map +1 -0
- package/packages/core/dist/workflow/trimodal.d.ts +86 -0
- package/packages/core/dist/workflow/trimodal.d.ts.map +1 -0
- package/packages/core/dist/workflow/trimodal.js +118 -0
- package/packages/core/dist/workflow/trimodal.js.map +1 -0
- package/packages/core/dist/workflow/trimodal.test.d.ts +11 -0
- package/packages/core/dist/workflow/trimodal.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/trimodal.test.js +395 -0
- package/packages/core/dist/workflow/trimodal.test.js.map +1 -0
- package/packages/core/dist/workflow/variable-resolver.d.ts +67 -0
- package/packages/core/dist/workflow/variable-resolver.d.ts.map +1 -0
- package/packages/core/dist/workflow/variable-resolver.js +156 -0
- package/packages/core/dist/workflow/variable-resolver.js.map +1 -0
- package/packages/core/dist/workflow/variable-resolver.test.d.ts +14 -0
- package/packages/core/dist/workflow/variable-resolver.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/variable-resolver.test.js +400 -0
- package/packages/core/dist/workflow/variable-resolver.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-executor.d.ts +163 -0
- package/packages/core/dist/workflow/workflow-executor.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-executor.js +197 -0
- package/packages/core/dist/workflow/workflow-executor.js.map +1 -0
- package/packages/core/dist/workflow/workflow-executor.test.d.ts +8 -0
- package/packages/core/dist/workflow/workflow-executor.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-executor.test.js +444 -0
- package/packages/core/dist/workflow/workflow-executor.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-loader.test.js +5 -5
- package/packages/core/dist/workflow/workflow-loader.test.js.map +1 -1
- package/packages/core/dist/workflow/workflow-migration.test.js +8 -9
- package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -1
- package/packages/core/dist/workflow/workflow-permissions.d.ts +55 -0
- package/packages/core/dist/workflow/workflow-permissions.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-permissions.js +64 -0
- package/packages/core/dist/workflow/workflow-permissions.js.map +1 -0
- package/packages/core/dist/workflow/workflow-permissions.test.d.ts +15 -0
- package/packages/core/dist/workflow/workflow-permissions.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-permissions.test.js +301 -0
- package/packages/core/dist/workflow/workflow-permissions.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-schema.d.ts +61 -2
- package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.js +293 -69
- package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.test.js +6 -6
- package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -1
- package/packages/core/dist/workflow/workflow-stepped-schema.test.d.ts +18 -0
- package/packages/core/dist/workflow/workflow-stepped-schema.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-stepped-schema.test.js +608 -0
- package/packages/core/dist/workflow/workflow-stepped-schema.test.js.map +1 -0
- package/pennyfarthing-dist/agents/README.md +63 -134
- package/pennyfarthing-dist/agents/architect.md +18 -10
- package/pennyfarthing-dist/agents/dev.md +47 -32
- package/pennyfarthing-dist/agents/devops.md +18 -9
- package/pennyfarthing-dist/agents/handoff.md +289 -0
- package/pennyfarthing-dist/agents/orchestrator.md +44 -22
- package/pennyfarthing-dist/agents/pm.md +13 -8
- package/pennyfarthing-dist/agents/reviewer-preflight.md +42 -128
- package/pennyfarthing-dist/agents/reviewer.md +104 -57
- package/pennyfarthing-dist/agents/sm-file-summary.md +24 -75
- package/pennyfarthing-dist/agents/sm-finish.md +61 -0
- package/pennyfarthing-dist/agents/sm-handoff.md +102 -54
- package/pennyfarthing-dist/agents/sm-setup.md +174 -0
- package/pennyfarthing-dist/agents/sm.md +223 -100
- package/pennyfarthing-dist/agents/tea.md +42 -34
- package/pennyfarthing-dist/agents/tech-writer.md +74 -6
- package/pennyfarthing-dist/agents/testing-runner.md +78 -360
- package/pennyfarthing-dist/agents/ux-designer.md +80 -7
- package/pennyfarthing-dist/agents/workflow-status-check.md +35 -299
- package/pennyfarthing-dist/commands/architect.md +2 -2
- package/pennyfarthing-dist/commands/close-epic.md +5 -2
- package/pennyfarthing-dist/commands/create-branches-from-story.md +7 -23
- package/pennyfarthing-dist/commands/dev.md +2 -2
- package/pennyfarthing-dist/commands/devops.md +3 -3
- package/pennyfarthing-dist/commands/git-cleanup.md +5 -5
- package/pennyfarthing-dist/commands/health-check.md +1 -1
- package/pennyfarthing-dist/commands/list-themes.md +7 -3
- package/pennyfarthing-dist/commands/orchestrator.md +2 -2
- package/pennyfarthing-dist/commands/parallel-work.md +4 -4
- package/pennyfarthing-dist/commands/pm.md +2 -2
- package/pennyfarthing-dist/commands/prime.md +7 -7
- package/pennyfarthing-dist/commands/release.md +1 -1
- package/pennyfarthing-dist/commands/repo-status.md +2 -2
- package/pennyfarthing-dist/commands/retro.md +2 -2
- package/pennyfarthing-dist/commands/reviewer.md +2 -2
- package/pennyfarthing-dist/commands/set-theme.md +5 -1
- package/pennyfarthing-dist/commands/sm.md +2 -2
- package/pennyfarthing-dist/commands/start-epic.md +26 -14
- package/pennyfarthing-dist/commands/sync-epic-to-jira.md +8 -8
- package/pennyfarthing-dist/commands/sync-work-with-sprint.md +1 -4
- package/pennyfarthing-dist/commands/tea.md +2 -2
- package/pennyfarthing-dist/commands/tech-writer.md +2 -2
- package/pennyfarthing-dist/commands/ux-designer.md +3 -3
- package/pennyfarthing-dist/commands/work.md +15 -4
- package/pennyfarthing-dist/commands/workflow.md +21 -0
- package/pennyfarthing-dist/guides/AGENT-COORDINATION.md +15 -15
- package/pennyfarthing-dist/guides/PROMPT-PATTERNS.md +1 -1
- package/pennyfarthing-dist/guides/SESSION-ARTIFACTS.md +4 -4
- package/pennyfarthing-dist/guides/agent-behavior.md +238 -0
- package/pennyfarthing-dist/guides/agent-template-strategic.md +2 -2
- package/pennyfarthing-dist/guides/agent-template-tactical.md +4 -4
- package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +1 -1
- package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +17 -17
- package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +8 -8
- package/pennyfarthing-dist/guides/workflow-schema.md +62 -0
- package/pennyfarthing-dist/guides/worktree-mode.md +5 -5
- package/pennyfarthing-dist/personas/themes/1984.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/a-team.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/agatha-christie.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/all-stars.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/ancient-philosophers.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/ancient-strategists.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/arcane.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/arthurian-mythos.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/avatar-the-last-airbender.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/babylon-5.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/better-call-saul.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/big-lebowski.yaml +2 -2
- package/pennyfarthing-dist/personas/themes/black-sails.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/blade-runner.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/bobiverse.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/breaking-bad.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/catch-22.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/classical-composers.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/control.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/count-of-monte-cristo.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/deadwood.yaml +2 -2
- package/pennyfarthing-dist/personas/themes/discworld.yaml +2 -2
- package/pennyfarthing-dist/personas/themes/doctor-who.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/enlightenment-thinkers.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/expeditionary-force.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/firefly.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/foundation.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/futurama.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +2 -2
- package/pennyfarthing-dist/personas/themes/gilligans-island.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/gothic-literature.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/great-gatsby.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/greek-mythology.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/harry-potter.yaml +2 -2
- package/pennyfarthing-dist/personas/themes/his-dark-materials.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/historical-figures.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/house-md.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/imperial-radch.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/jane-austen.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/jazz-legends.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/justified.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/legion-of-doom.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/les-miserables.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/lovecraft-mythos.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/mad-men.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/marvel-mcu.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/mash.yaml +69 -66
- package/pennyfarthing-dist/personas/themes/mass-effect.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/military-commanders.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/moby-dick.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/monty-python.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/neuromancer.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/norse-mythology.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/peaky-blinders.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/princess-bride.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/rome.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/russian-masters.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/sandman.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/shakespeare.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/sherlock-holmes.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/snow-crash.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/software-pioneers.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/star-trek-tos.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/star-wars.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/superfriends.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/the-americans.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/the-crown.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/the-expanse.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/the-good-place.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/the-office.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/the-simpsons.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/the-sopranos.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/the-wire.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/the-witcher.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/vorkosigan-saga.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/west-wing.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/wwii-leaders.yaml +1 -1
- package/pennyfarthing-dist/scripts/README.md +68 -0
- package/pennyfarthing-dist/scripts/core/README.md +26 -0
- package/pennyfarthing-dist/scripts/{agent-session.sh → core/agent-session.sh} +34 -23
- package/pennyfarthing-dist/scripts/{check-context.sh → core/check-context.sh} +93 -37
- package/pennyfarthing-dist/scripts/core/handoff-marker.sh +90 -0
- package/pennyfarthing-dist/scripts/core/prime.sh +136 -0
- package/pennyfarthing-dist/scripts/core/run.sh +75 -0
- package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +21 -0
- package/pennyfarthing-dist/scripts/git/README.md +25 -0
- package/pennyfarthing-dist/scripts/{utils → git}/create-feature-branches.sh +11 -15
- package/pennyfarthing-dist/scripts/{utils → git}/git-status-all.sh +1 -1
- package/pennyfarthing-dist/scripts/{install-git-hooks.sh → git/install-git-hooks.sh} +0 -0
- package/pennyfarthing-dist/scripts/{release.sh → git/release.sh} +0 -0
- package/pennyfarthing-dist/scripts/{worktree-manager.sh → git/worktree-manager.sh} +0 -4
- package/pennyfarthing-dist/scripts/hooks/README.md +32 -0
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +3 -4
- package/pennyfarthing-dist/scripts/hooks/context-warning.sh +1 -2
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/post-merge.sh +1 -1
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/session-start.sh +2 -3
- package/pennyfarthing-dist/scripts/hooks/session-stop.sh +2 -3
- package/pennyfarthing-dist/scripts/jira/README.md +33 -0
- package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +101 -0
- package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +97 -0
- package/pennyfarthing-dist/scripts/jira/jira-bidirectional-sync.mjs +327 -0
- package/pennyfarthing-dist/scripts/jira/jira-bidirectional-sync.test.mjs +503 -0
- package/pennyfarthing-dist/scripts/{utils → jira}/jira-claim-story.sh +8 -6
- package/pennyfarthing-dist/scripts/{utils/jira → jira}/jira-lib.mjs +10 -10
- package/pennyfarthing-dist/scripts/{utils → jira}/jira-lib.sh +18 -17
- package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +266 -0
- package/pennyfarthing-dist/scripts/{utils/jira → jira}/jira-sync-story.mjs +14 -14
- package/pennyfarthing-dist/scripts/{utils → jira}/jira-sync-story.sh +0 -0
- package/pennyfarthing-dist/scripts/{utils/jira → jira}/jira-sync.mjs +4 -4
- package/pennyfarthing-dist/scripts/{utils → jira}/jira-sync.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +104 -0
- package/pennyfarthing-dist/scripts/{utils → jira}/sync-epic-to-jira.sh +1 -1
- package/pennyfarthing-dist/scripts/lib/README.md +29 -0
- package/pennyfarthing-dist/scripts/{utils → lib}/background-tasks.sh +1 -1
- package/pennyfarthing-dist/scripts/{utils → lib}/checkpoint.sh +0 -0
- package/pennyfarthing-dist/scripts/{utils → lib}/common.sh +1 -1
- package/pennyfarthing-dist/scripts/{utils → lib}/file-lock.sh +0 -0
- package/pennyfarthing-dist/scripts/{utils → lib}/find-root.sh +7 -5
- package/pennyfarthing-dist/scripts/{utils → lib}/logging.sh +0 -0
- package/pennyfarthing-dist/scripts/{utils → lib}/retry.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/README.md +44 -0
- package/pennyfarthing-dist/scripts/{add-short-names.mjs → misc/add-short-names.mjs} +0 -0
- package/pennyfarthing-dist/scripts/misc/backlog.sh +91 -0
- package/pennyfarthing-dist/scripts/{utils → misc}/check-status.sh +4 -8
- package/pennyfarthing-dist/scripts/{deploy.sh → misc/deploy.sh} +0 -0
- package/pennyfarthing-dist/scripts/{doctor-dogfood.sh → misc/doctor-dogfood.sh} +2 -5
- package/pennyfarthing-dist/scripts/{utils → misc}/find-related-work.sh +0 -0
- package/pennyfarthing-dist/scripts/{utils → misc}/generate-skill-docs.sh +0 -0
- package/pennyfarthing-dist/scripts/{utils → misc}/log-skill-usage.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.mjs +474 -0
- package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +9 -0
- package/pennyfarthing-dist/scripts/{utils → misc}/repo-scan.sh +0 -0
- package/pennyfarthing-dist/scripts/{repo-utils.sh → misc/repo-utils.sh} +2 -2
- package/pennyfarthing-dist/scripts/{run-ci.sh → misc/run-ci.sh} +0 -0
- package/pennyfarthing-dist/scripts/{utils → misc}/run-timestamp.sh +0 -0
- package/pennyfarthing-dist/scripts/{utils → misc}/session-cleanup.sh +0 -0
- package/pennyfarthing-dist/scripts/{utils → misc}/skill-usage-report.sh +0 -0
- package/pennyfarthing-dist/scripts/{statusline.sh → misc/statusline.sh} +2 -7
- package/pennyfarthing-dist/scripts/{uninstall.sh → misc/uninstall.sh} +4 -5
- package/pennyfarthing-dist/scripts/{utils → misc}/validate-subagent-frontmatter.sh +3 -3
- package/pennyfarthing-dist/scripts/sprint/README.md +29 -0
- package/pennyfarthing-dist/scripts/sprint/archive-story.sh +135 -0
- package/pennyfarthing-dist/scripts/sprint/available-stories.sh +97 -0
- package/pennyfarthing-dist/scripts/sprint/check-story.sh +164 -0
- package/pennyfarthing-dist/scripts/sprint/get-epic-field.sh +58 -0
- package/pennyfarthing-dist/scripts/sprint/get-story-field.sh +69 -0
- package/pennyfarthing-dist/scripts/sprint/list-future.sh +151 -0
- package/pennyfarthing-dist/scripts/sprint/new-sprint.sh +116 -0
- package/pennyfarthing-dist/scripts/sprint/promote-epic.sh +164 -0
- package/pennyfarthing-dist/scripts/{utils → sprint}/sprint-common.sh +135 -0
- package/pennyfarthing-dist/scripts/sprint/sprint-info.sh +39 -0
- package/pennyfarthing-dist/scripts/{utils → sprint}/sprint-metrics.sh +0 -0
- package/pennyfarthing-dist/scripts/sprint/sprint-status.sh +134 -0
- package/pennyfarthing-dist/scripts/story/README.md +23 -0
- package/pennyfarthing-dist/scripts/story/create-story.sh +159 -0
- package/pennyfarthing-dist/scripts/story/size-story.sh +198 -0
- package/pennyfarthing-dist/scripts/story/story-template.sh +162 -0
- package/pennyfarthing-dist/scripts/test/README.md +23 -0
- package/pennyfarthing-dist/scripts/{utils → test}/swebench-judge.py +0 -0
- package/pennyfarthing-dist/scripts/test/test-cache.sh +165 -0
- package/pennyfarthing-dist/scripts/{utils → test}/test-setup.sh +5 -5
- package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +515 -0
- package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +599 -0
- package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +332 -0
- package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +573 -0
- package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +859 -0
- package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +662 -0
- package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +589 -0
- package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +7 -9
- package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +18 -18
- package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +10 -10
- package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +1 -1
- package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +647 -0
- package/pennyfarthing-dist/scripts/theme/README.md +22 -0
- package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +203 -0
- package/pennyfarthing-dist/scripts/theme/list-themes.sh +73 -0
- package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +97 -0
- package/pennyfarthing-dist/scripts/workflow/README.md +28 -0
- package/pennyfarthing-dist/scripts/{check.sh → workflow/check.sh} +0 -0
- package/pennyfarthing-dist/scripts/workflow/finish-story.sh +159 -0
- package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +228 -0
- package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +91 -0
- package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +163 -0
- package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +138 -0
- package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +256 -0
- package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +167 -0
- package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +6 -0
- package/pennyfarthing-dist/skills/changelog/SKILL.md +2 -2
- package/pennyfarthing-dist/skills/code-review/SKILL.md +3 -3
- package/pennyfarthing-dist/skills/context-engineering/SKILL.md +6 -0
- package/pennyfarthing-dist/skills/cyclist/SKILL.md +56 -139
- package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +21 -5
- package/pennyfarthing-dist/skills/finalize-run/SKILL.md +1 -1
- package/pennyfarthing-dist/skills/jira/SKILL.md +381 -178
- package/pennyfarthing-dist/skills/judge/SKILL.md +76 -21
- package/pennyfarthing-dist/skills/just/SKILL.md +345 -102
- package/pennyfarthing-dist/skills/otel/skill.md +1 -0
- package/pennyfarthing-dist/skills/permissions/skill.md +1 -1
- package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +5 -0
- package/pennyfarthing-dist/skills/skill-registry.schema.json +5 -0
- package/pennyfarthing-dist/skills/skill-registry.yaml +22 -0
- package/pennyfarthing-dist/skills/sprint/scripts/archive-story.sh +101 -0
- package/pennyfarthing-dist/skills/sprint/scripts/available-stories.sh +97 -0
- package/pennyfarthing-dist/skills/sprint/scripts/check-story.sh +164 -0
- package/pennyfarthing-dist/skills/sprint/scripts/create-jira-epic.sh +101 -0
- package/pennyfarthing-dist/skills/sprint/scripts/new-sprint.sh +116 -0
- package/pennyfarthing-dist/skills/sprint/scripts/promote-epic.sh +164 -0
- package/pennyfarthing-dist/skills/sprint/scripts/sprint-info.sh +39 -0
- package/pennyfarthing-dist/skills/sprint/scripts/sprint-status.sh +147 -0
- package/pennyfarthing-dist/skills/sprint/scripts/sync-epic-jira.sh +104 -0
- package/pennyfarthing-dist/skills/sprint/skill.md +465 -0
- package/pennyfarthing-dist/skills/story/scripts/create-story.sh +159 -0
- package/pennyfarthing-dist/skills/story/scripts/size-story.sh +198 -0
- package/pennyfarthing-dist/skills/story/scripts/story-template.sh +162 -0
- package/pennyfarthing-dist/skills/story/skill.md +219 -0
- package/pennyfarthing-dist/skills/systematic-debugging/SKILL.md +390 -0
- package/pennyfarthing-dist/skills/theme/skill.md +1 -1
- package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +91 -0
- package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +163 -0
- package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +138 -0
- package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +273 -0
- package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +167 -0
- package/pennyfarthing-dist/skills/workflow/skill.md +337 -0
- package/pennyfarthing-dist/templates/settings.local.json.template +1 -1
- package/pennyfarthing-dist/workflows/agent-docs.yaml +1 -1
- package/pennyfarthing-dist/workflows/architecture/steps/step-01-initialize.md +101 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-01b-continue.md +93 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-02-context.md +115 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-03-patterns.md +133 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-04-components.md +138 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-05-interfaces.md +133 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-06-risks.md +142 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-07-document.md +160 -0
- package/pennyfarthing-dist/workflows/architecture/templates/architecture-decision.md +102 -0
- package/pennyfarthing-dist/workflows/architecture.yaml +65 -0
- package/pennyfarthing-dist/workflows/bdd.yaml +3 -1
- package/pennyfarthing-dist/workflows/brainstorming/brain-methods.csv +62 -0
- package/pennyfarthing-dist/workflows/brainstorming/checklist.md +44 -0
- package/pennyfarthing-dist/workflows/brainstorming/instructions.md +736 -0
- package/pennyfarthing-dist/workflows/brainstorming/workflow.yaml +49 -0
- package/pennyfarthing-dist/workflows/code-review/checklist.md +23 -0
- package/pennyfarthing-dist/workflows/code-review/instructions.md +234 -0
- package/pennyfarthing-dist/workflows/code-review/workflow.yaml +51 -0
- package/pennyfarthing-dist/workflows/dev-story/checklist.md +80 -0
- package/pennyfarthing-dist/workflows/dev-story/instructions.xml +410 -0
- package/pennyfarthing-dist/workflows/dev-story/workflow.yaml +50 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-01-validate-prerequisites.md +256 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-02-design-epics.md +233 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-03-create-stories.md +272 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-04-final-validation.md +145 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/templates/epics-template.md +57 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/workflow.yaml +27 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-01-document-discovery.md +190 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-02-prd-analysis.md +178 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-04-ux-alignment.md +139 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-05-epic-quality-review.md +252 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-06-final-assessment.md +133 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/templates/readiness-report-template.md +4 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/workflow.yaml +40 -0
- package/pennyfarthing-dist/workflows/prd/data/domain-complexity.csv +13 -0
- package/pennyfarthing-dist/workflows/prd/data/prd-purpose.md +197 -0
- package/pennyfarthing-dist/workflows/prd/data/project-types.csv +11 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-01-init.md +191 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-01b-continue.md +153 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-02-discovery.md +224 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-03-success.md +226 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-04-journeys.md +213 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-05-domain.md +207 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-06-innovation.md +226 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-07-project-type.md +237 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-08-scoping.md +228 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-09-functional.md +231 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-10-nonfunctional.md +242 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-11-polish.md +217 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-12-complete.md +180 -0
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01-discovery.md +247 -0
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-02-review.md +249 -0
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-03-edit.md +253 -0
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-04-complete.md +168 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-01-discovery.md +218 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02-format-detection.md +191 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02b-parity-check.md +209 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-03-density-validation.md +174 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-05-measurability-validation.md +228 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-06-traceability-validation.md +217 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-09-project-type-validation.md +263 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-10-smart-validation.md +209 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-12-completeness-validation.md +242 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-13-report-complete.md +232 -0
- package/pennyfarthing-dist/workflows/prd/templates/prd-template.md +10 -0
- package/pennyfarthing-dist/workflows/prd/workflow.yaml +42 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-01-init.md +177 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-01b-continue.md +161 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-02-vision.md +199 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-03-users.md +202 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-04-metrics.md +205 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-05-scope.md +219 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-06-complete.md +194 -0
- package/pennyfarthing-dist/workflows/product-brief/templates/product-brief.template.md +10 -0
- package/pennyfarthing-dist/workflows/product-brief/workflow.yaml +31 -0
- package/pennyfarthing-dist/workflows/project-context/project-context-template.md +21 -0
- package/pennyfarthing-dist/workflows/project-context/steps/step-01-discover.md +184 -0
- package/pennyfarthing-dist/workflows/project-context/steps/step-02-generate.md +318 -0
- package/pennyfarthing-dist/workflows/project-context/steps/step-03-complete.md +278 -0
- package/pennyfarthing-dist/workflows/project-context/workflow.yaml +27 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-01-mode-detection.md +156 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-02-context-gathering.md +120 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-03-execute.md +113 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-04-self-check.md +113 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-05-adversarial-review.md +106 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-06-resolve-findings.md +140 -0
- package/pennyfarthing-dist/workflows/quick-dev/workflow.yaml +27 -0
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +189 -0
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +144 -0
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +128 -0
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +191 -0
- package/pennyfarthing-dist/workflows/quick-spec/tech-spec-template.md +74 -0
- package/pennyfarthing-dist/workflows/quick-spec/workflow.yaml +27 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-01-init.md +137 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-02-domain-analysis.md +229 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-03-competitive-landscape.md +238 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-04-regulatory-focus.md +206 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-05-technical-trends.md +234 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-06-research-synthesis.md +443 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-01-init.md +182 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-behavior.md +237 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-insights.md +200 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-03-customer-pain-points.md +249 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-04-customer-decisions.md +259 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-05-competitive-analysis.md +177 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-06-research-completion.md +475 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-01-init.md +137 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-02-technical-overview.md +239 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-03-integration-patterns.md +248 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-04-architectural-patterns.md +202 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-05-implementation-research.md +239 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-06-research-synthesis.md +486 -0
- package/pennyfarthing-dist/workflows/research/templates/research.template.md +29 -0
- package/pennyfarthing-dist/workflows/research/workflow.yaml +45 -0
- package/pennyfarthing-dist/workflows/retrospective/checklist.md +31 -0
- package/pennyfarthing-dist/workflows/retrospective/instructions.md +1443 -0
- package/pennyfarthing-dist/workflows/retrospective/workflow.yaml +50 -0
- package/pennyfarthing-dist/workflows/sprint-planning/checklist.md +33 -0
- package/pennyfarthing-dist/workflows/sprint-planning/sprint-status-template.yaml +55 -0
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-01-parse-epic-files.md +54 -0
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-02-build-sprint-status.md +44 -0
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-03-status-detection.md +64 -0
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-04-generate-status-file.md +73 -0
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-05-validate-and-report.md +56 -0
- package/pennyfarthing-dist/workflows/sprint-planning/workflow.yaml +34 -0
- package/pennyfarthing-dist/workflows/trivial.yaml +1 -1
- package/pennyfarthing-dist/workflows/ux-design/steps/step-01-init.md +135 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-01b-continue.md +127 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-02-discovery.md +190 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-03-core-experience.md +216 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-04-emotional-response.md +219 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-05-inspiration.md +234 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-06-design-system.md +252 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-07-defining-experience.md +254 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-08-visual-foundation.md +224 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-09-design-directions.md +224 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-10-user-journeys.md +241 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-11-component-strategy.md +248 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-12-ux-patterns.md +237 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-13-responsive-accessibility.md +264 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-14-complete.md +228 -0
- package/pennyfarthing-dist/workflows/ux-design/ux-design-template.md +13 -0
- package/pennyfarthing-dist/workflows/ux-design/workflow.yaml +41 -0
- package/packages/core/dist/scripts/generate-all-faces.d.ts +0 -10
- package/packages/core/dist/scripts/generate-all-faces.d.ts.map +0 -1
- package/packages/core/dist/scripts/generate-all-faces.js +0 -256
- package/packages/core/dist/scripts/generate-all-faces.js.map +0 -1
- package/packages/core/dist/scripts/generate-all-faces.test.d.ts +0 -17
- package/packages/core/dist/scripts/generate-all-faces.test.d.ts.map +0 -1
- package/packages/core/dist/scripts/generate-all-faces.test.js +0 -372
- package/packages/core/dist/scripts/generate-all-faces.test.js.map +0 -1
- package/packages/core/dist/scripts/generate-ascii-face.d.ts +0 -52
- package/packages/core/dist/scripts/generate-ascii-face.d.ts.map +0 -1
- package/packages/core/dist/scripts/generate-ascii-face.js +0 -155
- package/packages/core/dist/scripts/generate-ascii-face.js.map +0 -1
- package/packages/core/dist/scripts/generate-face.d.ts +0 -52
- package/packages/core/dist/scripts/generate-face.d.ts.map +0 -1
- package/packages/core/dist/scripts/generate-face.js +0 -199
- package/packages/core/dist/scripts/generate-face.js.map +0 -1
- package/packages/core/dist/scripts/generate-face.test.d.ts +0 -13
- package/packages/core/dist/scripts/generate-face.test.d.ts.map +0 -1
- package/packages/core/dist/scripts/generate-face.test.js +0 -301
- package/packages/core/dist/scripts/generate-face.test.js.map +0 -1
- package/pennyfarthing-dist/agents/generic-handoff.md +0 -454
- package/pennyfarthing-dist/agents/generic-sm-finish.md +0 -261
- package/pennyfarthing-dist/agents/generic-sm-setup.md +0 -214
- package/pennyfarthing-dist/commands/new-work.md +0 -127
- package/pennyfarthing-dist/guides/AGENT-SCOPES.md +0 -201
- package/pennyfarthing-dist/guides/persona-system.md +0 -294
- package/pennyfarthing-dist/guides/shared-agent-behavior.md +0 -388
- package/pennyfarthing-dist/guides/shared-context.md +0 -147
- package/pennyfarthing-dist/guides/strategic-agent-behavior.md +0 -348
- package/pennyfarthing-dist/guides/tactical-agent-behavior.md +0 -1041
- package/pennyfarthing-dist/scripts/prime.sh +0 -161
- package/pennyfarthing-dist/scripts/run.sh +0 -65
- package/pennyfarthing-dist/skills/sprint-context/SKILL.md +0 -120
- package/pennyfarthing-dist/skills/story-management/SKILL.md +0 -208
- package/pennyfarthing-dist/skills/workflow/SKILL.md +0 -160
- /package/pennyfarthing-dist/commands/{brainstorm.md → brainstorming.md} +0 -0
- /package/pennyfarthing-dist/scripts/{utils → test}/ground-truth-judge.py +0 -0
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: systematic-debugging
|
|
3
|
+
description: Systematic debugging approach for isolating and fixing issues. Use when debugging failures, investigating errors, bisecting regressions, or validating fixes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Systematic Debugging Skill
|
|
7
|
+
|
|
8
|
+
**Purpose:** Guide methodical debugging to find root causes, not just symptoms.
|
|
9
|
+
|
|
10
|
+
**Use when:** Bug reports, test failures, unexpected behavior, regressions.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## When to Use This Skill
|
|
15
|
+
|
|
16
|
+
- Debugging test failures or unexpected behavior
|
|
17
|
+
- Investigating error messages or stack traces
|
|
18
|
+
- Bisecting to find when a regression was introduced
|
|
19
|
+
- Validating that a fix addresses root cause, not just symptoms
|
|
20
|
+
- Intermittent failures that are hard to reproduce
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## The Debugging Cycle
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
1. REPRODUCE → Make the failure happen reliably
|
|
28
|
+
2. ISOLATE → Narrow down to minimal reproducer
|
|
29
|
+
3. HYPOTHESIZE → Form theory about root cause
|
|
30
|
+
4. TEST → Validate or invalidate hypothesis
|
|
31
|
+
5. FIX → Implement solution
|
|
32
|
+
6. VERIFY → Confirm fix addresses root cause
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Quick Reference
|
|
36
|
+
|
|
37
|
+
| Phase | Question to Answer | Output |
|
|
38
|
+
|-------|-------------------|--------|
|
|
39
|
+
| REPRODUCE | Can I make it fail consistently? | Reliable reproduction steps |
|
|
40
|
+
| ISOLATE | What's the minimal code/input that triggers it? | Minimal reproducer |
|
|
41
|
+
| HYPOTHESIZE | What could cause this behavior? | Ranked list of theories |
|
|
42
|
+
| TEST | Does evidence support my theory? | Confirmed or refuted hypothesis |
|
|
43
|
+
| FIX | What's the minimal change to fix it? | Working code |
|
|
44
|
+
| VERIFY | Does the fix address root cause? | Regression test |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Phase 1: REPRODUCE
|
|
49
|
+
|
|
50
|
+
**Goal:** Make the failure happen reliably.
|
|
51
|
+
|
|
52
|
+
### Steps
|
|
53
|
+
|
|
54
|
+
1. **Document exact error** - Copy the full error message, stack trace, logs
|
|
55
|
+
2. **Capture environment** - Versions, configuration, system state
|
|
56
|
+
3. **Create reproduction steps** - Exact commands/actions to trigger
|
|
57
|
+
4. **Test reproduction** - Run it 3+ times to confirm consistency
|
|
58
|
+
|
|
59
|
+
### For Intermittent Failures
|
|
60
|
+
|
|
61
|
+
| Pattern | Approach |
|
|
62
|
+
|---------|----------|
|
|
63
|
+
| Race condition | Add delays, run in tight loop, stress test |
|
|
64
|
+
| State-dependent | Reset to clean state, document preconditions |
|
|
65
|
+
| Environment-specific | Compare working vs failing environments |
|
|
66
|
+
| Timing-dependent | Add timestamps, check for timeouts |
|
|
67
|
+
|
|
68
|
+
### Example
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Document the failure
|
|
72
|
+
$ npm test -- -t "user authentication"
|
|
73
|
+
# Error: Expected 200 but got 401
|
|
74
|
+
|
|
75
|
+
# Capture environment
|
|
76
|
+
$ node --version # v18.17.0
|
|
77
|
+
$ npm --version # 9.6.7
|
|
78
|
+
|
|
79
|
+
# Reproduction steps
|
|
80
|
+
1. Start fresh database: docker-compose down -v && docker-compose up -d
|
|
81
|
+
2. Run: npm test -- -t "user authentication"
|
|
82
|
+
3. Observe: 401 error on third test
|
|
83
|
+
|
|
84
|
+
# Verify reproduction
|
|
85
|
+
$ npm test -- -t "user authentication" # Fails
|
|
86
|
+
$ npm test -- -t "user authentication" # Fails
|
|
87
|
+
$ npm test -- -t "user authentication" # Fails - consistent!
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Phase 2: ISOLATE
|
|
93
|
+
|
|
94
|
+
**Goal:** Narrow down to the smallest code/input that triggers the bug.
|
|
95
|
+
|
|
96
|
+
### Techniques
|
|
97
|
+
|
|
98
|
+
#### Binary Search (Code)
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
1. Find a known-good commit
|
|
102
|
+
2. Find the failing commit
|
|
103
|
+
3. git bisect between them
|
|
104
|
+
4. Each step: test, mark good/bad
|
|
105
|
+
5. Arrive at first bad commit
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
git bisect start
|
|
110
|
+
git bisect bad HEAD
|
|
111
|
+
git bisect good v1.2.0
|
|
112
|
+
# Git checks out middle commit
|
|
113
|
+
npm test -- -t "failing test"
|
|
114
|
+
git bisect bad # or good
|
|
115
|
+
# Repeat until found
|
|
116
|
+
git bisect reset
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
#### Minimal Reproducer
|
|
120
|
+
|
|
121
|
+
1. Start with failing test/code
|
|
122
|
+
2. Remove components one at a time
|
|
123
|
+
3. Stop when removal fixes the bug
|
|
124
|
+
4. The last removed component is involved
|
|
125
|
+
|
|
126
|
+
#### Variable Elimination
|
|
127
|
+
|
|
128
|
+
| Remove | Still fails? | Conclusion |
|
|
129
|
+
|--------|--------------|------------|
|
|
130
|
+
| External API calls | Yes | Not API-related |
|
|
131
|
+
| Database queries | No | Database-related |
|
|
132
|
+
| Specific table | Yes | Not that table |
|
|
133
|
+
| Auth middleware | No | Auth is involved |
|
|
134
|
+
|
|
135
|
+
### Example
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
// Full failing code
|
|
139
|
+
async function createUser(data) {
|
|
140
|
+
validateInput(data);
|
|
141
|
+
const hash = await hashPassword(data.password);
|
|
142
|
+
const user = await db.insert({ ...data, password: hash });
|
|
143
|
+
await sendWelcomeEmail(user.email);
|
|
144
|
+
return user;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Minimal reproducer (isolated the issue)
|
|
148
|
+
async function createUser(data) {
|
|
149
|
+
const user = await db.insert(data); // Fails here!
|
|
150
|
+
return user;
|
|
151
|
+
}
|
|
152
|
+
// Conclusion: Issue is in db.insert, not validation/email
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Phase 3: HYPOTHESIZE
|
|
158
|
+
|
|
159
|
+
**Goal:** Form testable theories about root cause.
|
|
160
|
+
|
|
161
|
+
### Common Root Causes
|
|
162
|
+
|
|
163
|
+
| Category | Examples |
|
|
164
|
+
|----------|----------|
|
|
165
|
+
| State | Uninitialized variable, stale cache, leftover data |
|
|
166
|
+
| Timing | Race condition, timeout, async ordering |
|
|
167
|
+
| Input | Edge case, null/undefined, empty collection, boundary |
|
|
168
|
+
| Environment | Missing env var, wrong version, config mismatch |
|
|
169
|
+
| Logic | Off-by-one, wrong operator, incorrect condition |
|
|
170
|
+
|
|
171
|
+
### Hypothesis Formation
|
|
172
|
+
|
|
173
|
+
1. **Read the error message carefully** - Often tells you exactly what's wrong
|
|
174
|
+
2. **Check recent changes** - `git log --oneline -20`, `git diff HEAD~5`
|
|
175
|
+
3. **Consider edge cases** - What if null? Empty? Max value?
|
|
176
|
+
4. **Look for patterns** - When does it fail vs succeed?
|
|
177
|
+
|
|
178
|
+
### Rank Hypotheses
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
Hypothesis 1 (HIGH): Database connection timing out
|
|
182
|
+
- Evidence: Error mentions timeout, happens under load
|
|
183
|
+
- Test: Check connection pool settings
|
|
184
|
+
|
|
185
|
+
Hypothesis 2 (MEDIUM): Invalid input not validated
|
|
186
|
+
- Evidence: Stack trace shows null pointer in parser
|
|
187
|
+
- Test: Add input validation logging
|
|
188
|
+
|
|
189
|
+
Hypothesis 3 (LOW): Bug in library
|
|
190
|
+
- Evidence: Nothing obvious in our code
|
|
191
|
+
- Test: Check library issues, try downgrade
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Phase 4: TEST
|
|
197
|
+
|
|
198
|
+
**Goal:** Validate or invalidate each hypothesis.
|
|
199
|
+
|
|
200
|
+
### Testing Approaches
|
|
201
|
+
|
|
202
|
+
| Approach | When to Use |
|
|
203
|
+
|----------|-------------|
|
|
204
|
+
| Add logging | Need to see values at runtime |
|
|
205
|
+
| Debugger breakpoint | Need to inspect state interactively |
|
|
206
|
+
| Unit test | Can isolate the specific function |
|
|
207
|
+
| Print statements | Quick check in specific location |
|
|
208
|
+
| Assertion | Verify assumption holds |
|
|
209
|
+
|
|
210
|
+
### Logging Strategy
|
|
211
|
+
|
|
212
|
+
```typescript
|
|
213
|
+
// Add strategic logging
|
|
214
|
+
console.log('[DEBUG] Input:', JSON.stringify(data));
|
|
215
|
+
console.log('[DEBUG] Before DB call, user:', user?.id);
|
|
216
|
+
console.log('[DEBUG] After DB call, result:', result);
|
|
217
|
+
console.log('[DEBUG] Query took:', endTime - startTime, 'ms');
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Hypothesis Testing
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
HYPOTHESIS: Connection pool exhausted under load
|
|
224
|
+
|
|
225
|
+
TEST 1: Check pool stats
|
|
226
|
+
> db.pool.stats()
|
|
227
|
+
{ active: 50, idle: 0, waiting: 12 } // Pool full!
|
|
228
|
+
|
|
229
|
+
TEST 2: Increase pool size
|
|
230
|
+
> config.pool.max = 100
|
|
231
|
+
> Rerun test
|
|
232
|
+
> PASS
|
|
233
|
+
|
|
234
|
+
CONCLUSION: Hypothesis confirmed. Pool too small.
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### When Hypothesis is Wrong
|
|
238
|
+
|
|
239
|
+
If evidence doesn't support your theory:
|
|
240
|
+
1. Don't force-fit the evidence
|
|
241
|
+
2. Return to HYPOTHESIZE phase
|
|
242
|
+
3. Form new theory based on new observations
|
|
243
|
+
4. Repeat until you find the cause
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Phase 5: FIX
|
|
248
|
+
|
|
249
|
+
**Goal:** Implement the minimal change that fixes the issue.
|
|
250
|
+
|
|
251
|
+
### Fix Principles
|
|
252
|
+
|
|
253
|
+
1. **Fix the root cause, not the symptom**
|
|
254
|
+
- BAD: Add try/catch to hide the error
|
|
255
|
+
- GOOD: Fix why the error occurs
|
|
256
|
+
|
|
257
|
+
2. **Minimal change**
|
|
258
|
+
- Change only what's necessary
|
|
259
|
+
- Don't refactor while fixing bugs
|
|
260
|
+
|
|
261
|
+
3. **One fix per bug**
|
|
262
|
+
- Don't bundle unrelated changes
|
|
263
|
+
- Makes it clear what fixed what
|
|
264
|
+
|
|
265
|
+
### Fix Template
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
// BEFORE: Bug - pool exhaustion under load
|
|
269
|
+
const pool = new Pool({ max: 10 });
|
|
270
|
+
|
|
271
|
+
// AFTER: Fix - increase pool size based on expected load
|
|
272
|
+
const pool = new Pool({
|
|
273
|
+
max: 50, // Increased from 10 to handle peak load
|
|
274
|
+
idleTimeoutMillis: 30000,
|
|
275
|
+
});
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## Phase 6: VERIFY
|
|
281
|
+
|
|
282
|
+
**Goal:** Confirm the fix addresses root cause and doesn't break anything else.
|
|
283
|
+
|
|
284
|
+
### Verification Checklist
|
|
285
|
+
|
|
286
|
+
- [ ] Original reproduction steps now pass
|
|
287
|
+
- [ ] New test case covers the bug (regression test)
|
|
288
|
+
- [ ] Existing tests still pass
|
|
289
|
+
- [ ] Fix doesn't introduce new issues
|
|
290
|
+
- [ ] Fix addresses root cause, not just symptom
|
|
291
|
+
|
|
292
|
+
### Write a Regression Test
|
|
293
|
+
|
|
294
|
+
```typescript
|
|
295
|
+
// This test should have caught the bug
|
|
296
|
+
test('handles concurrent requests without pool exhaustion', async () => {
|
|
297
|
+
const requests = Array(100).fill(null).map(() => api.createUser());
|
|
298
|
+
const results = await Promise.all(requests);
|
|
299
|
+
expect(results.every(r => r.status === 201)).toBe(true);
|
|
300
|
+
});
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Symptom vs Root Cause Check
|
|
304
|
+
|
|
305
|
+
Ask yourself:
|
|
306
|
+
- "Would this bug happen again in a different form?"
|
|
307
|
+
- "Did I fix WHY it happened, or just WHAT happened?"
|
|
308
|
+
|
|
309
|
+
| Fix | Symptom or Root Cause? |
|
|
310
|
+
|-----|------------------------|
|
|
311
|
+
| Add null check | Symptom (why is it null?) |
|
|
312
|
+
| Initialize variable properly | Root cause |
|
|
313
|
+
| Increase timeout | Symptom (why is it slow?) |
|
|
314
|
+
| Fix N+1 query | Root cause |
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
## Debugging Anti-Patterns
|
|
319
|
+
|
|
320
|
+
### What NOT to Do
|
|
321
|
+
|
|
322
|
+
| Anti-Pattern | Why It's Bad | Instead |
|
|
323
|
+
|--------------|--------------|---------|
|
|
324
|
+
| Random changes | Introduces new bugs, wastes time | Follow the cycle |
|
|
325
|
+
| Fix without reproducing | Can't verify fix works | Always reproduce first |
|
|
326
|
+
| Blame external factors | Delays finding real cause | Assume it's your code |
|
|
327
|
+
| Skip verification | Bug may not be fixed | Always verify |
|
|
328
|
+
| Big refactor as "fix" | Hides what actually fixed it | Minimal changes |
|
|
329
|
+
|
|
330
|
+
### Common Traps
|
|
331
|
+
|
|
332
|
+
1. **Confirmation bias** - Looking for evidence that supports your theory
|
|
333
|
+
2. **Premature optimization** - Fixing performance before correctness
|
|
334
|
+
3. **Tunnel vision** - Fixating on one hypothesis
|
|
335
|
+
4. **Solution jumping** - Skipping to fix before understanding
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## Quick Debugging Commands
|
|
340
|
+
|
|
341
|
+
### Git Bisect (Find Regression)
|
|
342
|
+
|
|
343
|
+
```bash
|
|
344
|
+
git bisect start
|
|
345
|
+
git bisect bad # Current commit is bad
|
|
346
|
+
git bisect good v1.0.0 # Known good commit
|
|
347
|
+
# Run test, then:
|
|
348
|
+
git bisect good # or bad
|
|
349
|
+
# Repeat until found
|
|
350
|
+
git bisect reset
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### Find Recent Changes
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
# What changed recently?
|
|
357
|
+
git log --oneline -20
|
|
358
|
+
git diff HEAD~5
|
|
359
|
+
|
|
360
|
+
# Who changed this file?
|
|
361
|
+
git blame path/to/file.ts
|
|
362
|
+
|
|
363
|
+
# When did this line change?
|
|
364
|
+
git log -p -S "problematic code" -- path/to/file.ts
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### Check Running Processes
|
|
368
|
+
|
|
369
|
+
```bash
|
|
370
|
+
# What's using resources?
|
|
371
|
+
ps aux | grep node
|
|
372
|
+
lsof -i :3000
|
|
373
|
+
|
|
374
|
+
# Check memory/CPU
|
|
375
|
+
top -l 1 | head -20
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
## Integration with Other Skills
|
|
381
|
+
|
|
382
|
+
| Skill | How It Complements |
|
|
383
|
+
|-------|-------------------|
|
|
384
|
+
| `/testing` | Run tests to verify fixes |
|
|
385
|
+
| `/dev-patterns` | Avoid common pitfalls |
|
|
386
|
+
| `/agentic-patterns` | ReAct pattern for systematic investigation |
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
**Remember:** Debugging is detective work. Follow the evidence, test your theories, and fix the root cause. Rushing leads to band-aid fixes that break later.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: theme
|
|
3
|
-
description: Manage persona themes - list available themes, show current/specific theme details, and set active theme. Use
|
|
3
|
+
description: Manage persona themes - list available themes, show current/specific theme details, and set active theme. Use when switching persona themes, viewing available characters, or checking which theme is currently active.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Theme Management Skill
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# List all available workflows with type indicators
|
|
3
|
+
# Usage: .pennyfarthing/scripts/core/run.sh workflow/list-workflows.sh
|
|
4
|
+
# or: Invoked with PROJECT_ROOT already set
|
|
5
|
+
#
|
|
6
|
+
# MSSCI-12083: Added type, steps, and modes columns
|
|
7
|
+
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
|
|
10
|
+
# PROJECT_ROOT should be set by run.sh, but find it if not
|
|
11
|
+
if [[ -z "${PROJECT_ROOT:-}" ]]; then
|
|
12
|
+
d="$PWD"
|
|
13
|
+
while [[ ! -d "$d/.claude" ]] && [[ "$d" != "/" ]]; do
|
|
14
|
+
d="$(dirname "$d")"
|
|
15
|
+
done
|
|
16
|
+
PROJECT_ROOT="$d"
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
WORKFLOWS_DIR="$PROJECT_ROOT/pennyfarthing-dist/workflows"
|
|
20
|
+
|
|
21
|
+
if [[ ! -d "$WORKFLOWS_DIR" ]]; then
|
|
22
|
+
echo "Error: Workflows directory not found at $WORKFLOWS_DIR"
|
|
23
|
+
exit 1
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
if ! command -v yq &> /dev/null; then
|
|
27
|
+
echo "Error: yq is required but not installed"
|
|
28
|
+
echo "Install with: brew install yq"
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
echo "# Available Workflows"
|
|
33
|
+
echo ""
|
|
34
|
+
echo "| Workflow | Type | Default | Steps/Phases | Modes | Description |"
|
|
35
|
+
echo "|----------|------|---------|--------------|-------|-------------|"
|
|
36
|
+
|
|
37
|
+
for f in "$WORKFLOWS_DIR"/*.yaml; do
|
|
38
|
+
[[ -f "$f" ]] || continue
|
|
39
|
+
|
|
40
|
+
name=$(yq eval '.workflow.name' "$f")
|
|
41
|
+
desc=$(yq eval '.workflow.description' "$f" | head -1)
|
|
42
|
+
is_default=$(yq eval '.workflow.triggers.default // false' "$f")
|
|
43
|
+
|
|
44
|
+
# Detect workflow type (stepped vs phased)
|
|
45
|
+
# Stepped workflows have .workflow.type == "stepped" or .workflow.steps
|
|
46
|
+
workflow_type=$(yq eval '.workflow.type // "phased"' "$f")
|
|
47
|
+
has_steps=$(yq eval '.workflow.steps != null' "$f")
|
|
48
|
+
|
|
49
|
+
if [[ "$has_steps" == "true" ]] || [[ "$workflow_type" == "stepped" ]]; then
|
|
50
|
+
type_col="stepped"
|
|
51
|
+
# Count step files if steps.path is defined
|
|
52
|
+
steps_path=$(yq eval '.workflow.steps.path // ""' "$f")
|
|
53
|
+
steps_pattern=$(yq eval '.workflow.steps.pattern // "step-*.md"' "$f")
|
|
54
|
+
if [[ -n "$steps_path" ]] && [[ -d "$PROJECT_ROOT/$steps_path" ]]; then
|
|
55
|
+
step_count=$(find "$PROJECT_ROOT/$steps_path" -name "$steps_pattern" 2>/dev/null | wc -l | tr -d ' ')
|
|
56
|
+
steps_col="${step_count} steps"
|
|
57
|
+
else
|
|
58
|
+
steps_col="-"
|
|
59
|
+
fi
|
|
60
|
+
else
|
|
61
|
+
type_col="phased"
|
|
62
|
+
# Count phases for phased workflows
|
|
63
|
+
phase_count=$(yq eval '.workflow.phases | length' "$f")
|
|
64
|
+
steps_col="${phase_count} phases"
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
# Default column
|
|
68
|
+
if [[ "$is_default" == "true" ]]; then
|
|
69
|
+
default_col="yes"
|
|
70
|
+
else
|
|
71
|
+
default_col="no"
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
# Modes column (for tri-modal workflows)
|
|
75
|
+
modes=$(yq eval '.workflow.modes.available // []' "$f")
|
|
76
|
+
if [[ "$modes" != "[]" ]] && [[ "$modes" != "null" ]]; then
|
|
77
|
+
# Format as comma-separated list
|
|
78
|
+
modes_col=$(yq eval '.workflow.modes.available | join(",")' "$f")
|
|
79
|
+
else
|
|
80
|
+
modes_col="-"
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
echo "| $name | $type_col | $default_col | $steps_col | $modes_col | $desc |"
|
|
84
|
+
done
|
|
85
|
+
|
|
86
|
+
echo ""
|
|
87
|
+
echo "**Legend:**"
|
|
88
|
+
echo "- **phased**: Agent-driven workflow (SM → TEA → Dev → Reviewer)"
|
|
89
|
+
echo "- **stepped**: Step-by-step guided workflow with progressive disclosure"
|
|
90
|
+
echo ""
|
|
91
|
+
echo "Use \`/workflow show <name>\` for workflow details."
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Resume a stepped workflow from last completed step
|
|
3
|
+
# Usage: .pennyfarthing/scripts/core/run.sh workflow/resume-workflow.sh [name]
|
|
4
|
+
#
|
|
5
|
+
# If no name provided, detects from active session
|
|
6
|
+
|
|
7
|
+
set -euo pipefail
|
|
8
|
+
|
|
9
|
+
# PROJECT_ROOT should be set by run.sh, but find it if not
|
|
10
|
+
if [[ -z "${PROJECT_ROOT:-}" ]]; then
|
|
11
|
+
d="$PWD"
|
|
12
|
+
while [[ ! -d "$d/.claude" ]] && [[ "$d" != "/" ]]; do
|
|
13
|
+
d="$(dirname "$d")"
|
|
14
|
+
done
|
|
15
|
+
PROJECT_ROOT="$d"
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
WORKFLOWS_DIR="$PROJECT_ROOT/pennyfarthing-dist/workflows"
|
|
19
|
+
SESSION_DIR="$PROJECT_ROOT/.session"
|
|
20
|
+
|
|
21
|
+
if ! command -v yq &> /dev/null; then
|
|
22
|
+
echo "Error: yq is required but not installed"
|
|
23
|
+
echo "Install with: brew install yq"
|
|
24
|
+
exit 1
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
WORKFLOW_NAME="${1:-}"
|
|
28
|
+
|
|
29
|
+
# If no name, try to detect from session
|
|
30
|
+
if [[ -z "$WORKFLOW_NAME" ]]; then
|
|
31
|
+
# Look for workflow session files
|
|
32
|
+
SESSION_FILE=$(find "$SESSION_DIR" -maxdepth 1 -name "*-workflow-session.md" 2>/dev/null | head -1)
|
|
33
|
+
|
|
34
|
+
if [[ -z "$SESSION_FILE" ]]; then
|
|
35
|
+
echo "# Resume Stepped Workflow"
|
|
36
|
+
echo ""
|
|
37
|
+
echo "No active workflow session found."
|
|
38
|
+
echo ""
|
|
39
|
+
echo "Use \`/workflow start <name>\` to begin a new workflow."
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
# Extract workflow name from session
|
|
44
|
+
WORKFLOW_NAME=$(grep -E "^\*\*Workflow:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/\*\*Workflow:\*\* //' | tr -d ' ')
|
|
45
|
+
|
|
46
|
+
if [[ -z "$WORKFLOW_NAME" ]]; then
|
|
47
|
+
# Try extracting from filename
|
|
48
|
+
WORKFLOW_NAME=$(basename "$SESSION_FILE" | sed 's/-workflow-session.md//')
|
|
49
|
+
fi
|
|
50
|
+
else
|
|
51
|
+
SESSION_FILE="$SESSION_DIR/${WORKFLOW_NAME}-workflow-session.md"
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
if [[ ! -f "$SESSION_FILE" ]]; then
|
|
55
|
+
echo "Error: No session found for workflow '$WORKFLOW_NAME'"
|
|
56
|
+
echo ""
|
|
57
|
+
echo "Use \`/workflow start $WORKFLOW_NAME\` to begin."
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
# Find workflow file
|
|
62
|
+
WORKFLOW_FILE=""
|
|
63
|
+
if [[ -f "$WORKFLOWS_DIR/${WORKFLOW_NAME}.yaml" ]]; then
|
|
64
|
+
WORKFLOW_FILE="$WORKFLOWS_DIR/${WORKFLOW_NAME}.yaml"
|
|
65
|
+
elif [[ -f "$WORKFLOWS_DIR/${WORKFLOW_NAME}/workflow.yaml" ]]; then
|
|
66
|
+
WORKFLOW_FILE="$WORKFLOWS_DIR/${WORKFLOW_NAME}/workflow.yaml"
|
|
67
|
+
else
|
|
68
|
+
echo "Error: Workflow definition '$WORKFLOW_NAME' not found"
|
|
69
|
+
exit 1
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
WORKFLOW_DIR=$(dirname "$WORKFLOW_FILE")
|
|
73
|
+
|
|
74
|
+
# Parse session state
|
|
75
|
+
CURRENT_STEP=$(grep -E "^\- \*\*Current Step:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' || echo "1")
|
|
76
|
+
MODE=$(grep -E "^\- \*\*Mode:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' || echo "create")
|
|
77
|
+
STATUS=$(grep -E "^\- \*\*Status:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' || echo "in_progress")
|
|
78
|
+
STEPS_COMPLETED=$(grep -E "^\- \*\*Steps Completed:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' || echo "[]")
|
|
79
|
+
|
|
80
|
+
# Check if workflow is complete
|
|
81
|
+
if [[ "$STATUS" == "completed" ]]; then
|
|
82
|
+
echo "# Workflow Complete: $WORKFLOW_NAME"
|
|
83
|
+
echo ""
|
|
84
|
+
echo "This workflow has already been completed."
|
|
85
|
+
echo ""
|
|
86
|
+
echo "To start a new session, delete the session file:"
|
|
87
|
+
echo "\`\`\`bash"
|
|
88
|
+
echo "rm \"$SESSION_FILE\""
|
|
89
|
+
echo "\`\`\`"
|
|
90
|
+
echo ""
|
|
91
|
+
echo "Then run \`/workflow start $WORKFLOW_NAME\`"
|
|
92
|
+
exit 0
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
# Resolve steps path based on mode
|
|
96
|
+
MODE_PATH=$(yq eval ".workflow.modes.$MODE // \"\"" "$WORKFLOW_FILE")
|
|
97
|
+
if [[ -n "$MODE_PATH" && "$MODE_PATH" != "null" ]]; then
|
|
98
|
+
STEPS_PATH="$MODE_PATH"
|
|
99
|
+
else
|
|
100
|
+
STEPS_PATH=$(yq eval '.workflow.steps.path' "$WORKFLOW_FILE")
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
# Resolve relative path
|
|
104
|
+
if [[ "$STEPS_PATH" == ./* ]]; then
|
|
105
|
+
STEPS_PATH="$WORKFLOW_DIR/${STEPS_PATH#./}"
|
|
106
|
+
elif [[ "$STEPS_PATH" != /* ]]; then
|
|
107
|
+
STEPS_PATH="$PROJECT_ROOT/$STEPS_PATH"
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
# Count steps
|
|
111
|
+
STEP_COUNT=$(find "$STEPS_PATH" -maxdepth 1 -name "step-0*.md" -o -name "step-1*.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
112
|
+
|
|
113
|
+
# Find the current step file
|
|
114
|
+
# Handle various naming: step-01.md, step-01-name.md, step-1-name.md
|
|
115
|
+
PADDED_STEP=$(printf "%02d" "$CURRENT_STEP")
|
|
116
|
+
STEP_FILE=$(find "$STEPS_PATH" -maxdepth 1 \( -name "step-${PADDED_STEP}*.md" -o -name "step-${CURRENT_STEP}-*.md" \) 2>/dev/null | sort | head -1)
|
|
117
|
+
|
|
118
|
+
if [[ -z "$STEP_FILE" ]]; then
|
|
119
|
+
echo "Error: Could not find step $CURRENT_STEP file in $STEPS_PATH"
|
|
120
|
+
exit 1
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
# Update last updated timestamp
|
|
124
|
+
NOW=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
125
|
+
sed -i '' "s/^\- \*\*Last Updated:\*\*.*/- **Last Updated:** $NOW/" "$SESSION_FILE" 2>/dev/null || true
|
|
126
|
+
|
|
127
|
+
# Calculate completion percentage
|
|
128
|
+
COMPLETED_COUNT=$(echo "$STEPS_COMPLETED" | tr -cd ',' | wc -c | tr -d ' ')
|
|
129
|
+
if [[ "$STEPS_COMPLETED" != "[]" ]]; then
|
|
130
|
+
COMPLETED_COUNT=$((COMPLETED_COUNT + 1))
|
|
131
|
+
fi
|
|
132
|
+
if [[ "$STEP_COUNT" -gt 0 ]]; then
|
|
133
|
+
COMPLETION_PCT=$((COMPLETED_COUNT * 100 / STEP_COUNT))
|
|
134
|
+
else
|
|
135
|
+
COMPLETION_PCT=0
|
|
136
|
+
fi
|
|
137
|
+
|
|
138
|
+
# Output resume info
|
|
139
|
+
echo "# Resuming Workflow: $WORKFLOW_NAME"
|
|
140
|
+
echo ""
|
|
141
|
+
echo "**Mode:** $MODE"
|
|
142
|
+
echo "**Progress:** Step $CURRENT_STEP of $STEP_COUNT ($COMPLETION_PCT% complete)"
|
|
143
|
+
echo "**Steps Completed:** $STEPS_COMPLETED"
|
|
144
|
+
echo "**Session:** $SESSION_FILE"
|
|
145
|
+
echo ""
|
|
146
|
+
echo "---"
|
|
147
|
+
echo ""
|
|
148
|
+
echo "## Step $CURRENT_STEP of $STEP_COUNT"
|
|
149
|
+
echo ""
|
|
150
|
+
|
|
151
|
+
# Output step content (strip frontmatter if present)
|
|
152
|
+
if head -1 "$STEP_FILE" | grep -q "^---$"; then
|
|
153
|
+
awk '/^---$/{if(++c==2){p=1;next}}p' "$STEP_FILE"
|
|
154
|
+
else
|
|
155
|
+
cat "$STEP_FILE"
|
|
156
|
+
fi
|
|
157
|
+
|
|
158
|
+
echo ""
|
|
159
|
+
echo "---"
|
|
160
|
+
echo ""
|
|
161
|
+
echo "**Controls:**"
|
|
162
|
+
echo "- \`C\` - Continue to next step"
|
|
163
|
+
echo "- \`/workflow status\` - Check progress"
|