autoworkflow 3.6.0 → 3.7.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/.claude/hooks/pre-edit.sh +192 -119
- package/.claude/settings.local.json +2 -1
- package/README.md +48 -14
- package/package.json +1 -1
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# AutoWorkflow Pre-Edit Hook
|
|
2
|
+
# AutoWorkflow Pre-Edit Hook (v3.7.0 - Fail-Closed Design)
|
|
3
3
|
# Runs on: PreToolUse for Write/Edit tools
|
|
4
|
-
# Purpose:
|
|
4
|
+
# Purpose: BLOCK edits by default unless workflow state is properly set
|
|
5
5
|
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
6
|
+
# DESIGN PRINCIPLE: Fail-closed
|
|
7
|
+
# - If state is not initialized → BLOCK (auto-init as feature)
|
|
8
|
+
# - If plan not approved → BLOCK
|
|
9
|
+
# - If suggestions not shown (feature tasks) → BLOCK
|
|
10
|
+
# - If multiple edits per turn → BLOCK
|
|
11
|
+
# - Only allow edit if ALL checks pass
|
|
8
12
|
|
|
9
13
|
# Colors
|
|
10
14
|
RED='\033[0;31m'
|
|
@@ -24,14 +28,43 @@ TASK_TYPE_FILE="$STATE_DIR/task-type"
|
|
|
24
28
|
PLAN_APPROVED_FILE="$STATE_DIR/plan-approved"
|
|
25
29
|
SUGGESTIONS_SHOWN_FILE="$STATE_DIR/suggestions-shown"
|
|
26
30
|
CURRENT_TURN_EDITS_FILE="$STATE_DIR/current-turn-edits"
|
|
27
|
-
|
|
31
|
+
WORKFLOW_INITIALIZED_FILE="$STATE_DIR/workflow-initialized"
|
|
32
|
+
|
|
33
|
+
# Auto-initialize workflow state with safe defaults
|
|
34
|
+
auto_init_state() {
|
|
35
|
+
mkdir -p "$STATE_DIR"
|
|
36
|
+
|
|
37
|
+
# Set safe defaults - assume feature task (strictest)
|
|
38
|
+
echo "feature" > "$TASK_TYPE_FILE"
|
|
39
|
+
echo "IMPLEMENT" > "$PHASE_FILE"
|
|
40
|
+
echo "false" > "$PLAN_APPROVED_FILE"
|
|
41
|
+
echo "false" > "$SUGGESTIONS_SHOWN_FILE"
|
|
42
|
+
echo "0" > "$CURRENT_TURN_EDITS_FILE"
|
|
43
|
+
echo "true" > "$WORKFLOW_INITIALIZED_FILE"
|
|
44
|
+
|
|
45
|
+
echo ""
|
|
46
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
47
|
+
echo -e "${CYAN}${BOLD}📋 AUTOWORKFLOW: STATE INITIALIZED${NC}"
|
|
48
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
49
|
+
echo ""
|
|
50
|
+
echo "Workflow state auto-initialized with safe defaults:"
|
|
51
|
+
echo " Task type: feature (strictest)"
|
|
52
|
+
echo " Plan approved: false"
|
|
53
|
+
echo " Suggestions shown: false"
|
|
54
|
+
echo ""
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
# Check if workflow is initialized
|
|
58
|
+
is_workflow_initialized() {
|
|
59
|
+
[ -d "$STATE_DIR" ] && [ -f "$WORKFLOW_INITIALIZED_FILE" ]
|
|
60
|
+
}
|
|
28
61
|
|
|
29
62
|
# Get current phase
|
|
30
63
|
get_phase() {
|
|
31
64
|
if [ -f "$PHASE_FILE" ]; then
|
|
32
65
|
cat "$PHASE_FILE"
|
|
33
66
|
else
|
|
34
|
-
echo "
|
|
67
|
+
echo "UNKNOWN"
|
|
35
68
|
fi
|
|
36
69
|
}
|
|
37
70
|
|
|
@@ -40,7 +73,7 @@ get_task_type() {
|
|
|
40
73
|
if [ -f "$TASK_TYPE_FILE" ]; then
|
|
41
74
|
cat "$TASK_TYPE_FILE"
|
|
42
75
|
else
|
|
43
|
-
echo "
|
|
76
|
+
echo "feature" # Default to strictest
|
|
44
77
|
fi
|
|
45
78
|
}
|
|
46
79
|
|
|
@@ -53,7 +86,7 @@ is_plan_approved() {
|
|
|
53
86
|
return 1
|
|
54
87
|
}
|
|
55
88
|
|
|
56
|
-
# Check if suggestions were shown
|
|
89
|
+
# Check if suggestions were shown
|
|
57
90
|
suggestions_shown() {
|
|
58
91
|
if [ -f "$SUGGESTIONS_SHOWN_FILE" ]; then
|
|
59
92
|
local status=$(cat "$SUGGESTIONS_SHOWN_FILE")
|
|
@@ -79,142 +112,182 @@ increment_turn_edits() {
|
|
|
79
112
|
echo "$next"
|
|
80
113
|
}
|
|
81
114
|
|
|
82
|
-
# Check if
|
|
83
|
-
|
|
84
|
-
if [ -f "$SELECTED_ITEMS_FILE" ]; then
|
|
85
|
-
local content=$(cat "$SELECTED_ITEMS_FILE")
|
|
86
|
-
[ -n "$content" ] && return 0
|
|
87
|
-
fi
|
|
88
|
-
return 1
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
# Check if task type requires approval
|
|
92
|
-
requires_approval() {
|
|
115
|
+
# Check if task type requires strict workflow
|
|
116
|
+
requires_strict_workflow() {
|
|
93
117
|
local task_type="$1"
|
|
94
118
|
case "$task_type" in
|
|
95
|
-
#
|
|
119
|
+
# Strict workflow required
|
|
96
120
|
feature|fix|refactor|perf|security|test)
|
|
97
121
|
return 0
|
|
98
122
|
;;
|
|
99
|
-
#
|
|
100
|
-
docs|style|config
|
|
123
|
+
# Relaxed workflow
|
|
124
|
+
docs|style|config)
|
|
101
125
|
return 1
|
|
102
126
|
;;
|
|
103
|
-
# Unknown
|
|
127
|
+
# Unknown = strict
|
|
104
128
|
*)
|
|
105
129
|
return 0
|
|
106
130
|
;;
|
|
107
131
|
esac
|
|
108
132
|
}
|
|
109
133
|
|
|
110
|
-
#
|
|
111
|
-
|
|
112
|
-
local
|
|
113
|
-
local task_type=$(get_task_type)
|
|
134
|
+
# GATE 1: Plan Approval Check
|
|
135
|
+
check_plan_approval() {
|
|
136
|
+
local task_type="$1"
|
|
114
137
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
exit 0
|
|
138
|
+
if ! requires_strict_workflow "$task_type"; then
|
|
139
|
+
return 0 # Pass for relaxed task types
|
|
118
140
|
fi
|
|
119
141
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
142
|
+
if ! is_plan_approved; then
|
|
143
|
+
echo ""
|
|
144
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
145
|
+
echo -e "${RED}${BOLD}⛔ GATE 1: PLAN APPROVAL REQUIRED${NC}"
|
|
146
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
147
|
+
echo ""
|
|
148
|
+
echo -e "${CYAN}Task Type:${NC} $task_type"
|
|
149
|
+
echo -e "${CYAN}Plan Approved:${NC} NO"
|
|
150
|
+
echo ""
|
|
151
|
+
echo "You MUST get user approval before making any edits."
|
|
152
|
+
echo ""
|
|
153
|
+
echo -e "${BOLD}Required steps:${NC}"
|
|
154
|
+
echo " 1. Analyze the codebase"
|
|
155
|
+
echo " 2. Present your plan to the user"
|
|
156
|
+
echo " 3. Wait for explicit approval (yes/proceed/approved)"
|
|
157
|
+
echo " 4. THEN implement"
|
|
158
|
+
echo ""
|
|
159
|
+
echo -e "${DIM}To mark approved: echo 'true' > $PLAN_APPROVED_FILE${NC}"
|
|
160
|
+
echo ""
|
|
161
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
162
|
+
echo ""
|
|
163
|
+
return 1
|
|
123
164
|
fi
|
|
165
|
+
return 0
|
|
166
|
+
}
|
|
124
167
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
168
|
+
# GATE 2: Suggestions Check (for feature tasks)
|
|
169
|
+
check_suggestions() {
|
|
170
|
+
local task_type="$1"
|
|
171
|
+
|
|
172
|
+
# Only enforce for feature tasks
|
|
173
|
+
if [ "$task_type" != "feature" ]; then
|
|
174
|
+
return 0
|
|
175
|
+
fi
|
|
176
|
+
|
|
177
|
+
if ! suggestions_shown; then
|
|
178
|
+
echo ""
|
|
179
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
180
|
+
echo -e "${RED}${BOLD}⛔ GATE 2: SUGGESTIONS REQUIRED${NC}"
|
|
181
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
182
|
+
echo ""
|
|
183
|
+
echo -e "${CYAN}Task Type:${NC} feature"
|
|
184
|
+
echo ""
|
|
185
|
+
echo "For feature tasks, you MUST show 3-tier suggestions FIRST:"
|
|
186
|
+
echo ""
|
|
187
|
+
echo " 🔴 Required - Must implement"
|
|
188
|
+
echo " 🟡 Recommended - Should implement"
|
|
189
|
+
echo " 🟢 Optional - Nice to have"
|
|
190
|
+
echo ""
|
|
191
|
+
echo "Show suggestions, let user select, THEN implement ONE at a time."
|
|
192
|
+
echo ""
|
|
193
|
+
echo -e "${DIM}To mark shown: echo 'true' > $SUGGESTIONS_SHOWN_FILE${NC}"
|
|
194
|
+
echo ""
|
|
195
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
196
|
+
echo ""
|
|
197
|
+
return 1
|
|
198
|
+
fi
|
|
199
|
+
return 0
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
# GATE 3: One Edit Per Turn Check (applies to ALL implementation)
|
|
203
|
+
check_one_edit_per_turn() {
|
|
204
|
+
local task_type="$1"
|
|
132
205
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
if ! is_plan_approved; then
|
|
136
|
-
echo ""
|
|
137
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
138
|
-
echo -e "${RED}${BOLD}⛔ AUTOWORKFLOW: PLAN APPROVAL REQUIRED${NC}"
|
|
139
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
140
|
-
echo ""
|
|
141
|
-
echo -e "${CYAN}Current Phase:${NC} $phase"
|
|
142
|
-
echo -e "${CYAN}Task Type:${NC} $task_type"
|
|
143
|
-
echo -e "${CYAN}Plan Approved:${NC} NO"
|
|
144
|
-
echo ""
|
|
145
|
-
echo "Cannot edit files before plan approval."
|
|
146
|
-
echo ""
|
|
147
|
-
echo -e "${BOLD}Required workflow:${NC}"
|
|
148
|
-
echo " 1. Complete ANALYZE phase (read relevant files)"
|
|
149
|
-
echo " 2. Present PLAN with suggestions"
|
|
150
|
-
echo " 3. Wait for user approval"
|
|
151
|
-
echo " 4. THEN implement"
|
|
152
|
-
echo ""
|
|
153
|
-
echo -e "${DIM}To approve, user must say: yes, proceed, approved, go ahead${NC}"
|
|
154
|
-
echo ""
|
|
155
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
156
|
-
echo ""
|
|
157
|
-
|
|
158
|
-
# Exit with error to BLOCK the edit
|
|
159
|
-
exit 1
|
|
160
|
-
fi
|
|
206
|
+
if ! requires_strict_workflow "$task_type"; then
|
|
207
|
+
return 0 # Pass for relaxed task types
|
|
161
208
|
fi
|
|
162
209
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
exit 1
|
|
186
|
-
fi
|
|
210
|
+
local edit_count=$(get_turn_edit_count)
|
|
211
|
+
|
|
212
|
+
if [ "$edit_count" -ge 1 ]; then
|
|
213
|
+
echo ""
|
|
214
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
215
|
+
echo -e "${YELLOW}${BOLD}⛔ GATE 3: ONE EDIT PER TURN${NC}"
|
|
216
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
217
|
+
echo ""
|
|
218
|
+
echo -e "${CYAN}Edits this turn:${NC} $edit_count"
|
|
219
|
+
echo ""
|
|
220
|
+
echo "You can only make ONE edit per user turn."
|
|
221
|
+
echo ""
|
|
222
|
+
echo "This ensures:"
|
|
223
|
+
echo " 1. Easier to track changes"
|
|
224
|
+
echo " 2. Errors caught early"
|
|
225
|
+
echo " 3. User can review incrementally"
|
|
226
|
+
echo ""
|
|
227
|
+
echo "Wait for user's next message before making another edit."
|
|
228
|
+
echo ""
|
|
229
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
230
|
+
echo ""
|
|
231
|
+
return 1
|
|
187
232
|
fi
|
|
188
233
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
234
|
+
return 0
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
# Main execution
|
|
238
|
+
main() {
|
|
239
|
+
# STEP 1: Check if workflow is initialized
|
|
240
|
+
if ! is_workflow_initialized; then
|
|
241
|
+
# Auto-initialize with safe defaults
|
|
242
|
+
auto_init_state
|
|
243
|
+
|
|
244
|
+
# After init, BLOCK this edit attempt
|
|
245
|
+
echo ""
|
|
246
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
247
|
+
echo -e "${RED}${BOLD}⛔ AUTOWORKFLOW: EDIT BLOCKED${NC}"
|
|
248
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
249
|
+
echo ""
|
|
250
|
+
echo "Workflow just initialized. Cannot edit yet."
|
|
251
|
+
echo ""
|
|
252
|
+
echo "You must first:"
|
|
253
|
+
echo " 1. Show your analysis/plan to the user"
|
|
254
|
+
echo " 2. Get user approval"
|
|
255
|
+
echo " 3. For features: Show 3-tier suggestions"
|
|
256
|
+
echo " 4. THEN implement one fix at a time"
|
|
257
|
+
echo ""
|
|
258
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
259
|
+
echo ""
|
|
260
|
+
exit 1
|
|
215
261
|
fi
|
|
216
262
|
|
|
217
|
-
#
|
|
263
|
+
# Get current state
|
|
264
|
+
local task_type=$(get_task_type)
|
|
265
|
+
local phase=$(get_phase)
|
|
266
|
+
|
|
267
|
+
# STEP 2: Run all gates
|
|
268
|
+
|
|
269
|
+
# GATE 1: Plan Approval
|
|
270
|
+
if ! check_plan_approval "$task_type"; then
|
|
271
|
+
exit 1
|
|
272
|
+
fi
|
|
273
|
+
|
|
274
|
+
# GATE 2: Suggestions (feature tasks only)
|
|
275
|
+
if ! check_suggestions "$task_type"; then
|
|
276
|
+
exit 1
|
|
277
|
+
fi
|
|
278
|
+
|
|
279
|
+
# GATE 3: One Edit Per Turn
|
|
280
|
+
if ! check_one_edit_per_turn "$task_type"; then
|
|
281
|
+
exit 1
|
|
282
|
+
fi
|
|
283
|
+
|
|
284
|
+
# ALL GATES PASSED - Allow edit and track it
|
|
285
|
+
increment_turn_edits > /dev/null
|
|
286
|
+
|
|
287
|
+
echo ""
|
|
288
|
+
echo -e "${GREEN}✓${NC} Edit allowed (turn edit #$(get_turn_edit_count))"
|
|
289
|
+
echo ""
|
|
290
|
+
|
|
218
291
|
exit 0
|
|
219
292
|
}
|
|
220
293
|
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> Automated workflow enforcement for Claude Code via hooks and system prompts.
|
|
4
4
|
|
|
5
|
-
**v3.
|
|
5
|
+
**v3.7.0** - Fail-closed enforcement: BLOCKS edits by default unless all gates pass.
|
|
6
6
|
|
|
7
7
|
When you use Claude Code with AutoWorkflow, hooks automatically enforce workflow phases, block unauthorized edits, and guide Claude through a structured process for all coding tasks.
|
|
8
8
|
|
|
@@ -21,6 +21,35 @@ Options:
|
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
24
|
+
## What's New in v3.7.0
|
|
25
|
+
|
|
26
|
+
### Fail-Closed Enforcement Design
|
|
27
|
+
Previous versions "failed open" - if state wasn't set, edits were allowed. v3.7.0 "fails closed":
|
|
28
|
+
|
|
29
|
+
| Scenario | Before (v3.6) | After (v3.7) |
|
|
30
|
+
|----------|---------------|--------------|
|
|
31
|
+
| No workflow state | ✅ Allowed | ⛔ BLOCKED |
|
|
32
|
+
| Plan not approved | ⛔ Blocked (in PLAN phase only) | ⛔ BLOCKED (always) |
|
|
33
|
+
| No suggestions shown | ⛔ Blocked (in IMPLEMENT only) | ⛔ BLOCKED (always for features) |
|
|
34
|
+
| Multiple edits/turn | ⛔ Blocked (in FIX only) | ⛔ BLOCKED (always) |
|
|
35
|
+
|
|
36
|
+
### Auto-Initialization with Safe Defaults
|
|
37
|
+
When Claude attempts the first edit without workflow state:
|
|
38
|
+
1. Auto-creates state with `task-type: feature` (strictest)
|
|
39
|
+
2. Sets `plan-approved: false`
|
|
40
|
+
3. Sets `suggestions-shown: false`
|
|
41
|
+
4. **BLOCKS the edit** immediately
|
|
42
|
+
5. Claude must show plan/suggestions first, get approval, then try again
|
|
43
|
+
|
|
44
|
+
### Three Gates (All Must Pass)
|
|
45
|
+
```
|
|
46
|
+
GATE 1: Plan Approval → Must have user approval
|
|
47
|
+
GATE 2: Suggestions → Must show 3-tier suggestions (features)
|
|
48
|
+
GATE 3: One Edit/Turn → Max 1 edit per user message
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
24
53
|
## What's New in v3.6.0
|
|
25
54
|
|
|
26
55
|
### Multi-Language Project Support
|
|
@@ -88,10 +117,11 @@ guardrails:
|
|
|
88
117
|
┌─────────────────────────────────────────────────────────────┐
|
|
89
118
|
│ HOOKS (Automatic) │
|
|
90
119
|
│ │
|
|
91
|
-
│ UserPromptSubmit → session-check.sh (resume,
|
|
92
|
-
│ PreToolUse → pre-edit.sh (
|
|
120
|
+
│ UserPromptSubmit → session-check.sh (resume, turn reset) │
|
|
121
|
+
│ PreToolUse → pre-edit.sh (3 gates: approval, │
|
|
122
|
+
│ suggestions, one-fix-at-a-time) │
|
|
93
123
|
│ PreToolUse → pre-commit-check.sh (BLOCKS bad code) │
|
|
94
|
-
│ PostToolUse → post-edit.sh (
|
|
124
|
+
│ PostToolUse → post-edit.sh (multi-lang verify) │
|
|
95
125
|
│ PostToolUse → post-commit.sh (BLUEPRINT reminder) │
|
|
96
126
|
│ │
|
|
97
127
|
│ Hooks ENFORCE workflow - they physically block actions │
|
|
@@ -140,22 +170,26 @@ ANALYZE → PLAN → CONFIRM → IMPLEMENT → VERIFY → AUDIT → COMMIT → U
|
|
|
140
170
|
|
|
141
171
|
| Hook | Trigger | Action |
|
|
142
172
|
|------|---------|--------|
|
|
143
|
-
| `session-check.sh` | Every user message | Resume
|
|
144
|
-
| `pre-edit.sh` | Before Write/Edit | **BLOCK if
|
|
145
|
-
| `post-edit.sh` | After Write/Edit |
|
|
173
|
+
| `session-check.sh` | Every user message | Resume session, reset turn counter |
|
|
174
|
+
| `pre-edit.sh` | Before Write/Edit | **BLOCK** if: no approval, no suggestions, or multiple fixes |
|
|
175
|
+
| `post-edit.sh` | After Write/Edit | Detect project type, run verification |
|
|
146
176
|
| `pre-commit-check.sh` | Before git commit | **BLOCK if TODO/console.log/errors** |
|
|
147
177
|
| `post-commit.sh` | After git commit | Remind to update BLUEPRINT.md |
|
|
148
178
|
|
|
149
179
|
---
|
|
150
180
|
|
|
151
|
-
## Blocking Gates
|
|
181
|
+
## Blocking Gates (Fail-Closed)
|
|
182
|
+
|
|
183
|
+
| Gate | Blocks If | Applies To |
|
|
184
|
+
|------|-----------|------------|
|
|
185
|
+
| **State Init** | No workflow state exists | ALL tasks |
|
|
186
|
+
| **Plan Approval** | User hasn't approved | feature, fix, refactor, perf, security, test |
|
|
187
|
+
| **Suggestions** | 3-tier suggestions not shown | feature tasks |
|
|
188
|
+
| **One Edit/Turn** | Already edited this turn | feature, fix, refactor, perf, security, test |
|
|
189
|
+
| **Verify** | Language-specific errors | ALL (post-edit) |
|
|
190
|
+
| **Pre-Commit** | TODO/FIXME, console.log | ALL commits |
|
|
152
191
|
|
|
153
|
-
|
|
154
|
-
|------|-----------|-------------|
|
|
155
|
-
| Plan Approval | User hasn't approved the plan | `pre-edit.sh` (exit 1) |
|
|
156
|
-
| Verify | TypeScript or ESLint errors exist | `post-edit.sh` loop |
|
|
157
|
-
| Audit | Orphan features or circular dependencies | Required before commit |
|
|
158
|
-
| Pre-Commit | TODO/FIXME, console.log, bad format | `pre-commit-check.sh` (exit 1) |
|
|
192
|
+
**Design:** All gates are checked on EVERY edit. Unknown state = strictest defaults.
|
|
159
193
|
|
|
160
194
|
---
|
|
161
195
|
|