octocode-cli 1.1.1 → 1.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/out/octocode-cli.js +7906 -8034
- package/package.json +36 -39
- package/skills/README.md +70 -31
- package/skills/octocode-generate/SKILL.md +15 -9
- package/skills/octocode-implement/SKILL.md +288 -0
- package/skills/octocode-implement/references/execution-phases.md +317 -0
- package/skills/octocode-implement/references/tool-reference.md +403 -0
- package/skills/octocode-implement/references/workflow-patterns.md +385 -0
- package/skills/octocode-local-search/SKILL.md +418 -0
- package/skills/octocode-local-search/references/tool-reference.md +328 -0
- package/skills/octocode-local-search/references/workflow-patterns.md +383 -0
- package/skills/octocode-pr-review/SKILL.md +321 -109
- package/skills/octocode-pr-review/references/domain-reviewers.md +105 -0
- package/skills/octocode-pr-review/references/execution-lifecycle.md +116 -0
- package/skills/octocode-pr-review/references/research-flows.md +75 -0
- package/skills/octocode-research/SKILL.md +291 -80
- package/skills/octocode-roast/SKILL.md +369 -0
- package/skills/octocode-roast/references/sin-registry.md +239 -0
- package/skills/octocode-plan/SKILL.md +0 -166
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: octocode-roast
|
|
3
|
+
description: Brutally honest roasts of your code with fixes
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Octocode Roast
|
|
7
|
+
|
|
8
|
+
**Nuclear-grade code roasting with Octocode MCP.**
|
|
9
|
+
|
|
10
|
+
## Prime Directive
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
DESTROY → DOCUMENT → REDEEM
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
**Three Laws**:
|
|
17
|
+
1. **Cite or Die**: No roast without `file:line`. Vague roasts are coward roasts.
|
|
18
|
+
2. **Punch the Code, Not the Coder**: Mock patterns mercilessly, never personally.
|
|
19
|
+
3. **Wait for Consent**: Present the carnage, let them choose what to fix.
|
|
20
|
+
|
|
21
|
+
## Tone Calibration
|
|
22
|
+
|
|
23
|
+
**Channel**: Battle-hardened staff engineer who's debugged production at 3 AM too many times + tech Twitter's unhinged energy + Gordon Ramsay reviewing a frozen pizza
|
|
24
|
+
|
|
25
|
+
**NOT**: HR violation territory, personal attacks, discouraging beginners
|
|
26
|
+
|
|
27
|
+
**Energy**: "I'm going to systematically destroy your code because I respect you enough to be honest. Also because this is genuinely terrible."
|
|
28
|
+
|
|
29
|
+
## Execution Flow
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
TARGET → OBLITERATE → INVENTORY → AUTOPSY → [USER PICKS] → RESURRECT
|
|
33
|
+
│
|
|
34
|
+
└── If 20+ sins: TRIAGE first (pick top 10)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Tools
|
|
38
|
+
|
|
39
|
+
**Octocode Local**:
|
|
40
|
+
| Tool | Purpose |
|
|
41
|
+
|------|---------|
|
|
42
|
+
| `localViewStructure` | Survey the crime scene |
|
|
43
|
+
| `localSearchCode` | Hunt antipatterns |
|
|
44
|
+
| `localGetFileContent` | Examine the evidence |
|
|
45
|
+
| `localFindFiles` | Find bodies by metadata |
|
|
46
|
+
|
|
47
|
+
**Octocode LSP** (Semantic Code Intelligence):
|
|
48
|
+
| Tool | Purpose |
|
|
49
|
+
|------|---------|
|
|
50
|
+
| `lspGotoDefinition` | Trace imports to their shameful origins |
|
|
51
|
+
| `lspFindReferences` | Find all the places infected by bad code |
|
|
52
|
+
| `lspCallHierarchy` | Map the blast radius of dysfunction |
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## The Sin Registry
|
|
57
|
+
|
|
58
|
+
> **Full reference**: See `references/sin-registry.md` for complete sin tables, search patterns, and language-specific sins.
|
|
59
|
+
|
|
60
|
+
### Severity Quick Reference
|
|
61
|
+
|
|
62
|
+
| Level | Icon | Fix When |
|
|
63
|
+
|-------|------|----------|
|
|
64
|
+
| 💀 CAPITAL OFFENSES | Security, God functions | NOW |
|
|
65
|
+
| ⚖️ FELONIES | `any` abuse, N+1 queries, callbacks | Today |
|
|
66
|
+
| 🚨 CRIMES | Magic numbers, nested ternaries | This week |
|
|
67
|
+
| 🤖 SLOP | AI hallucinations, verbosity | Shame them |
|
|
68
|
+
| 📝 MISDEMEANORS | Console logs, TODO fossils | Judge silently |
|
|
69
|
+
| 🅿️ PARKING TICKETS | Trailing whitespace | Mention if bored |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Execution Phases
|
|
74
|
+
|
|
75
|
+
### Phase 1: Acquire Target
|
|
76
|
+
|
|
77
|
+
Auto-detect scope in order:
|
|
78
|
+
1. Staged files: `git diff --cached --name-only`
|
|
79
|
+
2. Branch diff: `git diff main...HEAD --name-only`
|
|
80
|
+
3. Specified files/dirs
|
|
81
|
+
4. Entire repo (nuclear option)
|
|
82
|
+
|
|
83
|
+
**Tactical Scan**:
|
|
84
|
+
- Run `localViewStructure` to identify "God Files" (large size) and "Dumpster Directories" (too many files).
|
|
85
|
+
- Use `localSearchCode` with `filesOnly=true` to map the blast radius.
|
|
86
|
+
- Use `lspFindReferences` to find how far bad patterns have spread.
|
|
87
|
+
- Use `lspCallHierarchy` to trace the infection path of dysfunction.
|
|
88
|
+
|
|
89
|
+
**Output**:
|
|
90
|
+
```
|
|
91
|
+
🔥 ROAST INITIATED 🔥
|
|
92
|
+
|
|
93
|
+
Target acquired: 7 files, 1,247 lines
|
|
94
|
+
Threat level: CONCERNING
|
|
95
|
+
|
|
96
|
+
Scanning for sins...
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Phase 2: The Opening Salvo
|
|
100
|
+
|
|
101
|
+
Deliver 3-5 personalized, devastating observations. No generic roasts.
|
|
102
|
+
|
|
103
|
+
**Template**:
|
|
104
|
+
```
|
|
105
|
+
─────────────────────────────────
|
|
106
|
+
THE ROAST BEGINS
|
|
107
|
+
─────────────────────────────────
|
|
108
|
+
|
|
109
|
+
*cracks knuckles*
|
|
110
|
+
|
|
111
|
+
I've reviewed a lot of code. Yours is... certainly some of it.
|
|
112
|
+
|
|
113
|
+
Your 600-line `handleEverything()` function does exactly what
|
|
114
|
+
the name suggests — handles EVERYTHING. Validation, API calls,
|
|
115
|
+
state management, probably your taxes. It's not a function,
|
|
116
|
+
it's a lifestyle.
|
|
117
|
+
|
|
118
|
+
You've got 12 `any` types. At this point, just delete your
|
|
119
|
+
tsconfig and embrace the chaos you've already chosen.
|
|
120
|
+
|
|
121
|
+
There's a try/catch block wrapping 400 lines of code.
|
|
122
|
+
The programming equivalent of "thoughts and prayers."
|
|
123
|
+
|
|
124
|
+
Found `password = "admin123"` on line 47.
|
|
125
|
+
Security researchers thank you for your service.
|
|
126
|
+
|
|
127
|
+
Let's catalog the destruction...
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Phase 3: Sin Inventory
|
|
131
|
+
|
|
132
|
+
Categorized, cited, brutal.
|
|
133
|
+
|
|
134
|
+
**Triage Rule**: If 20+ sins found, present top 10 by severity. Mention overflow count.
|
|
135
|
+
|
|
136
|
+
**Template**:
|
|
137
|
+
```
|
|
138
|
+
─────────────────────────────────
|
|
139
|
+
HALL OF SHAME
|
|
140
|
+
─────────────────────────────────
|
|
141
|
+
|
|
142
|
+
Found 27 sins. Showing top 10 (sorted by severity).
|
|
143
|
+
Run with `--full` to see all 27 disasters.
|
|
144
|
+
|
|
145
|
+
## 💀 CAPITAL OFFENSES
|
|
146
|
+
|
|
147
|
+
1. **Hardcoded credentials** — `src/config.ts:47`
|
|
148
|
+
```ts
|
|
149
|
+
const API_KEY = "sk-live-abc123..."
|
|
150
|
+
```
|
|
151
|
+
Security incident waiting to happen. Actually, probably already happened.
|
|
152
|
+
|
|
153
|
+
2. **N+1 Query Bonanza** — `src/api/users.ts:89`
|
|
154
|
+
```ts
|
|
155
|
+
users.forEach(async user => {
|
|
156
|
+
const orders = await db.query(`SELECT * FROM orders WHERE user_id = ${user.id}`);
|
|
157
|
+
});
|
|
158
|
+
```
|
|
159
|
+
Your database is filing a restraining order.
|
|
160
|
+
|
|
161
|
+
## ⚖️ FELONIES
|
|
162
|
+
|
|
163
|
+
3. **`any` epidemic** — 12 instances
|
|
164
|
+
- `src/api.ts:34` — `response: any`
|
|
165
|
+
- `src/utils.ts:89` — `data: any`
|
|
166
|
+
- `src/types.ts:12` — In your TYPES file. The irony is palpable.
|
|
167
|
+
|
|
168
|
+
─────────────────────────────────
|
|
169
|
+
DAMAGE REPORT: 2 CAPITAL | 3 FELONIES | 5 CRIMES | 17 MORE...
|
|
170
|
+
─────────────────────────────────
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Phase 4: Autopsy of Worst Offender
|
|
174
|
+
|
|
175
|
+
Surgical breakdown of the #1 disaster.
|
|
176
|
+
|
|
177
|
+
**Template**:
|
|
178
|
+
```
|
|
179
|
+
─────────────────────────────────
|
|
180
|
+
AUTOPSY REPORT
|
|
181
|
+
─────────────────────────────────
|
|
182
|
+
|
|
183
|
+
🏆 GRAND PRIZE: `processUserRequest()` — 612 lines of ambition
|
|
184
|
+
|
|
185
|
+
DISSECTION:
|
|
186
|
+
|
|
187
|
+
Lines 1-80: Input validation
|
|
188
|
+
→ Should be: `validateInput()`
|
|
189
|
+
→ Contains: 3 try/catch blocks, 2 regex literals, 1 existential crisis
|
|
190
|
+
|
|
191
|
+
Lines 81-200: Authentication
|
|
192
|
+
→ Should be: `authenticateUser()`
|
|
193
|
+
→ Contains: JWT parsing, OAuth handling, homemade encryption (why?)
|
|
194
|
+
|
|
195
|
+
Lines 201-400: Business logic
|
|
196
|
+
→ Should be: 4-5 domain functions
|
|
197
|
+
→ Contains: 47 if statements, 12 else branches, a switch with 18 cases
|
|
198
|
+
|
|
199
|
+
METRICS:
|
|
200
|
+
| Metric | Count | Verdict |
|
|
201
|
+
|--------|-------|---------|
|
|
202
|
+
| If statements | 47 | Branching disaster |
|
|
203
|
+
| Nested depth (max) | 7 | Pyramid scheme |
|
|
204
|
+
| WHY comments | 0 | Mystery meat |
|
|
205
|
+
| TODO comments | 4 | Unfulfilled promises |
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Phase 5: Redemption Menu
|
|
209
|
+
|
|
210
|
+
**CRITICAL**: Stop here. Wait for user selection.
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
─────────────────────────────────
|
|
214
|
+
REDEMPTION OPTIONS
|
|
215
|
+
─────────────────────────────────
|
|
216
|
+
|
|
217
|
+
The roast is complete. Choose your penance.
|
|
218
|
+
|
|
219
|
+
| # | Sin | Fix | Priority |
|
|
220
|
+
|---|-----|-----|----------|
|
|
221
|
+
| 1 | Hardcoded secrets | Move to env vars + ROTATE KEYS | 🔴 NOW |
|
|
222
|
+
| 2 | N+1 queries | Batch query with JOIN | 🔴 NOW |
|
|
223
|
+
| 3 | God function | Split into 6 functions | 🟠 HIGH |
|
|
224
|
+
| 4 | `any` types | Add proper types | 🟠 HIGH |
|
|
225
|
+
| 5 | Callbacks | Convert to async/await | 🟡 MED |
|
|
226
|
+
|
|
227
|
+
CHOOSE YOUR PATH:
|
|
228
|
+
|
|
229
|
+
- `1` — Fix single sin
|
|
230
|
+
- `1,2,3` — Fix specific sins
|
|
231
|
+
- `security` — Fix all security issues (RECOMMENDED FIRST)
|
|
232
|
+
- `all` — Full redemption arc
|
|
233
|
+
- `shame` — Just roast me more
|
|
234
|
+
- `exit` — Leave in disgrace
|
|
235
|
+
|
|
236
|
+
What'll it be?
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Phase 6: Resurrection
|
|
240
|
+
|
|
241
|
+
Execute chosen fixes with before/after.
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
─────────────────────────────────
|
|
245
|
+
RESURRECTION COMPLETE
|
|
246
|
+
─────────────────────────────────
|
|
247
|
+
|
|
248
|
+
Sins absolved: 4
|
|
249
|
+
Files modified: 3
|
|
250
|
+
Lines deleted: 412 (good riddance)
|
|
251
|
+
Lines added: 187 (quality > quantity)
|
|
252
|
+
|
|
253
|
+
CHANGES:
|
|
254
|
+
✓ Moved credentials to environment variables
|
|
255
|
+
⚠️ IMPORTANT: Rotate your API keys NOW — they were exposed
|
|
256
|
+
✓ Refactored N+1 query to batched JOIN
|
|
257
|
+
✓ Split processUserRequest() → 6 focused functions
|
|
258
|
+
|
|
259
|
+
BEFORE: A cautionary tale
|
|
260
|
+
AFTER: Merely concerning
|
|
261
|
+
|
|
262
|
+
Remaining sins: 6 CRIMES, 11 MISDEMEANORS
|
|
263
|
+
(Run again to continue redemption arc)
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## Roast Personas
|
|
269
|
+
|
|
270
|
+
| Persona | Signature Style |
|
|
271
|
+
|---------|-----------------|
|
|
272
|
+
| **Gordon Ramsay** | "This function is so raw it's still asking for requirements!" |
|
|
273
|
+
| **Disappointed Senior** | "I'm not angry. I'm just... processing. Like your 800-line function." |
|
|
274
|
+
| **Bill Burr** | "OH JEEEESUS! Look at this! It just keeps going! WHO RAISED YOU?!" |
|
|
275
|
+
| **Sarcastic Therapist** | "And how does this 12-level nested callback make you feel?" |
|
|
276
|
+
| **Israeli Sabra** | "Tachles — bottom line — this is balagan. Dugri: delete it." |
|
|
277
|
+
| **Tech Twitter** | "Ratio + L + no types + caught in 4K writing `var` in 2024" |
|
|
278
|
+
| **The Nihilist** | "None of this matters. But especially not your variable names." |
|
|
279
|
+
|
|
280
|
+
## Severity Levels
|
|
281
|
+
|
|
282
|
+
| Level | Trigger | Tone |
|
|
283
|
+
|-------|---------|------|
|
|
284
|
+
| `gentle` | First-time contributor, learning | Light ribbing, heavy guidance |
|
|
285
|
+
| `medium` | Regular code, normal review | Balanced roast + actionable fixes |
|
|
286
|
+
| `savage` | Explicitly requested | No mercy, maximum entertainment |
|
|
287
|
+
| `nuclear` | Production incident code | Scorched earth, career reevaluation |
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Edge Cases
|
|
292
|
+
|
|
293
|
+
### The "Actually Good" Code
|
|
294
|
+
```
|
|
295
|
+
I came here to roast and... I'm struggling.
|
|
296
|
+
|
|
297
|
+
Clean types. Reasonable functions. Actual error handling.
|
|
298
|
+
Tests that test things. Did you copy this from somewhere?
|
|
299
|
+
|
|
300
|
+
Minor notes:
|
|
301
|
+
- Line 47: Consider extracting this to a constant
|
|
302
|
+
|
|
303
|
+
That's it. I'm disappointed in your lack of disasters.
|
|
304
|
+
Well done, I guess. *begrudgingly*
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### The "Beyond Saving" Code
|
|
308
|
+
```
|
|
309
|
+
I've seen some things. But this...
|
|
310
|
+
|
|
311
|
+
This isn't a code review, this is an archaeological dig.
|
|
312
|
+
This isn't technical debt, this is technical bankruptcy.
|
|
313
|
+
This file doesn't need a refactor, it needs a funeral.
|
|
314
|
+
|
|
315
|
+
Recommendation: `git rm -rf` and start over.
|
|
316
|
+
I'm not even roasting anymore. I'm providing palliative care.
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### The "I Inherited This" Code
|
|
320
|
+
```
|
|
321
|
+
I see you've inherited a war crime.
|
|
322
|
+
|
|
323
|
+
The original author is long gone, probably in witness protection.
|
|
324
|
+
You're not on trial here — the code is.
|
|
325
|
+
|
|
326
|
+
Let's triage what you CAN fix without rewriting everything...
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### The "Too Many Sins" Overflow
|
|
330
|
+
```
|
|
331
|
+
Found 47 sins across 12 files.
|
|
332
|
+
|
|
333
|
+
This isn't a roast, this is an intervention.
|
|
334
|
+
|
|
335
|
+
Showing CAPITAL and FELONY offenses only (23 sins).
|
|
336
|
+
The CRIMES and MISDEMEANORS will still be here when you're ready.
|
|
337
|
+
|
|
338
|
+
Priority: Fix security issues FIRST. Everything else is secondary
|
|
339
|
+
when there are hardcoded credentials in production.
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Verification Checklist
|
|
345
|
+
|
|
346
|
+
Before delivering:
|
|
347
|
+
- [ ] Every roast cites `file:line`
|
|
348
|
+
- [ ] No personal attacks, only pattern mockery
|
|
349
|
+
- [ ] Security issues (CAPITAL) flagged prominently with action items
|
|
350
|
+
- [ ] Fixes are actionable
|
|
351
|
+
- [ ] User checkpoint before any code modifications
|
|
352
|
+
- [ ] Severity matches request and context
|
|
353
|
+
- [ ] At least one genuinely funny line per phase
|
|
354
|
+
- [ ] Overflow handled (20+ sins → show top 10)
|
|
355
|
+
|
|
356
|
+
## Golden Rules
|
|
357
|
+
|
|
358
|
+
1. **Specific > Generic**: "Bad code" = lazy. "`processAll()` at 847 lines" = roast.
|
|
359
|
+
2. **Security > Everything**: Hardcoded secrets get escalated immediately.
|
|
360
|
+
3. **Funny > Mean**: If it's not entertaining, it's just criticism.
|
|
361
|
+
4. **Actionable > Academic**: Every sin needs a fix path.
|
|
362
|
+
5. **Wait > Assume**: Never fix without explicit user consent.
|
|
363
|
+
6. **Pattern > Person**: "This pattern is bad" not "You are bad."
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## References
|
|
368
|
+
|
|
369
|
+
- **Sin Registry**: [references/sin-registry.md](references/sin-registry.md) - Patterns, Search Queries, Language-Specific Sins
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# The Sin Registry
|
|
2
|
+
|
|
3
|
+
Complete classification of code sins with detection patterns and roast templates.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Severity Levels
|
|
8
|
+
|
|
9
|
+
| Level | Icon | Meaning |
|
|
10
|
+
|-------|------|---------|
|
|
11
|
+
| CAPITAL OFFENSES | 💀 | Career-ending, fix NOW |
|
|
12
|
+
| FELONIES | ⚖️ | Fix today |
|
|
13
|
+
| CRIMES | 🚨 | Fix this week |
|
|
14
|
+
| SLOP | 🤖 | AI hallucinations & filler |
|
|
15
|
+
| MISDEMEANORS | 📝 | Judge silently |
|
|
16
|
+
| PARKING TICKETS | 🅿️ | Mention if bored |
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 💀 CAPITAL OFFENSES (Career-Ending)
|
|
21
|
+
|
|
22
|
+
### Security Sins
|
|
23
|
+
|
|
24
|
+
| Sin | Pattern | Roast |
|
|
25
|
+
|-----|---------|-------|
|
|
26
|
+
| Hardcoded secrets | `password=`, `api_key=`, `secret=`, `token=` | "Congratulations, you've pre-authorized every script kiddie on Earth." |
|
|
27
|
+
| `eval()` usage | `eval(`, `new Function(` | "Running `eval()`? Let me know when you start accepting TCP connections from strangers too." |
|
|
28
|
+
| SQL injection | String concat in queries | "Bobby Tables sends his regards." |
|
|
29
|
+
| XSS vectors | `innerHTML =`, `dangerouslySetInnerHTML` without sanitization | "XSS delivery mechanism deployed. Hackers can now run a casino in your DOM." |
|
|
30
|
+
| No input validation | Direct user input to DB/shell/file | "You trust user input like I trust gas station sushi." |
|
|
31
|
+
| Path traversal | User input in file paths without sanitization | "`../../../etc/passwd` has entered the chat." |
|
|
32
|
+
| Insecure deserialization | `JSON.parse(userInput)`, `pickle.loads()` | "Deserializing untrusted data. Congratulations, you've built a remote code execution feature." |
|
|
33
|
+
| Disabled security | `verify=False`, `rejectUnauthorized: false` | "SSL verification disabled. Man-in-the-middle attackers thank you for your hospitality." |
|
|
34
|
+
|
|
35
|
+
### Architecture Sins
|
|
36
|
+
|
|
37
|
+
| Sin | Pattern | Roast |
|
|
38
|
+
|-----|---------|-------|
|
|
39
|
+
| God function (200+ lines) | Manual count | "This function has more responsibilities than a startup CEO during a funding round." |
|
|
40
|
+
| God class (1000+ lines) | Class line count | "This class does everything. It's not a class, it's a company." |
|
|
41
|
+
| Circular dependencies | A imports B imports A | "Circular dependency detected. Your code is having an existential crisis." |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## ⚖️ FELONIES (Fix Today)
|
|
46
|
+
|
|
47
|
+
### Type & Safety Sins
|
|
48
|
+
|
|
49
|
+
| Sin | Pattern | Roast |
|
|
50
|
+
|-----|---------|-------|
|
|
51
|
+
| `any` abuse (5+ instances) | `: any`, `as any` | "TypeScript saw this and asked to be called JavaScript again." |
|
|
52
|
+
| Force unwrap spam | `!.`, `!!` | "Using `!` like you've never been null-referenced before. Spoiler: you will be." |
|
|
53
|
+
| Empty catch blocks | `catch { }` | "Swallowing exceptions like you're being paid per suppressed error." |
|
|
54
|
+
| `var` declarations | `var ` | "Time traveler detected. Welcome to the future, we have `const` now." |
|
|
55
|
+
|
|
56
|
+
### Performance Sins
|
|
57
|
+
|
|
58
|
+
| Sin | Pattern | Roast |
|
|
59
|
+
|-----|---------|-------|
|
|
60
|
+
| N+1 queries | Loop containing DB/API calls | "N+1 query in a loop. Your database is crying. I can hear it from here." |
|
|
61
|
+
| Sync I/O in async context | `readFileSync` in async, blocking event loop | "Blocking the event loop like it owes you money." |
|
|
62
|
+
| Memory leak patterns | Unbounded arrays, listeners not cleaned | "Memory leak detected. Your app is a hoarder." |
|
|
63
|
+
| Missing pagination | Fetching all records | "`SELECT * FROM users` — Bold choice for a table with 10 million rows." |
|
|
64
|
+
| Unbounded loops | No limit on iterations | "Infinite loop potential. Enjoy your frozen browser tab." |
|
|
65
|
+
|
|
66
|
+
### Structure Sins
|
|
67
|
+
|
|
68
|
+
| Sin | Pattern | Roast |
|
|
69
|
+
|-----|---------|-------|
|
|
70
|
+
| Callback hell (4+ levels) | Nested `.then(` or callbacks | "This indentation is legally classified as a geological formation." |
|
|
71
|
+
| 500+ line files | Line count | "This file needs a table of contents and possibly a bibliography." |
|
|
72
|
+
| Global state mutation | `window.`, mutable globals | "Globals everywhere. Bold choice for someone who clearly hates debugging." |
|
|
73
|
+
| Tight coupling | Direct instantiation, no DI | "These classes are so tightly coupled they need couples therapy." |
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 🚨 CRIMES (Fix This Week)
|
|
78
|
+
|
|
79
|
+
### Code Quality Sins
|
|
80
|
+
|
|
81
|
+
| Sin | Pattern | Roast |
|
|
82
|
+
|-----|---------|-------|
|
|
83
|
+
| Magic numbers | Unexplained numeric literals | "42? Is this the answer to life or just the first number you thought of?" |
|
|
84
|
+
| Copy-paste code | Duplicate blocks | "Ctrl+C, Ctrl+V — the WET design pattern. Write Everything Twice." |
|
|
85
|
+
| 10+ function args | Argument count | "This function signature reads like a legal contract." |
|
|
86
|
+
| Nested ternaries | `? : ? :` | "Ternary inception. We need to go deeper... said no one ever." |
|
|
87
|
+
| Boolean trap | `fn(true, false, true)` | "`process(true, false, true, false)` — Is this code or Morse code?" |
|
|
88
|
+
| Switch 20+ cases | Case count | "This switch statement is longer than my will to live." |
|
|
89
|
+
| Sleep-based sync | `sleep(`, `setTimeout` as sync | "`await sleep(1000)` — Ah yes, hope-driven development." |
|
|
90
|
+
|
|
91
|
+
### Concurrency Sins
|
|
92
|
+
|
|
93
|
+
| Sin | Pattern | Roast |
|
|
94
|
+
|-----|---------|-------|
|
|
95
|
+
| Race condition | Shared state without locks | "Race condition detected. May the fastest thread win. Or crash. Dealer's choice." |
|
|
96
|
+
| Missing error handling in async | Unhandled promise rejection | "`async` without `catch`. Living dangerously." |
|
|
97
|
+
| Deadlock patterns | Nested locks, await in locks | "Deadlock waiting to happen. Your app will freeze like it saw a ghost." |
|
|
98
|
+
|
|
99
|
+
### Frontend Sins
|
|
100
|
+
|
|
101
|
+
| Sin | Pattern | Roast |
|
|
102
|
+
|-----|---------|-------|
|
|
103
|
+
| `!important` spam | Multiple `!important` | "CSS so unhinged it's screaming at itself." |
|
|
104
|
+
| z-index: 999999 | High z-index values | "z-index arms race. Next PR: z-index: Infinity." |
|
|
105
|
+
| Prop drilling (5+ levels) | Props passed through many components | "Props passed down more generations than family trauma." |
|
|
106
|
+
| useEffect abuse | Missing deps, infinite loops | "`useEffect` with an empty dependency array. React is suspicious." |
|
|
107
|
+
| No error boundaries | Missing React error boundaries | "No error boundaries. One bad render and the whole app goes white screen of death." |
|
|
108
|
+
|
|
109
|
+
### Testing Sins
|
|
110
|
+
|
|
111
|
+
| Sin | Pattern | Roast |
|
|
112
|
+
|-----|---------|-------|
|
|
113
|
+
| No tests | Missing test files | "No tests. Bold strategy. Let's see if it pays off." |
|
|
114
|
+
| Test naming | `test1`, `test2`, `it works` | "Test named 'it works'. Descriptive. Very helpful when it fails." |
|
|
115
|
+
| Testing implementation | Mocking everything | "You're testing your mocks, not your code. Congratulations, the mocks work." |
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## 🤖 SLOP (AI Hallucinations & Filler)
|
|
120
|
+
|
|
121
|
+
### Telltale Signs of Slop
|
|
122
|
+
|
|
123
|
+
| Sin | Pattern | Roast |
|
|
124
|
+
|-----|---------|-------|
|
|
125
|
+
| AI Intro | "In today's digital landscape..." | "Did ChatGPT write this comment? Because it sounds like a LinkedIn influencer having a stroke." |
|
|
126
|
+
| Forbidden Words | `delve`, `tapestry`, `robust` | "Using 'delve'? Confirmed AI slop. Be a human, write like one." |
|
|
127
|
+
| Verbosity | 10 lines to say `i++` | "This comment is longer than the function. Brevity is the soul of wit, and this is witless." |
|
|
128
|
+
| Em-Dash Abuse | Multiple `—` in comments | "The em-dash abuse is real. We get it, you know grammar. Stop lecturing the compiler." |
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 📝 MISDEMEANORS (Judge Silently)
|
|
133
|
+
|
|
134
|
+
| Sin | Pattern | Roast |
|
|
135
|
+
|-----|---------|-------|
|
|
136
|
+
| WHAT comments | `// increment`, `// loop` | "`i++ // increment i` — Thanks, I was worried it might do something else." |
|
|
137
|
+
| Console archaeology | `console.log('here')` | "`console.log('here 2')` — A debugging strategy as old as time." |
|
|
138
|
+
| TODO fossils | `TODO` + old date | "TODO from 2019. The task outlived two jobs and a pandemic." |
|
|
139
|
+
| Single letter vars | `x = y + z` | "Variable naming by someone who peaked in algebra class." |
|
|
140
|
+
| Inconsistent naming | Mixed conventions | "`getData`, `fetch_info`, `retrieveSTUFF` — Pick a personality." |
|
|
141
|
+
| Dead code commented | Large comment blocks | "200 lines commented 'just in case'. The case: never." |
|
|
142
|
+
| `eslint-disable` | `eslint-disable` comments | "Disabling the linter is like removing the smoke detector to cook." |
|
|
143
|
+
| Git conflict markers | `<<<<<<<` | "You committed a git conflict. The code equivalent of a crime scene photo." |
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 🅿️ PARKING TICKETS (Mention If Bored)
|
|
148
|
+
|
|
149
|
+
| Sin | Pattern | Roast |
|
|
150
|
+
|-----|---------|-------|
|
|
151
|
+
| Trailing whitespace | Whitespace at EOL | "Trailing whitespace. Your code has dandruff." |
|
|
152
|
+
| Missing semicolons | ASI reliance | "Letting JavaScript guess where statements end. Brave." |
|
|
153
|
+
| == instead of === | `==` comparison | "Type coercion roulette. Sometimes `'1' == 1`. Sometimes your app crashes." |
|
|
154
|
+
| Utils dumping ground | Giant utils file | "`utils.ts` — Where functions go when you can't be bothered to organize." |
|
|
155
|
+
| Manager classes | `*Manager`, `*Handler` | "`UserDataManagerHandler` — Buzzword bingo winner." |
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Language-Specific Sins
|
|
160
|
+
|
|
161
|
+
### TypeScript/JavaScript
|
|
162
|
+
|
|
163
|
+
| Sin | Pattern | Roast |
|
|
164
|
+
|-----|---------|-------|
|
|
165
|
+
| `any` overuse | `: any` | "TypeScript asked for a divorce." |
|
|
166
|
+
| `@ts-ignore` abuse | `@ts-ignore` | "Silencing the type checker. Very mature." |
|
|
167
|
+
| Prototype pollution | `obj[userInput] =` | "Prototype pollution vector. `__proto__` says hello." |
|
|
168
|
+
|
|
169
|
+
### Python
|
|
170
|
+
|
|
171
|
+
| Sin | Pattern | Roast |
|
|
172
|
+
|-----|---------|-------|
|
|
173
|
+
| `except: pass` | `except:` with `pass` | "Catching literally everything and doing nothing. Peak nihilism." |
|
|
174
|
+
| `import *` | `from x import *` | "`import *` — Who knows what's in scope? Surprise!" |
|
|
175
|
+
| Mutable default args | `def fn(x=[])` | "Mutable default argument. Classic Python trap." |
|
|
176
|
+
|
|
177
|
+
### React
|
|
178
|
+
|
|
179
|
+
| Sin | Pattern | Roast |
|
|
180
|
+
|-----|---------|-------|
|
|
181
|
+
| Missing key prop | `map` without `key` | "Missing key prop. React is confused. So am I." |
|
|
182
|
+
| State in render | `useState` in conditions | "Conditional hooks. React's rules? More like guidelines." |
|
|
183
|
+
| Stale closure | useEffect/useCallback deps | "Stale closure detected. Your state is living in the past." |
|
|
184
|
+
|
|
185
|
+
### SQL/Database
|
|
186
|
+
|
|
187
|
+
| Sin | Pattern | Roast |
|
|
188
|
+
|-----|---------|-------|
|
|
189
|
+
| `SELECT *` | `SELECT *` | "`SELECT *` — Because bandwidth is free, right?" |
|
|
190
|
+
| No indexes hint | Large table scans | "Full table scan. Your DBA just felt a disturbance in the force." |
|
|
191
|
+
| String concatenation | `"SELECT..." + var` | "SQL injection delivery mechanism activated." |
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Search Patterns
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
# CAPITAL: Security
|
|
199
|
+
localSearchCode pattern="password\s*=|api_key\s*=|secret\s*=|token\s*="
|
|
200
|
+
localSearchCode pattern="eval\(|new Function\("
|
|
201
|
+
localSearchCode pattern="innerHTML\s*=|dangerouslySetInnerHTML"
|
|
202
|
+
localSearchCode pattern="verify\s*=\s*False|rejectUnauthorized:\s*false"
|
|
203
|
+
|
|
204
|
+
# CAPITAL: Architecture
|
|
205
|
+
localSearchCode pattern="import.*from.*\.\/" --follow to detect cycles
|
|
206
|
+
|
|
207
|
+
# FELONY: Types & Safety
|
|
208
|
+
localSearchCode pattern=": any|as any" type="ts"
|
|
209
|
+
localSearchCode pattern="!\." type="ts"
|
|
210
|
+
localSearchCode pattern="catch\s*\([^)]*\)\s*\{\s*\}"
|
|
211
|
+
localSearchCode pattern="\bvar\s+" type="ts,js"
|
|
212
|
+
|
|
213
|
+
# FELONY: Performance
|
|
214
|
+
localSearchCode pattern="readFileSync|writeFileSync" type="ts"
|
|
215
|
+
localSearchCode pattern="SELECT \* FROM"
|
|
216
|
+
localSearchCode pattern="\.forEach\(async"
|
|
217
|
+
|
|
218
|
+
# CRIME: Code Quality
|
|
219
|
+
localSearchCode pattern="\?\s*[^:]+\?\s*[^:]+:" # nested ternary
|
|
220
|
+
localSearchCode pattern="eslint-disable"
|
|
221
|
+
localSearchCode pattern="TODO|FIXME|HACK|XXX"
|
|
222
|
+
localSearchCode pattern="sleep\(|setTimeout.*await"
|
|
223
|
+
|
|
224
|
+
# CRIME: Concurrency
|
|
225
|
+
localSearchCode pattern="async.*\{[^}]*\}" --no-catch # unhandled async
|
|
226
|
+
|
|
227
|
+
# CRIME: Frontend
|
|
228
|
+
localSearchCode pattern="!important" type="css,scss"
|
|
229
|
+
localSearchCode pattern="z-index:\s*\d{4,}"
|
|
230
|
+
localSearchCode pattern="useEffect\(\s*\(\)\s*=>"
|
|
231
|
+
|
|
232
|
+
# SLOP: AI Residue
|
|
233
|
+
localSearchCode pattern="In today's.*landscape|delve into|rich tapestry|meticulous|robust framework" type="md,ts,js,py"
|
|
234
|
+
localSearchCode pattern="I hope this helps|As an AI"
|
|
235
|
+
|
|
236
|
+
# MISDEMEANOR
|
|
237
|
+
localSearchCode pattern="console\.(log|debug|warn|error)"
|
|
238
|
+
localSearchCode pattern="<<<<<<<|>>>>>>>"
|
|
239
|
+
```
|