@pennyfarthing/core 11.1.0 → 11.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/README.md +8 -8
  2. package/package.json +16 -14
  3. package/packages/core/dist/cli/utils/constants.d.ts +1 -1
  4. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
  5. package/packages/core/dist/cli/utils/constants.js +2 -1
  6. package/packages/core/dist/cli/utils/constants.js.map +1 -1
  7. package/packages/core/dist/consultation/dialogue-manager.d.ts +75 -0
  8. package/packages/core/dist/consultation/dialogue-manager.d.ts.map +1 -0
  9. package/packages/core/dist/consultation/dialogue-manager.js +334 -0
  10. package/packages/core/dist/consultation/dialogue-manager.js.map +1 -0
  11. package/packages/core/dist/consultation/dialogue-manager.test.d.ts +19 -0
  12. package/packages/core/dist/consultation/dialogue-manager.test.d.ts.map +1 -0
  13. package/packages/core/dist/consultation/dialogue-manager.test.js +444 -0
  14. package/packages/core/dist/consultation/dialogue-manager.test.js.map +1 -0
  15. package/packages/core/dist/server/api/git.d.ts +13 -1
  16. package/packages/core/dist/server/api/git.d.ts.map +1 -1
  17. package/packages/core/dist/server/api/git.js +53 -34
  18. package/packages/core/dist/server/api/git.js.map +1 -1
  19. package/packages/core/dist/server/otlp-receiver.d.ts +16 -11
  20. package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
  21. package/packages/core/dist/server/otlp-receiver.js +185 -24
  22. package/packages/core/dist/server/otlp-receiver.js.map +1 -1
  23. package/packages/core/dist/server/otlp-receiver.test.d.ts +21 -0
  24. package/packages/core/dist/server/otlp-receiver.test.d.ts.map +1 -0
  25. package/packages/core/dist/server/otlp-receiver.test.js +446 -0
  26. package/packages/core/dist/server/otlp-receiver.test.js.map +1 -0
  27. package/packages/core/dist/shared/portrait-resolver.d.ts +9 -0
  28. package/packages/core/dist/shared/portrait-resolver.d.ts.map +1 -1
  29. package/packages/core/dist/shared/portrait-resolver.js +27 -0
  30. package/packages/core/dist/shared/portrait-resolver.js.map +1 -1
  31. package/packages/core/dist/shared/portrait-resolver.test.js +47 -1
  32. package/packages/core/dist/shared/portrait-resolver.test.js.map +1 -1
  33. package/packages/core/dist/shared/skill-search.test.js +2 -2
  34. package/packages/core/dist/shared/tandem-portrait-inventory.test.d.ts +13 -0
  35. package/packages/core/dist/shared/tandem-portrait-inventory.test.d.ts.map +1 -0
  36. package/packages/core/dist/shared/tandem-portrait-inventory.test.js +126 -0
  37. package/packages/core/dist/shared/tandem-portrait-inventory.test.js.map +1 -0
  38. package/pennyfarthing-dist/agents/dev.md +1 -1
  39. package/pennyfarthing-dist/agents/reviewer.md +1 -1
  40. package/pennyfarthing-dist/agents/sm-setup.md +1 -1
  41. package/pennyfarthing-dist/agents/sm.md +2 -2
  42. package/pennyfarthing-dist/agents/tea.md +1 -1
  43. package/pennyfarthing-dist/agents/testing-runner.md +2 -1
  44. package/pennyfarthing-dist/commands/pf-chore.md +2 -2
  45. package/pennyfarthing-dist/commands/pf-standalone.md +7 -2
  46. package/pennyfarthing-dist/guides/agent-behavior.md +1 -1
  47. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +1 -1
  48. package/pennyfarthing-dist/guides/bikerack.md +3 -3
  49. package/pennyfarthing-dist/guides/hooks.md +1 -1
  50. package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
  51. package/pennyfarthing-dist/guides/xml-tags.md +2 -2
  52. package/pennyfarthing-dist/scripts/README.md +1 -1
  53. package/pennyfarthing-dist/scripts/core/agent-session.sh +0 -0
  54. package/pennyfarthing-dist/scripts/core/check-context.sh +1 -1
  55. package/pennyfarthing-dist/scripts/core/dialogue-manager.sh +322 -0
  56. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +0 -0
  57. package/pennyfarthing-dist/scripts/core/prime.sh +0 -0
  58. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -0
  59. package/pennyfarthing-dist/scripts/git/README.md +24 -14
  60. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +5 -266
  61. package/pennyfarthing-dist/scripts/git/git-status-all.sh +5 -151
  62. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +6 -144
  63. package/pennyfarthing-dist/scripts/git/release.sh +0 -0
  64. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +5 -496
  65. package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -0
  66. package/pennyfarthing-dist/scripts/hooks/README.md +1 -1
  67. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +1 -1
  68. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
  69. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
  70. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  71. package/pennyfarthing-dist/scripts/hooks/dispatcher-template.sh +0 -0
  72. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +9 -11
  73. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -0
  74. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -0
  75. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
  76. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -0
  77. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -0
  78. package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -0
  79. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -0
  80. package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -0
  81. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
  82. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -0
  83. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +1 -1
  84. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -0
  85. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -0
  86. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -0
  87. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -0
  88. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -0
  89. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -0
  90. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -0
  91. package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -0
  92. package/pennyfarthing-dist/scripts/lib/common.sh +0 -0
  93. package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -0
  94. package/pennyfarthing-dist/scripts/lib/logging.sh +0 -0
  95. package/pennyfarthing-dist/scripts/lib/retry.sh +0 -0
  96. package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -0
  97. package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -0
  98. package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -0
  99. package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -0
  100. package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -0
  101. package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -0
  102. package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -0
  103. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -0
  104. package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -0
  105. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -0
  106. package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -0
  107. package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -0
  108. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -0
  109. package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -0
  110. package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -0
  111. package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -0
  112. package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -0
  113. package/pennyfarthing-dist/scripts/misc/statusline.sh +0 -0
  114. package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -0
  115. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +0 -0
  116. package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +0 -0
  117. package/pennyfarthing-dist/scripts/portraits/generate-tandem-portraits.sh +76 -0
  118. package/pennyfarthing-dist/scripts/story/create-story.sh +0 -0
  119. package/pennyfarthing-dist/scripts/story/size-story.sh +0 -0
  120. package/pennyfarthing-dist/scripts/story/story-template.sh +0 -0
  121. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
  122. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -0
  123. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -0
  124. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +0 -0
  125. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -0
  126. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -0
  127. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -0
  128. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -0
  129. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
  130. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -0
  131. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
  132. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
  133. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
  134. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -0
  135. package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -0
  136. package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -0
  137. package/pennyfarthing-dist/scripts/workflow/check.py +0 -0
  138. package/pennyfarthing-dist/scripts/workflow/check.sh +0 -0
  139. package/pennyfarthing-dist/scripts/workflow/complete-step.py +0 -0
  140. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +0 -0
  141. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +4 -221
  142. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -0
  143. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +5 -13
  144. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +4 -123
  145. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +4 -33
  146. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +4 -156
  147. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +4 -131
  148. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +4 -249
  149. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +4 -160
  150. package/pennyfarthing-dist/skills/pf-bc/usage.md +1 -1
  151. package/pennyfarthing-dist/skills/pf-jira/examples.md +5 -2
  152. package/pennyfarthing-dist/skills/pf-story/scripts/create-story.sh +0 -0
  153. package/pennyfarthing-dist/skills/pf-story/scripts/size-story.sh +0 -0
  154. package/pennyfarthing-dist/skills/pf-story/scripts/story-template.sh +0 -0
  155. package/pennyfarthing-dist/skills/pf-workflow/examples.md +27 -16
  156. package/pennyfarthing-dist/skills/pf-workflow/skill.md +9 -12
  157. package/pennyfarthing-dist/skills/pf-workflow/usage.md +33 -8
  158. package/pennyfarthing-dist/workflows/bdd-tandem.yaml +18 -6
  159. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +1 -1
  160. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +1 -1
  161. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
  162. package/pennyfarthing-dist/workflows/review-tandem.yaml +65 -0
  163. package/pennyfarthing-dist/workflows/tdd-tandem.yaml +16 -8
  164. package/pennyfarthing_scripts/CLAUDE.md +26 -4
  165. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  166. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  167. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  168. package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  169. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
  170. package/pennyfarthing_scripts/bc/cli.py +3 -5
  171. package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  172. package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  173. package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  174. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  175. package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  176. package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  177. package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  178. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  179. package/pennyfarthing_scripts/bikerack/__pycache__/portrait.cpython-314.pyc +0 -0
  180. package/pennyfarthing_scripts/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
  181. package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  182. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  183. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  184. package/pennyfarthing_scripts/bikerack/background_panel.py +86 -5
  185. package/pennyfarthing_scripts/bikerack/base_panel.py +62 -0
  186. package/pennyfarthing_scripts/bikerack/changed_panel.py +32 -28
  187. package/pennyfarthing_scripts/bikerack/cli.py +10 -11
  188. package/pennyfarthing_scripts/bikerack/debug_panel.py +31 -1
  189. package/pennyfarthing_scripts/bikerack/diffs_panel.py +74 -17
  190. package/pennyfarthing_scripts/bikerack/git_panel.py +103 -33
  191. package/pennyfarthing_scripts/bikerack/launcher.py +15 -15
  192. package/pennyfarthing_scripts/bikerack/progress_panel.py +315 -0
  193. package/pennyfarthing_scripts/bikerack/sprint_panel.py +158 -26
  194. package/pennyfarthing_scripts/bikerack/tui.py +336 -30
  195. package/pennyfarthing_scripts/bikerack/ws_client.py +2 -2
  196. package/pennyfarthing_scripts/cli.py +37 -65
  197. package/pennyfarthing_scripts/consultation/__init__.py +1 -0
  198. package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
  199. package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-314.pyc +0 -0
  200. package/pennyfarthing_scripts/consultation/cli.py +149 -0
  201. package/pennyfarthing_scripts/consultation/dialogue_manager.py +417 -0
  202. package/pennyfarthing_scripts/context.py +3 -3
  203. package/pennyfarthing_scripts/epic/__pycache__/__init__.cpython-314.pyc +0 -0
  204. package/pennyfarthing_scripts/epic/__pycache__/cli.cpython-314.pyc +0 -0
  205. package/pennyfarthing_scripts/git/__init__.py +12 -1
  206. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  207. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  208. package/pennyfarthing_scripts/git/__pycache__/hooks_installer.cpython-314.pyc +0 -0
  209. package/pennyfarthing_scripts/git/__pycache__/repos.cpython-314.pyc +0 -0
  210. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  211. package/pennyfarthing_scripts/git/__pycache__/worktree.cpython-314.pyc +0 -0
  212. package/pennyfarthing_scripts/git/create_branches.py +3 -4
  213. package/pennyfarthing_scripts/git/hooks_installer.py +152 -0
  214. package/pennyfarthing_scripts/git/repos.py +196 -0
  215. package/pennyfarthing_scripts/git/status_all.py +27 -11
  216. package/pennyfarthing_scripts/git/worktree.py +302 -0
  217. package/pennyfarthing_scripts/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
  218. package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-314.pyc +0 -0
  219. package/pennyfarthing_scripts/git_group/cli.py +143 -40
  220. package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
  221. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  222. package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  223. package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  224. package/pennyfarthing_scripts/handoff/complete_phase.py +12 -0
  225. package/pennyfarthing_scripts/handoff/resolve_gate.py +5 -14
  226. package/pennyfarthing_scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  227. package/pennyfarthing_scripts/hooks.py +3 -17
  228. package/pennyfarthing_scripts/pretooluse_hook.py +1 -1
  229. package/pennyfarthing_scripts/prime/__pycache__/heatmap.cpython-314.pyc +0 -0
  230. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  231. package/pennyfarthing_scripts/prime/heatmap.py +655 -0
  232. package/pennyfarthing_scripts/session/__pycache__/__init__.cpython-314.pyc +0 -0
  233. package/pennyfarthing_scripts/session/__pycache__/cli.cpython-314.pyc +0 -0
  234. package/pennyfarthing_scripts/session_start_hook.py +1 -1
  235. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  236. package/pennyfarthing_scripts/sprint/loader.py +15 -1
  237. package/pennyfarthing_scripts/sprint/story_finish.py +14 -0
  238. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  239. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
  240. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  241. package/pennyfarthing_scripts/tests/test_bikerack.py +51 -51
  242. package/pennyfarthing_scripts/tests/test_dialogue_manager.py +811 -0
  243. package/pennyfarthing_scripts/tests/test_handoff_cli.py +16 -11
  244. package/pennyfarthing_scripts/tests/test_workflow_check.py +2 -3
  245. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
  246. package/pennyfarthing_scripts/validate/adapters/tandem_awareness.py +254 -0
  247. package/pennyfarthing_scripts/validate/cli.py +17 -5
  248. package/pennyfarthing_scripts/workflow/__init__.py +40 -0
  249. package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
  250. package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-314.pyc +0 -0
  251. package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
  252. package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-314.pyc +0 -0
  253. package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-314.pyc +0 -0
  254. package/pennyfarthing_scripts/workflow/cli.py +1099 -0
  255. package/pennyfarthing_scripts/workflow/helpers.py +241 -0
  256. package/pennyfarthing_scripts/{workflow.py → workflow/scale.py} +0 -104
  257. package/pennyfarthing_scripts/workflow/state.py +112 -0
  258. package/scripts/README.md +41 -0
  259. package/pennyfarthing-dist/skills/pf-workflow/scripts/list-workflows.sh +0 -91
  260. package/pennyfarthing-dist/skills/pf-workflow/scripts/resume-workflow.sh +0 -163
  261. package/pennyfarthing-dist/skills/pf-workflow/scripts/show-workflow.sh +0 -138
  262. package/pennyfarthing-dist/skills/pf-workflow/scripts/start-workflow.sh +0 -273
  263. package/pennyfarthing-dist/skills/pf-workflow/scripts/workflow-status.sh +0 -167
@@ -1,161 +1,5 @@
1
1
  #!/bin/bash
2
- # Show current stepped workflow progress
3
- # Usage: .pennyfarthing/scripts/workflow/workflow-status.sh [name]
4
- #
5
- # If no name provided, shows status of active workflow session
6
-
7
- set -euo pipefail
8
-
9
- # Find project root
10
- source "$(dirname "${BASH_SOURCE[0]}")/../lib/find-root.sh"
11
-
12
- WORKFLOWS_DIR="$PROJECT_ROOT/.pennyfarthing/workflows"
13
- SESSION_DIR="$PROJECT_ROOT/.session"
14
-
15
- if ! command -v yq &> /dev/null; then
16
- echo "Error: yq is required but not installed"
17
- echo "Install with: brew install yq"
18
- exit 1
19
- fi
20
-
21
- WORKFLOW_NAME="${1:-}"
22
-
23
- # If no name, try to detect from session
24
- if [[ -z "$WORKFLOW_NAME" ]]; then
25
- SESSION_FILE=$(find "$SESSION_DIR" -maxdepth 1 -name "*-workflow-session.md" 2>/dev/null | head -1)
26
-
27
- if [[ -z "$SESSION_FILE" ]]; then
28
- echo "# Workflow Status"
29
- echo ""
30
- echo "No active workflow session found."
31
- echo ""
32
- echo "Use \`/workflow start <name>\` to begin a new workflow."
33
- exit 0
34
- fi
35
-
36
- WORKFLOW_NAME=$(grep -E "^\*\*Workflow:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/\*\*Workflow:\*\* //' | tr -d ' ')
37
-
38
- if [[ -z "$WORKFLOW_NAME" ]]; then
39
- WORKFLOW_NAME=$(basename "$SESSION_FILE" | sed 's/-workflow-session.md//')
40
- fi
41
- else
42
- SESSION_FILE="$SESSION_DIR/${WORKFLOW_NAME}-workflow-session.md"
43
- fi
44
-
45
- if [[ ! -f "$SESSION_FILE" ]]; then
46
- echo "# Workflow Status: $WORKFLOW_NAME"
47
- echo ""
48
- echo "No session found for workflow '$WORKFLOW_NAME'"
49
- echo ""
50
- echo "Use \`/workflow start $WORKFLOW_NAME\` to begin."
51
- exit 0
52
- fi
53
-
54
- # Find workflow file
55
- WORKFLOW_FILE=""
56
- if [[ -f "$WORKFLOWS_DIR/${WORKFLOW_NAME}.yaml" ]]; then
57
- WORKFLOW_FILE="$WORKFLOWS_DIR/${WORKFLOW_NAME}.yaml"
58
- elif [[ -f "$WORKFLOWS_DIR/${WORKFLOW_NAME}/workflow.yaml" ]]; then
59
- WORKFLOW_FILE="$WORKFLOWS_DIR/${WORKFLOW_NAME}/workflow.yaml"
60
- fi
61
-
62
- WORKFLOW_DIR=$(dirname "$WORKFLOW_FILE")
63
-
64
- # Parse session state
65
- CURRENT_STEP=$(grep -E "^\- \*\*Current Step:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' || echo "1")
66
- MODE=$(grep -E "^\- \*\*Mode:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' || echo "create")
67
- STATUS=$(grep -E "^\- \*\*Status:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' || echo "in_progress")
68
- STARTED=$(grep -E "^\- \*\*Started:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' || echo "-")
69
- LAST_UPDATED=$(grep -E "^\- \*\*Last Updated:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' || echo "-")
70
- STEPS_COMPLETED=$(grep -E "^\- \*\*Steps Completed:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' || echo "[]")
71
- NOTES=$(grep -E "^\- \*\*Notes:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' || echo "-")
72
-
73
- # Get total steps from workflow
74
- if [[ -n "$WORKFLOW_FILE" && -f "$WORKFLOW_FILE" ]]; then
75
- # Resolve steps path based on mode
76
- MODE_PATH=$(yq eval ".workflow.modes.$MODE // \"\"" "$WORKFLOW_FILE")
77
- if [[ -n "$MODE_PATH" && "$MODE_PATH" != "null" ]]; then
78
- STEPS_PATH="$MODE_PATH"
79
- else
80
- STEPS_PATH=$(yq eval '.workflow.steps.path' "$WORKFLOW_FILE")
81
- fi
82
-
83
- # Resolve relative path
84
- if [[ "$STEPS_PATH" == ./* ]]; then
85
- STEPS_PATH="$WORKFLOW_DIR/${STEPS_PATH#./}"
86
- elif [[ "$STEPS_PATH" != /* ]]; then
87
- STEPS_PATH="$PROJECT_ROOT/$STEPS_PATH"
88
- fi
89
-
90
- STEP_COUNT=$(find "$STEPS_PATH" -maxdepth 1 -name "step-0*.md" -o -name "step-1*.md" 2>/dev/null | wc -l | tr -d ' ')
91
- WORKFLOW_DESC=$(yq eval '.workflow.description' "$WORKFLOW_FILE" | head -1)
92
- else
93
- STEP_COUNT="?"
94
- WORKFLOW_DESC="-"
95
- fi
96
-
97
- # Calculate completion percentage
98
- COMPLETED_COUNT=$(echo "$STEPS_COMPLETED" | tr -cd ',' | wc -c | tr -d ' ')
99
- if [[ "$STEPS_COMPLETED" != "[]" && -n "$STEPS_COMPLETED" ]]; then
100
- COMPLETED_COUNT=$((COMPLETED_COUNT + 1))
101
- fi
102
-
103
- if [[ "$STEP_COUNT" != "?" && "$STEP_COUNT" -gt 0 ]]; then
104
- COMPLETION_PCT=$((COMPLETED_COUNT * 100 / STEP_COUNT))
105
- else
106
- COMPLETION_PCT=0
107
- fi
108
-
109
- # Build progress bar
110
- BAR_WIDTH=20
111
- if [[ "$STEP_COUNT" != "?" && "$STEP_COUNT" -gt 0 ]]; then
112
- FILLED=$((COMPLETION_PCT * BAR_WIDTH / 100))
113
- EMPTY=$((BAR_WIDTH - FILLED))
114
- PROGRESS_BAR=$(printf '%*s' "$FILLED" '' | tr ' ' '#')$(printf '%*s' "$EMPTY" '' | tr ' ' '-')
115
- else
116
- PROGRESS_BAR=$(printf '%*s' "$BAR_WIDTH" '' | tr ' ' '?')
117
- fi
118
-
119
- # Status indicator
120
- case "$STATUS" in
121
- completed)
122
- STATUS_ICON="[COMPLETE]"
123
- ;;
124
- paused)
125
- STATUS_ICON="[PAUSED]"
126
- ;;
127
- *)
128
- STATUS_ICON="[IN PROGRESS]"
129
- ;;
130
- esac
131
-
132
- # Output status
133
- echo "# Workflow Status: $WORKFLOW_NAME"
134
- echo ""
135
- echo "**Description:** $WORKFLOW_DESC"
136
- echo ""
137
- echo "## Progress"
138
- echo ""
139
- echo "\`\`\`"
140
- echo "[$PROGRESS_BAR] $COMPLETION_PCT%"
141
- echo "\`\`\`"
142
- echo ""
143
- echo "| Field | Value |"
144
- echo "|-------|-------|"
145
- echo "| Status | $STATUS_ICON |"
146
- echo "| Mode | $MODE |"
147
- echo "| Current Step | $CURRENT_STEP of $STEP_COUNT |"
148
- echo "| Completed | $COMPLETED_COUNT steps |"
149
- echo "| Steps Done | $STEPS_COMPLETED |"
150
- echo "| Started | $STARTED |"
151
- echo "| Last Updated | $LAST_UPDATED |"
152
- if [[ "$NOTES" != "-" ]]; then
153
- echo "| Notes | $NOTES |"
154
- fi
155
- echo ""
156
- echo "**Session:** $SESSION_FILE"
157
- echo ""
158
-
159
- if [[ "$STATUS" != "completed" ]]; then
160
- echo "**Next:** Use \`/workflow resume\` to continue from step $CURRENT_STEP"
161
- fi
2
+ # DEPRECATED: Use `pf workflow status` instead.
3
+ # This shim forwards to the Python CLI for backward compatibility.
4
+ echo "Warning: workflow-status.sh is deprecated. Use: pf workflow status $*" >&2
5
+ exec pf workflow status "$@"
@@ -57,7 +57,7 @@ pf bc save <NAME> [--dry-run]
57
57
  | `NAME` | Yes | Layout name to save as |
58
58
  | `--dry-run` | No | Preview without making changes |
59
59
 
60
- Fetches the active layout from the running Cyclist/BikeRack server (checks `.bikerack-port` then `.cyclist-port`). Fails if no server is running.
60
+ Fetches the active layout from the running Cyclist/BikeRack server (reads `.wheelhub-port`). Fails if no server is running.
61
61
 
62
62
  Output: `{"success": true, "name": "<name>", "panels": <count>}`
63
63
 
@@ -129,11 +129,14 @@ pf jira reconcile --fix
129
129
  ## Sprint Management
130
130
 
131
131
  ```bash
132
+ # Read sprint ID from current-sprint.yaml (never hardcode)
133
+ SPRINT_ID=$(grep 'jira_sprint_id:' sprint/current-sprint.yaml | awk '{print $2}')
134
+
132
135
  # Add issue to sprint
133
- pf jira sprint add 276 MSSCI-11999
136
+ pf jira sprint add "$SPRINT_ID" MSSCI-11999
134
137
 
135
138
  # Preview
136
- pf jira sprint add 276 MSSCI-11999 --dry-run
139
+ pf jira sprint add "$SPRINT_ID" MSSCI-11999 --dry-run
137
140
  ```
138
141
 
139
142
  ## Common Workflows
@@ -4,19 +4,19 @@
4
4
 
5
5
  ```bash
6
6
  # List all available workflows
7
- .pennyfarthing/scripts/workflow/list-workflows.sh
7
+ pf workflow list
8
8
 
9
9
  # Show TDD workflow details
10
- .pennyfarthing/scripts/workflow/show-workflow.sh tdd
10
+ pf workflow show tdd
11
11
 
12
12
  # Show current session's workflow
13
- .pennyfarthing/scripts/workflow/show-workflow.sh
13
+ pf workflow show
14
14
 
15
15
  # Show trivial workflow
16
- .pennyfarthing/scripts/workflow/show-workflow.sh trivial
16
+ pf workflow show trivial
17
17
  ```
18
18
 
19
- ## Checking State (Python CLI)
19
+ ## Checking State
20
20
 
21
21
  ```bash
22
22
  # Check current workflow state
@@ -31,6 +31,13 @@ pf workflow phase-check tdd review
31
31
  pf workflow phase-check trivial implement
32
32
  # Returns: dev
33
33
 
34
+ # Get workflow type
35
+ pf workflow type tdd
36
+ # Returns: phased
37
+
38
+ pf workflow type architecture
39
+ # Returns: stepped
40
+
34
41
  # Emit handoff marker for Cyclist
35
42
  pf workflow handoff reviewer
36
43
  ```
@@ -39,40 +46,44 @@ pf workflow handoff reviewer
39
46
 
40
47
  ```bash
41
48
  # Start architecture workflow in create mode (default)
42
- .pennyfarthing/scripts/workflow/start-workflow.sh architecture
49
+ pf workflow start architecture
43
50
 
44
51
  # Start in validate mode
45
- .pennyfarthing/scripts/workflow/start-workflow.sh architecture --mode validate
52
+ pf workflow start architecture --mode validate
46
53
 
47
54
  # Check progress
48
- .pennyfarthing/scripts/workflow/workflow-status.sh
55
+ pf workflow status
49
56
 
50
57
  # Resume after interruption
51
- .pennyfarthing/scripts/workflow/resume-workflow.sh
52
- .pennyfarthing/scripts/workflow/resume-workflow.sh architecture
58
+ pf workflow resume
59
+ pf workflow resume architecture
60
+
61
+ # Complete current step and advance
62
+ pf workflow complete-step
63
+ pf workflow complete-step architecture --step 3
53
64
  ```
54
65
 
55
66
  ## Phase Repair
56
67
 
57
68
  ```bash
58
69
  # Preview phase fix
59
- .pennyfarthing/scripts/workflow/fix-session-phase.sh 56-1 review --dry-run
70
+ pf workflow fix-phase 56-1 review --dry-run
60
71
 
61
72
  # Fix phase to review (after Dev completed)
62
- .pennyfarthing/scripts/workflow/fix-session-phase.sh 56-1 review
73
+ pf workflow fix-phase 56-1 review
63
74
 
64
75
  # Fix phase to approved (after Reviewer approved)
65
- .pennyfarthing/scripts/workflow/fix-session-phase.sh 56-1 approved
76
+ pf workflow fix-phase 56-1 approved
66
77
 
67
78
  # Using Jira key
68
- .pennyfarthing/scripts/workflow/fix-session-phase.sh MSSCI-12190 approved
79
+ pf workflow fix-phase MSSCI-12190 approved
69
80
  ```
70
81
 
71
82
  ## Switching Workflow Mid-Session
72
83
 
73
84
  1. Verify the target workflow exists:
74
85
  ```bash
75
- .pennyfarthing/scripts/workflow/show-workflow.sh trivial
86
+ pf workflow show trivial
76
87
  ```
77
88
 
78
89
  2. Edit the session file:
@@ -89,7 +100,7 @@ pf workflow handoff reviewer
89
100
  pf workflow check --json
90
101
  # Edit session to change workflow from trivial to tdd
91
102
  # Fix phase to match where you are
92
- .pennyfarthing/scripts/workflow/fix-session-phase.sh 56-1 red
103
+ pf workflow fix-phase 56-1 red
93
104
  ```
94
105
 
95
106
  ### Agent activated on wrong phase
@@ -11,25 +11,22 @@ Pennyfarthing uses YAML-defined workflows to control agent sequences. The defaul
11
11
 
12
12
  ## Quick Reference
13
13
 
14
- ### Shell Script Commands
15
-
16
- | Command | Script | Purpose |
17
- |---------|--------|---------|
18
- | `/pf-workflow` or `/pf-workflow list` | `.pennyfarthing/scripts/workflow/list-workflows.sh` | List all workflows |
19
- | `/pf-workflow show [name]` | `.pennyfarthing/scripts/workflow/show-workflow.sh [name]` | Show workflow details |
20
- | `/pf-workflow set <name>` | Edit session file `**Workflow:**` line | Switch workflow mid-session |
21
- | `/pf-workflow start <name>` | `.pennyfarthing/scripts/workflow/start-workflow.sh <name> [--mode M]` | Start stepped workflow |
22
- | `/pf-workflow resume [name]` | `.pennyfarthing/scripts/workflow/resume-workflow.sh [name]` | Resume interrupted workflow |
23
- | `/pf-workflow status` | `.pennyfarthing/scripts/workflow/workflow-status.sh` | Show stepped workflow progress |
24
- | `/pf-workflow fix-phase <id> <phase>` | `.pennyfarthing/scripts/workflow/fix-session-phase.sh <id> <phase> [--dry-run]` | Repair session phase |
25
-
26
14
  ### Python CLI Commands
27
15
 
28
16
  | Command | CLI | Purpose |
29
17
  |---------|-----|---------|
18
+ | `/pf-workflow` or `/pf-workflow list` | `pf workflow list` | List all workflows |
19
+ | `/pf-workflow show [name]` | `pf workflow show [name]` | Show workflow details |
20
+ | `/pf-workflow set <name>` | Edit session file `**Workflow:**` line | Switch workflow mid-session |
21
+ | `/pf-workflow start <name>` | `pf workflow start <name> [--mode M]` | Start stepped workflow |
22
+ | `/pf-workflow resume [name]` | `pf workflow resume [name]` | Resume interrupted workflow |
23
+ | `/pf-workflow status` | `pf workflow status` | Show stepped workflow progress |
24
+ | `/pf-workflow fix-phase <id> <phase>` | `pf workflow fix-phase <id> <phase> [--dry-run]` | Repair session phase |
30
25
  | Check workflow state | `pf workflow check [--json]` | Current story, phase, state |
31
26
  | Check phase owner | `pf workflow phase-check <workflow> <phase>` | Which agent owns a phase |
27
+ | Get workflow type | `pf workflow type <workflow>` | phased/stepped/procedural |
32
28
  | Emit handoff marker | `pf workflow handoff <next-agent>` | CYCLIST handoff marker |
29
+ | Complete step | `pf workflow complete-step [name] [--step N]` | Advance stepped workflow |
33
30
 
34
31
  ### Built-in Workflows
35
32
 
@@ -1,11 +1,11 @@
1
1
  # Workflow — Detailed Usage
2
2
 
3
- ## Shell Script Commands
3
+ ## Commands
4
4
 
5
5
  ### List Workflows
6
6
 
7
7
  ```bash
8
- .pennyfarthing/scripts/workflow/list-workflows.sh
8
+ pf workflow list
9
9
  ```
10
10
 
11
11
  No arguments. Returns table of workflows with type, phases/steps count, modes, default flag, description.
@@ -13,7 +13,7 @@ No arguments. Returns table of workflows with type, phases/steps count, modes, d
13
13
  ### Show Workflow
14
14
 
15
15
  ```bash
16
- .pennyfarthing/scripts/workflow/show-workflow.sh [NAME]
16
+ pf workflow show [NAME]
17
17
  ```
18
18
 
19
19
  | Arg | Required | Description |
@@ -31,7 +31,7 @@ Warning: Only do this when story requirements have fundamentally changed. Switch
31
31
  ### Start Stepped Workflow
32
32
 
33
33
  ```bash
34
- .pennyfarthing/scripts/workflow/start-workflow.sh <NAME> [--mode <MODE>]
34
+ pf workflow start <NAME> [--mode <MODE>]
35
35
  ```
36
36
 
37
37
  | Arg/Option | Required | Description |
@@ -44,7 +44,7 @@ Creates a new session and begins at step 1.
44
44
  ### Resume Stepped Workflow
45
45
 
46
46
  ```bash
47
- .pennyfarthing/scripts/workflow/resume-workflow.sh [NAME]
47
+ pf workflow resume [NAME]
48
48
  ```
49
49
 
50
50
  | Arg | Required | Description |
@@ -54,7 +54,7 @@ Creates a new session and begins at step 1.
54
54
  ### Workflow Status
55
55
 
56
56
  ```bash
57
- .pennyfarthing/scripts/workflow/workflow-status.sh
57
+ pf workflow status
58
58
  ```
59
59
 
60
60
  No arguments. Shows current step, progress percentage, mode.
@@ -62,7 +62,7 @@ No arguments. Shows current step, progress percentage, mode.
62
62
  ### Fix Session Phase
63
63
 
64
64
  ```bash
65
- .pennyfarthing/scripts/workflow/fix-session-phase.sh <STORY_ID> <TARGET_PHASE> [--dry-run]
65
+ pf workflow fix-phase <STORY_ID> <TARGET_PHASE> [--dry-run]
66
66
  ```
67
67
 
68
68
  | Arg/Option | Required | Description |
@@ -80,9 +80,22 @@ Valid phases by workflow:
80
80
 
81
81
  Updates `**Phase:**` field, `**Phase Started:**` timestamp, and handoff history table.
82
82
 
83
+ ### Complete Step
84
+
85
+ ```bash
86
+ pf workflow complete-step [NAME] [--step N]
87
+ ```
88
+
89
+ | Arg/Option | Required | Description |
90
+ |------------|----------|-------------|
91
+ | `NAME` | No | Workflow name (auto-detects from session) |
92
+ | `--step N` | No | Complete specific step number instead of current |
93
+
94
+ Advances session: increments step, updates completed list, recalculates percentage.
95
+
83
96
  ---
84
97
 
85
- ## Python CLI Commands
98
+ ## State & Phase Commands
86
99
 
87
100
  ### Check Workflow State
88
101
 
@@ -109,6 +122,18 @@ pf workflow phase-check <WORKFLOW_NAME> <PHASE>
109
122
 
110
123
  Returns the agent name that owns the phase.
111
124
 
125
+ ### Get Workflow Type
126
+
127
+ ```bash
128
+ pf workflow type <WORKFLOW_NAME>
129
+ ```
130
+
131
+ | Arg | Required | Description |
132
+ |-----|----------|-------------|
133
+ | `WORKFLOW_NAME` | Yes | Workflow name (e.g., `tdd`, `architecture`) |
134
+
135
+ Returns `phased`, `stepped`, or `procedural`.
136
+
112
137
  ### Emit Handoff Marker
113
138
 
114
139
  ```bash
@@ -1,14 +1,23 @@
1
1
  # BDD Tandem Workflow - BDD with Full Tandem Chain
2
- # Extends standard BDD with tandem observers:
3
- # - Architect backseats UX-Designer during design
4
- # - UX-Designer backseats Dev during implementation
5
- # - PM backseats Reviewer during review
6
2
  #
7
- # Flow: SM UX-Designer (+Architect) TEA → Dev (+UX-Designer) → Reviewer (+PM) → SM
3
+ # When to use: Best for UI/UX-heavy stories where designer-architect pairing
4
+ # shapes implementation. Use this instead of base bdd when the story involves
5
+ # complex user flows, new component patterns, or cross-domain UI integration.
6
+ #
7
+ # Tandem pairings:
8
+ # - DESIGN phase: UX-Designer + Architect (file-watch) — Architect validates technical feasibility
9
+ # - RED phase: TEA + Dev (file-watch) — Dev provides implementation context for test strategy
10
+ # - GREEN phase: Dev + UX-Designer (file-watch) — UX-Designer ensures design fidelity
11
+ # - REVIEW phase: Reviewer + PM (file-watch) — PM validates business requirements
12
+ #
13
+ # Compared to base bdd: Adds tandem observers on every working phase.
14
+ # Designer-developer pairing ensures UX intent survives implementation.
15
+ #
16
+ # Flow: SM → UX-Designer (+Architect) → TEA (+Dev) → Dev (+UX-Designer) → Reviewer (+PM) → SM
8
17
 
9
18
  workflow:
10
19
  name: bdd-tandem
11
- description: BDD with full tandem chain across design, implementation, and review
20
+ description: BDD with full tandem chain designer and architect consultation across phases
12
21
  version: "1.0.0"
13
22
 
14
23
  phases:
@@ -36,6 +45,9 @@ workflow:
36
45
  file: gates/tests-fail
37
46
  type: tests_fail
38
47
  condition: Behavior scenarios have test coverage
48
+ tandem:
49
+ partner: dev
50
+ scope: file-watch
39
51
 
40
52
  - name: green
41
53
  agent: dev
@@ -32,7 +32,7 @@ Build a complete picture of uncommitted changes across ALL repos defined in `.cl
32
32
  **CRITICAL: Use the multi-repo script, not plain `git status`.**
33
33
 
34
34
  ```bash
35
- .pennyfarthing/scripts/git/git-status-all.sh
35
+ pf git status
36
36
  ```
37
37
 
38
38
  This shows branch, staged/unstaged changes, and unpushed commits for **all repos** defined in the project configuration.
@@ -34,7 +34,7 @@ Git cleanup summary report including:
34
34
  ### 4.1 Final Git Status (All Repos)
35
35
 
36
36
  ```bash
37
- .pennyfarthing/scripts/git/git-status-all.sh
37
+ pf git status
38
38
  ```
39
39
 
40
40
  Expected: Clean working directory in all repos, or only intentionally skipped files.
@@ -68,7 +68,7 @@ To run git-cleanup again:
68
68
  Or for a quick status check across all repos:
69
69
 
70
70
  ```bash
71
- .pennyfarthing/scripts/git/git-status-all.sh
71
+ pf git status
72
72
  ```
73
73
 
74
74
  ---
@@ -0,0 +1,65 @@
1
+ # Review Tandem Workflow - TDD with Focused Architectural Review
2
+ #
3
+ # When to use: Best for stories that primarily need architectural review during
4
+ # the review phase. Use this for large refactors (10+ pts), cross-cutting
5
+ # infrastructure changes, or stories where an architect audit catches issues
6
+ # that a standard code review might miss.
7
+ #
8
+ # Tandem pairings:
9
+ # - REVIEW phase: Reviewer + Architect (file-watch) — Architect provides
10
+ # focused architectural audit alongside standard code review
11
+ #
12
+ # Compared to base tdd: Same phase flow, but adds architect consultation
13
+ # during review only. Lighter than tdd-tandem (no tandem on red/green phases).
14
+ #
15
+ # Flow: SM → TEA → Dev → Reviewer (+Architect) → SM
16
+
17
+ workflow:
18
+ name: review-tandem
19
+ description: TDD with tandem architect consultation on review phase
20
+ version: "1.0.0"
21
+
22
+ phases:
23
+ - name: setup
24
+ agent: sm
25
+ output: [session_file, branches, story_context]
26
+
27
+ - name: red
28
+ agent: tea
29
+ input: [session_file, story_context]
30
+ output: [failing_tests]
31
+ gate:
32
+ file: gates/tests-fail
33
+ type: tests_fail
34
+ condition: All acceptance criteria have test coverage
35
+
36
+ - name: green
37
+ agent: dev
38
+ input: [failing_tests, story_context]
39
+ output: [implementation, passing_tests]
40
+ gate:
41
+ file: gates/tests-pass
42
+ type: tests_pass
43
+ condition: All tests passing, no skipped tests
44
+
45
+ - name: review
46
+ agent: reviewer
47
+ input: [implementation, passing_tests]
48
+ output: [approval]
49
+ gate:
50
+ file: gates/approval
51
+ type: approval
52
+ condition: Code review approved, architecture validated
53
+ tandem:
54
+ partner: architect
55
+ scope: file-watch
56
+
57
+ - name: finish
58
+ agent: sm
59
+ input: [approval]
60
+ output: [archived_session, story_summary]
61
+
62
+ triggers:
63
+ tags: [review-tandem, tandem]
64
+ points:
65
+ min: 8
@@ -1,14 +1,22 @@
1
1
  # TDD Tandem Workflow - TDD with Full Tandem Chain
2
- # Extends standard TDD with tandem observers on every phase:
3
- # - Architect backseats TEA during red phase
4
- # - TEA backseats Dev during green phase
5
- # - PM backseats Reviewer during review phase
6
2
  #
7
- # Flow: SM TEA (+Architect) Dev (+TEA) Reviewer (+PM) → SM
3
+ # When to use: Best for 5+ point feature stories where architectural alignment
4
+ # during implementation provides high value. Use this instead of base tdd when
5
+ # the story involves cross-cutting concerns, new patterns, or complex integrations.
6
+ #
7
+ # Tandem pairings:
8
+ # - RED phase: TEA + Architect (file-watch) — Architect reviews test strategy
9
+ # - GREEN phase: Dev + Architect (file-watch) — Architect guides implementation patterns
10
+ # - REVIEW phase: Reviewer + PM (file-watch) — PM validates business requirements
11
+ #
12
+ # Compared to base tdd: Adds tandem observers on every working phase.
13
+ # The extra context from partner agents helps catch architectural drift early.
14
+ #
15
+ # Flow: SM → TEA (+Architect) → Dev (+Architect) → Reviewer (+PM) → SM
8
16
 
9
17
  workflow:
10
18
  name: tdd-tandem
11
- description: TDD with full tandem chain across all phases
19
+ description: TDD with full tandem chain — architect and PM consultation across phases
12
20
  version: "2.0.0"
13
21
 
14
22
  phases:
@@ -37,7 +45,7 @@ workflow:
37
45
  type: tests_pass
38
46
  condition: All tests passing, no skipped tests
39
47
  tandem:
40
- partner: tea
48
+ partner: architect
41
49
  scope: file-watch
42
50
 
43
51
  - name: review
@@ -60,5 +68,5 @@ workflow:
60
68
  triggers:
61
69
  tags: [tandem]
62
70
  points:
63
- min: 3
71
+ min: 5
64
72
  default: false
@@ -12,8 +12,9 @@ Python Click CLI for Pennyfarthing. Entry point: `pennyfarthing_scripts/cli.py`.
12
12
  | `pf bc` | Panel focus and layout management | `bc/cli.py` |
13
13
  | `pf validate` | Project validators | `validate/cli.py` |
14
14
  | `pf agent` | Agent session management | `cli.py` (inline) |
15
- | `pf workflow` | Workflow state and phase management | `cli.py` (inline) |
15
+ | `pf workflow` | Workflow state and phase management | `workflow/cli.py` |
16
16
  | `pf bikerack` | BikeRack dashboard launcher | `bikerack/cli.py` |
17
+ | `pf git` | Repository operations (status, branches, worktree, hooks) | `git_group/cli.py` |
17
18
  | `pf debug` | Analysis tools (hotspots, deadcode, healthscore) | `cli.py` (inline group) |
18
19
 
19
20
  ### Sugar Shortcuts
@@ -139,9 +140,17 @@ Options: `--session-id`, `--no-persona`, `--json`, `--minimal`, `--full`, `--qui
139
140
 
140
141
  | Command | Description | Source |
141
142
  |---------|-------------|--------|
142
- | `pf workflow check` | Current workflow state | `workflow.py` |
143
- | `pf workflow phase-check WORKFLOW PHASE` | Check phase owner | `workflow.py` |
144
- | `pf workflow handoff AGENT` | Emit handoff marker | `cli.py` (inline) |
143
+ | `pf workflow check [--json]` | Current workflow state | `workflow/cli.py` |
144
+ | `pf workflow phase-check WORKFLOW PHASE` | Check phase owner | `workflow/cli.py` |
145
+ | `pf workflow handoff AGENT` | Emit handoff marker | `workflow/cli.py` |
146
+ | `pf workflow type WORKFLOW` | Get workflow type (phased/stepped/procedural) | `workflow/cli.py` |
147
+ | `pf workflow list` | List all available workflows | `workflow/cli.py` |
148
+ | `pf workflow show [NAME]` | Show workflow details | `workflow/cli.py` |
149
+ | `pf workflow start NAME [--mode M]` | Start stepped workflow | `workflow/cli.py` |
150
+ | `pf workflow resume [NAME]` | Resume interrupted workflow | `workflow/cli.py` |
151
+ | `pf workflow status [NAME]` | Show stepped workflow progress | `workflow/cli.py` |
152
+ | `pf workflow fix-phase ID PHASE [--dry-run]` | Repair session phase | `workflow/cli.py` |
153
+ | `pf workflow complete-step [NAME] [--step N]` | Complete current step | `workflow/cli.py` |
145
154
 
146
155
  ## pf bikerack
147
156
 
@@ -151,6 +160,19 @@ Options: `--session-id`, `--no-persona`, `--json`, `--minimal`, `--full`, `--qui
151
160
  | `pf bikerack stop` | Stop running instance | `bikerack/cli.py` |
152
161
  | `pf bikerack status` | Show running state | `bikerack/cli.py` |
153
162
 
163
+ ## pf git
164
+
165
+ | Command | Description | Source |
166
+ |---------|-------------|--------|
167
+ | `pf git status [--brief]` | Check git status of all repos | `git/status_all.py` |
168
+ | `pf git branches BRANCH [--repos all\|api\|ui]` | Create feature branches | `git/create_branches.py` |
169
+ | `pf git cleanup` | Start git-cleanup workflow | `git_group/cli.py` |
170
+ | `pf git worktree create NAME BRANCH` | Create worktree(s) | `git/worktree.py` |
171
+ | `pf git worktree remove NAME` | Remove worktree | `git/worktree.py` |
172
+ | `pf git worktree list` | List active worktrees | `git/worktree.py` |
173
+ | `pf git worktree status` | Show worktree status | `git/worktree.py` |
174
+ | `pf git install-hooks` | Install git hooks with .d/ dispatcher | `git/hooks_installer.py` |
175
+
154
176
  ## pf debug
155
177
 
156
178
  | Command | Description | Source |