@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
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Chernoff Face Generator - OCEAN → SVG
|
|
3
|
-
*
|
|
4
|
-
* Story 11-3: Build Chernoff face generator (OCEAN → SVG)
|
|
5
|
-
*
|
|
6
|
-
* This module takes OCEAN personality scores and generates SVG Chernoff faces.
|
|
7
|
-
* Mapping follows the OCEAN-TO-FACE.md specification.
|
|
8
|
-
*/
|
|
9
|
-
export interface OceanScores {
|
|
10
|
-
O: number;
|
|
11
|
-
C: number;
|
|
12
|
-
E: number;
|
|
13
|
-
A: number;
|
|
14
|
-
N: number;
|
|
15
|
-
}
|
|
16
|
-
export interface FaceParams {
|
|
17
|
-
eyeRadius: number;
|
|
18
|
-
pupilRadius: number;
|
|
19
|
-
faceWidth: number;
|
|
20
|
-
faceHeight: number;
|
|
21
|
-
cornerRadius: number;
|
|
22
|
-
mouthWidth: number;
|
|
23
|
-
mouthCurve: number;
|
|
24
|
-
eyebrowAngle: number;
|
|
25
|
-
strokeWidth: number;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Load OCEAN scores from a theme YAML file for a specific agent
|
|
29
|
-
*/
|
|
30
|
-
export declare function loadThemeOcean(theme: string, agent: string): OceanScores;
|
|
31
|
-
/**
|
|
32
|
-
* Map OCEAN scores to SVG face parameters per OCEAN-TO-FACE.md spec
|
|
33
|
-
*
|
|
34
|
-
* Mappings (adjusted for visibility):
|
|
35
|
-
* - O (Openness) → Eye size: 1→8px, 5→18px (more extreme)
|
|
36
|
-
* - C (Conscientiousness) → Face shape: 1→95x95 round, 5→85x105 angular (reduced variance)
|
|
37
|
-
* - E (Extraversion) → Mouth width: 1→12px, 5→50px (more extreme)
|
|
38
|
-
* - A (Agreeableness) → Eyebrow angle: 1→-20°, 5→+20° (more extreme)
|
|
39
|
-
* - N (Neuroticism) → Stroke width: 1→1.5px, 5→4px (more visible)
|
|
40
|
-
*/
|
|
41
|
-
export declare function oceanToParams(ocean: OceanScores): FaceParams;
|
|
42
|
-
/**
|
|
43
|
-
* Generate SVG string from face parameters
|
|
44
|
-
* @param params - Face parameters from oceanToParams
|
|
45
|
-
* @param backgroundColor - Optional background color (hex string)
|
|
46
|
-
*/
|
|
47
|
-
export declare function generateSvgFromParams(params: FaceParams, backgroundColor?: string): string;
|
|
48
|
-
/**
|
|
49
|
-
* Main function: Generate SVG face for a theme's agent
|
|
50
|
-
*/
|
|
51
|
-
export declare function generateFace(theme: string, agent: string): string;
|
|
52
|
-
//# sourceMappingURL=generate-face.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate-face.d.ts","sourceRoot":"","sources":["../../src/scripts/generate-face.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAgBD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAgCxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,CAuC5D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAoG1F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjE"}
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Chernoff Face Generator - OCEAN → SVG
|
|
3
|
-
*
|
|
4
|
-
* Story 11-3: Build Chernoff face generator (OCEAN → SVG)
|
|
5
|
-
*
|
|
6
|
-
* This module takes OCEAN personality scores and generates SVG Chernoff faces.
|
|
7
|
-
* Mapping follows the OCEAN-TO-FACE.md specification.
|
|
8
|
-
*/
|
|
9
|
-
import { readFileSync, existsSync } from 'fs';
|
|
10
|
-
import { join, dirname } from 'path';
|
|
11
|
-
import { fileURLToPath } from 'url';
|
|
12
|
-
import { parse as parseYaml } from 'yaml';
|
|
13
|
-
import { findMonorepoRoot } from '../cli/utils/files.js';
|
|
14
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
-
const __dirname = dirname(__filename);
|
|
16
|
-
// Find monorepo root by walking up from current directory
|
|
17
|
-
const projectRoot = findMonorepoRoot(__dirname);
|
|
18
|
-
const themesDir = join(projectRoot, 'pennyfarthing-dist', 'personas', 'themes');
|
|
19
|
-
// Pastel background colors by agent role
|
|
20
|
-
const AGENT_COLORS = {
|
|
21
|
-
orchestrator: '#E8D5E8', // Soft lavender
|
|
22
|
-
sm: '#D5E8D5', // Soft mint green
|
|
23
|
-
tea: '#D5E0E8', // Soft sky blue
|
|
24
|
-
dev: '#E8E8D5', // Soft cream
|
|
25
|
-
reviewer: '#E8D5D5', // Soft rose
|
|
26
|
-
architect: '#D5D8E8', // Soft periwinkle
|
|
27
|
-
pm: '#E8DDD5', // Soft peach
|
|
28
|
-
'tech-writer': '#D5E8E8', // Soft cyan
|
|
29
|
-
'ux-designer': '#E8D8E8', // Soft orchid
|
|
30
|
-
devops: '#DDE8D5', // Soft sage
|
|
31
|
-
};
|
|
32
|
-
/**
|
|
33
|
-
* Load OCEAN scores from a theme YAML file for a specific agent
|
|
34
|
-
*/
|
|
35
|
-
export function loadThemeOcean(theme, agent) {
|
|
36
|
-
const themePath = join(themesDir, `${theme}.yaml`);
|
|
37
|
-
if (!existsSync(themePath)) {
|
|
38
|
-
throw new Error(`Theme not found: ${theme}`);
|
|
39
|
-
}
|
|
40
|
-
const content = readFileSync(themePath, 'utf-8');
|
|
41
|
-
const parsed = parseYaml(content);
|
|
42
|
-
const agents = parsed.agents;
|
|
43
|
-
if (!agents) {
|
|
44
|
-
throw new Error(`Theme ${theme} has no agents section`);
|
|
45
|
-
}
|
|
46
|
-
const agentData = agents[agent];
|
|
47
|
-
if (!agentData) {
|
|
48
|
-
throw new Error(`Agent not found: ${agent} in theme ${theme}`);
|
|
49
|
-
}
|
|
50
|
-
const ocean = agentData.ocean;
|
|
51
|
-
if (!ocean) {
|
|
52
|
-
throw new Error(`Agent ${agent} in theme ${theme} has no OCEAN scores`);
|
|
53
|
-
}
|
|
54
|
-
return {
|
|
55
|
-
O: ocean.O,
|
|
56
|
-
C: ocean.C,
|
|
57
|
-
E: ocean.E,
|
|
58
|
-
A: ocean.A,
|
|
59
|
-
N: ocean.N,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Map OCEAN scores to SVG face parameters per OCEAN-TO-FACE.md spec
|
|
64
|
-
*
|
|
65
|
-
* Mappings (adjusted for visibility):
|
|
66
|
-
* - O (Openness) → Eye size: 1→8px, 5→18px (more extreme)
|
|
67
|
-
* - C (Conscientiousness) → Face shape: 1→95x95 round, 5→85x105 angular (reduced variance)
|
|
68
|
-
* - E (Extraversion) → Mouth width: 1→12px, 5→50px (more extreme)
|
|
69
|
-
* - A (Agreeableness) → Eyebrow angle: 1→-20°, 5→+20° (more extreme)
|
|
70
|
-
* - N (Neuroticism) → Stroke width: 1→1.5px, 5→4px (more visible)
|
|
71
|
-
*/
|
|
72
|
-
export function oceanToParams(ocean) {
|
|
73
|
-
// Linear interpolation helper
|
|
74
|
-
const lerp = (value, min, max) => {
|
|
75
|
-
// value is 1-5, normalize to 0-1 then interpolate
|
|
76
|
-
const t = (value - 1) / 4;
|
|
77
|
-
return min + t * (max - min);
|
|
78
|
-
};
|
|
79
|
-
// Openness → Eye Size (8px to 18px - more extreme range)
|
|
80
|
-
const eyeRadius = Math.round(lerp(ocean.O, 8, 18));
|
|
81
|
-
const pupilRadius = Math.round(lerp(ocean.O, 3, 8));
|
|
82
|
-
// Conscientiousness → Face Shape (dramatic variance)
|
|
83
|
-
// C=1: Wide round face (110x90), C=5: Narrow tall angular face (70x120)
|
|
84
|
-
const faceWidth = Math.round(lerp(ocean.C, 110, 70));
|
|
85
|
-
const faceHeight = Math.round(lerp(ocean.C, 90, 120));
|
|
86
|
-
const cornerRadius = Math.round(lerp(ocean.C, 50, 5)); // Round to angular
|
|
87
|
-
// Extraversion → Mouth (width 12 to 50, curve flat to strong - more extreme)
|
|
88
|
-
const mouthWidth = Math.round(lerp(ocean.E, 12, 50));
|
|
89
|
-
const mouthCurve = Math.round(lerp(ocean.E, -5, 20)); // Negative = frown, positive = smile
|
|
90
|
-
// Agreeableness → Eyebrow Angle (-20° to +20° - more extreme)
|
|
91
|
-
const eyebrowAngle = Math.round(lerp(ocean.A, -20, 20));
|
|
92
|
-
// Neuroticism → Stroke Width (1.5px to 4px - more visible)
|
|
93
|
-
const strokeWidth = lerp(ocean.N, 1.5, 4);
|
|
94
|
-
return {
|
|
95
|
-
eyeRadius,
|
|
96
|
-
pupilRadius,
|
|
97
|
-
faceWidth,
|
|
98
|
-
faceHeight,
|
|
99
|
-
cornerRadius,
|
|
100
|
-
mouthWidth,
|
|
101
|
-
mouthCurve,
|
|
102
|
-
eyebrowAngle,
|
|
103
|
-
strokeWidth,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Generate SVG string from face parameters
|
|
108
|
-
* @param params - Face parameters from oceanToParams
|
|
109
|
-
* @param backgroundColor - Optional background color (hex string)
|
|
110
|
-
*/
|
|
111
|
-
export function generateSvgFromParams(params, backgroundColor) {
|
|
112
|
-
const { eyeRadius, pupilRadius, faceWidth, faceHeight, cornerRadius: _cornerRadius, mouthWidth, mouthCurve, eyebrowAngle, strokeWidth, } = params;
|
|
113
|
-
// ViewBox is 200x200, center at 100,100
|
|
114
|
-
const cx = 100;
|
|
115
|
-
const cy = 100;
|
|
116
|
-
// Face ellipse (centered)
|
|
117
|
-
const faceRx = faceWidth / 2;
|
|
118
|
-
const faceRy = faceHeight / 2;
|
|
119
|
-
// Eye positions (relative to center)
|
|
120
|
-
const eyeY = cy - faceRy * 0.15; // Slightly above center
|
|
121
|
-
const eyeSpacing = faceWidth * 0.25;
|
|
122
|
-
const leftEyeX = cx - eyeSpacing;
|
|
123
|
-
const rightEyeX = cx + eyeSpacing;
|
|
124
|
-
// Mouth position
|
|
125
|
-
const mouthY = cy + faceRy * 0.35;
|
|
126
|
-
const mouthHalfWidth = mouthWidth / 2;
|
|
127
|
-
// Mouth path (quadratic bezier for curve)
|
|
128
|
-
// In SVG, Y increases downward. For a smile, control point must be BELOW the line (larger Y)
|
|
129
|
-
// Positive mouthCurve = smile (control point BELOW line, curve opens upward)
|
|
130
|
-
// Negative mouthCurve = frown (control point ABOVE line, curve opens downward)
|
|
131
|
-
const mouthStartX = cx - mouthHalfWidth;
|
|
132
|
-
const mouthEndX = cx + mouthHalfWidth;
|
|
133
|
-
const mouthControlY = mouthY + mouthCurve; // Add: positive curve = point goes down = smile opens up
|
|
134
|
-
const mouthPath = `M ${mouthStartX} ${mouthY} Q ${cx} ${mouthControlY} ${mouthEndX} ${mouthY}`;
|
|
135
|
-
// Eyebrow positions and rotation
|
|
136
|
-
const eyebrowY = eyeY - eyeRadius - 8;
|
|
137
|
-
const eyebrowLength = eyeRadius * 1.5;
|
|
138
|
-
// Calculate vertical offset for eyebrow tilt
|
|
139
|
-
// Positive angle (friendly): inner ends UP, outer ends DOWN
|
|
140
|
-
// Negative angle (stern): inner ends DOWN, outer ends UP
|
|
141
|
-
const browTilt = Math.sin((eyebrowAngle * Math.PI) / 180) * (eyebrowLength / 2);
|
|
142
|
-
// Left eyebrow: outer=left (x1), inner=right (x2)
|
|
143
|
-
const leftBrowOuterX = leftEyeX - eyebrowLength / 2;
|
|
144
|
-
const leftBrowInnerX = leftEyeX + eyebrowLength / 2;
|
|
145
|
-
const leftBrowOuterY = eyebrowY + browTilt; // Positive tilt pushes outer DOWN
|
|
146
|
-
const leftBrowInnerY = eyebrowY - browTilt; // Positive tilt pushes inner UP
|
|
147
|
-
// Right eyebrow: inner=left (x1), outer=right (x2) - mirrored
|
|
148
|
-
const rightBrowInnerX = rightEyeX - eyebrowLength / 2;
|
|
149
|
-
const rightBrowOuterX = rightEyeX + eyebrowLength / 2;
|
|
150
|
-
const rightBrowInnerY = eyebrowY - browTilt; // Positive tilt pushes inner UP
|
|
151
|
-
const rightBrowOuterY = eyebrowY + browTilt; // Positive tilt pushes outer DOWN
|
|
152
|
-
// Background (optional)
|
|
153
|
-
const bgRect = backgroundColor
|
|
154
|
-
? `\n <!-- Background -->\n <rect x="0" y="0" width="200" height="200" fill="${backgroundColor}" />\n`
|
|
155
|
-
: '';
|
|
156
|
-
// Build SVG
|
|
157
|
-
const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">${bgRect}
|
|
158
|
-
<!-- Face -->
|
|
159
|
-
<ellipse cx="${cx}" cy="${cy}" rx="${faceRx}" ry="${faceRy}"
|
|
160
|
-
fill="none" stroke="black" stroke-width="${strokeWidth}" />
|
|
161
|
-
|
|
162
|
-
<!-- Left Eye -->
|
|
163
|
-
<circle cx="${leftEyeX}" cy="${eyeY}" r="${eyeRadius}"
|
|
164
|
-
fill="none" stroke="black" stroke-width="${strokeWidth}" />
|
|
165
|
-
<circle cx="${leftEyeX}" cy="${eyeY}" r="${pupilRadius}"
|
|
166
|
-
fill="black" stroke="none" />
|
|
167
|
-
|
|
168
|
-
<!-- Right Eye -->
|
|
169
|
-
<circle cx="${rightEyeX}" cy="${eyeY}" r="${eyeRadius}"
|
|
170
|
-
fill="none" stroke="black" stroke-width="${strokeWidth}" />
|
|
171
|
-
<circle cx="${rightEyeX}" cy="${eyeY}" r="${pupilRadius}"
|
|
172
|
-
fill="black" stroke="none" />
|
|
173
|
-
|
|
174
|
-
<!-- Left Eyebrow -->
|
|
175
|
-
<line x1="${leftBrowOuterX}" y1="${leftBrowOuterY}"
|
|
176
|
-
x2="${leftBrowInnerX}" y2="${leftBrowInnerY}"
|
|
177
|
-
stroke="black" stroke-width="${strokeWidth}" stroke-linecap="round" />
|
|
178
|
-
|
|
179
|
-
<!-- Right Eyebrow -->
|
|
180
|
-
<line x1="${rightBrowInnerX}" y1="${rightBrowInnerY}"
|
|
181
|
-
x2="${rightBrowOuterX}" y2="${rightBrowOuterY}"
|
|
182
|
-
stroke="black" stroke-width="${strokeWidth}" stroke-linecap="round" />
|
|
183
|
-
|
|
184
|
-
<!-- Mouth -->
|
|
185
|
-
<path d="${mouthPath}"
|
|
186
|
-
fill="none" stroke="black" stroke-width="${strokeWidth}" stroke-linecap="round" />
|
|
187
|
-
</svg>`;
|
|
188
|
-
return svg;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Main function: Generate SVG face for a theme's agent
|
|
192
|
-
*/
|
|
193
|
-
export function generateFace(theme, agent) {
|
|
194
|
-
const ocean = loadThemeOcean(theme, agent);
|
|
195
|
-
const params = oceanToParams(ocean);
|
|
196
|
-
const backgroundColor = AGENT_COLORS[agent] || '#F0F0F0'; // Default light gray
|
|
197
|
-
return generateSvgFromParams(params, backgroundColor);
|
|
198
|
-
}
|
|
199
|
-
//# sourceMappingURL=generate-face.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate-face.js","sourceRoot":"","sources":["../../src/scripts/generate-face.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for Story 11-3: Build Chernoff Face Generator (OCEAN → SVG)
|
|
3
|
-
*
|
|
4
|
-
* These tests verify:
|
|
5
|
-
* AC1: scripts/generate-face.ts functional (module exists and exports work)
|
|
6
|
-
* AC2: Takes theme + agent as input, outputs SVG
|
|
7
|
-
* AC3: Faces visually distinct across OCEAN profiles
|
|
8
|
-
* AC4: SVGs render correctly in browsers and markdown (valid SVG structure)
|
|
9
|
-
*
|
|
10
|
-
* Run with: npm test
|
|
11
|
-
*/
|
|
12
|
-
export {};
|
|
13
|
-
//# sourceMappingURL=generate-face.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate-face.test.d.ts","sourceRoot":"","sources":["../../src/scripts/generate-face.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -1,301 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for Story 11-3: Build Chernoff Face Generator (OCEAN → SVG)
|
|
3
|
-
*
|
|
4
|
-
* These tests verify:
|
|
5
|
-
* AC1: scripts/generate-face.ts functional (module exists and exports work)
|
|
6
|
-
* AC2: Takes theme + agent as input, outputs SVG
|
|
7
|
-
* AC3: Faces visually distinct across OCEAN profiles
|
|
8
|
-
* AC4: SVGs render correctly in browsers and markdown (valid SVG structure)
|
|
9
|
-
*
|
|
10
|
-
* Run with: npm test
|
|
11
|
-
*/
|
|
12
|
-
import { describe, it } from 'node:test';
|
|
13
|
-
import assert from 'node:assert';
|
|
14
|
-
import { dirname } from 'path';
|
|
15
|
-
import { fileURLToPath } from 'url';
|
|
16
|
-
import { findMonorepoRoot } from '../cli/utils/files.js';
|
|
17
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
18
|
-
const __dirname = dirname(__filename);
|
|
19
|
-
// Find monorepo root by walking up from current directory
|
|
20
|
-
const _projectRoot = findMonorepoRoot(__dirname);
|
|
21
|
-
// ============================================================================
|
|
22
|
-
// AC1: scripts/generate-face.ts functional
|
|
23
|
-
// ============================================================================
|
|
24
|
-
describe('AC1: Generator Module Exists and Exports', () => {
|
|
25
|
-
it('should export generateFace function', async () => {
|
|
26
|
-
// This will fail until the module is created
|
|
27
|
-
const module = await import('./generate-face.js');
|
|
28
|
-
assert.ok(typeof module.generateFace === 'function', 'generateFace should be a function');
|
|
29
|
-
});
|
|
30
|
-
it('should export oceanToParams function for mapping', async () => {
|
|
31
|
-
const module = await import('./generate-face.js');
|
|
32
|
-
assert.ok(typeof module.oceanToParams === 'function', 'oceanToParams should be a function');
|
|
33
|
-
});
|
|
34
|
-
it('should export loadThemeOcean function for YAML parsing', async () => {
|
|
35
|
-
const module = await import('./generate-face.js');
|
|
36
|
-
assert.ok(typeof module.loadThemeOcean === 'function', 'loadThemeOcean should be a function');
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
// ============================================================================
|
|
40
|
-
// AC2: Takes theme + agent as input, outputs SVG
|
|
41
|
-
// ============================================================================
|
|
42
|
-
describe('AC2: Theme + Agent Input → SVG Output', () => {
|
|
43
|
-
it('should load OCEAN scores from deadwood theme for sm agent', async () => {
|
|
44
|
-
const { loadThemeOcean } = await import('./generate-face.js');
|
|
45
|
-
const ocean = loadThemeOcean('deadwood', 'sm');
|
|
46
|
-
assert.ok(ocean, 'Should return OCEAN object');
|
|
47
|
-
assert.strictEqual(typeof ocean.O, 'number', 'O should be a number');
|
|
48
|
-
assert.strictEqual(typeof ocean.C, 'number', 'C should be a number');
|
|
49
|
-
assert.strictEqual(typeof ocean.E, 'number', 'E should be a number');
|
|
50
|
-
assert.strictEqual(typeof ocean.A, 'number', 'A should be a number');
|
|
51
|
-
assert.strictEqual(typeof ocean.N, 'number', 'N should be a number');
|
|
52
|
-
});
|
|
53
|
-
it('should generate SVG string from theme and agent', async () => {
|
|
54
|
-
const { generateFace } = await import('./generate-face.js');
|
|
55
|
-
const svg = generateFace('deadwood', 'sm');
|
|
56
|
-
assert.ok(typeof svg === 'string', 'Should return string');
|
|
57
|
-
assert.ok(svg.includes('<svg'), 'Should contain SVG opening tag');
|
|
58
|
-
assert.ok(svg.includes('</svg>'), 'Should contain SVG closing tag');
|
|
59
|
-
});
|
|
60
|
-
it('should work for all 10 agent roles', async () => {
|
|
61
|
-
const { generateFace } = await import('./generate-face.js');
|
|
62
|
-
const roles = [
|
|
63
|
-
'orchestrator',
|
|
64
|
-
'sm',
|
|
65
|
-
'tea',
|
|
66
|
-
'dev',
|
|
67
|
-
'reviewer',
|
|
68
|
-
'architect',
|
|
69
|
-
'pm',
|
|
70
|
-
'tech-writer',
|
|
71
|
-
'ux-designer',
|
|
72
|
-
'devops',
|
|
73
|
-
];
|
|
74
|
-
for (const role of roles) {
|
|
75
|
-
const svg = generateFace('deadwood', role);
|
|
76
|
-
assert.ok(svg.includes('<svg'), `Should generate SVG for ${role}`);
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
it('should throw error for non-existent theme', async () => {
|
|
80
|
-
const { generateFace } = await import('./generate-face.js');
|
|
81
|
-
assert.throws(() => generateFace('nonexistent-theme', 'sm'), /theme.*not found/i, 'Should throw error for missing theme');
|
|
82
|
-
});
|
|
83
|
-
it('should throw error for non-existent agent', async () => {
|
|
84
|
-
const { generateFace } = await import('./generate-face.js');
|
|
85
|
-
assert.throws(() => generateFace('deadwood', 'nonexistent-agent'), /agent.*not found/i, 'Should throw error for missing agent');
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
// ============================================================================
|
|
89
|
-
// AC3: Faces visually distinct across OCEAN profiles
|
|
90
|
-
// ============================================================================
|
|
91
|
-
describe('AC3: OCEAN → SVG Parameter Mapping', () => {
|
|
92
|
-
// Test the mapping function directly with known values
|
|
93
|
-
it('should map O=1 to small eye radius (8px)', async () => {
|
|
94
|
-
const { oceanToParams } = await import('./generate-face.js');
|
|
95
|
-
const params = oceanToParams({ O: 1, C: 3, E: 3, A: 3, N: 3 });
|
|
96
|
-
assert.strictEqual(params.eyeRadius, 8, 'O=1 should map to 8px eye radius');
|
|
97
|
-
});
|
|
98
|
-
it('should map O=5 to large eye radius (18px)', async () => {
|
|
99
|
-
const { oceanToParams } = await import('./generate-face.js');
|
|
100
|
-
const params = oceanToParams({ O: 5, C: 3, E: 3, A: 3, N: 3 });
|
|
101
|
-
assert.strictEqual(params.eyeRadius, 18, 'O=5 should map to 18px eye radius');
|
|
102
|
-
});
|
|
103
|
-
it('should map C=1 to wide round face (110x90)', async () => {
|
|
104
|
-
const { oceanToParams } = await import('./generate-face.js');
|
|
105
|
-
const params = oceanToParams({ O: 3, C: 1, E: 3, A: 3, N: 3 });
|
|
106
|
-
assert.strictEqual(params.faceWidth, 110, 'C=1 should map to 110px face width');
|
|
107
|
-
assert.strictEqual(params.faceHeight, 90, 'C=1 should map to 90px face height');
|
|
108
|
-
assert.strictEqual(params.cornerRadius, 50, 'C=1 should have very round corners');
|
|
109
|
-
});
|
|
110
|
-
it('should map C=5 to narrow angular face (70x120)', async () => {
|
|
111
|
-
const { oceanToParams } = await import('./generate-face.js');
|
|
112
|
-
const params = oceanToParams({ O: 3, C: 5, E: 3, A: 3, N: 3 });
|
|
113
|
-
assert.strictEqual(params.faceWidth, 70, 'C=5 should map to 70px face width');
|
|
114
|
-
assert.strictEqual(params.faceHeight, 120, 'C=5 should map to 120px face height');
|
|
115
|
-
assert.strictEqual(params.cornerRadius, 5, 'C=5 should have angular corners');
|
|
116
|
-
});
|
|
117
|
-
it('should map E=1 to narrow mouth (12px)', async () => {
|
|
118
|
-
const { oceanToParams } = await import('./generate-face.js');
|
|
119
|
-
const params = oceanToParams({ O: 3, C: 3, E: 1, A: 3, N: 3 });
|
|
120
|
-
assert.strictEqual(params.mouthWidth, 12, 'E=1 should map to 12px mouth width');
|
|
121
|
-
});
|
|
122
|
-
it('should map E=5 to wide mouth (50px)', async () => {
|
|
123
|
-
const { oceanToParams } = await import('./generate-face.js');
|
|
124
|
-
const params = oceanToParams({ O: 3, C: 3, E: 5, A: 3, N: 3 });
|
|
125
|
-
assert.strictEqual(params.mouthWidth, 50, 'E=5 should map to 50px mouth width');
|
|
126
|
-
});
|
|
127
|
-
it('should map A=1 to angled-down eyebrows (-20 degrees)', async () => {
|
|
128
|
-
const { oceanToParams } = await import('./generate-face.js');
|
|
129
|
-
const params = oceanToParams({ O: 3, C: 3, E: 3, A: 1, N: 3 });
|
|
130
|
-
assert.strictEqual(params.eyebrowAngle, -20, 'A=1 should map to -20 degree eyebrows');
|
|
131
|
-
});
|
|
132
|
-
it('should map A=5 to raised eyebrows (+20 degrees)', async () => {
|
|
133
|
-
const { oceanToParams } = await import('./generate-face.js');
|
|
134
|
-
const params = oceanToParams({ O: 3, C: 3, E: 3, A: 5, N: 3 });
|
|
135
|
-
assert.strictEqual(params.eyebrowAngle, 20, 'A=5 should map to +20 degree eyebrows');
|
|
136
|
-
});
|
|
137
|
-
it('should map N=1 to light stroke (1.5px)', async () => {
|
|
138
|
-
const { oceanToParams } = await import('./generate-face.js');
|
|
139
|
-
const params = oceanToParams({ O: 3, C: 3, E: 3, A: 3, N: 1 });
|
|
140
|
-
assert.strictEqual(params.strokeWidth, 1.5, 'N=1 should map to 1.5px stroke');
|
|
141
|
-
});
|
|
142
|
-
it('should map N=5 to heavy stroke (4px)', async () => {
|
|
143
|
-
const { oceanToParams } = await import('./generate-face.js');
|
|
144
|
-
const params = oceanToParams({ O: 3, C: 3, E: 3, A: 3, N: 5 });
|
|
145
|
-
assert.strictEqual(params.strokeWidth, 4, 'N=5 should map to 4px stroke');
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
describe('AC3: Extreme Profiles Produce Different SVGs', () => {
|
|
149
|
-
it('should produce different SVGs for 1-1-1-1-1 vs 5-5-5-5-5', async () => {
|
|
150
|
-
const { oceanToParams, generateSvgFromParams } = await import('./generate-face.js');
|
|
151
|
-
const stoic = oceanToParams({ O: 1, C: 1, E: 1, A: 1, N: 1 });
|
|
152
|
-
const intense = oceanToParams({ O: 5, C: 5, E: 5, A: 5, N: 5 });
|
|
153
|
-
const stoicSvg = generateSvgFromParams(stoic);
|
|
154
|
-
const intenseSvg = generateSvgFromParams(intense);
|
|
155
|
-
assert.notStrictEqual(stoicSvg, intenseSvg, 'Extreme profiles should produce different SVGs');
|
|
156
|
-
// Verify specific differences exist
|
|
157
|
-
assert.ok(stoicSvg.includes('r="8"') || stoicSvg.includes('r="8px"'), 'Stoic should have small eyes (8px)');
|
|
158
|
-
assert.ok(intenseSvg.includes('r="18"') || intenseSvg.includes('r="18px"'), 'Intense should have large eyes (18px)');
|
|
159
|
-
});
|
|
160
|
-
it('should produce measurably different parameters for each OCEAN value', async () => {
|
|
161
|
-
const { oceanToParams } = await import('./generate-face.js');
|
|
162
|
-
// Generate params for each value of O (1-5)
|
|
163
|
-
const openness1 = oceanToParams({ O: 1, C: 3, E: 3, A: 3, N: 3 });
|
|
164
|
-
const openness3 = oceanToParams({ O: 3, C: 3, E: 3, A: 3, N: 3 });
|
|
165
|
-
const openness5 = oceanToParams({ O: 5, C: 3, E: 3, A: 3, N: 3 });
|
|
166
|
-
// Eye radius should increase with O
|
|
167
|
-
assert.ok(openness1.eyeRadius < openness3.eyeRadius, 'O=1 should have smaller eyes than O=3');
|
|
168
|
-
assert.ok(openness3.eyeRadius < openness5.eyeRadius, 'O=3 should have smaller eyes than O=5');
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
// ============================================================================
|
|
172
|
-
// AC4: SVGs render correctly in browsers and markdown
|
|
173
|
-
// ============================================================================
|
|
174
|
-
describe('AC4: Valid SVG Structure', () => {
|
|
175
|
-
it('should include viewBox attribute for scaling', async () => {
|
|
176
|
-
const { generateFace } = await import('./generate-face.js');
|
|
177
|
-
const svg = generateFace('deadwood', 'sm');
|
|
178
|
-
assert.ok(svg.includes('viewBox="0 0 200 200"'), 'Should have 200x200 viewBox for proper scaling');
|
|
179
|
-
});
|
|
180
|
-
it('should include xmlns attribute for browser compatibility', async () => {
|
|
181
|
-
const { generateFace } = await import('./generate-face.js');
|
|
182
|
-
const svg = generateFace('deadwood', 'sm');
|
|
183
|
-
assert.ok(svg.includes('xmlns="http://www.w3.org/2000/svg"'), 'Should have SVG xmlns for browser rendering');
|
|
184
|
-
});
|
|
185
|
-
it('should contain face shape element', async () => {
|
|
186
|
-
const { generateFace } = await import('./generate-face.js');
|
|
187
|
-
const svg = generateFace('deadwood', 'sm');
|
|
188
|
-
// Face could be ellipse, rect with rx/ry, or path
|
|
189
|
-
const hasFaceShape = svg.includes('<ellipse') ||
|
|
190
|
-
svg.includes('<rect') ||
|
|
191
|
-
svg.includes('<circle');
|
|
192
|
-
assert.ok(hasFaceShape, 'Should contain face shape element');
|
|
193
|
-
});
|
|
194
|
-
it('should contain eye elements', async () => {
|
|
195
|
-
const { generateFace } = await import('./generate-face.js');
|
|
196
|
-
const svg = generateFace('deadwood', 'sm');
|
|
197
|
-
// Eyes are typically circles or ellipses
|
|
198
|
-
// Count occurrences - should have at least 2 for eyes
|
|
199
|
-
const circleCount = (svg.match(/<circle/g) || []).length;
|
|
200
|
-
const ellipseCount = (svg.match(/<ellipse/g) || []).length;
|
|
201
|
-
assert.ok(circleCount >= 2 || ellipseCount >= 2, 'Should contain at least 2 eye elements');
|
|
202
|
-
});
|
|
203
|
-
it('should contain mouth element', async () => {
|
|
204
|
-
const { generateFace } = await import('./generate-face.js');
|
|
205
|
-
const svg = generateFace('deadwood', 'sm');
|
|
206
|
-
// Mouth is typically a path or line
|
|
207
|
-
const hasMouth = svg.includes('<path') || svg.includes('<line');
|
|
208
|
-
assert.ok(hasMouth, 'Should contain mouth path or line');
|
|
209
|
-
});
|
|
210
|
-
it('should be well-formed XML', async () => {
|
|
211
|
-
const { generateFace } = await import('./generate-face.js');
|
|
212
|
-
const svg = generateFace('deadwood', 'sm');
|
|
213
|
-
// Check basic XML well-formedness
|
|
214
|
-
assert.ok(svg.startsWith('<svg'), 'Should start with <svg');
|
|
215
|
-
assert.ok(svg.endsWith('</svg>'), 'Should end with </svg>');
|
|
216
|
-
// Check that all opened tags have closing counterparts
|
|
217
|
-
// (This is a simple check - real XML validation would use a parser)
|
|
218
|
-
const openTags = svg.match(/<[a-z]+[^/>]*>/gi) || [];
|
|
219
|
-
const closeTags = svg.match(/<\/[a-z]+>/gi) || [];
|
|
220
|
-
const selfClosing = svg.match(/<[a-z]+[^>]*\/>/gi) || [];
|
|
221
|
-
// Note: This is approximate - real validation needed for production
|
|
222
|
-
assert.ok(openTags.length <= closeTags.length + selfClosing.length + 1, 'Tags should be properly closed');
|
|
223
|
-
});
|
|
224
|
-
it('should use stroke-width for line weights', async () => {
|
|
225
|
-
const { generateFace } = await import('./generate-face.js');
|
|
226
|
-
const svg = generateFace('deadwood', 'sm');
|
|
227
|
-
assert.ok(svg.includes('stroke-width'), 'Should use stroke-width for line weight control');
|
|
228
|
-
});
|
|
229
|
-
it('should be monochrome (black strokes, no fill or light fill)', async () => {
|
|
230
|
-
const { generateFace } = await import('./generate-face.js');
|
|
231
|
-
const svg = generateFace('deadwood', 'sm');
|
|
232
|
-
// Should have black or no stroke color
|
|
233
|
-
const hasStroke = svg.includes('stroke=');
|
|
234
|
-
const strokeIsBlack = svg.includes('stroke="black"') ||
|
|
235
|
-
svg.includes('stroke="#000"') ||
|
|
236
|
-
svg.includes('stroke="currentColor"');
|
|
237
|
-
assert.ok(!hasStroke || strokeIsBlack, 'Strokes should be black or currentColor');
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
// ============================================================================
|
|
241
|
-
// Integration: Full Pipeline Test
|
|
242
|
-
// ============================================================================
|
|
243
|
-
describe('Integration: Full Face Generation Pipeline', () => {
|
|
244
|
-
it('should generate valid SVG for all 10 anchor themes', async () => {
|
|
245
|
-
const { generateFace } = await import('./generate-face.js');
|
|
246
|
-
const themes = [
|
|
247
|
-
'deadwood',
|
|
248
|
-
'firefly',
|
|
249
|
-
'breaking-bad',
|
|
250
|
-
'the-good-place',
|
|
251
|
-
'star-trek-tng',
|
|
252
|
-
'discworld',
|
|
253
|
-
'fargo',
|
|
254
|
-
'succession',
|
|
255
|
-
'mass-effect',
|
|
256
|
-
'software-pioneers',
|
|
257
|
-
];
|
|
258
|
-
for (const theme of themes) {
|
|
259
|
-
const svg = generateFace(theme, 'sm');
|
|
260
|
-
assert.ok(svg.includes('<svg') && svg.includes('</svg>'), `Should generate valid SVG for ${theme}`);
|
|
261
|
-
}
|
|
262
|
-
});
|
|
263
|
-
it('should produce 100 unique face variations (10 themes × 10 agents)', async () => {
|
|
264
|
-
const { generateFace } = await import('./generate-face.js');
|
|
265
|
-
const themes = [
|
|
266
|
-
'deadwood',
|
|
267
|
-
'firefly',
|
|
268
|
-
'breaking-bad',
|
|
269
|
-
'the-good-place',
|
|
270
|
-
'star-trek-tng',
|
|
271
|
-
'discworld',
|
|
272
|
-
'fargo',
|
|
273
|
-
'succession',
|
|
274
|
-
'mass-effect',
|
|
275
|
-
'software-pioneers',
|
|
276
|
-
];
|
|
277
|
-
const roles = [
|
|
278
|
-
'orchestrator',
|
|
279
|
-
'sm',
|
|
280
|
-
'tea',
|
|
281
|
-
'dev',
|
|
282
|
-
'reviewer',
|
|
283
|
-
'architect',
|
|
284
|
-
'pm',
|
|
285
|
-
'tech-writer',
|
|
286
|
-
'ux-designer',
|
|
287
|
-
'devops',
|
|
288
|
-
];
|
|
289
|
-
const svgSet = new Set();
|
|
290
|
-
for (const theme of themes) {
|
|
291
|
-
for (const role of roles) {
|
|
292
|
-
const svg = generateFace(theme, role);
|
|
293
|
-
svgSet.add(svg);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
// Not all 100 will be unique (some characters share OCEAN scores)
|
|
297
|
-
// but there should be significant variation
|
|
298
|
-
assert.ok(svgSet.size >= 20, `Should have at least 20 unique face variations, got ${svgSet.size}`);
|
|
299
|
-
});
|
|
300
|
-
});
|
|
301
|
-
//# sourceMappingURL=generate-face.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate-face.test.js","sourceRoot":"","sources":["../../src/scripts/generate-face.test.ts"],"names":[],"mappings":"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"}
|