@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,157 +1,5 @@
1
1
  #!/bin/bash
2
- # Resume a stepped workflow from last completed step
3
- # Usage: .pennyfarthing/scripts/workflow/resume-workflow.sh [name]
4
- #
5
- # If no name provided, detects from active 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
- # Look for workflow session files
26
- SESSION_FILE=$(find "$SESSION_DIR" -maxdepth 1 -name "*-workflow-session.md" 2>/dev/null | head -1)
27
-
28
- if [[ -z "$SESSION_FILE" ]]; then
29
- echo "# Resume Stepped Workflow"
30
- echo ""
31
- echo "No active workflow session found."
32
- echo ""
33
- echo "Use \`/workflow start <name>\` to begin a new workflow."
34
- exit 1
35
- fi
36
-
37
- # Extract workflow name from session
38
- WORKFLOW_NAME=$(grep -E "^\*\*Workflow:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/\*\*Workflow:\*\* //' | tr -d ' ')
39
-
40
- if [[ -z "$WORKFLOW_NAME" ]]; then
41
- # Try extracting from filename
42
- WORKFLOW_NAME=$(basename "$SESSION_FILE" | sed 's/-workflow-session.md//')
43
- fi
44
- else
45
- SESSION_FILE="$SESSION_DIR/${WORKFLOW_NAME}-workflow-session.md"
46
- fi
47
-
48
- if [[ ! -f "$SESSION_FILE" ]]; then
49
- echo "Error: No session found for workflow '$WORKFLOW_NAME'"
50
- echo ""
51
- echo "Use \`/workflow start $WORKFLOW_NAME\` to begin."
52
- exit 1
53
- fi
54
-
55
- # Find workflow file
56
- WORKFLOW_FILE=""
57
- if [[ -f "$WORKFLOWS_DIR/${WORKFLOW_NAME}.yaml" ]]; then
58
- WORKFLOW_FILE="$WORKFLOWS_DIR/${WORKFLOW_NAME}.yaml"
59
- elif [[ -f "$WORKFLOWS_DIR/${WORKFLOW_NAME}/workflow.yaml" ]]; then
60
- WORKFLOW_FILE="$WORKFLOWS_DIR/${WORKFLOW_NAME}/workflow.yaml"
61
- else
62
- echo "Error: Workflow definition '$WORKFLOW_NAME' not found"
63
- exit 1
64
- fi
65
-
66
- WORKFLOW_DIR=$(dirname "$WORKFLOW_FILE")
67
-
68
- # Parse session state
69
- CURRENT_STEP=$(grep -E "^\- \*\*Current Step:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' || echo "1")
70
- MODE=$(grep -E "^\- \*\*Mode:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' || echo "create")
71
- STATUS=$(grep -E "^\- \*\*Status:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' || echo "in_progress")
72
- STEPS_COMPLETED=$(grep -E "^\- \*\*Steps Completed:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' || echo "[]")
73
-
74
- # Check if workflow is complete
75
- if [[ "$STATUS" == "completed" ]]; then
76
- echo "# Workflow Complete: $WORKFLOW_NAME"
77
- echo ""
78
- echo "This workflow has already been completed."
79
- echo ""
80
- echo "To start a new session, delete the session file:"
81
- echo "\`\`\`bash"
82
- echo "rm \"$SESSION_FILE\""
83
- echo "\`\`\`"
84
- echo ""
85
- echo "Then run \`/workflow start $WORKFLOW_NAME\`"
86
- exit 0
87
- fi
88
-
89
- # Resolve steps path based on mode
90
- MODE_PATH=$(yq eval ".workflow.modes.$MODE // \"\"" "$WORKFLOW_FILE")
91
- if [[ -n "$MODE_PATH" && "$MODE_PATH" != "null" ]]; then
92
- STEPS_PATH="$MODE_PATH"
93
- else
94
- STEPS_PATH=$(yq eval '.workflow.steps.path' "$WORKFLOW_FILE")
95
- fi
96
-
97
- # Resolve relative path
98
- if [[ "$STEPS_PATH" == ./* ]]; then
99
- STEPS_PATH="$WORKFLOW_DIR/${STEPS_PATH#./}"
100
- elif [[ "$STEPS_PATH" != /* ]]; then
101
- STEPS_PATH="$PROJECT_ROOT/$STEPS_PATH"
102
- fi
103
-
104
- # Count steps
105
- STEP_COUNT=$(find "$STEPS_PATH" -maxdepth 1 -name "step-0*.md" -o -name "step-1*.md" 2>/dev/null | wc -l | tr -d ' ')
106
-
107
- # Find the current step file
108
- # Handle various naming: step-01.md, step-01-name.md, step-1-name.md
109
- PADDED_STEP=$(printf "%02d" "$CURRENT_STEP")
110
- STEP_FILE=$(find "$STEPS_PATH" -maxdepth 1 \( -name "step-${PADDED_STEP}*.md" -o -name "step-${CURRENT_STEP}-*.md" \) 2>/dev/null | sort | head -1)
111
-
112
- if [[ -z "$STEP_FILE" ]]; then
113
- echo "Error: Could not find step $CURRENT_STEP file in $STEPS_PATH"
114
- exit 1
115
- fi
116
-
117
- # Update last updated timestamp
118
- NOW=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
119
- sed -i '' "s/^\- \*\*Last Updated:\*\*.*/- **Last Updated:** $NOW/" "$SESSION_FILE" 2>/dev/null || true
120
-
121
- # Calculate completion percentage
122
- COMPLETED_COUNT=$(echo "$STEPS_COMPLETED" | tr -cd ',' | wc -c | tr -d ' ')
123
- if [[ "$STEPS_COMPLETED" != "[]" ]]; then
124
- COMPLETED_COUNT=$((COMPLETED_COUNT + 1))
125
- fi
126
- if [[ "$STEP_COUNT" -gt 0 ]]; then
127
- COMPLETION_PCT=$((COMPLETED_COUNT * 100 / STEP_COUNT))
128
- else
129
- COMPLETION_PCT=0
130
- fi
131
-
132
- # Output resume info
133
- echo "# Resuming Workflow: $WORKFLOW_NAME"
134
- echo ""
135
- echo "**Mode:** $MODE"
136
- echo "**Progress:** Step $CURRENT_STEP of $STEP_COUNT ($COMPLETION_PCT% complete)"
137
- echo "**Steps Completed:** $STEPS_COMPLETED"
138
- echo "**Session:** $SESSION_FILE"
139
- echo ""
140
- echo "---"
141
- echo ""
142
- echo "## Step $CURRENT_STEP of $STEP_COUNT"
143
- echo ""
144
-
145
- # Output step content (strip frontmatter if present)
146
- if head -1 "$STEP_FILE" | grep -q "^---$"; then
147
- awk '/^---$/{if(++c==2){p=1;next}}p' "$STEP_FILE"
148
- else
149
- cat "$STEP_FILE"
150
- fi
151
-
152
- echo ""
153
- echo "---"
154
- echo ""
155
- echo "**Controls:**"
156
- echo "- \`C\` - Continue to next step"
157
- echo "- \`/workflow status\` - Check progress"
2
+ # DEPRECATED: Use `pf workflow resume` instead.
3
+ # This shim forwards to the Python CLI for backward compatibility.
4
+ echo "Warning: resume-workflow.sh is deprecated. Use: pf workflow resume $*" >&2
5
+ exec pf workflow resume "$@"
@@ -1,132 +1,5 @@
1
1
  #!/bin/bash
2
- # Show workflow details
3
- # Usage: .pennyfarthing/scripts/workflow/show-workflow.sh [name]
4
- # or: Invoked with PROJECT_ROOT already set
5
- #
6
- # If no name provided, shows current session's workflow
7
- # If name provided, shows that workflow's details
8
-
9
- set -euo pipefail
10
-
11
- # Find project root
12
- source "$(dirname "${BASH_SOURCE[0]}")/../lib/find-root.sh"
13
-
14
- WORKFLOWS_DIR="$PROJECT_ROOT/.pennyfarthing/workflows"
15
- SESSION_DIR="$PROJECT_ROOT/.session"
16
-
17
- if ! command -v yq &> /dev/null; then
18
- echo "Error: yq is required but not installed"
19
- echo "Install with: brew install yq"
20
- exit 1
21
- fi
22
-
23
- # Get workflow name from argument or session
24
- WORKFLOW_NAME="${1:-}"
25
-
26
- if [[ -z "$WORKFLOW_NAME" ]]; then
27
- # Try to get from current session (exclude archive directory)
28
- SESSION_FILE=$(find "$SESSION_DIR" -maxdepth 1 -name "*-session.md" 2>/dev/null | head -1)
29
- if [[ -n "$SESSION_FILE" ]]; then
30
- # Extract workflow from session file (look for **Workflow:** line)
31
- WORKFLOW_NAME=$(grep -E "^\*\*Workflow:\*\*" "$SESSION_FILE" 2>/dev/null | sed 's/.*\*\* //' | tr -d ' ' || echo "")
32
- if [[ -z "$WORKFLOW_NAME" ]]; then
33
- # Try alternate format (Workflow: value in tracking section)
34
- WORKFLOW_NAME=$(grep -E "^Workflow:" "$SESSION_FILE" 2>/dev/null | head -1 | cut -d: -f2 | tr -d ' ' || echo "")
35
- fi
36
- fi
37
-
38
- if [[ -z "$WORKFLOW_NAME" ]]; then
39
- echo "# Current Workflow"
40
- echo ""
41
- echo "No active session found. Showing default workflow (tdd)."
42
- echo ""
43
- WORKFLOW_NAME="tdd"
44
- else
45
- echo "# Current Session Workflow: $WORKFLOW_NAME"
46
- echo ""
47
- fi
48
- else
49
- echo "# Workflow: $WORKFLOW_NAME"
50
- echo ""
51
- fi
52
-
53
- WORKFLOW_FILE="$WORKFLOWS_DIR/${WORKFLOW_NAME}.yaml"
54
-
55
- if [[ ! -f "$WORKFLOW_FILE" ]]; then
56
- echo "Error: Workflow '$WORKFLOW_NAME' not found"
57
- echo ""
58
- echo "Available workflows:"
59
- for f in "$WORKFLOWS_DIR"/*.yaml; do
60
- [[ -f "$f" ]] || continue
61
- basename "$f" .yaml
62
- done
63
- exit 1
64
- fi
65
-
66
- # Extract workflow details
67
- DESC=$(yq eval '.workflow.description' "$WORKFLOW_FILE")
68
- VERSION=$(yq eval '.workflow.version' "$WORKFLOW_FILE")
69
-
70
- echo "**Description:** $DESC"
71
- echo "**Version:** $VERSION"
72
- echo ""
73
-
74
- # Show phases as a flow diagram
75
- echo "## Phase Flow"
76
- echo ""
77
- echo -n "\`\`\`"
78
- echo ""
79
-
80
- # Build phase flow string
81
- PHASES=""
82
- yq eval '.workflow.phases[].name' "$WORKFLOW_FILE" | while read -r phase; do
83
- if [[ -n "$PHASES" ]]; then
84
- echo -n " -> "
85
- fi
86
- echo -n "$phase"
87
- PHASES="$phase"
88
- done
89
- echo ""
90
- echo "\`\`\`"
91
- echo ""
92
-
93
- # Show phases table
94
- echo "## Phases"
95
- echo ""
96
- echo "| Phase | Agent | Gate |"
97
- echo "|-------|-------|------|"
98
-
99
- yq eval '.workflow.phases[] | .name + "|" + .agent + "|" + (.gate.type // "none")' "$WORKFLOW_FILE" | while IFS='|' read -r phase agent gate; do
100
- echo "| $phase | $agent | $gate |"
101
- done
102
-
103
- echo ""
104
-
105
- # Show triggers
106
- echo "## Triggers"
107
- echo ""
108
-
109
- TYPES=$(yq eval '.workflow.triggers.types // []' "$WORKFLOW_FILE")
110
- if [[ "$TYPES" != "[]" && "$TYPES" != "null" ]]; then
111
- echo "**Types:** $(yq eval '.workflow.triggers.types | join(", ")' "$WORKFLOW_FILE")"
112
- fi
113
-
114
- POINTS_MIN=$(yq eval '.workflow.triggers.points.min // ""' "$WORKFLOW_FILE")
115
- POINTS_MAX=$(yq eval '.workflow.triggers.points.max // ""' "$WORKFLOW_FILE")
116
-
117
- if [[ -n "$POINTS_MIN" && "$POINTS_MIN" != "null" ]]; then
118
- echo "**Points Min:** $POINTS_MIN"
119
- fi
120
- if [[ -n "$POINTS_MAX" && "$POINTS_MAX" != "null" ]]; then
121
- echo "**Points Max:** $POINTS_MAX"
122
- fi
123
-
124
- IS_DEFAULT=$(yq eval '.workflow.triggers.default // false' "$WORKFLOW_FILE")
125
- if [[ "$IS_DEFAULT" == "true" ]]; then
126
- echo "**Default:** yes (used when no other workflow matches)"
127
- fi
128
-
129
- TAGS=$(yq eval '.workflow.triggers.tags // []' "$WORKFLOW_FILE")
130
- if [[ "$TAGS" != "[]" && "$TAGS" != "null" ]]; then
131
- echo "**Tags:** $(yq eval '.workflow.triggers.tags | join(", ")' "$WORKFLOW_FILE")"
132
- fi
2
+ # DEPRECATED: Use `pf workflow show` instead.
3
+ # This shim forwards to the Python CLI for backward compatibility.
4
+ echo "Warning: show-workflow.sh is deprecated. Use: pf workflow show $*" >&2
5
+ exec pf workflow show "$@"
@@ -1,250 +1,5 @@
1
1
  #!/bin/bash
2
- # Start a stepped workflow
3
- # Usage: .pennyfarthing/scripts/workflow/start-workflow.sh <name> [--mode create|validate|edit]
4
- #
5
- # Creates a new workflow session and loads step 1.
6
- # For tri-modal workflows, --mode selects the step path (default: create)
7
-
8
- set -euo pipefail
9
-
10
- # Find project root
11
- source "$(dirname "${BASH_SOURCE[0]}")/../lib/find-root.sh"
12
-
13
- WORKFLOWS_DIR="$PROJECT_ROOT/.pennyfarthing/workflows"
14
- SESSION_DIR="$PROJECT_ROOT/.session"
15
-
16
- if ! command -v yq &> /dev/null; then
17
- echo "Error: yq is required but not installed"
18
- echo "Install with: brew install yq"
19
- exit 1
20
- fi
21
-
22
- # Parse arguments
23
- WORKFLOW_NAME=""
24
- MODE=""
25
- ARGS=("$@")
26
-
27
- i=0
28
- while [[ $i -lt ${#ARGS[@]} ]]; do
29
- arg="${ARGS[$i]}"
30
- case "$arg" in
31
- --mode=*)
32
- MODE="${arg#--mode=}"
33
- ;;
34
- --mode|-m)
35
- if [[ $((i+1)) -lt ${#ARGS[@]} ]]; then
36
- ((i++))
37
- MODE="${ARGS[$i]}"
38
- else
39
- echo "Error: --mode requires a value (create, validate, or edit)"
40
- exit 1
41
- fi
42
- ;;
43
- -*)
44
- echo "Error: Unknown option: $arg"
45
- echo "Usage: start-workflow.sh <name> [--mode create|validate|edit]"
46
- exit 1
47
- ;;
48
- *)
49
- if [[ -z "$WORKFLOW_NAME" ]]; then
50
- WORKFLOW_NAME="$arg"
51
- else
52
- echo "Error: Unexpected argument: $arg"
53
- exit 1
54
- fi
55
- ;;
56
- esac
57
- ((i++))
58
- done
59
-
60
- if [[ -z "$WORKFLOW_NAME" ]]; then
61
- echo "# Start Stepped Workflow"
62
- echo ""
63
- echo "Usage: /workflow start <name> [--mode create|validate|edit]"
64
- echo ""
65
- echo "**Available stepped workflows:**"
66
- echo ""
67
- for f in "$WORKFLOWS_DIR"/*.yaml "$WORKFLOWS_DIR"/*/workflow.yaml; do
68
- [[ -f "$f" ]] || continue
69
- workflow_type=$(yq eval '.workflow.type // "phased"' "$f")
70
- if [[ "$workflow_type" == "stepped" ]]; then
71
- name=$(yq eval '.workflow.name' "$f")
72
- desc=$(yq eval '.workflow.description' "$f" | head -1 | cut -c1-60)
73
- echo "- **$name** - $desc"
74
- fi
75
- done
76
- exit 1
77
- fi
78
-
79
- # Find workflow file (support both flat and directory structure)
80
- WORKFLOW_FILE=""
81
- if [[ -f "$WORKFLOWS_DIR/${WORKFLOW_NAME}.yaml" ]]; then
82
- WORKFLOW_FILE="$WORKFLOWS_DIR/${WORKFLOW_NAME}.yaml"
83
- elif [[ -f "$WORKFLOWS_DIR/${WORKFLOW_NAME}/workflow.yaml" ]]; then
84
- WORKFLOW_FILE="$WORKFLOWS_DIR/${WORKFLOW_NAME}/workflow.yaml"
85
- else
86
- echo "Error: Workflow '$WORKFLOW_NAME' not found"
87
- echo ""
88
- echo "Looked in:"
89
- echo " $WORKFLOWS_DIR/${WORKFLOW_NAME}.yaml"
90
- echo " $WORKFLOWS_DIR/${WORKFLOW_NAME}/workflow.yaml"
91
- exit 1
92
- fi
93
-
94
- WORKFLOW_DIR=$(dirname "$WORKFLOW_FILE")
95
-
96
- # Validate it's a stepped workflow
97
- WORKFLOW_TYPE=$(yq eval '.workflow.type // "phased"' "$WORKFLOW_FILE")
98
- if [[ "$WORKFLOW_TYPE" != "stepped" ]]; then
99
- echo "Error: '$WORKFLOW_NAME' is a phased workflow, not stepped"
100
- echo "Use TDD workflow commands (/sm, /tea, /dev, /reviewer) for phased workflows"
101
- exit 1
102
- fi
103
-
104
- # Validate mode if provided
105
- if [[ -n "$MODE" ]]; then
106
- case "$MODE" in
107
- create|validate|edit)
108
- ;;
109
- *)
110
- echo "Error: Invalid mode '$MODE'. Must be one of: create, validate, edit"
111
- exit 1
112
- ;;
113
- esac
114
- fi
115
-
116
- # Get workflow info
117
- WORKFLOW_DESC=$(yq eval '.workflow.description' "$WORKFLOW_FILE")
118
- WORKFLOW_AGENT=$(yq eval '.workflow.agent // "pm"' "$WORKFLOW_FILE")
119
-
120
- # Resolve steps path based on mode
121
- if [[ -n "$MODE" ]]; then
122
- MODE_PATH=$(yq eval ".workflow.modes.$MODE // \"\"" "$WORKFLOW_FILE")
123
- if [[ -z "$MODE_PATH" || "$MODE_PATH" == "null" ]]; then
124
- AVAILABLE_MODES=$(yq eval '.workflow.modes | keys | .[]' "$WORKFLOW_FILE" 2>/dev/null | grep -v default | tr '\n' ', ' | sed 's/,$//')
125
- echo "Error: Mode '$MODE' not available for workflow '$WORKFLOW_NAME'"
126
- echo "Available modes: $AVAILABLE_MODES"
127
- exit 1
128
- fi
129
- STEPS_PATH="$MODE_PATH"
130
- else
131
- # Use default mode or steps.path
132
- DEFAULT_MODE=$(yq eval '.workflow.modes.default // ""' "$WORKFLOW_FILE")
133
- if [[ -n "$DEFAULT_MODE" && "$DEFAULT_MODE" != "null" ]]; then
134
- MODE_PATH=$(yq eval ".workflow.modes.$DEFAULT_MODE // \"\"" "$WORKFLOW_FILE")
135
- if [[ -n "$MODE_PATH" && "$MODE_PATH" != "null" ]]; then
136
- STEPS_PATH="$MODE_PATH"
137
- MODE="$DEFAULT_MODE"
138
- fi
139
- fi
140
-
141
- if [[ -z "${STEPS_PATH:-}" ]]; then
142
- STEPS_PATH=$(yq eval '.workflow.steps.path' "$WORKFLOW_FILE")
143
- MODE="${MODE:-create}"
144
- fi
145
- fi
146
-
147
- # Resolve relative path
148
- if [[ "$STEPS_PATH" == ./* ]]; then
149
- STEPS_PATH="$WORKFLOW_DIR/${STEPS_PATH#./}"
150
- elif [[ "$STEPS_PATH" != /* ]]; then
151
- STEPS_PATH="$PROJECT_ROOT/$STEPS_PATH"
152
- fi
153
-
154
- # Count steps
155
- STEPS_PATTERN=$(yq eval '.workflow.steps.pattern // "step-*.md"' "$WORKFLOW_FILE")
156
- STEP_COUNT=$(find "$STEPS_PATH" -maxdepth 1 -name "step-0*.md" -o -name "step-1*.md" 2>/dev/null | wc -l | tr -d ' ')
157
-
158
- if [[ "$STEP_COUNT" -eq 0 ]]; then
159
- echo "Error: No step files found in $STEPS_PATH"
160
- exit 1
161
- fi
162
-
163
- # Create session directory
164
- mkdir -p "$SESSION_DIR"
165
-
166
- # Generate session filename
167
- SESSION_FILE="$SESSION_DIR/${WORKFLOW_NAME}-workflow-session.md"
168
-
169
- # Check for existing session
170
- if [[ -f "$SESSION_FILE" ]]; then
171
- echo "**Warning:** Existing session found"
172
- echo ""
173
- echo "Session: $SESSION_FILE"
174
- echo ""
175
- echo "Options:"
176
- echo "1. Use \`/workflow resume $WORKFLOW_NAME\` to continue"
177
- echo "2. Delete the session file to start fresh"
178
- echo ""
179
- echo "To start fresh, run:"
180
- echo "\`\`\`bash"
181
- echo "rm \"$SESSION_FILE\""
182
- echo "\`\`\`"
183
- exit 0
184
- fi
185
-
186
- # Create initial session file
187
- NOW=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
188
- cat > "$SESSION_FILE" << EOF
189
- # Workflow Session: $WORKFLOW_NAME
190
-
191
- **Workflow:** $WORKFLOW_NAME
192
- **Type:** stepped
193
- **Agent:** $WORKFLOW_AGENT
194
- **Started:** $NOW
195
-
196
- ## Workflow State
197
- - **Workflow Name:** $WORKFLOW_NAME
198
- - **Type:** stepped
199
- - **Mode:** $MODE
200
- - **Started:** $NOW
201
- - **Last Updated:** $NOW
202
- - **Current Step:** 1
203
- - **Steps Completed:** []
204
- - **Status:** in_progress
205
- - **Notes:** Session created via /workflow start
206
-
207
- ## Progress
208
- - Total Steps: $STEP_COUNT
209
- - Completion: 0%
210
-
211
- ---
212
-
213
- EOF
214
-
215
- # Find step 1 file (handle various naming patterns)
216
- STEP_FILE=$(find "$STEPS_PATH" -maxdepth 1 \( -name "step-01*.md" -o -name "step-1-*.md" \) 2>/dev/null | sort | head -1)
217
-
218
- if [[ -z "$STEP_FILE" ]]; then
219
- echo "Error: Could not find step 1 file in $STEPS_PATH"
220
- exit 1
221
- fi
222
-
223
- # Output workflow start info
224
- echo "# Starting Workflow: $WORKFLOW_NAME"
225
- echo ""
226
- echo "**Description:** $WORKFLOW_DESC"
227
- echo "**Mode:** $MODE"
228
- echo "**Steps:** $STEP_COUNT"
229
- echo "**Agent:** $WORKFLOW_AGENT"
230
- echo "**Session:** $SESSION_FILE"
231
- echo ""
232
- echo "---"
233
- echo ""
234
- echo "## Step 1 of $STEP_COUNT"
235
- echo ""
236
-
237
- # Output step content (strip frontmatter if present)
238
- if head -1 "$STEP_FILE" | grep -q "^---$"; then
239
- awk '/^---$/{if(++c==2){p=1;next}}p' "$STEP_FILE"
240
- else
241
- cat "$STEP_FILE"
242
- fi
243
-
244
- echo ""
245
- echo "---"
246
- echo ""
247
- echo "**Controls:**"
248
- echo "- \`C\` - Continue to next step"
249
- echo "- \`/workflow status\` - Check progress"
250
- echo "- \`/workflow resume\` - Resume after break"
2
+ # DEPRECATED: Use `pf workflow start` instead.
3
+ # This shim forwards to the Python CLI for backward compatibility.
4
+ echo "Warning: start-workflow.sh is deprecated. Use: pf workflow start $*" >&2
5
+ exec pf workflow start "$@"