@pennyfarthing/core 11.1.1 → 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 (160) hide show
  1. package/README.md +8 -8
  2. package/package.json +1 -1
  3. package/packages/core/dist/server/otlp-receiver.d.ts +16 -11
  4. package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
  5. package/packages/core/dist/server/otlp-receiver.js +185 -24
  6. package/packages/core/dist/server/otlp-receiver.js.map +1 -1
  7. package/packages/core/dist/server/otlp-receiver.test.d.ts +21 -0
  8. package/packages/core/dist/server/otlp-receiver.test.d.ts.map +1 -0
  9. package/packages/core/dist/server/otlp-receiver.test.js +446 -0
  10. package/packages/core/dist/server/otlp-receiver.test.js.map +1 -0
  11. package/packages/core/dist/shared/portrait-resolver.d.ts +9 -0
  12. package/packages/core/dist/shared/portrait-resolver.d.ts.map +1 -1
  13. package/packages/core/dist/shared/portrait-resolver.js +27 -0
  14. package/packages/core/dist/shared/portrait-resolver.js.map +1 -1
  15. package/packages/core/dist/shared/portrait-resolver.test.js +47 -1
  16. package/packages/core/dist/shared/portrait-resolver.test.js.map +1 -1
  17. package/packages/core/dist/shared/tandem-portrait-inventory.test.d.ts +13 -0
  18. package/packages/core/dist/shared/tandem-portrait-inventory.test.d.ts.map +1 -0
  19. package/packages/core/dist/shared/tandem-portrait-inventory.test.js +126 -0
  20. package/packages/core/dist/shared/tandem-portrait-inventory.test.js.map +1 -0
  21. package/pennyfarthing-dist/agents/dev.md +1 -1
  22. package/pennyfarthing-dist/agents/reviewer.md +1 -1
  23. package/pennyfarthing-dist/agents/sm-setup.md +1 -1
  24. package/pennyfarthing-dist/agents/sm.md +2 -2
  25. package/pennyfarthing-dist/agents/tea.md +1 -1
  26. package/pennyfarthing-dist/agents/testing-runner.md +2 -1
  27. package/pennyfarthing-dist/commands/pf-chore.md +2 -2
  28. package/pennyfarthing-dist/commands/pf-standalone.md +7 -2
  29. package/pennyfarthing-dist/guides/agent-behavior.md +1 -1
  30. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +1 -1
  31. package/pennyfarthing-dist/guides/bikerack.md +3 -3
  32. package/pennyfarthing-dist/guides/hooks.md +1 -1
  33. package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
  34. package/pennyfarthing-dist/guides/xml-tags.md +2 -2
  35. package/pennyfarthing-dist/scripts/README.md +1 -1
  36. package/pennyfarthing-dist/scripts/core/check-context.sh +1 -1
  37. package/pennyfarthing-dist/scripts/git/README.md +24 -14
  38. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +5 -266
  39. package/pennyfarthing-dist/scripts/git/git-status-all.sh +5 -151
  40. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +6 -144
  41. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +5 -496
  42. package/pennyfarthing-dist/scripts/hooks/README.md +1 -1
  43. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +1 -1
  44. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +9 -11
  45. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +1 -1
  46. package/pennyfarthing-dist/scripts/portraits/generate-tandem-portraits.sh +76 -0
  47. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +4 -221
  48. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +5 -13
  49. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +4 -123
  50. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +4 -33
  51. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +4 -156
  52. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +4 -131
  53. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +4 -249
  54. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +4 -160
  55. package/pennyfarthing-dist/skills/pf-bc/usage.md +1 -1
  56. package/pennyfarthing-dist/skills/pf-jira/examples.md +5 -2
  57. package/pennyfarthing-dist/skills/pf-workflow/examples.md +27 -16
  58. package/pennyfarthing-dist/skills/pf-workflow/skill.md +9 -12
  59. package/pennyfarthing-dist/skills/pf-workflow/usage.md +33 -8
  60. package/pennyfarthing-dist/workflows/bdd-tandem.yaml +18 -6
  61. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +1 -1
  62. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +1 -1
  63. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
  64. package/pennyfarthing-dist/workflows/review-tandem.yaml +65 -0
  65. package/pennyfarthing-dist/workflows/tdd-tandem.yaml +16 -8
  66. package/pennyfarthing_scripts/CLAUDE.md +26 -4
  67. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  68. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  69. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  70. package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  71. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
  72. package/pennyfarthing_scripts/bc/cli.py +3 -5
  73. package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  74. package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  75. package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  76. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  77. package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  78. package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  79. package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  80. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  81. package/pennyfarthing_scripts/bikerack/__pycache__/portrait.cpython-314.pyc +0 -0
  82. package/pennyfarthing_scripts/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
  83. package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  84. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  85. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  86. package/pennyfarthing_scripts/bikerack/background_panel.py +86 -5
  87. package/pennyfarthing_scripts/bikerack/base_panel.py +62 -0
  88. package/pennyfarthing_scripts/bikerack/changed_panel.py +32 -28
  89. package/pennyfarthing_scripts/bikerack/debug_panel.py +31 -1
  90. package/pennyfarthing_scripts/bikerack/diffs_panel.py +74 -17
  91. package/pennyfarthing_scripts/bikerack/git_panel.py +103 -33
  92. package/pennyfarthing_scripts/bikerack/launcher.py +15 -15
  93. package/pennyfarthing_scripts/bikerack/progress_panel.py +315 -0
  94. package/pennyfarthing_scripts/bikerack/sprint_panel.py +158 -26
  95. package/pennyfarthing_scripts/bikerack/tui.py +336 -30
  96. package/pennyfarthing_scripts/bikerack/ws_client.py +2 -2
  97. package/pennyfarthing_scripts/cli.py +37 -65
  98. package/pennyfarthing_scripts/consultation/__init__.py +1 -0
  99. package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
  100. package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-314.pyc +0 -0
  101. package/pennyfarthing_scripts/consultation/cli.py +149 -0
  102. package/pennyfarthing_scripts/consultation/dialogue_manager.py +417 -0
  103. package/pennyfarthing_scripts/context.py +3 -3
  104. package/pennyfarthing_scripts/epic/__pycache__/__init__.cpython-314.pyc +0 -0
  105. package/pennyfarthing_scripts/epic/__pycache__/cli.cpython-314.pyc +0 -0
  106. package/pennyfarthing_scripts/git/__init__.py +12 -1
  107. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  108. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  109. package/pennyfarthing_scripts/git/__pycache__/hooks_installer.cpython-314.pyc +0 -0
  110. package/pennyfarthing_scripts/git/__pycache__/repos.cpython-314.pyc +0 -0
  111. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  112. package/pennyfarthing_scripts/git/__pycache__/worktree.cpython-314.pyc +0 -0
  113. package/pennyfarthing_scripts/git/create_branches.py +3 -4
  114. package/pennyfarthing_scripts/git/hooks_installer.py +152 -0
  115. package/pennyfarthing_scripts/git/repos.py +196 -0
  116. package/pennyfarthing_scripts/git/status_all.py +27 -11
  117. package/pennyfarthing_scripts/git/worktree.py +302 -0
  118. package/pennyfarthing_scripts/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
  119. package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-314.pyc +0 -0
  120. package/pennyfarthing_scripts/git_group/cli.py +143 -40
  121. package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
  122. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  123. package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  124. package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  125. package/pennyfarthing_scripts/handoff/complete_phase.py +12 -0
  126. package/pennyfarthing_scripts/handoff/resolve_gate.py +5 -14
  127. package/pennyfarthing_scripts/hooks.py +3 -17
  128. package/pennyfarthing_scripts/pretooluse_hook.py +1 -1
  129. package/pennyfarthing_scripts/prime/__pycache__/heatmap.cpython-314.pyc +0 -0
  130. package/pennyfarthing_scripts/prime/heatmap.py +655 -0
  131. package/pennyfarthing_scripts/session/__pycache__/__init__.cpython-314.pyc +0 -0
  132. package/pennyfarthing_scripts/session/__pycache__/cli.cpython-314.pyc +0 -0
  133. package/pennyfarthing_scripts/session_start_hook.py +1 -1
  134. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  135. package/pennyfarthing_scripts/sprint/loader.py +15 -1
  136. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  137. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
  138. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  139. package/pennyfarthing_scripts/tests/test_bikerack.py +51 -51
  140. package/pennyfarthing_scripts/tests/test_dialogue_manager.py +811 -0
  141. package/pennyfarthing_scripts/tests/test_handoff_cli.py +16 -11
  142. package/pennyfarthing_scripts/tests/test_workflow_check.py +2 -3
  143. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
  144. package/pennyfarthing_scripts/validate/adapters/tandem_awareness.py +254 -0
  145. package/pennyfarthing_scripts/validate/cli.py +17 -5
  146. package/pennyfarthing_scripts/workflow/__init__.py +40 -0
  147. package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
  148. package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-314.pyc +0 -0
  149. package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
  150. package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-314.pyc +0 -0
  151. package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-314.pyc +0 -0
  152. package/pennyfarthing_scripts/workflow/cli.py +1099 -0
  153. package/pennyfarthing_scripts/workflow/helpers.py +241 -0
  154. package/pennyfarthing_scripts/{workflow.py → workflow/scale.py} +0 -104
  155. package/pennyfarthing_scripts/workflow/state.py +112 -0
  156. package/pennyfarthing-dist/skills/pf-workflow/scripts/list-workflows.sh +0 -91
  157. package/pennyfarthing-dist/skills/pf-workflow/scripts/resume-workflow.sh +0 -163
  158. package/pennyfarthing-dist/skills/pf-workflow/scripts/show-workflow.sh +0 -138
  159. package/pennyfarthing-dist/skills/pf-workflow/scripts/start-workflow.sh +0 -273
  160. package/pennyfarthing-dist/skills/pf-workflow/scripts/workflow-status.sh +0 -167
@@ -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 "$@"
@@ -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