@ulpi/cli 0.1.5 → 0.1.6
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/LICENSE +21 -0
- package/dist/{auth-PN7TMQHV-2W4ICG64.js → auth-FWM7MM4Q-VZC3U2XZ.js} +1 -1
- package/dist/{auth-BFFBUJUC.js → auth-HDK7ECJL.js} +2 -1
- package/dist/{chunk-RJIRWQJD.js → chunk-3BCW6ABU.js} +402 -142
- package/dist/{chunk-L3PWNHSA.js → chunk-3WB5CXH4.js} +180 -5
- package/dist/{chunk-K4OVPFY2.js → chunk-4UCJIAOU.js} +2 -2
- package/dist/chunk-4XTHZVDS.js +109 -0
- package/dist/chunk-4ZPOZULQ.js +6522 -0
- package/dist/{chunk-SIAQVRKG.js → chunk-5MI5GIXM.js} +48 -2
- package/dist/{chunk-KLEASXUR.js → chunk-6ZL6NXMV.js} +1 -1
- package/dist/{chunk-AV5RB3N2.js → chunk-76D3BYJD.js} +48 -0
- package/dist/{chunk-DOIKS6C5.js → chunk-AWOSRA5F.js} +1 -1
- package/dist/{chunk-UCMT5OKP.js → chunk-BFEKZZHM.js} +274 -57
- package/dist/chunk-C7CLUQI6.js +1286 -0
- package/dist/{chunk-ELTGWMDE.js → chunk-E3B5NROU.js} +7 -7
- package/dist/chunk-EJ7TW77N.js +1418 -0
- package/dist/{chunk-6OURRFP7.js → chunk-IV6MWETF.js} +383 -168
- package/dist/chunk-IZPJHSPX.js +1478 -0
- package/dist/chunk-JLHNLM3C.js +228 -0
- package/dist/{chunk-P2RESJRN.js → chunk-KYYI23AQ.js} +2 -2
- package/dist/chunk-S6ANCSYO.js +1271 -0
- package/dist/chunk-SEU7WWNQ.js +1251 -0
- package/dist/chunk-SNQ7NAIS.js +453 -0
- package/dist/{ulpi-RMMCUAGP-EWYUE7RU.js → chunk-TSLDGT5O.js} +73 -35
- package/dist/{chunk-EIWYSP3A.js → chunk-UXHCHOWQ.js} +83 -62
- package/dist/chunk-V2H5D6Y3.js +146 -0
- package/dist/{chunk-5SCG7UYM.js → chunk-VVEDXI7E.js} +1 -1
- package/dist/chunk-VXH5Y4FO.js +6761 -0
- package/dist/chunk-WED4LM5N.js +322 -0
- package/dist/{chunk-74WVVWJ4.js → chunk-YOKL7RB5.js} +184 -15
- package/dist/chunk-Z53CAR7G.js +298 -0
- package/dist/{ci-JQ56YIKC.js → ci-X3U2W4HC.js} +124 -26
- package/dist/cloud-2F3NLVHN.js +274 -0
- package/dist/{codemap-HMYBXJL2.js → codemap-XNGMAF3F.js} +37 -37
- package/dist/codex-MB5YTMRT.js +132 -0
- package/dist/{config-YYWEN7U2.js → config-OOELBYTH.js} +1 -1
- package/dist/dist-2BJYR5EI.js +59 -0
- package/dist/dist-3EIQTZHT.js +1380 -0
- package/dist/{dist-WAMAQVPK.js → dist-4U5L2X2C.js} +2 -2
- package/dist/{dist-4XTJ6HLM.js → dist-54KAMNLO.js} +16 -15
- package/dist/dist-6M4MZWZW.js +58 -0
- package/dist/dist-6X576SU2.js +27 -0
- package/dist/dist-7QOEYLFX.js +103 -0
- package/dist/dist-AYBGHEDY.js +2541 -0
- package/dist/dist-EK45QNEM.js +45 -0
- package/dist/{dist-U7ZIJMZD.js → dist-FKFEJRPX.js} +16 -15
- package/dist/dist-GTEJUBBT.js +66 -0
- package/dist/dist-HA74OKJZ.js +40 -0
- package/dist/{dist-XG2GG5SD.js → dist-HU5RZAON.js} +14 -2
- package/dist/dist-IYE3OBRB.js +374 -0
- package/dist/{dist-7WLLPWWB.js → dist-JLU26AB6.js} +12 -9
- package/dist/{dist-6G7JC2RA.js → dist-KUCI6JFE.js} +49 -9
- package/dist/dist-NUEMFZFL.js +33 -0
- package/dist/{dist-GWGTAHNM.js → dist-NUXMDXZ3.js} +31 -3
- package/dist/{dist-5R4RYNQO.js → dist-YCNWHSLN.js} +15 -5
- package/dist/{dist-6MFVWIFF.js → dist-YFFG2ZD6.js} +9 -16
- package/dist/dist-ZG4OKCSR.js +15 -0
- package/dist/doctor-SI4LLLDZ.js +345 -0
- package/dist/{export-import-4A5MWLIA.js → export-import-JFQH4KSJ.js} +1 -1
- package/dist/{history-RNUWO4JZ.js → history-5NE46ZAH.js} +7 -7
- package/dist/{hooks-installer-K2JXEBNN.js → hooks-installer-UN5JZLDQ.js} +2 -2
- package/dist/index.js +394 -618
- package/dist/{init-NQWFZPKO.js → init-5FK3VKRT.js} +76 -10
- package/dist/job-HIDMAFW2.js +376 -0
- package/dist/jobs.memory-PLMMSFHB-VBECCTHN.js +33 -0
- package/dist/kiro-VMUHDFGK.js +153 -0
- package/dist/{launchd-OYXUAVW6.js → launchd-6AWT54HR.js} +9 -17
- package/dist/mcp-PDUD7SGP.js +249 -0
- package/dist/mcp-installer-PQU3XOGO.js +259 -0
- package/dist/mcp-setup-OA7IB3H3.js +263 -0
- package/dist/{memory-D6ZFFCI2.js → memory-ZNAEAK3B.js} +17 -17
- package/dist/{ollama-3XCUZMZT-FYKHW4TZ.js → ollama-3XCUZMZT-4JMH6B7P.js} +1 -1
- package/dist/{openai-E7G2YAHU-IG33BFYF.js → openai-E7G2YAHU-T3HMBPH7.js} +2 -2
- package/dist/portal-JYWVHXDU.js +210 -0
- package/dist/prd-Q4J5NVAR.js +408 -0
- package/dist/repos-WWZXNN3P.js +271 -0
- package/dist/review-integration-5WHEJU2A.js +14 -0
- package/dist/{rules-3OFGWHP4.js → rules-Y4VSOY5Y.js} +3 -3
- package/dist/run-VPNXEIBY.js +687 -0
- package/dist/server-COL4AXKU-P7S7NNF6.js +11 -0
- package/dist/server-KKSETHDV-XSSLEENT.js +20 -0
- package/dist/{skills-GY2CTPWN.js → skills-QEYU2N27.js} +4 -2
- package/dist/start-JYOEL7AJ.js +303 -0
- package/dist/{status-SE43TIFJ.js → status-BHQYYGAL.js} +2 -2
- package/dist/{templates-O2XDKB5R.js → templates-CBRUJ66V.js} +6 -5
- package/dist/tui-DP7736EX.js +61 -0
- package/dist/ulpi-5EN6JCAS-LFE3WSL4.js +10 -0
- package/dist/{uninstall-KWGSGZTI.js → uninstall-ICUV6DDV.js} +3 -3
- package/dist/{update-QYZA4D23.js → update-7ZMAYRBH.js} +3 -3
- package/dist/{version-checker-MVB74DEX.js → version-checker-4ZFMZA7Y.js} +2 -2
- package/package.json +39 -31
- package/dist/chunk-26LLDX2T.js +0 -553
- package/dist/chunk-DDRLI6JU.js +0 -331
- package/dist/chunk-IFATANHR.js +0 -453
- package/dist/chunk-JWUUVXIV.js +0 -13694
- package/dist/chunk-LD52XG3X.js +0 -4273
- package/dist/chunk-MIAQVCFW.js +0 -39
- package/dist/chunk-YYZOFYS6.js +0 -415
- package/dist/dist-XD4YI27T.js +0 -26
- package/dist/mcp-installer-TOYDP77X.js +0 -124
- package/dist/projects-COUJP4ZC.js +0 -271
- package/dist/review-KMGP2S25.js +0 -152
- package/dist/server-USLHY6GH-F4JSXCWA.js +0 -18
- package/dist/server-X5P6WH2M-ULZF5WHZ.js +0 -11
- package/dist/skills/ulpi-generate-guardian/SKILL.md +0 -750
- package/dist/skills/ulpi-generate-guardian/references/framework-rules.md +0 -849
- package/dist/skills/ulpi-generate-guardian/references/language-rules.md +0 -591
- package/dist/ui-4SM2SUI6.js +0 -167
- package/dist/ui.html +0 -698
|
@@ -1,849 +0,0 @@
|
|
|
1
|
-
# Framework-Specific Rules
|
|
2
|
-
|
|
3
|
-
## Next.js
|
|
4
|
-
|
|
5
|
-
```yaml
|
|
6
|
-
permissions:
|
|
7
|
-
auto-approve-next:
|
|
8
|
-
trigger: PermissionRequest
|
|
9
|
-
matcher: Bash
|
|
10
|
-
command_pattern: "next"
|
|
11
|
-
decision: allow
|
|
12
|
-
|
|
13
|
-
# Build output protection
|
|
14
|
-
block-next-cache:
|
|
15
|
-
trigger: PreToolUse
|
|
16
|
-
matcher: "Write|Edit"
|
|
17
|
-
file_pattern: ".next/**"
|
|
18
|
-
decision: deny
|
|
19
|
-
message: "Do not edit .next/ cache. Run `next build` to regenerate."
|
|
20
|
-
locked: true
|
|
21
|
-
|
|
22
|
-
preconditions:
|
|
23
|
-
warn-app-router-convention:
|
|
24
|
-
trigger: PreToolUse
|
|
25
|
-
matcher: "Write|Edit"
|
|
26
|
-
file_pattern: "app/**/page.tsx"
|
|
27
|
-
message: "Page files must export default. Check naming conventions."
|
|
28
|
-
priority: 70
|
|
29
|
-
|
|
30
|
-
warn-next-config:
|
|
31
|
-
trigger: PreToolUse
|
|
32
|
-
matcher: "Write|Edit"
|
|
33
|
-
file_pattern: "next.config.*"
|
|
34
|
-
message: "Next.js config changes may require dev server restart and affect build behavior."
|
|
35
|
-
priority: 60
|
|
36
|
-
|
|
37
|
-
warn-middleware:
|
|
38
|
-
trigger: PreToolUse
|
|
39
|
-
matcher: "Write|Edit"
|
|
40
|
-
file_pattern: "middleware.ts"
|
|
41
|
-
message: "Middleware runs on every request. Verify edge runtime compatibility."
|
|
42
|
-
priority: 60
|
|
43
|
-
|
|
44
|
-
postconditions:
|
|
45
|
-
# Lint on save (Next.js built-in linter)
|
|
46
|
-
nextjs-lint-on-save:
|
|
47
|
-
trigger: PostToolUse
|
|
48
|
-
matcher: "Write|Edit"
|
|
49
|
-
file_pattern: "**/*.{ts,tsx}"
|
|
50
|
-
run: "npx next lint --quiet"
|
|
51
|
-
timeout: 30000
|
|
52
|
-
block_on_failure: false
|
|
53
|
-
|
|
54
|
-
# Typecheck on save
|
|
55
|
-
nextjs-typecheck:
|
|
56
|
-
trigger: PostToolUse
|
|
57
|
-
matcher: "Write|Edit"
|
|
58
|
-
file_pattern: "**/*.{ts,tsx}"
|
|
59
|
-
run: "tsc --noEmit"
|
|
60
|
-
timeout: 30000
|
|
61
|
-
block_on_failure: true
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## Nuxt
|
|
65
|
-
|
|
66
|
-
```yaml
|
|
67
|
-
permissions:
|
|
68
|
-
auto-approve-nuxt:
|
|
69
|
-
trigger: PermissionRequest
|
|
70
|
-
matcher: Bash
|
|
71
|
-
command_pattern: "nuxt"
|
|
72
|
-
decision: allow
|
|
73
|
-
|
|
74
|
-
auto-approve-nuxi:
|
|
75
|
-
trigger: PermissionRequest
|
|
76
|
-
matcher: Bash
|
|
77
|
-
command_pattern: "nuxi"
|
|
78
|
-
decision: allow
|
|
79
|
-
|
|
80
|
-
# Build output protection
|
|
81
|
-
block-nuxt-cache:
|
|
82
|
-
trigger: PreToolUse
|
|
83
|
-
matcher: "Write|Edit"
|
|
84
|
-
file_pattern: ".nuxt/**"
|
|
85
|
-
decision: deny
|
|
86
|
-
message: "Do not edit .nuxt/ cache. Run `nuxt build` to regenerate."
|
|
87
|
-
locked: true
|
|
88
|
-
|
|
89
|
-
block-nuxt-output:
|
|
90
|
-
trigger: PreToolUse
|
|
91
|
-
matcher: "Write|Edit"
|
|
92
|
-
file_pattern: ".output/**"
|
|
93
|
-
decision: deny
|
|
94
|
-
message: "Do not edit .output/. Run `nuxt build` to regenerate."
|
|
95
|
-
locked: true
|
|
96
|
-
|
|
97
|
-
preconditions:
|
|
98
|
-
warn-nuxt-config:
|
|
99
|
-
trigger: PreToolUse
|
|
100
|
-
matcher: "Write|Edit"
|
|
101
|
-
file_pattern: "nuxt.config.*"
|
|
102
|
-
message: "Nuxt config changes may require dev server restart."
|
|
103
|
-
priority: 60
|
|
104
|
-
|
|
105
|
-
postconditions:
|
|
106
|
-
nuxt-typecheck:
|
|
107
|
-
trigger: PostToolUse
|
|
108
|
-
matcher: "Write|Edit"
|
|
109
|
-
file_pattern: "**/*.{ts,vue}"
|
|
110
|
-
run: "npx nuxi typecheck"
|
|
111
|
-
timeout: 30000
|
|
112
|
-
block_on_failure: true
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
## NestJS
|
|
116
|
-
|
|
117
|
-
```yaml
|
|
118
|
-
permissions:
|
|
119
|
-
auto-approve-nest:
|
|
120
|
-
trigger: PermissionRequest
|
|
121
|
-
matcher: Bash
|
|
122
|
-
command_pattern: "nest"
|
|
123
|
-
decision: allow
|
|
124
|
-
|
|
125
|
-
# Build output protection
|
|
126
|
-
block-nest-dist:
|
|
127
|
-
trigger: PreToolUse
|
|
128
|
-
matcher: "Write|Edit"
|
|
129
|
-
file_pattern: "dist/**"
|
|
130
|
-
decision: deny
|
|
131
|
-
message: "Do not edit dist/. Run `nest build` to regenerate."
|
|
132
|
-
locked: true
|
|
133
|
-
|
|
134
|
-
preconditions:
|
|
135
|
-
warn-module-changes:
|
|
136
|
-
trigger: PreToolUse
|
|
137
|
-
matcher: "Write|Edit"
|
|
138
|
-
file_pattern: "**/*.module.ts"
|
|
139
|
-
message: "Module changes affect dependency injection. Verify imports/exports."
|
|
140
|
-
priority: 70
|
|
141
|
-
|
|
142
|
-
postconditions:
|
|
143
|
-
nest-build-check:
|
|
144
|
-
trigger: PostToolUse
|
|
145
|
-
matcher: "Write|Edit"
|
|
146
|
-
file_pattern: "src/**/*.ts"
|
|
147
|
-
run: "nest build"
|
|
148
|
-
timeout: 30000
|
|
149
|
-
block_on_failure: true
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
## SvelteKit
|
|
153
|
-
|
|
154
|
-
```yaml
|
|
155
|
-
permissions:
|
|
156
|
-
auto-approve-svelte:
|
|
157
|
-
trigger: PermissionRequest
|
|
158
|
-
matcher: Bash
|
|
159
|
-
command_pattern: "svelte-kit"
|
|
160
|
-
decision: allow
|
|
161
|
-
|
|
162
|
-
# Build output protection
|
|
163
|
-
block-svelte-kit-output:
|
|
164
|
-
trigger: PreToolUse
|
|
165
|
-
matcher: "Write|Edit"
|
|
166
|
-
file_pattern: ".svelte-kit/**"
|
|
167
|
-
decision: deny
|
|
168
|
-
message: "Do not edit .svelte-kit/. Run `svelte-kit build` to regenerate."
|
|
169
|
-
locked: true
|
|
170
|
-
|
|
171
|
-
preconditions:
|
|
172
|
-
warn-svelte-config:
|
|
173
|
-
trigger: PreToolUse
|
|
174
|
-
matcher: "Write|Edit"
|
|
175
|
-
file_pattern: "svelte.config.*"
|
|
176
|
-
message: "SvelteKit config changes may require dev server restart."
|
|
177
|
-
priority: 60
|
|
178
|
-
|
|
179
|
-
postconditions:
|
|
180
|
-
svelte-check:
|
|
181
|
-
trigger: PostToolUse
|
|
182
|
-
matcher: "Write|Edit"
|
|
183
|
-
file_pattern: "**/*.{ts,svelte}"
|
|
184
|
-
run: "npx svelte-check"
|
|
185
|
-
timeout: 30000
|
|
186
|
-
block_on_failure: true
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
## Angular
|
|
190
|
-
|
|
191
|
-
```yaml
|
|
192
|
-
permissions:
|
|
193
|
-
auto-approve-ng:
|
|
194
|
-
trigger: PermissionRequest
|
|
195
|
-
matcher: Bash
|
|
196
|
-
command_pattern: "ng"
|
|
197
|
-
decision: allow
|
|
198
|
-
|
|
199
|
-
# Build output protection
|
|
200
|
-
block-angular-dist:
|
|
201
|
-
trigger: PreToolUse
|
|
202
|
-
matcher: "Write|Edit"
|
|
203
|
-
file_pattern: "dist/**"
|
|
204
|
-
decision: deny
|
|
205
|
-
message: "Do not edit dist/. Run `ng build` to regenerate."
|
|
206
|
-
locked: true
|
|
207
|
-
|
|
208
|
-
preconditions:
|
|
209
|
-
warn-angular-json:
|
|
210
|
-
trigger: PreToolUse
|
|
211
|
-
matcher: "Write|Edit"
|
|
212
|
-
file_pattern: "angular.json"
|
|
213
|
-
message: "angular.json changes affect build configuration and all projects."
|
|
214
|
-
priority: 60
|
|
215
|
-
|
|
216
|
-
postconditions:
|
|
217
|
-
angular-lint:
|
|
218
|
-
trigger: PostToolUse
|
|
219
|
-
matcher: "Write|Edit"
|
|
220
|
-
file_pattern: "**/*.ts"
|
|
221
|
-
run: "ng lint"
|
|
222
|
-
timeout: 30000
|
|
223
|
-
block_on_failure: false
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
## Expo React Native
|
|
227
|
-
|
|
228
|
-
```yaml
|
|
229
|
-
permissions:
|
|
230
|
-
auto-approve-expo:
|
|
231
|
-
trigger: PermissionRequest
|
|
232
|
-
matcher: Bash
|
|
233
|
-
command_pattern: "expo"
|
|
234
|
-
decision: allow
|
|
235
|
-
|
|
236
|
-
auto-approve-npx-expo:
|
|
237
|
-
trigger: PermissionRequest
|
|
238
|
-
matcher: Bash
|
|
239
|
-
command_pattern: "npx expo"
|
|
240
|
-
decision: allow
|
|
241
|
-
|
|
242
|
-
auto-approve-eas:
|
|
243
|
-
trigger: PermissionRequest
|
|
244
|
-
matcher: Bash
|
|
245
|
-
command_pattern: "eas"
|
|
246
|
-
decision: allow
|
|
247
|
-
|
|
248
|
-
# Build output protection
|
|
249
|
-
block-expo-cache:
|
|
250
|
-
trigger: PreToolUse
|
|
251
|
-
matcher: "Write|Edit"
|
|
252
|
-
file_pattern: ".expo/**"
|
|
253
|
-
decision: deny
|
|
254
|
-
message: "Do not edit .expo/ cache. Run `npx expo start --clear` to regenerate."
|
|
255
|
-
locked: true
|
|
256
|
-
|
|
257
|
-
preconditions:
|
|
258
|
-
warn-app-json:
|
|
259
|
-
trigger: PreToolUse
|
|
260
|
-
matcher: "Write|Edit"
|
|
261
|
-
file_pattern: "app.json"
|
|
262
|
-
message: "app.json changes may require a native rebuild (npx expo prebuild --clean)."
|
|
263
|
-
priority: 60
|
|
264
|
-
|
|
265
|
-
warn-plugins:
|
|
266
|
-
trigger: PreToolUse
|
|
267
|
-
matcher: "Write|Edit"
|
|
268
|
-
file_pattern: "plugins/**"
|
|
269
|
-
message: "Plugin changes require prebuild. Run `npx expo prebuild` after editing."
|
|
270
|
-
priority: 60
|
|
271
|
-
|
|
272
|
-
postconditions:
|
|
273
|
-
expo-typecheck:
|
|
274
|
-
trigger: PostToolUse
|
|
275
|
-
matcher: "Write|Edit"
|
|
276
|
-
file_pattern: "**/*.{ts,tsx}"
|
|
277
|
-
run: "tsc --noEmit"
|
|
278
|
-
timeout: 30000
|
|
279
|
-
block_on_failure: true
|
|
280
|
-
|
|
281
|
-
expo-config-check:
|
|
282
|
-
trigger: PostToolUse
|
|
283
|
-
matcher: "Write|Edit"
|
|
284
|
-
file_pattern: "app.json"
|
|
285
|
-
run: "npx expo config --type public"
|
|
286
|
-
timeout: 10000
|
|
287
|
-
block_on_failure: false
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
## Laravel
|
|
291
|
-
|
|
292
|
-
```yaml
|
|
293
|
-
permissions:
|
|
294
|
-
auto-approve-artisan:
|
|
295
|
-
trigger: PermissionRequest
|
|
296
|
-
matcher: Bash
|
|
297
|
-
command_pattern: "php artisan"
|
|
298
|
-
decision: allow
|
|
299
|
-
|
|
300
|
-
block-migrate-fresh:
|
|
301
|
-
trigger: PreToolUse
|
|
302
|
-
matcher: Bash
|
|
303
|
-
command_pattern: "artisan migrate:fresh"
|
|
304
|
-
decision: deny
|
|
305
|
-
message: "migrate:fresh drops all tables. Use migrate instead."
|
|
306
|
-
|
|
307
|
-
block-db-wipe:
|
|
308
|
-
trigger: PreToolUse
|
|
309
|
-
matcher: Bash
|
|
310
|
-
command_pattern: "artisan db:wipe"
|
|
311
|
-
decision: deny
|
|
312
|
-
message: "db:wipe destroys the database."
|
|
313
|
-
|
|
314
|
-
# Build artifact protection
|
|
315
|
-
block-vendor:
|
|
316
|
-
trigger: PreToolUse
|
|
317
|
-
matcher: "Write|Edit"
|
|
318
|
-
file_pattern: "vendor/**"
|
|
319
|
-
decision: deny
|
|
320
|
-
message: "Do not edit vendor/ directly. Use composer to manage dependencies."
|
|
321
|
-
locked: true
|
|
322
|
-
|
|
323
|
-
block-storage-framework:
|
|
324
|
-
trigger: PreToolUse
|
|
325
|
-
matcher: "Write|Edit"
|
|
326
|
-
file_pattern: "storage/framework/**"
|
|
327
|
-
decision: deny
|
|
328
|
-
message: "Do not edit storage/framework/ directly. These are generated cache files."
|
|
329
|
-
locked: true
|
|
330
|
-
|
|
331
|
-
postconditions:
|
|
332
|
-
# Cache clears after config/route/view changes
|
|
333
|
-
laravel-config-clear:
|
|
334
|
-
trigger: PostToolUse
|
|
335
|
-
matcher: "Write|Edit"
|
|
336
|
-
file_pattern: "config/**/*.php"
|
|
337
|
-
run: "php artisan config:clear"
|
|
338
|
-
timeout: 10000
|
|
339
|
-
block_on_failure: true
|
|
340
|
-
|
|
341
|
-
laravel-route-clear:
|
|
342
|
-
trigger: PostToolUse
|
|
343
|
-
matcher: "Write|Edit"
|
|
344
|
-
file_pattern: "routes/**/*.php"
|
|
345
|
-
run: "php artisan route:clear"
|
|
346
|
-
timeout: 10000
|
|
347
|
-
block_on_failure: true
|
|
348
|
-
|
|
349
|
-
laravel-view-clear:
|
|
350
|
-
trigger: PostToolUse
|
|
351
|
-
matcher: "Write|Edit"
|
|
352
|
-
file_pattern: "resources/views/**/*.blade.php"
|
|
353
|
-
run: "php artisan view:clear"
|
|
354
|
-
timeout: 10000
|
|
355
|
-
block_on_failure: true
|
|
356
|
-
|
|
357
|
-
# Migration check
|
|
358
|
-
migrate-after-migration:
|
|
359
|
-
trigger: PostToolUse
|
|
360
|
-
matcher: "Write|Edit"
|
|
361
|
-
file_pattern: "database/migrations/*.php"
|
|
362
|
-
run: "php artisan migrate --pretend"
|
|
363
|
-
timeout: 15000
|
|
364
|
-
block_on_failure: false
|
|
365
|
-
|
|
366
|
-
# Lint on save (if Pint or PHP-CS-Fixer detected)
|
|
367
|
-
laravel-lint:
|
|
368
|
-
trigger: PostToolUse
|
|
369
|
-
matcher: "Write|Edit"
|
|
370
|
-
file_pattern: "**/*.php"
|
|
371
|
-
run: "./vendor/bin/pint --test" # or php-cs-fixer fix --dry-run
|
|
372
|
-
timeout: 30000
|
|
373
|
-
block_on_failure: false
|
|
374
|
-
```
|
|
375
|
-
|
|
376
|
-
## Django
|
|
377
|
-
|
|
378
|
-
```yaml
|
|
379
|
-
permissions:
|
|
380
|
-
auto-approve-manage:
|
|
381
|
-
trigger: PermissionRequest
|
|
382
|
-
matcher: Bash
|
|
383
|
-
command_pattern: "python manage.py"
|
|
384
|
-
decision: allow
|
|
385
|
-
|
|
386
|
-
block-flush:
|
|
387
|
-
trigger: PreToolUse
|
|
388
|
-
matcher: Bash
|
|
389
|
-
command_pattern: "manage.py flush"
|
|
390
|
-
decision: deny
|
|
391
|
-
message: "manage.py flush deletes all data."
|
|
392
|
-
|
|
393
|
-
postconditions:
|
|
394
|
-
# Django system check
|
|
395
|
-
django-check:
|
|
396
|
-
trigger: PostToolUse
|
|
397
|
-
matcher: "Write|Edit"
|
|
398
|
-
file_pattern: "**/*.py"
|
|
399
|
-
run: "python manage.py check"
|
|
400
|
-
timeout: 15000
|
|
401
|
-
block_on_failure: true
|
|
402
|
-
|
|
403
|
-
# Migration check after model changes
|
|
404
|
-
django-migrations-check:
|
|
405
|
-
trigger: PostToolUse
|
|
406
|
-
matcher: "Write|Edit"
|
|
407
|
-
file_pattern: "**/models.py"
|
|
408
|
-
run: "python manage.py makemigrations --check --dry-run"
|
|
409
|
-
timeout: 15000
|
|
410
|
-
block_on_failure: false
|
|
411
|
-
|
|
412
|
-
makemigrations:
|
|
413
|
-
trigger: PostToolUse
|
|
414
|
-
matcher: "Write|Edit"
|
|
415
|
-
file_pattern: "**/models.py"
|
|
416
|
-
run: "python manage.py makemigrations"
|
|
417
|
-
timeout: 30000
|
|
418
|
-
block_on_failure: false
|
|
419
|
-
```
|
|
420
|
-
|
|
421
|
-
## FastAPI
|
|
422
|
-
|
|
423
|
-
```yaml
|
|
424
|
-
permissions:
|
|
425
|
-
auto-approve-uvicorn:
|
|
426
|
-
trigger: PermissionRequest
|
|
427
|
-
matcher: Bash
|
|
428
|
-
command_pattern: "uvicorn"
|
|
429
|
-
decision: allow
|
|
430
|
-
|
|
431
|
-
auto-approve-fastapi:
|
|
432
|
-
trigger: PermissionRequest
|
|
433
|
-
matcher: Bash
|
|
434
|
-
command_pattern: "fastapi"
|
|
435
|
-
decision: allow
|
|
436
|
-
|
|
437
|
-
preconditions:
|
|
438
|
-
warn-schema-changes:
|
|
439
|
-
trigger: PreToolUse
|
|
440
|
-
matcher: "Write|Edit"
|
|
441
|
-
file_pattern: "**/schemas.py"
|
|
442
|
-
message: "Schema changes may affect API contracts."
|
|
443
|
-
priority: 70
|
|
444
|
-
|
|
445
|
-
postconditions:
|
|
446
|
-
# Typecheck on save (use detected: mypy or pyright)
|
|
447
|
-
fastapi-typecheck:
|
|
448
|
-
trigger: PostToolUse
|
|
449
|
-
matcher: "Write|Edit"
|
|
450
|
-
file_pattern: "**/*.py"
|
|
451
|
-
run: "mypy ." # or pyright .
|
|
452
|
-
timeout: 30000
|
|
453
|
-
block_on_failure: true
|
|
454
|
-
```
|
|
455
|
-
|
|
456
|
-
## Rails
|
|
457
|
-
|
|
458
|
-
```yaml
|
|
459
|
-
permissions:
|
|
460
|
-
auto-approve-rails:
|
|
461
|
-
trigger: PermissionRequest
|
|
462
|
-
matcher: Bash
|
|
463
|
-
command_pattern: "rails"
|
|
464
|
-
decision: allow
|
|
465
|
-
|
|
466
|
-
block-db-drop:
|
|
467
|
-
trigger: PreToolUse
|
|
468
|
-
matcher: Bash
|
|
469
|
-
command_pattern: "rails db:drop"
|
|
470
|
-
decision: deny
|
|
471
|
-
message: "rails db:drop destroys the database."
|
|
472
|
-
|
|
473
|
-
postconditions:
|
|
474
|
-
db-migrate:
|
|
475
|
-
trigger: PostToolUse
|
|
476
|
-
matcher: "Write|Edit"
|
|
477
|
-
file_pattern: "db/migrate/*.rb"
|
|
478
|
-
run: "rails db:migrate"
|
|
479
|
-
timeout: 30000
|
|
480
|
-
block_on_failure: false
|
|
481
|
-
|
|
482
|
-
# Lint on save (if RuboCop detected)
|
|
483
|
-
rubocop-check:
|
|
484
|
-
trigger: PostToolUse
|
|
485
|
-
matcher: "Write|Edit"
|
|
486
|
-
file_pattern: "**/*.rb"
|
|
487
|
-
run: "rubocop --format quiet"
|
|
488
|
-
timeout: 30000
|
|
489
|
-
block_on_failure: false
|
|
490
|
-
```
|
|
491
|
-
|
|
492
|
-
## Prisma
|
|
493
|
-
|
|
494
|
-
```yaml
|
|
495
|
-
permissions:
|
|
496
|
-
auto-approve-prisma:
|
|
497
|
-
trigger: PermissionRequest
|
|
498
|
-
matcher: Bash
|
|
499
|
-
command_pattern: "prisma"
|
|
500
|
-
decision: allow
|
|
501
|
-
|
|
502
|
-
block-prisma-reset:
|
|
503
|
-
trigger: PreToolUse
|
|
504
|
-
matcher: Bash
|
|
505
|
-
command_pattern: "prisma migrate reset"
|
|
506
|
-
decision: deny
|
|
507
|
-
message: "prisma migrate reset is destructive. Use prisma migrate dev."
|
|
508
|
-
|
|
509
|
-
postconditions:
|
|
510
|
-
prisma-generate:
|
|
511
|
-
trigger: PostToolUse
|
|
512
|
-
matcher: "Write|Edit"
|
|
513
|
-
file_pattern: "prisma/schema.prisma"
|
|
514
|
-
run: "npx prisma generate"
|
|
515
|
-
timeout: 30000
|
|
516
|
-
block_on_failure: true
|
|
517
|
-
```
|
|
518
|
-
|
|
519
|
-
## Drizzle
|
|
520
|
-
|
|
521
|
-
```yaml
|
|
522
|
-
permissions:
|
|
523
|
-
auto-approve-drizzle:
|
|
524
|
-
trigger: PermissionRequest
|
|
525
|
-
matcher: Bash
|
|
526
|
-
command_pattern: "drizzle-kit"
|
|
527
|
-
decision: allow
|
|
528
|
-
|
|
529
|
-
postconditions:
|
|
530
|
-
drizzle-generate:
|
|
531
|
-
trigger: PostToolUse
|
|
532
|
-
matcher: "Write|Edit"
|
|
533
|
-
file_pattern: "**/schema.ts"
|
|
534
|
-
run: "npx drizzle-kit generate"
|
|
535
|
-
timeout: 30000
|
|
536
|
-
block_on_failure: false
|
|
537
|
-
```
|
|
538
|
-
|
|
539
|
-
## Vitest
|
|
540
|
-
|
|
541
|
-
```yaml
|
|
542
|
-
permissions:
|
|
543
|
-
auto-approve-vitest:
|
|
544
|
-
trigger: PermissionRequest
|
|
545
|
-
matcher: Bash
|
|
546
|
-
command_pattern: "vitest"
|
|
547
|
-
decision: allow
|
|
548
|
-
```
|
|
549
|
-
|
|
550
|
-
## Jest
|
|
551
|
-
|
|
552
|
-
```yaml
|
|
553
|
-
permissions:
|
|
554
|
-
auto-approve-jest:
|
|
555
|
-
trigger: PermissionRequest
|
|
556
|
-
matcher: Bash
|
|
557
|
-
command_pattern: "jest"
|
|
558
|
-
decision: allow
|
|
559
|
-
```
|
|
560
|
-
|
|
561
|
-
## ESLint
|
|
562
|
-
|
|
563
|
-
```yaml
|
|
564
|
-
permissions:
|
|
565
|
-
auto-approve-eslint:
|
|
566
|
-
trigger: PermissionRequest
|
|
567
|
-
matcher: Bash
|
|
568
|
-
command_pattern: "eslint"
|
|
569
|
-
decision: allow
|
|
570
|
-
|
|
571
|
-
postconditions:
|
|
572
|
-
eslint-on-save:
|
|
573
|
-
trigger: PostToolUse
|
|
574
|
-
matcher: "Write|Edit"
|
|
575
|
-
file_pattern: "**/*.{ts,tsx,js,jsx}"
|
|
576
|
-
run: "eslint --quiet {file_path}"
|
|
577
|
-
timeout: 15000
|
|
578
|
-
block_on_failure: false
|
|
579
|
-
```
|
|
580
|
-
|
|
581
|
-
## Prettier
|
|
582
|
-
|
|
583
|
-
```yaml
|
|
584
|
-
permissions:
|
|
585
|
-
auto-approve-prettier:
|
|
586
|
-
trigger: PermissionRequest
|
|
587
|
-
matcher: Bash
|
|
588
|
-
command_pattern: "prettier"
|
|
589
|
-
decision: allow
|
|
590
|
-
|
|
591
|
-
postconditions:
|
|
592
|
-
prettier-check-on-save:
|
|
593
|
-
trigger: PostToolUse
|
|
594
|
-
matcher: "Write|Edit"
|
|
595
|
-
file_pattern: "**/*.{ts,tsx,js,jsx,json,css,md}"
|
|
596
|
-
run: "prettier --check {file_path}"
|
|
597
|
-
timeout: 10000
|
|
598
|
-
block_on_failure: false
|
|
599
|
-
```
|
|
600
|
-
|
|
601
|
-
## Biome
|
|
602
|
-
|
|
603
|
-
```yaml
|
|
604
|
-
permissions:
|
|
605
|
-
auto-approve-biome:
|
|
606
|
-
trigger: PermissionRequest
|
|
607
|
-
matcher: Bash
|
|
608
|
-
command_pattern: "biome"
|
|
609
|
-
decision: allow
|
|
610
|
-
|
|
611
|
-
postconditions:
|
|
612
|
-
biome-check-on-save:
|
|
613
|
-
trigger: PostToolUse
|
|
614
|
-
matcher: "Write|Edit"
|
|
615
|
-
file_pattern: "**/*.{ts,tsx,js,jsx,json}"
|
|
616
|
-
run: "biome check {file_path}"
|
|
617
|
-
timeout: 15000
|
|
618
|
-
block_on_failure: false
|
|
619
|
-
```
|
|
620
|
-
|
|
621
|
-
## TypeScript (tsup/tsc)
|
|
622
|
-
|
|
623
|
-
```yaml
|
|
624
|
-
permissions:
|
|
625
|
-
auto-approve-tsc:
|
|
626
|
-
trigger: PermissionRequest
|
|
627
|
-
matcher: Bash
|
|
628
|
-
command_pattern: "tsc"
|
|
629
|
-
decision: allow
|
|
630
|
-
|
|
631
|
-
auto-approve-tsup:
|
|
632
|
-
trigger: PermissionRequest
|
|
633
|
-
matcher: Bash
|
|
634
|
-
command_pattern: "tsup"
|
|
635
|
-
decision: allow
|
|
636
|
-
|
|
637
|
-
postconditions:
|
|
638
|
-
typecheck-on-save:
|
|
639
|
-
trigger: PostToolUse
|
|
640
|
-
matcher: "Write|Edit"
|
|
641
|
-
file_pattern: "**/*.{ts,tsx}" # Detect extensions: add .vue if Vue SFC, .mts/.cts if used
|
|
642
|
-
run: "tsc --noEmit"
|
|
643
|
-
timeout: 30000
|
|
644
|
-
block_on_failure: true
|
|
645
|
-
```
|
|
646
|
-
|
|
647
|
-
## Vite
|
|
648
|
-
|
|
649
|
-
```yaml
|
|
650
|
-
permissions:
|
|
651
|
-
auto-approve-vite:
|
|
652
|
-
trigger: PermissionRequest
|
|
653
|
-
matcher: Bash
|
|
654
|
-
command_pattern: "vite"
|
|
655
|
-
decision: allow
|
|
656
|
-
|
|
657
|
-
preconditions:
|
|
658
|
-
warn-vite-config:
|
|
659
|
-
trigger: PreToolUse
|
|
660
|
-
matcher: "Write|Edit"
|
|
661
|
-
file_pattern: "vite.config.*"
|
|
662
|
-
message: "Vite config changes may require dev server restart."
|
|
663
|
-
priority: 60
|
|
664
|
-
```
|
|
665
|
-
|
|
666
|
-
## Turborepo (Monorepo)
|
|
667
|
-
|
|
668
|
-
When Turborepo is detected, the skill MUST map the full workspace topology (Step 2b in SKILL.md) and generate monorepo-aware rules. The rules below are templates — replace placeholders with actual package names and paths from the detected topology.
|
|
669
|
-
|
|
670
|
-
### Header — Workspace Topology Comment
|
|
671
|
-
|
|
672
|
-
Always include a topology diagram in the YAML header:
|
|
673
|
-
|
|
674
|
-
```yaml
|
|
675
|
-
# Workspace Topology:
|
|
676
|
-
# {app-package} → {lib-package} (one-way dependency)
|
|
677
|
-
# {standalone-package} (no internal deps)
|
|
678
|
-
#
|
|
679
|
-
# Task Graph (from turbo.json):
|
|
680
|
-
# build: depends on ^build
|
|
681
|
-
# type-check: depends on ^type-check
|
|
682
|
-
# lint: depends on ^lint
|
|
683
|
-
```
|
|
684
|
-
|
|
685
|
-
### Permissions
|
|
686
|
-
|
|
687
|
-
```yaml
|
|
688
|
-
permissions:
|
|
689
|
-
auto-approve-turbo:
|
|
690
|
-
trigger: PermissionRequest
|
|
691
|
-
matcher: Bash
|
|
692
|
-
command_pattern: "turbo"
|
|
693
|
-
decision: allow
|
|
694
|
-
|
|
695
|
-
# Build artifact protection
|
|
696
|
-
block-turbo-cache:
|
|
697
|
-
trigger: PreToolUse
|
|
698
|
-
matcher: "Write|Edit"
|
|
699
|
-
file_pattern: ".turbo/**"
|
|
700
|
-
decision: deny
|
|
701
|
-
message: "Do not edit .turbo/ cache. Run `turbo` to regenerate."
|
|
702
|
-
locked: true
|
|
703
|
-
```
|
|
704
|
-
|
|
705
|
-
### Preconditions — Package Boundary Enforcement
|
|
706
|
-
|
|
707
|
-
Generate one rule per dependency boundary. The `file_pattern` and `import_pattern` should reflect the actual package names.
|
|
708
|
-
|
|
709
|
-
```yaml
|
|
710
|
-
preconditions:
|
|
711
|
-
# Package boundary: {lib-package} must NOT import from {app-package}
|
|
712
|
-
# Generate one rule per forbidden import direction
|
|
713
|
-
no-{lib-short}-imports-{app-short}:
|
|
714
|
-
enabled: true
|
|
715
|
-
trigger: PreToolUse
|
|
716
|
-
matcher: "Write|Edit"
|
|
717
|
-
file_pattern: "{lib-package-path}/**"
|
|
718
|
-
message: "{lib-package} must not import from {app-package}. Dependency flows {app} → {lib}, never reverse."
|
|
719
|
-
priority: 80
|
|
720
|
-
|
|
721
|
-
# Prefer turbo over direct package manager for tasks defined in turbo.json
|
|
722
|
-
prefer-turbo-over-direct:
|
|
723
|
-
enabled: true
|
|
724
|
-
trigger: PreToolUse
|
|
725
|
-
matcher: Bash
|
|
726
|
-
command_pattern: "{package_manager} (build|lint|type-check|test)"
|
|
727
|
-
message: "Use `turbo run <task>` or `turbo run <task> --filter=<package>` instead of running {package_manager} directly for tasks defined in turbo.json."
|
|
728
|
-
priority: 70
|
|
729
|
-
|
|
730
|
-
# Critical config cautions
|
|
731
|
-
caution-turbo-config:
|
|
732
|
-
enabled: true
|
|
733
|
-
trigger: PreToolUse
|
|
734
|
-
matcher: "Write|Edit"
|
|
735
|
-
file_pattern: "turbo.json"
|
|
736
|
-
message: "turbo.json defines the task graph and caching for ALL packages. Changes affect the entire monorepo build pipeline."
|
|
737
|
-
priority: 90
|
|
738
|
-
|
|
739
|
-
caution-root-package-json:
|
|
740
|
-
enabled: true
|
|
741
|
-
trigger: PreToolUse
|
|
742
|
-
matcher: "Write|Edit"
|
|
743
|
-
file_pattern: "package.json"
|
|
744
|
-
message: "Root package.json defines workspace scripts and shared devDependencies. Changes affect all packages."
|
|
745
|
-
priority: 80
|
|
746
|
-
|
|
747
|
-
caution-workspace-config:
|
|
748
|
-
enabled: true
|
|
749
|
-
trigger: PreToolUse
|
|
750
|
-
matcher: "Write|Edit"
|
|
751
|
-
file_pattern: "pnpm-workspace.yaml" # or package.json workspaces field
|
|
752
|
-
message: "Workspace config defines which directories are packages. Changes affect monorepo structure."
|
|
753
|
-
priority: 90
|
|
754
|
-
```
|
|
755
|
-
|
|
756
|
-
### Preconditions — Project-Specific Critical Files
|
|
757
|
-
|
|
758
|
-
Generate caution rules for files identified as architecturally critical during topology mapping. Examples:
|
|
759
|
-
|
|
760
|
-
```yaml
|
|
761
|
-
# Barrel exports (index.ts files that re-export from a package)
|
|
762
|
-
caution-barrel-exports:
|
|
763
|
-
enabled: true
|
|
764
|
-
trigger: PreToolUse
|
|
765
|
-
matcher: "Write|Edit"
|
|
766
|
-
file_pattern: "{lib-package-path}/src/index.ts"
|
|
767
|
-
message: "Barrel export for {lib-package}. Adding/removing exports affects all consumers."
|
|
768
|
-
priority: 80
|
|
769
|
-
|
|
770
|
-
# Framework middleware, adapters, or other high-impact files
|
|
771
|
-
# Customize based on what you find during topology mapping
|
|
772
|
-
caution-{critical-file}:
|
|
773
|
-
enabled: true
|
|
774
|
-
trigger: PreToolUse
|
|
775
|
-
matcher: "Write|Edit"
|
|
776
|
-
file_pattern: "{path-to-critical-file}"
|
|
777
|
-
message: "{Explanation of why this file is critical}"
|
|
778
|
-
priority: 80
|
|
779
|
-
```
|
|
780
|
-
|
|
781
|
-
### Postconditions — Per-Package Type Checking
|
|
782
|
-
|
|
783
|
-
Generate one postcondition per package. Use `turbo run --filter=` to scope to the affected package.
|
|
784
|
-
|
|
785
|
-
```yaml
|
|
786
|
-
postconditions:
|
|
787
|
-
# Per-package type checking — one rule per workspace package
|
|
788
|
-
type-check-{package-short}-on-change:
|
|
789
|
-
enabled: false # postconditions disabled by default
|
|
790
|
-
trigger: PostToolUse
|
|
791
|
-
matcher: "Write|Edit"
|
|
792
|
-
file_pattern: "{package-path}/**/*.{ts,tsx}"
|
|
793
|
-
run: "turbo run type-check --filter={package-name}"
|
|
794
|
-
timeout: 30000
|
|
795
|
-
block_on_failure: true
|
|
796
|
-
|
|
797
|
-
# Example for a package with no build step (consumed as source):
|
|
798
|
-
# type-check-ui-on-change:
|
|
799
|
-
# file_pattern: "packages/ui/**/*.{ts,tsx}"
|
|
800
|
-
# run: "turbo run type-check --filter=@maya/ui"
|
|
801
|
-
|
|
802
|
-
# Example for an app package:
|
|
803
|
-
# type-check-web-on-change:
|
|
804
|
-
# file_pattern: "apps/web/**/*.{ts,tsx}"
|
|
805
|
-
# run: "turbo run type-check --filter=@maya/web"
|
|
806
|
-
```
|
|
807
|
-
|
|
808
|
-
### Pipelines — Use Turbo Directly
|
|
809
|
-
|
|
810
|
-
**IMPORTANT:** Every pipeline MUST include `on_failure`. It is a required field. Omitting it causes a validation error.
|
|
811
|
-
|
|
812
|
-
```yaml
|
|
813
|
-
pipelines:
|
|
814
|
-
pre-commit-checks:
|
|
815
|
-
enabled: true
|
|
816
|
-
trigger: "PreToolUse"
|
|
817
|
-
matcher: "Bash"
|
|
818
|
-
command_pattern: "git commit"
|
|
819
|
-
steps:
|
|
820
|
-
- name: "type-check"
|
|
821
|
-
run: "turbo run type-check"
|
|
822
|
-
timeout: 60000
|
|
823
|
-
- name: "lint"
|
|
824
|
-
run: "turbo run lint"
|
|
825
|
-
timeout: 60000
|
|
826
|
-
on_failure: "block" # REQUIRED — "block" or "warn"
|
|
827
|
-
message: "Pre-commit checks via turbo."
|
|
828
|
-
locked: true
|
|
829
|
-
priority: 5
|
|
830
|
-
|
|
831
|
-
full-check:
|
|
832
|
-
enabled: false
|
|
833
|
-
steps:
|
|
834
|
-
- run: "turbo run type-check"
|
|
835
|
-
label: "Type-check all packages"
|
|
836
|
-
timeout: 60000
|
|
837
|
-
- run: "turbo run lint"
|
|
838
|
-
label: "Lint all packages"
|
|
839
|
-
timeout: 60000
|
|
840
|
-
on_failure: "warn" # REQUIRED — "block" or "warn"
|
|
841
|
-
```
|
|
842
|
-
|
|
843
|
-
### What NOT to Generate for Turborepo
|
|
844
|
-
|
|
845
|
-
- **Do NOT use `pnpm build` / `pnpm lint` in postconditions** — use `turbo run <task> --filter=<pkg>` instead
|
|
846
|
-
- **Do NOT generate global `tsc --noEmit` postconditions** — each package has its own tsconfig; use turbo to respect the task graph
|
|
847
|
-
- **Do NOT omit the topology comment** — it documents the workspace structure for humans
|
|
848
|
-
- **Do NOT skip package boundary rules** — they prevent the most common monorepo mistake (reverse imports)
|
|
849
|
-
- **Do NOT auto-approve git push** — even in monorepos, pushes affect shared state
|