plugins/upgrade-suggestion/skills/project-fingerprinting/SKILL.md
Deep project fingerprinting for tech stack detection, architecture analysis, and quality assessment
npx skillsauth add markus41/claude project-fingerprintingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Comprehensive project fingerprinting system that builds a multi-dimensional profile of any codebase. Used by the upgrade council to give specialist agents targeted context, eliminating irrelevant analysis and enabling framework-specific recommendations.
fingerprint:
# Core identity
name: string # from package.json name or directory
language: string # primary language
languages: string[] # all detected languages
# Framework detection
frameworks:
frontend: string[] # react, vue, angular, svelte, next, nuxt, etc.
backend: string[] # express, fastapi, django, nestjs, flask, etc.
meta: string[] # next (fullstack), nuxt (fullstack), remix, etc.
mobile: string[] # react-native, flutter, expo, etc.
# Infrastructure
infrastructure:
containerized: boolean
container_tool: docker | podman | none
orchestrated: boolean
orchestrator: kubernetes | docker-compose | nomad | none
ci_cd: github-actions | gitlab-ci | jenkins | circle-ci | azure-pipelines | none
cloud: aws | gcp | azure | vercel | netlify | none
iac: terraform | pulumi | cdk | cloudformation | none
monitoring: prometheus | datadog | newrelic | none
# Architecture
architecture:
pattern: monolith | monorepo | microservices | serverless | jamstack
api_style: rest | graphql | grpc | trpc | mixed | none
state_management: redux | zustand | jotai | recoil | mobx | context | pinia | vuex | none
orm: prisma | drizzle | typeorm | sequelize | sqlalchemy | django-orm | none
database: postgres | mysql | mongodb | sqlite | redis | none
auth: nextauth | clerk | auth0 | keycloak | passport | custom | none
monorepo_tool: nx | turborepo | lerna | pnpm-workspaces | none
# Quality signals
quality:
typescript:
enabled: boolean
strict: boolean
strict_null_checks: boolean
no_implicit_any: boolean
linter:
tool: eslint | biome | none
config_format: flat | legacy | none
formatter:
tool: prettier | biome | none
testing:
framework: jest | vitest | pytest | go-test | none
coverage_configured: boolean
e2e_framework: playwright | cypress | puppeteer | none
pre_commit: husky | lefthook | pre-commit | none
dependency_updates: dependabot | renovate | none
# Scale metrics
scale:
file_count: number
src_lines: number # approximate
dependency_count: number
dev_dependency_count: number
contributor_count: number # from git log --format='%ae' | sort -u | wc -l
commit_count_30d: number # activity level
age_days: number # first commit to now
# Package manager
package_manager: npm | pnpm | yarn | bun | pip | cargo | go-mod | maven | gradle
| Check | Language | Confidence |
|-------|----------|------------|
| tsconfig.json exists | TypeScript | 0.95 |
| *.ts files in src/ | TypeScript | 0.90 |
| package.json exists (no TS) | JavaScript | 0.85 |
| pyproject.toml or requirements.txt | Python | 0.95 |
| go.mod | Go | 0.95 |
| Cargo.toml | Rust | 0.95 |
| pom.xml or build.gradle | Java/Kotlin | 0.90 |
| *.rb + Gemfile | Ruby | 0.90 |
| *.cs + *.csproj | C# | 0.90 |
| *.swift + Package.swift | Swift | 0.90 |
| Dependency | Framework | Category |
|-----------|-----------|----------|
| next | Next.js | meta-framework |
| react, react-dom | React | frontend |
| vue | Vue.js | frontend |
| @angular/core | Angular | frontend |
| svelte, @sveltejs/kit | Svelte/SvelteKit | frontend/meta |
| express | Express | backend |
| fastify | Fastify | backend |
| @nestjs/core | NestJS | backend |
| hono | Hono | backend |
| @remix-run/node | Remix | meta-framework |
| astro | Astro | meta-framework |
| nuxt | Nuxt | meta-framework |
| gatsby | Gatsby | meta-framework |
| react-native | React Native | mobile |
| expo | Expo | mobile |
| Dependency | Framework |
|-----------|-----------|
| fastapi | FastAPI |
| django | Django |
| flask | Flask |
| starlette | Starlette |
| tornado | Tornado |
| aiohttp | aiohttp |
| Pattern | Infrastructure | Type |
|---------|---------------|------|
| Dockerfile | Docker | container |
| docker-compose.yml | Docker Compose | orchestrator |
| Chart.yaml | Helm | orchestrator |
| k8s/, kubernetes/ | Kubernetes | orchestrator |
| .github/workflows/ | GitHub Actions | ci_cd |
| .gitlab-ci.yml | GitLab CI | ci_cd |
| Jenkinsfile | Jenkins | ci_cd |
| terraform/, *.tf | Terraform | iac |
| Pulumi.yaml | Pulumi | iac |
| vercel.json | Vercel | cloud |
| netlify.toml | Netlify | cloud |
| firebase.json | Firebase | cloud |
| serverless.yml | Serverless FW | cloud |
| fly.toml | Fly.io | cloud |
| render.yaml | Render | cloud |
| Check | Detection |
|-------|-----------|
| tsconfig.json → "strict": true | TypeScript strict mode |
| .eslintrc* or eslint.config.* | ESLint configured |
| .prettierrc* or prettier.config.* | Prettier configured |
| jest.config.* or vitest.config.* | Test framework |
| .husky/ directory | Pre-commit hooks |
| renovate.json or .github/dependabot.yml | Auto dependency updates |
| playwright.config.* or cypress.config.* | E2E testing |
| biome.json or biome.jsonc | Biome (lint + format) |
| Signal | Pattern |
|--------|---------|
| packages/ or apps/ directory | Monorepo |
| turbo.json or nx.json | Monorepo (confirmed) |
| Multiple Dockerfiles + docker-compose.yml | Microservices |
| serverless.yml + functions/ | Serverless |
| Single src/ with both API + UI | Monolith |
| pages/ or app/ (Next.js) + api/ | Fullstack monolith |
# One-shot fingerprint collection script
echo "=== PACKAGE.JSON ===" && cat package.json 2>/dev/null | head -80
echo "=== TSCONFIG ===" && cat tsconfig.json 2>/dev/null | head -30
echo "=== DIR STRUCTURE ===" && ls -la src/ 2>/dev/null
echo "=== KEY FILES ===" && ls Dockerfile docker-compose.yml Chart.yaml .github/workflows/ 2>/dev/null
echo "=== GIT STATS ===" && git log --oneline --since='30 days ago' 2>/dev/null | wc -l
echo "=== CONTRIBUTORS ===" && git log --format='%ae' 2>/dev/null | sort -u | wc -l
echo "=== FILE COUNT ===" && find src/ -name '*.ts' -o -name '*.tsx' -o -name '*.py' -o -name '*.go' 2>/dev/null | wc -l
echo "=== LINE COUNT ===" && find src/ -name '*.ts' -o -name '*.tsx' 2>/dev/null | xargs wc -l 2>/dev/null | tail -1
When a framework is detected, enable additional specialist checks:
next/image usage (vs raw <img>)getServerSideProps vs getStaticProps (SSR vs SSG opportunities)The fingerprint is passed to all council agents as context. It determines:
development
Enhanced plan-authoring skill with Pre-Writing context gathering, task metadata, non-TDD templates, Red Flags, telemetry, and an automated plan linter. Use when you have a spec or requirements for a multi-step task, before touching code.
tools
Documentation intelligence engine with graph-based API docs, algorithm library, and drift detection
tools
Ultraplan cloud planning — kick off a plan in the cloud from your terminal, review and revise in the browser, then execute remotely or send back to CLI
tools
--- name: mcp description: Configure MCP servers for Claude Code — stdio vs HTTP, authentication, Tools/Resources/Prompts distinction, channels (CI webhook, mobile relay, Discord bridge, fakechat), and cost of always-loaded tools. Use this skill whenever adding an MCP server, debugging connection issues, choosing between MCP Tools vs Prompts vs Resources, installing channel servers, or managing .mcp.json. Triggers on: "MCP server", "mcp config", "add Obsidian MCP", "install context7", "channels"