Skip to content
Back to skills

Detect Stack

ASecurity

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.

  • 5 stars
  • 0 votes
  • 0 copies
  • 5 views
  • Added May 26, 2026
toolsjavascripttypescriptpythonrustgojavarubyphpswiftkotlin

Works with

  • cli

Security analysis

A100/100

Scanned May 27, 2026

npx -y skills add benmarte/autoimprove --skill detect-stack --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Detect Stack?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Detect Stack
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/benmarte-detect-stack/badge)](https://www.skillsdirectory.com/skills/benmarte-detect-stack)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.