deslop
deslop
Clean AI slop from code with certainty-based findings and auto-fixes.
Parse Arguments
const args = '$ARGUMENTS'.split(' ').filter(Boolean);
const mode = args.find(a => ['report', 'apply'].includes(a)) || 'report';
const scope = args.find(a => a.startsWith('--scope='))?.split('=')[1] || 'all';
const thoroughness = args.find(a => a.startsWith('--thoroughness='))?.split('=')[1] || 'normal';
Input
Arguments: [report|apply] [--scope=<path>|all|diff] [--thoroughness=quick|normal|deep]
- Mode:
report(default) orapply - Scope: What to scan
all(default): Entire codebasediff: Only files changed in current branch<path>: Specific directory or file
- Thoroughness: Analysis depth (default:
normal)quick: Regex patterns onlynormal: + multi-pass analyzersdeep: + CLI tools (jscpd, madge) if available
Detection Pipeline
Phase 1: Run Detection Script
The detection script is at ../../scripts/detect.js relative to this skill.
Run detection (use relative path from skill directory):
# Scripts are at plugin root: ../../scripts/ from skills/deslop/
node ../../scripts/detect.js . --thoroughness normal --compact --max 50
For diff scope (only changed files):
BASE=$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@' || echo "main")
# Use newline-separated list to safely handle filenames with special chars
git diff --name-only origin/${BASE}..HEAD | \
xargs -d '\n' node ../../scripts/detect.js --thoroughness normal --compact
Note: The relative path ../../scripts/detect.js navigates from skills/deslop/ up to the plugin root where scripts/ lives.
Phase 2: Repo-Map Enhancement (Optional)
If repo-map exists, enhance detection with AST-based analysis:
// Use relative path from skill directory to plugin lib
// Path: skills/deslop/ -> ../../lib/repo-map
const repoMap = require('../../lib/repo-map');
if (repoMap.exists(basePath)) {
const map = repoMap.load(basePath);
const usageIndex = repoMap.buildUsageIndex(map);
// Find orphaned infrastructure with HIGH certainty
const orphaned = repoMap.findOrphanedInfrastructure(map, usageIndex);
for (const item of orphaned) {
findings.push({
file: item.file,
line: item.line,
pattern: 'orphaned-infrastructure',
message: `${item.name} (${item.type}) is never used`,
certainty: 'HIGH',
severity: 'high',
autoFix: false
});
}
// Find unused exports
const unusedExports = repoMap.findUnusedExports(map, usageIndex);
for (const item of unusedExports) {
findings.push({
file: item.file,
line: item.line,
pattern: 'unused-export',
message: `Export '${item.name}' is never imported`,
certainty: item.certainty,
severity: 'medium',
autoFix: false
});
}
}
Phase 3: Aggregate and Prioritize
Sort findings by:
- Certainty: HIGH before MEDIUM before LOW
- Severity: high before medium before low
- Fix complexity: auto-fixable before manual
Phase 4: Return Structured Results
Skill returns structured JSON - does NOT apply fixes (orchestrator handles that).
Output Format
JSON structure between markers:
=== DESLOP_RESULT ===
{
"mode": "report|apply",
"scope": "all|diff|path",
"filesScanned": N,
"findings": [
{
"file": "src/api.js",
"line": 42,
"pattern": "debug-statement",
"message": "console.log found",
"certainty": "HIGH",
"severity": "medium",
"autoFix": true,
"fixType": "remove-line"
}
],
"fixes": [
{
"file": "src/api.js",
"line": 42,
"fixType": "remove-line",
"pattern": "debug-statement"
}
],
"summary": {
"high": N,
"medium": N,
"low": N,
"autoFixable": N
}
}
=== END_RESULT ===
Certainty Levels
| Level | Meaning | Action |
|---|---|---|
| HIGH | Definitely slop, safe to auto-fix | Auto-fix via simple-fixer |
| MEDIUM | Likely slop, needs verification | Review first |
| LOW | Possible slop, context-dependent | Flag only |
Pattern Categories
HIGH Certainty (Auto-Fixable)
debug-statement: console.log, console.debug, print, println!debug-import: Unused debug/logging importsplaceholder-text: "Lorem ipsum", "TODO: implement"empty-catch: Empty catch blocks without commenttrailing-whitespace: Trailing whitespacemixed-indentation: Mixed tabs/spaces
MEDIUM Certainty (Review Required)
excessive-comments: Comment/code ratio > 2:1doc-code-ratio: JSDoc > 3x function bodystub-function: Returns placeholder value onlydead-code: Unreachable after return/throwinfrastructure-without-impl: DB clients created but never used
LOW Certainty (Flag Only)
over-engineering: File/export ratio > 20xbuzzword-inflation: Claims without evidenceshotgun-surgery: Files frequently change together
Fix Types
| Fix Type | Action | Patterns |
|---|---|---|
remove-line |
Delete line | debug-statement, debug-import |
add-comment |
Add explanation | empty-catch |
remove-block |
Delete code block | stub-function with TODO |
Error Handling
- Git not available: Skip git-dependent checks
- Invalid scope: Return error in JSON
- Parse errors: Skip file, continue scan
Integration
This skill is invoked by:
deslop-agentfor/deslopcommand/next-taskPhase 8 (pre-review gates) withscope=diff
The orchestrator spawns simple-fixer to apply HIGH certainty fixes.
More from agent-sh/agentsys
debate
Structured AI debate templates and synthesis. Use when orchestrating multi-round debates between AI tools, 'debate topic', 'argue about', 'stress test idea', 'devil advocate'.
10discover-tasks
Use when user asks to \"discover tasks\", \"find next task\", \"prioritize issues\", \"what should I work on\", or \"list open issues\". Discovers and ranks tasks from GitHub, GitLab, local files, and custom sources.
9learn
Research any topic online and create learning guides. Use when user asks to 'learn about', 'research topic', 'create learning guide', 'build knowledge base', or 'study subject'.
9perf-benchmarker
Use when running performance benchmarks, establishing baselines, or validating regressions with sequential runs. Enforces 60s minimum runs (30s only for binary search) and no parallel benchmarks.
9web-browse
Browse and interact with web pages headlessly. Use when agent needs to navigate websites, click elements, fill forms, read content, or take screenshots.
9perf-baseline-manager
Use when managing perf baselines, consolidating results, or comparing versions. Ensures one baseline JSON per version.
8