autoworkflow 3.0.1 → 3.1.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.
@@ -0,0 +1,279 @@
1
+ #!/bin/bash
2
+ # AutoWorkflow Phase Transition Hook
3
+ # Purpose: Enforce gates between workflow phases
4
+ #
5
+ # This hook implements on:phase_transition from system/triggers.md
6
+ # and enforces gates from system/gates.md
7
+
8
+ # Colors
9
+ RED='\033[0;31m'
10
+ GREEN='\033[0;32m'
11
+ YELLOW='\033[1;33m'
12
+ CYAN='\033[0;36m'
13
+ BOLD='\033[1m'
14
+ DIM='\033[2m'
15
+ NC='\033[0m'
16
+
17
+ # State directory
18
+ STATE_DIR=".claude/.autoworkflow"
19
+ mkdir -p "$STATE_DIR"
20
+
21
+ # State files
22
+ PHASE_FILE="$STATE_DIR/phase"
23
+ TASK_TYPE_FILE="$STATE_DIR/task-type"
24
+ APPROVAL_FILE="$STATE_DIR/plan-approved"
25
+
26
+ # Arguments
27
+ FROM_PHASE="$1"
28
+ TO_PHASE="$2"
29
+
30
+ # Get current phase
31
+ get_phase() {
32
+ if [ -f "$PHASE_FILE" ]; then
33
+ cat "$PHASE_FILE"
34
+ else
35
+ echo "IDLE"
36
+ fi
37
+ }
38
+
39
+ # Set phase
40
+ set_phase() {
41
+ echo "$1" > "$PHASE_FILE"
42
+ }
43
+
44
+ # Get task type
45
+ get_task_type() {
46
+ if [ -f "$TASK_TYPE_FILE" ]; then
47
+ cat "$TASK_TYPE_FILE"
48
+ else
49
+ echo "unknown"
50
+ fi
51
+ }
52
+
53
+ # Check analyze gate
54
+ check_analyze_gate() {
55
+ echo ""
56
+ echo "Checking analyze_gate..."
57
+
58
+ # For now, this is soft - relies on Claude having read files
59
+ echo -e " ${GREEN}✅${NC} Relevant files should have been read"
60
+ echo -e " ${GREEN}✅${NC} Existing patterns understood"
61
+ echo -e " ${GREEN}✅${NC} BLUEPRINT.md checked"
62
+ echo ""
63
+ return 0
64
+ }
65
+
66
+ # Check plan approval gate
67
+ check_plan_approval_gate() {
68
+ echo ""
69
+ echo "Checking plan_approval_gate..."
70
+
71
+ if [ -f "$APPROVAL_FILE" ]; then
72
+ local approval=$(cat "$APPROVAL_FILE")
73
+ if [ "$approval" = "approved" ]; then
74
+ echo -e " ${GREEN}✅${NC} Plan has been approved"
75
+ return 0
76
+ fi
77
+ fi
78
+
79
+ echo -e " ${RED}⛔${NC} Plan has NOT been approved"
80
+ echo ""
81
+ echo -e "${YELLOW}BLOCKED:${NC} User must approve the plan before implementing."
82
+ echo ""
83
+ echo "Wait for user to say 'yes', 'proceed', 'approved', etc."
84
+ echo ""
85
+ return 1
86
+ }
87
+
88
+ # Check verify gate
89
+ check_verify_gate() {
90
+ echo ""
91
+ echo "Checking verify_gate..."
92
+
93
+ if [ -f "$STATE_DIR/verify-status" ]; then
94
+ local status=$(cat "$STATE_DIR/verify-status")
95
+ if [ "$status" = "PASSED" ]; then
96
+ echo -e " ${GREEN}✅${NC} Verification passed"
97
+ return 0
98
+ fi
99
+ fi
100
+
101
+ echo -e " ${RED}⛔${NC} Verification has NOT passed"
102
+ echo ""
103
+ echo -e "${YELLOW}BLOCKED:${NC} Run npm run verify and fix all errors first."
104
+ echo ""
105
+ return 1
106
+ }
107
+
108
+ # Check audit gate
109
+ check_audit_gate() {
110
+ local task_type=$(get_task_type)
111
+
112
+ # Only applies to certain task types
113
+ case "$task_type" in
114
+ feature|refactor|perf)
115
+ ;;
116
+ *)
117
+ echo ""
118
+ echo -e "Skipping audit_gate (not required for task type: $task_type)"
119
+ return 0
120
+ ;;
121
+ esac
122
+
123
+ echo ""
124
+ echo "Checking audit_gate..."
125
+
126
+ if [ -f "$STATE_DIR/audit-status" ]; then
127
+ local status=$(cat "$STATE_DIR/audit-status")
128
+ if [ "$status" = "PASSED" ]; then
129
+ echo -e " ${GREEN}✅${NC} Audit passed"
130
+ return 0
131
+ fi
132
+ fi
133
+
134
+ echo -e " ${RED}⛔${NC} Audit has NOT passed"
135
+ echo ""
136
+ echo -e "${YELLOW}BLOCKED:${NC} Run audits before committing:"
137
+ echo " npm run audit:ui"
138
+ echo " npm run audit:cycles"
139
+ echo ""
140
+ return 1
141
+ }
142
+
143
+ # Transition between phases
144
+ transition() {
145
+ local from="$1"
146
+ local to="$2"
147
+
148
+ echo ""
149
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
150
+ echo -e "${BOLD}AUTOWORKFLOW: PHASE TRANSITION${NC}"
151
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
152
+ echo ""
153
+ echo -e "Transition: ${CYAN}$from${NC} → ${CYAN}$to${NC}"
154
+
155
+ # Check gate based on transition
156
+ case "$to" in
157
+ PLAN)
158
+ if ! check_analyze_gate; then
159
+ echo ""
160
+ echo -e "${RED}⛔ GATE FAILED - Cannot proceed to PLAN${NC}"
161
+ return 1
162
+ fi
163
+ ;;
164
+ IMPLEMENT)
165
+ if ! check_plan_approval_gate; then
166
+ echo ""
167
+ echo -e "${RED}⛔ GATE FAILED - Cannot proceed to IMPLEMENT${NC}"
168
+ return 1
169
+ fi
170
+ ;;
171
+ AUDIT)
172
+ if ! check_verify_gate; then
173
+ echo ""
174
+ echo -e "${RED}⛔ GATE FAILED - Cannot proceed to AUDIT${NC}"
175
+ return 1
176
+ fi
177
+ ;;
178
+ COMMIT|PRE_COMMIT)
179
+ if ! check_verify_gate; then
180
+ echo ""
181
+ echo -e "${RED}⛔ GATE FAILED - Cannot proceed to COMMIT${NC}"
182
+ return 1
183
+ fi
184
+ if ! check_audit_gate; then
185
+ echo ""
186
+ echo -e "${RED}⛔ GATE FAILED - Cannot proceed to COMMIT${NC}"
187
+ return 1
188
+ fi
189
+ ;;
190
+ esac
191
+
192
+ # Gate passed - update phase
193
+ set_phase "$to"
194
+
195
+ echo ""
196
+ echo -e "${GREEN}✅ Gate passed - Now in ${BOLD}$to${NC} phase"
197
+ echo ""
198
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
199
+ echo ""
200
+
201
+ return 0
202
+ }
203
+
204
+ # Record plan approval
205
+ record_approval() {
206
+ echo "approved" > "$APPROVAL_FILE"
207
+ echo ""
208
+ echo -e "${GREEN}✅${NC} Plan approval recorded"
209
+ echo ""
210
+ }
211
+
212
+ # Record plan rejection
213
+ record_rejection() {
214
+ echo "rejected" > "$APPROVAL_FILE"
215
+ echo ""
216
+ echo -e "${YELLOW}Plan rejected - returning to PLAN phase${NC}"
217
+ set_phase "PLAN"
218
+ echo ""
219
+ }
220
+
221
+ # Reset workflow state
222
+ reset_workflow() {
223
+ rm -f "$STATE_DIR/session-id"
224
+ rm -f "$STATE_DIR/phase"
225
+ rm -f "$STATE_DIR/task-type"
226
+ rm -f "$STATE_DIR/verify-iteration"
227
+ rm -f "$STATE_DIR/verify-status"
228
+ rm -f "$STATE_DIR/audit-status"
229
+ rm -f "$STATE_DIR/gate-status"
230
+ rm -f "$STATE_DIR/gate-errors"
231
+ rm -f "$STATE_DIR/plan-approved"
232
+ rm -f "$STATE_DIR/changed-files"
233
+ rm -f "$STATE_DIR/blueprint-checked"
234
+
235
+ echo ""
236
+ echo -e "${GREEN}✅${NC} Workflow state reset"
237
+ echo ""
238
+ }
239
+
240
+ # Main command dispatcher
241
+ case "$1" in
242
+ transition)
243
+ transition "$2" "$3"
244
+ ;;
245
+ approve)
246
+ record_approval
247
+ ;;
248
+ reject)
249
+ record_rejection
250
+ ;;
251
+ reset)
252
+ reset_workflow
253
+ ;;
254
+ status)
255
+ echo ""
256
+ echo "Current phase: $(get_phase)"
257
+ echo "Task type: $(get_task_type)"
258
+ if [ -f "$STATE_DIR/verify-iteration" ]; then
259
+ echo "Verify iteration: $(cat $STATE_DIR/verify-iteration)"
260
+ fi
261
+ if [ -f "$STATE_DIR/verify-status" ]; then
262
+ echo "Verify status: $(cat $STATE_DIR/verify-status)"
263
+ fi
264
+ if [ -f "$APPROVAL_FILE" ]; then
265
+ echo "Plan approval: $(cat $APPROVAL_FILE)"
266
+ fi
267
+ echo ""
268
+ ;;
269
+ *)
270
+ echo "Usage: phase-transition.sh <command> [args]"
271
+ echo ""
272
+ echo "Commands:"
273
+ echo " transition <from> <to> - Transition between phases"
274
+ echo " approve - Record plan approval"
275
+ echo " reject - Record plan rejection"
276
+ echo " reset - Reset workflow state"
277
+ echo " status - Show current state"
278
+ ;;
279
+ esac
@@ -1,21 +1,225 @@
1
1
  #!/bin/bash
2
2
  # AutoWorkflow Post-Edit Hook
3
3
  # Runs on: PostToolUse for Write/Edit tools
4
- # Purpose: Remind Claude to run verification after code changes
4
+ # Purpose: Auto-run verification with loop tracking
5
+ #
6
+ # This hook implements verify_loop from system/loops.md
7
+ # It tracks iterations and enforces the verify_gate
5
8
 
6
- # Get the tool that was used (passed as argument or environment)
7
- TOOL_NAME="${1:-unknown}"
9
+ set -e
8
10
 
9
- # Only trigger for code file changes
10
- case "$TOOL_NAME" in
11
- Write|Edit)
11
+ # Colors
12
+ RED='\033[0;31m'
13
+ GREEN='\033[0;32m'
14
+ YELLOW='\033[1;33m'
15
+ CYAN='\033[0;36m'
16
+ BOLD='\033[1m'
17
+ DIM='\033[2m'
18
+ NC='\033[0m'
19
+
20
+ # State directory
21
+ STATE_DIR=".claude/.autoworkflow"
22
+ mkdir -p "$STATE_DIR"
23
+
24
+ # Configuration
25
+ MAX_ITERATIONS=10
26
+ VERIFY_ITERATION_FILE="$STATE_DIR/verify-iteration"
27
+ VERIFY_STATUS_FILE="$STATE_DIR/verify-status"
28
+ CHANGED_FILES_FILE="$STATE_DIR/changed-files"
29
+ PHASE_FILE="$STATE_DIR/phase"
30
+
31
+ # Get current iteration count
32
+ get_iteration() {
33
+ if [ -f "$VERIFY_ITERATION_FILE" ]; then
34
+ cat "$VERIFY_ITERATION_FILE"
35
+ else
36
+ echo "0"
37
+ fi
38
+ }
39
+
40
+ # Increment iteration
41
+ increment_iteration() {
42
+ local current=$(get_iteration)
43
+ local next=$((current + 1))
44
+ echo "$next" > "$VERIFY_ITERATION_FILE"
45
+ echo "$next"
46
+ }
47
+
48
+ # Reset iteration counter
49
+ reset_iteration() {
50
+ echo "0" > "$VERIFY_ITERATION_FILE"
51
+ }
52
+
53
+ # Track changed file
54
+ track_file() {
55
+ local file="$1"
56
+ if [ -n "$file" ]; then
57
+ echo "$file" >> "$CHANGED_FILES_FILE"
58
+ # Remove duplicates
59
+ if [ -f "$CHANGED_FILES_FILE" ]; then
60
+ sort -u "$CHANGED_FILES_FILE" -o "$CHANGED_FILES_FILE"
61
+ fi
62
+ fi
63
+ }
64
+
65
+ # Get current phase
66
+ get_phase() {
67
+ if [ -f "$PHASE_FILE" ]; then
68
+ cat "$PHASE_FILE"
69
+ else
70
+ echo "UNKNOWN"
71
+ fi
72
+ }
73
+
74
+ # Set phase
75
+ set_phase() {
76
+ echo "$1" > "$PHASE_FILE"
77
+ }
78
+
79
+ # Print header
80
+ print_header() {
81
+ local iteration=$(get_iteration)
82
+ echo ""
83
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
84
+ echo -e "${BOLD}AUTOWORKFLOW: VERIFY LOOP${NC} ${DIM}(Iteration $iteration/$MAX_ITERATIONS)${NC}"
85
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
86
+ echo ""
87
+ }
88
+
89
+ # Run verification
90
+ run_verify() {
91
+ local has_verify=false
92
+ local has_typecheck=false
93
+ local has_lint=false
94
+
95
+ # Check what scripts are available
96
+ if [ -f "package.json" ]; then
97
+ grep -q '"verify"' package.json 2>/dev/null && has_verify=true
98
+ grep -q '"typecheck"' package.json 2>/dev/null && has_typecheck=true
99
+ grep -q '"lint"' package.json 2>/dev/null && has_lint=true
100
+ fi
101
+
102
+ if [ "$has_verify" = true ]; then
103
+ echo -e "${CYAN}Running:${NC} npm run verify"
104
+ echo ""
105
+ if npm run verify 2>&1; then
106
+ return 0
107
+ else
108
+ return 1
109
+ fi
110
+ elif [ "$has_typecheck" = true ] || [ "$has_lint" = true ]; then
111
+ local exit_code=0
112
+
113
+ if [ "$has_typecheck" = true ]; then
114
+ echo -e "${CYAN}Running:${NC} npm run typecheck"
115
+ if ! npm run typecheck 2>&1; then
116
+ exit_code=1
117
+ fi
118
+ fi
119
+
120
+ if [ "$has_lint" = true ]; then
121
+ echo ""
122
+ echo -e "${CYAN}Running:${NC} npm run lint"
123
+ if ! npm run lint 2>&1; then
124
+ exit_code=1
125
+ fi
126
+ fi
127
+
128
+ return $exit_code
129
+ else
130
+ echo -e "${YELLOW}⚠${NC} No verify/typecheck/lint scripts found in package.json"
131
+ echo " Skipping verification."
132
+ return 0
133
+ fi
134
+ }
135
+
136
+ # Main execution
137
+ main() {
138
+ local current_phase=$(get_phase)
139
+
140
+ # Track that we're in VERIFY phase
141
+ set_phase "VERIFY"
142
+
143
+ # Get current iteration and increment
144
+ local iteration=$(increment_iteration)
145
+
146
+ # Check if we've exceeded max iterations
147
+ if [ "$iteration" -gt "$MAX_ITERATIONS" ]; then
148
+ echo ""
149
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
150
+ echo -e "${RED}${BOLD}⛔ MAX ITERATIONS REACHED${NC}"
151
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
12
152
  echo ""
13
- echo "--------------------------------------------------"
14
- echo "AUTOWORKFLOW: File modified"
15
- echo "--------------------------------------------------"
16
- echo "After completing all changes, run: npm run verify"
17
- echo "Fix any errors before proceeding to commit."
18
- echo "--------------------------------------------------"
153
+ echo "Verification has failed $MAX_ITERATIONS times."
154
+ echo "Manual intervention required."
19
155
  echo ""
20
- ;;
21
- esac
156
+ echo "Options:"
157
+ echo " 1. Fix remaining errors manually"
158
+ echo " 2. Reset counter: rm $VERIFY_ITERATION_FILE"
159
+ echo ""
160
+ echo "BLOCKED" > "$VERIFY_STATUS_FILE"
161
+ # Don't exit with error - let Claude continue but report the issue
162
+ exit 0
163
+ fi
164
+
165
+ print_header
166
+
167
+ # Run verification
168
+ echo "Checking TypeScript + ESLint..."
169
+ echo ""
170
+
171
+ if run_verify; then
172
+ echo ""
173
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
174
+ echo -e "${GREEN}${BOLD}✅ VERIFICATION PASSED${NC}"
175
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
176
+ echo ""
177
+
178
+ # Reset iteration counter on success
179
+ reset_iteration
180
+
181
+ # Update status
182
+ echo "PASSED" > "$VERIFY_STATUS_FILE"
183
+
184
+ # Check if this was a feature/refactor that needs audit
185
+ local task_type=""
186
+ if [ -f "$STATE_DIR/task-type" ]; then
187
+ task_type=$(cat "$STATE_DIR/task-type")
188
+ fi
189
+
190
+ if [ "$task_type" = "feature" ] || [ "$task_type" = "refactor" ]; then
191
+ echo "Task type: $task_type → AUDIT phase required"
192
+ echo ""
193
+ echo "Next: Run audits before commit"
194
+ echo " npm run audit:ui"
195
+ echo " npm run audit:cycles"
196
+ set_phase "AUDIT"
197
+ else
198
+ echo "Ready to proceed to COMMIT."
199
+ set_phase "PRE_COMMIT"
200
+ fi
201
+ echo ""
202
+
203
+ else
204
+ echo ""
205
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
206
+ echo -e "${RED}${BOLD}❌ VERIFICATION FAILED${NC} ${DIM}(Iteration $iteration/$MAX_ITERATIONS)${NC}"
207
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
208
+ echo ""
209
+
210
+ # Update status
211
+ echo "FAILED" > "$VERIFY_STATUS_FILE"
212
+ echo "$iteration" > "$VERIFY_ITERATION_FILE"
213
+
214
+ echo "Fix the errors above and save the file."
215
+ echo "Verification will re-run automatically."
216
+ echo ""
217
+ echo -e "${DIM}Remaining attempts: $((MAX_ITERATIONS - iteration))${NC}"
218
+ echo ""
219
+
220
+ # Enter FIX phase
221
+ set_phase "FIX"
222
+ fi
223
+ }
224
+
225
+ main