@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.
- package/README.md +8 -8
- package/package.json +1 -1
- package/packages/core/dist/server/otlp-receiver.d.ts +16 -11
- package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
- package/packages/core/dist/server/otlp-receiver.js +185 -24
- package/packages/core/dist/server/otlp-receiver.js.map +1 -1
- package/packages/core/dist/server/otlp-receiver.test.d.ts +21 -0
- package/packages/core/dist/server/otlp-receiver.test.d.ts.map +1 -0
- package/packages/core/dist/server/otlp-receiver.test.js +446 -0
- package/packages/core/dist/server/otlp-receiver.test.js.map +1 -0
- package/packages/core/dist/shared/portrait-resolver.d.ts +9 -0
- package/packages/core/dist/shared/portrait-resolver.d.ts.map +1 -1
- package/packages/core/dist/shared/portrait-resolver.js +27 -0
- package/packages/core/dist/shared/portrait-resolver.js.map +1 -1
- package/packages/core/dist/shared/portrait-resolver.test.js +47 -1
- package/packages/core/dist/shared/portrait-resolver.test.js.map +1 -1
- package/packages/core/dist/shared/tandem-portrait-inventory.test.d.ts +13 -0
- package/packages/core/dist/shared/tandem-portrait-inventory.test.d.ts.map +1 -0
- package/packages/core/dist/shared/tandem-portrait-inventory.test.js +126 -0
- package/packages/core/dist/shared/tandem-portrait-inventory.test.js.map +1 -0
- package/pennyfarthing-dist/agents/dev.md +1 -1
- package/pennyfarthing-dist/agents/reviewer.md +1 -1
- package/pennyfarthing-dist/agents/sm-setup.md +1 -1
- package/pennyfarthing-dist/agents/sm.md +2 -2
- package/pennyfarthing-dist/agents/tea.md +1 -1
- package/pennyfarthing-dist/agents/testing-runner.md +2 -1
- package/pennyfarthing-dist/commands/pf-chore.md +2 -2
- package/pennyfarthing-dist/commands/pf-standalone.md +7 -2
- package/pennyfarthing-dist/guides/agent-behavior.md +1 -1
- package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +1 -1
- package/pennyfarthing-dist/guides/bikerack.md +3 -3
- package/pennyfarthing-dist/guides/hooks.md +1 -1
- package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
- package/pennyfarthing-dist/guides/xml-tags.md +2 -2
- package/pennyfarthing-dist/scripts/README.md +1 -1
- package/pennyfarthing-dist/scripts/core/check-context.sh +1 -1
- package/pennyfarthing-dist/scripts/git/README.md +24 -14
- package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +5 -266
- package/pennyfarthing-dist/scripts/git/git-status-all.sh +5 -151
- package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +6 -144
- package/pennyfarthing-dist/scripts/git/worktree-manager.sh +5 -496
- package/pennyfarthing-dist/scripts/hooks/README.md +1 -1
- package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +1 -1
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +9 -11
- package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +1 -1
- package/pennyfarthing-dist/scripts/portraits/generate-tandem-portraits.sh +76 -0
- package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +4 -221
- package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +5 -13
- package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +4 -123
- package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +4 -33
- package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +4 -156
- package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +4 -131
- package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +4 -249
- package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +4 -160
- package/pennyfarthing-dist/skills/pf-bc/usage.md +1 -1
- package/pennyfarthing-dist/skills/pf-jira/examples.md +5 -2
- package/pennyfarthing-dist/skills/pf-workflow/examples.md +27 -16
- package/pennyfarthing-dist/skills/pf-workflow/skill.md +9 -12
- package/pennyfarthing-dist/skills/pf-workflow/usage.md +33 -8
- package/pennyfarthing-dist/workflows/bdd-tandem.yaml +18 -6
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +1 -1
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +1 -1
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
- package/pennyfarthing-dist/workflows/review-tandem.yaml +65 -0
- package/pennyfarthing-dist/workflows/tdd-tandem.yaml +16 -8
- package/pennyfarthing_scripts/CLAUDE.md +26 -4
- package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/cli.py +3 -5
- package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/portrait.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/background_panel.py +86 -5
- package/pennyfarthing_scripts/bikerack/base_panel.py +62 -0
- package/pennyfarthing_scripts/bikerack/changed_panel.py +32 -28
- package/pennyfarthing_scripts/bikerack/debug_panel.py +31 -1
- package/pennyfarthing_scripts/bikerack/diffs_panel.py +74 -17
- package/pennyfarthing_scripts/bikerack/git_panel.py +103 -33
- package/pennyfarthing_scripts/bikerack/launcher.py +15 -15
- package/pennyfarthing_scripts/bikerack/progress_panel.py +315 -0
- package/pennyfarthing_scripts/bikerack/sprint_panel.py +158 -26
- package/pennyfarthing_scripts/bikerack/tui.py +336 -30
- package/pennyfarthing_scripts/bikerack/ws_client.py +2 -2
- package/pennyfarthing_scripts/cli.py +37 -65
- package/pennyfarthing_scripts/consultation/__init__.py +1 -0
- package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/consultation/cli.py +149 -0
- package/pennyfarthing_scripts/consultation/dialogue_manager.py +417 -0
- package/pennyfarthing_scripts/context.py +3 -3
- package/pennyfarthing_scripts/epic/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/epic/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__init__.py +12 -1
- package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/hooks_installer.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/repos.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/worktree.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/create_branches.py +3 -4
- package/pennyfarthing_scripts/git/hooks_installer.py +152 -0
- package/pennyfarthing_scripts/git/repos.py +196 -0
- package/pennyfarthing_scripts/git/status_all.py +27 -11
- package/pennyfarthing_scripts/git/worktree.py +302 -0
- package/pennyfarthing_scripts/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git_group/cli.py +143 -40
- package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/complete_phase.py +12 -0
- package/pennyfarthing_scripts/handoff/resolve_gate.py +5 -14
- package/pennyfarthing_scripts/hooks.py +3 -17
- package/pennyfarthing_scripts/pretooluse_hook.py +1 -1
- package/pennyfarthing_scripts/prime/__pycache__/heatmap.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/heatmap.py +655 -0
- package/pennyfarthing_scripts/session/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/session/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/session_start_hook.py +1 -1
- package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/loader.py +15 -1
- package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/test_bikerack.py +51 -51
- package/pennyfarthing_scripts/tests/test_dialogue_manager.py +811 -0
- package/pennyfarthing_scripts/tests/test_handoff_cli.py +16 -11
- package/pennyfarthing_scripts/tests/test_workflow_check.py +2 -3
- package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/tandem_awareness.py +254 -0
- package/pennyfarthing_scripts/validate/cli.py +17 -5
- package/pennyfarthing_scripts/workflow/__init__.py +40 -0
- package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/cli.py +1099 -0
- package/pennyfarthing_scripts/workflow/helpers.py +241 -0
- package/pennyfarthing_scripts/{workflow.py → workflow/scale.py} +0 -104
- package/pennyfarthing_scripts/workflow/state.py +112 -0
- package/pennyfarthing-dist/skills/pf-workflow/scripts/list-workflows.sh +0 -91
- package/pennyfarthing-dist/skills/pf-workflow/scripts/resume-workflow.sh +0 -163
- package/pennyfarthing-dist/skills/pf-workflow/scripts/show-workflow.sh +0 -138
- package/pennyfarthing-dist/skills/pf-workflow/scripts/start-workflow.sh +0 -273
- package/pennyfarthing-dist/skills/pf-workflow/scripts/workflow-status.sh +0 -167
|
@@ -1,132 +1,5 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
|
|
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
|
-
#
|
|
3
|
-
#
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
#
|
|
3
|
-
#
|
|
4
|
-
|
|
5
|
-
|
|
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 (
|
|
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
|
|
136
|
+
pf jira sprint add "$SPRINT_ID" MSSCI-11999
|
|
134
137
|
|
|
135
138
|
# Preview
|
|
136
|
-
pf jira sprint add
|
|
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
|
-
|
|
7
|
+
pf workflow list
|
|
8
8
|
|
|
9
9
|
# Show TDD workflow details
|
|
10
|
-
|
|
10
|
+
pf workflow show tdd
|
|
11
11
|
|
|
12
12
|
# Show current session's workflow
|
|
13
|
-
|
|
13
|
+
pf workflow show
|
|
14
14
|
|
|
15
15
|
# Show trivial workflow
|
|
16
|
-
|
|
16
|
+
pf workflow show trivial
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
## Checking State
|
|
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
|
-
|
|
49
|
+
pf workflow start architecture
|
|
43
50
|
|
|
44
51
|
# Start in validate mode
|
|
45
|
-
|
|
52
|
+
pf workflow start architecture --mode validate
|
|
46
53
|
|
|
47
54
|
# Check progress
|
|
48
|
-
|
|
55
|
+
pf workflow status
|
|
49
56
|
|
|
50
57
|
# Resume after interruption
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
70
|
+
pf workflow fix-phase 56-1 review --dry-run
|
|
60
71
|
|
|
61
72
|
# Fix phase to review (after Dev completed)
|
|
62
|
-
|
|
73
|
+
pf workflow fix-phase 56-1 review
|
|
63
74
|
|
|
64
75
|
# Fix phase to approved (after Reviewer approved)
|
|
65
|
-
|
|
76
|
+
pf workflow fix-phase 56-1 approved
|
|
66
77
|
|
|
67
78
|
# Using Jira key
|
|
68
|
-
|
|
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
|
-
|
|
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
|
-
|
|
103
|
+
pf workflow fix-phase 56-1 red
|
|
93
104
|
```
|
|
94
105
|
|
|
95
106
|
### Agent activated on wrong phase
|