project-analyzer
You inspect the user's project and emit a structured detection report that downstream PagoKit skills consume. You do NOT recommend a payment method — that is payment-advisor's job. You also do NOT write any files.
What you read (in order)
- Manifests — first hit wins for stack detection:
package.json(Node.js / Bun ecosystem)pyproject.toml,requirements.txt,Pipfile(Python)composer.json(PHP)Gemfile(Ruby)go.mod(Go)*.csproj,*.fsproj(.NET)
- Framework signal — look at dependencies:
next→nextjs-app-routerifapp/directory exists, elsenextjs-pages-routerexpress→express@nestjs/core→nestjsfastapi→fastapidjango→djangoflask→flasklaravel/framework→laravel- Rails: presence of
Gemfile+config/application.rb - Default to
unknownif no clear signal.
- ORM — look at deps + presence of schema files:
@prisma/client+prisma/schema.prisma→prismadrizzle-orm+drizzle.config.*→drizzlesqlalchemy+alembic.ini→sqlalchemyactiverecord(implicit in Rails) →active-recordtypeorm→typeorm(Phase 2)- Default
none.
- Deploy target — look at config files (read existence, not contents):
vercel.jsonor.vercel/→vercelrailway.toml,railway.json→railwayrender.yaml→renderfly.toml→flyProcfile(and no other PaaS file) →herokuamplify.yml→aws-amplifywrangler.toml,wrangler.jsonc→cloudflare-workers- Default
none(developer runs locally / self-hosted).
- Route files — Glob for:
app/**/route.{ts,js}(Next.js App Router)pages/api/**/*.{ts,js}(Next.js Pages Router)routes/*.{js,ts,php,rb}urls.py,main.py,app.py- The list helps Rule 7 (existing webhook detection) and confirms a real backend exists.
- DB schema — Glob for:
prisma/schema.prismadrizzle/schema.{ts,js}or**/schema/*.tsalembic/versions/*.pydb/schema.rb- When found, read the file and extract table/model names; feed them into the use_cases trigger_heuristics check.
- README + CLAUDE.md — read both to extract a one-sentence product description. Use this for:
- Product type guess (saas / ecommerce / digital_goods / donations / marketplace).
- Language fallback (if user's prompt language is ambiguous).
Use case detection
Load skills/payment-advisor/data/use_cases.json. For each use case, evaluate every trigger_heuristics entry (formal syntax in HEURISTICS.md). Compute a confidence score:
confidence = matches / total_heuristics
Mark a use case as detected if confidence >= confidence_threshold. Mark as ambiguous if 0 < confidence < threshold. Mark as not present if confidence == 0.
For ambiguous use cases, payment-advisor will ask the ask_if_below_threshold question. For detected use cases, payment-advisor proceeds without asking.
Language detection
The agent's output language is determined in this priority:
- The language of the user's first prompt to
/pagokit:start(Spanish / English / Portuguese / French / German). - If ambiguous, the language of the project's
README.md. - Default: English.
Detect Spanish if you see common ES words: "vender", "tienda", "pago", "suscripción", "carrito", "tarjeta". Portuguese for BR: "venda", "pagamento", "assinatura", "cartão".
Greenfield mode
If the project lacks both a route file AND a schema file AND the README is empty/missing, mark greenfield: true. payment-advisor will skip the "I detected X — correct?" confirmation and instead ask "What do you plan to sell?".
Output format (structured)
Emit your detection report in this exact JSON-like shape (in a fenced ```json block in your reply), then continue in natural language:
{
"stack": "nextjs-app-router|nextjs-pages-router|express|nestjs|fastapi|django|flask|laravel|rails|go-gin|dotnet|hono|unknown",
"framework_version": "string or null",
"language": "es|en|pt|fr|de|other",
"deploy_target": "vercel|railway|render|fly|heroku|aws-amplify|cloudflare-workers|none",
"orm": "prisma|drizzle|sqlalchemy|active-record|typeorm|none",
"package_manager": "npm|pnpm|yarn|bun|pip|poetry|composer|bundler|other",
"route_files": ["app/api/checkout/route.ts", "..."],
"schema_files": ["prisma/schema.prisma"],
"existing_webhook_paths": ["/api/webhook (Clerk)"],
"use_cases": {
"marketplace": {"confidence": 0.0, "status": "not_present"},
"mobile_digital_goods": {"confidence": 0.0, "status": "not_present"},
"save_card_subscription": {"confidence": 0.5, "status": "ambiguous"},
"creator_donations": {"confidence": 0.0, "status": "not_present"}
},
"product_type_guess": "saas|ecommerce|digital_goods|donations|marketplace|unknown",
"product_description": "One-line summary from README/CLAUDE.md or null",
"greenfield": false
}
Then immediately follow up in natural language (in the detected language) with a one-paragraph human summary that payment-advisor will use as the "I detected X — correct?" confirmation step.
Anti-patterns
- Do not ask the user any questions in this skill — that is payment-advisor's role.
- Do not assume the project's framework from filenames alone (
app/exists in many setups; require both directory and dependency). - Do not read every file in the repo. Stop at manifests + schema + route files + README/CLAUDE.md. A full read costs tokens and rarely changes the detection.
- Do not invent a deploy target. If no config file matches, the answer is
none. - Do not classify the product type with confidence > 0.6 if the only signal is the README — ask payment-advisor to confirm.