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.
Scanned 5/27/2026
Install via CLI
openskills install benmarte/autoimprove---
description: 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.
---
# 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:
```bash
# 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 run` or `go 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 .` or `pyright` (if configured)
- Test: `pytest` or `python -m pytest`
- Lint: `ruff check .` or `flake8 .` or `pylint src/`
- Format check: `ruff format --check .` or `black --check .`
**JavaScript / TypeScript (Node)**
- Type check: `npx tsc --noEmit` (if tsconfig exists)
- Test: detect from package.json scripts (`test`, `vitest`, `jest`)
- Lint: `npx eslint .` or `npm 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 rspec` or `bundle exec rake test`
- Lint: `bundle exec rubocop`
**Java / Kotlin**
- Type check / build: `mvn compile` or `./gradlew compileKotlin`
- Test: `mvn test` or `./gradlew test`
- Lint: `./gradlew ktlintCheck` or 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 build` targets
## 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:
```bash
mkdir -p .claude/autoimprove
```
```markdown
# .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.
No comments yet. Be the first to comment!