# Detect Stack

> 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.

- **Type:** Skill
- **Install:** `agentstack add skill-benmarte-autoimprove-detect-stack`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [benmarte](https://agentstack.voostack.com/s/benmarte)
- **Installs:** 0
- **Category:** [Developer Tools](https://agentstack.voostack.com/c/developer-tools)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [benmarte](https://github.com/benmarte)
- **Source:** https://github.com/benmarte/autoimprove/tree/main/skills/detect-stack

## Install

```sh
agentstack add skill-benmarte-autoimprove-detect-stack
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# 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

## 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.

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [benmarte](https://github.com/benmarte)
- **Source:** [benmarte/autoimprove](https://github.com/benmarte/autoimprove)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** yes
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-benmarte-autoimprove-detect-stack
- Seller: https://agentstack.voostack.com/s/benmarte
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
