autoworkflow 3.0.1 → 3.1.1
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/.claude/hooks/audit-runner.sh +191 -0
- package/.claude/hooks/blueprint-generator.sh +253 -0
- package/.claude/hooks/phase-transition.sh +279 -0
- package/.claude/hooks/post-edit.sh +218 -14
- package/.claude/hooks/pre-commit-check.sh +223 -47
- package/.claude/hooks/pre-tool-router.sh +67 -0
- package/.claude/hooks/session-check.sh +328 -41
- package/.claude/settings.json +60 -15
- package/.claude/settings.local.json +6 -1
- package/CLAUDE.md +119 -47
- package/bin/cli.js +28 -7
- package/instructions/CLAUDE.md +22 -0
- package/package.json +1 -1
- package/system/triggers.md +243 -235
|
@@ -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:
|
|
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
|
-
|
|
7
|
-
TOOL_NAME="${1:-unknown}"
|
|
9
|
+
set -e
|
|
8
10
|
|
|
9
|
-
#
|
|
10
|
-
|
|
11
|
-
|
|
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 "
|
|
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
|
-
|
|
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
|