Help us improve
Share bugs, ideas, or general feedback.
From first-plan
Detects tech stacks and folder roles from manifest files (go.mod, package.json, pyproject.toml, etc.), routing to stack-specific lens skills. Use for project discovery or extending new stacks.
npx claudepluginhub vynazevedo/first-plan --plugin first-planHow this skill is triggered — by the user, by Claude, or both
Slash command
/first-plan:lens-engineThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Motor que detecta stacks por manifesto, infere papel da pasta e roteia para a skill `lens-<stack>` correspondente.
Provides fallback analysis for projects with unusual structures, rare stacks (Elixir, OCaml, Haskell, Erlang, Zig), or polyglot setups using generic heuristics on file extensions, manifests, and patterns.
Detects project tech stack (frameworks, databases, tests, libraries) from dependency files (Python, JS, Go, Ruby, Java, PHP) and structure; outputs structured JSON.
Analyzes codebases to identify project structure, technology stack, dependencies, development tools, CI/CD configs, and recommends MCP integrations like database and cloud tools.
Share bugs, ideas, or general feedback.
Motor que detecta stacks por manifesto, infere papel da pasta e roteia para a skill lens-<stack> correspondente.
| Manifesto | Stack | Pistas adicionais para inferir papel |
|---|---|---|
go.mod | Go | cmd/ = CLI/binário; internal/ = lib privada; pkg/ = lib pública; presença de chi/gin/echo/fiber = HTTP API; kafka-go/amqp/segmentio/kafka-go = consumer/producer |
package.json | Node/TS | next.config.* = Next.js; vite.config.* = SPA Vite; nest-cli.json = NestJS; astro.config.* = Astro; remix.config.* = Remix; sveltekit em deps = SvelteKit; @nuxt/* = Nuxt; sem framework + bin/ = CLI Node |
composer.json | PHP | artisan = Laravel; bin/console = Symfony; index.php em pasta public/ sem framework = legacy |
pyproject.toml / setup.py / requirements.txt | Python | manage.py = Django; fastapi em deps = FastAPI; flask em deps = Flask; litestar = Litestar; celery em deps = worker; streamlit = data app |
Cargo.toml | Rust | [[bin]] = binário; [lib] = lib; presença de actix-web/axum/rocket = HTTP API |
*.tf | Terraform | main.tf na raiz = root módulo; modules/ = library; presença de provider "aws" etc para identificar plataforma |
Gemfile | Ruby | config.ru = Rack; bin/rails = Rails; presença de sidekiq em Gemfile = worker |
pubspec.yaml | Flutter / Dart | lib/main.dart = app Flutter; bin/ = CLI Dart |
Package.swift | Swift | Sources/ = lib/app Swift |
build.gradle.kts ou build.gradle | Kotlin/Java/Android | AndroidManifest.xml = Android app; application plugin = backend |
*.csproj ou *.sln | .NET (C#) | <OutputType>Exe</> = CLI/web; Microsoft.AspNetCore = ASP.NET |
mix.exs | Elixir | phoenix em deps = Phoenix |
deno.json ou deno.jsonc | Deno | inferir papel pelo entry script |
bun.lockb ou bunfig.toml | Bun | similar a Node/TS, framework por inspeção |
1. Para cada pasta candidata (root + subdiretórios não-ignorados):
a. Listar arquivos top-level
b. Match contra tabela acima (primeiro match ganha; se múltiplos, todos contam = polyglot)
c. Se match: registrar stack + papel inferido
d. Se nenhum match: aplicar lens-generic
2. Excluir pastas:
- node_modules, vendor, target, dist, build, .next, .nuxt, venv, .venv
- .cache, coverage
- Pastas listadas em .gitignore
3. Limites:
- Profundidade máxima: 4 níveis
- Tamanho máximo por arquivo de manifesto inspecionado: 1MB
- Em monorepo grande (>50 manifestos), aplicar amostragem por pasta principal
Após detectar stack X, carregar e aplicar skills/lens-<x>/SKILL.md. Cada lens segue o contrato comum:
Cada lens-<stack>/SKILL.md deve providenciar:
.first-plan/ cada lens preencheSe detectado manifesto não-listado ou nenhum manifesto:
lens-generic/SKILL.md.first-plan/01-topology/stacks.md como "stack: unknown, lens: generic"skills/lens-<nova-stack>/SKILL.md seguindo o contrato comumQuando uma pasta tem múltiplos manifestos (ex: package.json + composer.json em projeto Laravel + frontend):
.first-plan/01-topology/stacks.mdCada stack detectada vira uma seção no stacks.md com: