Detect stack
Autonomous codebase improvement loop for Claude Code
npx -y skills add benmarte/autoimprove --skill detect-stackAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Automatically detect the language, framework, package manager, test runner, linter, and build tool used in the current project. Produces an .claude/autoimprove/config.md file that the improve loop uses as its measurement suite. Run this once before starting the improve loop in a new project.
SKILL.md
5.9 KB, as published. Nobody here has run it
Detect Stack Skill
Analyse the project root and produce a .claude/autoimprove/config.md that configures the measurement suite for this specific codebase.
Step 1 — Fingerprint the project
Run these checks to identify the stack:
# Language detection
ls *.go go.mod 2>/dev/null && echo "LANG=go"
ls *.rs Cargo.toml 2>/dev/null && echo "LANG=rust"
ls *.py pyproject.toml setup.py requirements.txt 2>/dev/null && echo "LANG=python"
ls package.json 2>/dev/null && echo "LANG=js"
ls *.java pom.xml build.gradle 2>/dev/null && echo "LANG=java"
ls *.rb Gemfile 2>/dev/null && echo "LANG=ruby"
ls *.php composer.json 2>/dev/null && echo "LANG=php"
ls *.cs *.csproj 2>/dev/null && echo "LANG=csharp"
ls *.swift Package.swift 2>/dev/null && echo "LANG=swift"
ls *.kt *.kts 2>/dev/null && echo "LANG=kotlin"
# Framework detection (JS)
cat package.json 2>/dev/null | grep -E '"next"|"nuxt"|"remix"|"astro"|"svelte"|"react"|"vue"'
# Package manager
ls yarn.lock 2>/dev/null && echo "PKG=yarn"
ls pnpm-lock.yaml 2>/dev/null && echo "PKG=pnpm"
ls bun.lockb 2>/dev/null && echo "PKG=bun"
ls package-lock.json 2>/dev/null && echo "PKG=npm"
ls Pipfile 2>/dev/null && echo "PKG=pipenv"
ls poetry.lock 2>/dev/null && echo "PKG=poetry"
ls Cargo.lock 2>/dev/null && echo "PKG=cargo"
# Test runner
cat package.json 2>/dev/null | grep -E '"jest"|"vitest"|"mocha"|"playwright"|"cypress"'
ls pytest.ini pyproject.toml 2>/dev/null | xargs grep -l "pytest" 2>/dev/null
ls *_test.go 2>/dev/null && echo "TEST=go test"
# Linter
ls .eslintrc* eslint.config* 2>/dev/null && echo "LINT=eslint"
ls .golangci.yml .golangci.yaml 2>/dev/null && echo "LINT=golangci-lint"
ls .rubocop.yml 2>/dev/null && echo "LINT=rubocop"
cat pyproject.toml 2>/dev/null | grep -E "ruff|flake8|pylint"
ls Makefile 2>/dev/null && grep -E "lint|check|fmt" Makefile
# Type checker
cat package.json 2>/dev/null | grep '"typescript"'
ls mypy.ini .mypy.ini 2>/dev/null && echo "TYPES=mypy"
cat pyproject.toml 2>/dev/null | grep -E "mypy|pyright"
Step 2 — Build the measurement suite
Based on what you find, map to these commands:
Language → Commands Reference
Go
- Type check:
go build ./... - Test:
go test ./... - Lint:
golangci-lint runorgo vet ./... - Format check:
gofmt -l . | wc -l(unformatted files)
Rust
- Type check:
cargo check - Test:
cargo test - Lint:
cargo clippy -- -D warnings - Format check:
cargo fmt --check
Python
- Type check:
mypy .orpyright(if configured) - Test:
pytestorpython -m pytest - Lint:
ruff check .orflake8 .orpylint src/ - Format check:
ruff format --check .orblack --check .
JavaScript / TypeScript (Node)
- Type check:
npx tsc --noEmit(if tsconfig exists) - Test: detect from package.json scripts (
test,vitest,jest) - Lint:
npx eslint .ornpm run lint - Build:
npm run build/yarn build/pnpm build
Next.js / Nuxt / Remix / Astro
- Same as JS/TS + framework build command
- Bundle size: check build output for size warnings
Ruby
- Type check:
srb tc(if Sorbet configured) - Test:
bundle exec rspecorbundle exec rake test - Lint:
bundle exec rubocop
Java / Kotlin
- Type check / build:
mvn compileor./gradlew compileKotlin - Test:
mvn testor./gradlew test - Lint:
./gradlew ktlintCheckor Checkstyle
C# / .NET
- Type check / build:
dotnet build - Test:
dotnet test - Lint:
dotnet format --verify-no-changes
PHP
- Type check:
./vendor/bin/phpstan analyse - Test:
./vendor/bin/phpunit - Lint:
./vendor/bin/phpcs
Swift
- Build:
swift build - Test:
swift test - Lint:
swiftlint
Makefile / custom
- Look for
make test,make lint,make check,make buildtargets
Step 3 — Assign weights
Use this scoring framework regardless of language:
| Metric | Weight | Notes |
|---|---|---|
| Type errors / compile errors | 40 pts | Must compile cleanly. Errors × penalty. |
| Build / compile success | 20 pts | Binary/artifact builds without error |
| Test suite pass rate | 30 pts | (passing / total) × 30 |
| Lint / style errors | 10 pts | Errors × penalty, capped at 0 |
If a metric doesn't apply (e.g. no tests yet, no linter configured), redistribute its weight equally to the others and note it.
Step 4 — Write .claude/autoimprove/config.md
Create the directory and config file:
mkdir -p .claude/autoimprove
# .claude/autoimprove/config.md
<!-- Auto-generated by /autoimprove:setup — edit to customise -->
## Stack
- Language: [detected]
- Framework: [detected or none]
- Package manager: [detected]
## Measurement Commands
### Type Check (40 pts)
\`\`\`bash
[command]
\`\`\`
Error pattern: [regex or grep to count errors]
Penalty: [X] pts per error
### Build (20 pts)
\`\`\`bash
[command]
\`\`\`
Success pattern: [what exit code / output means success]
### Tests (30 pts)
\`\`\`bash
[command]
\`\`\`
Parse pattern: [how to extract pass/fail counts]
### Lint (10 pts)
\`\`\`bash
[command]
\`\`\`
Error pattern: [regex or grep to count errors]
Penalty: [X] pts per error
## Improvement Areas
[list 5-8 language-specific improvement areas based on the detected stack]
## Files to Never Modify
[list lock files, generated files, migration files, .env, etc.]
Step 5 — Confirm with user
Print a summary:
✅ Stack detected: [language] / [framework]
📦 Package manager: [pm]
🧪 Test runner: [runner]
🔍 Linter: [linter]
📐 Type checker: [checker]
Measurement suite written to .claude/autoimprove/config.md.
Run /autoimprove:measure to check your baseline score.
If any tool is missing or not configured, suggest the most popular option for that language and offer to help set it up.