mirror of
https://github.com/github/awesome-copilot.git
synced 2026-04-15 04:35:55 +00:00
Adds a new Agent Skill - Acquire-Codebase-Knowledge (#1373)
* feat(skill): add acquire-codebase-knowledge skill documentation * feat(templates): add architecture, concerns, conventions, integrations, stack, structure, and testing documentation templates * feat(references): add inquiry checkpoints and stack detection documentation * feat(scan): add script to collect project discovery information for acquire-codebase-knowledge skill * feat(skills): add acquire-codebase-knowledge skill for codebase mapping and documentation * feat(scan): enhance scan script with absolute path handling and improved output variable validation * feat(scan): replace bash script with Python script for project discovery information collection * feat(skills): update acquire-codebase-knowledge skill to replace scan.sh with scan.py
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
# Inquiry Checkpoints
|
||||
|
||||
Per-template investigation questions for Phase 2 of the acquire-codebase-knowledge workflow. For each template area, look for answers in the scan output first, then read source files to fill gaps.
|
||||
|
||||
---
|
||||
|
||||
## 1. STACK.md — Tech Stack
|
||||
|
||||
- What is the primary language and exact version? (check `.nvmrc`, `go.mod`, `pyproject.toml`, Docker `FROM` line)
|
||||
- What package manager is used? (`npm`, `yarn`, `pnpm`, `go mod`, `pip`, `uv`)
|
||||
- What are the core runtime frameworks? (web server, ORM, DI container)
|
||||
- What do `dependencies` (production) vs `devDependencies` (dev tooling) contain?
|
||||
- Is there a Docker image and what base image does it use?
|
||||
- What are the key scripts in `package.json` / `Makefile` / `pyproject.toml`?
|
||||
|
||||
## 2. STRUCTURE.md — Directory Layout
|
||||
|
||||
- Where does source code live? (usually `src/`, `lib/`, or project root for Go)
|
||||
- What are the entry points? (check `main` in `package.json`, `scripts.start`, `cmd/main.go`, `app.py`)
|
||||
- What is the stated purpose of each top-level directory?
|
||||
- Are there non-obvious directories (e.g., `eng/`, `platform/`, `infra/`)?
|
||||
- Are there hidden config directories (`.github/`, `.vscode/`, `.husky/`)?
|
||||
- What naming conventions do directories follow? (camelCase, kebab-case, domain-based vs layer-based)
|
||||
|
||||
## 3. ARCHITECTURE.md — Patterns
|
||||
|
||||
- Is the code organized by layer (controllers → services → repos) or by feature?
|
||||
- What is the primary data flow? Trace one request or command from entry to data store.
|
||||
- Are there singletons, dependency injection patterns, or explicit initialization order requirements?
|
||||
- Are there background workers, queues, or event-driven components?
|
||||
- What design patterns appear repeatedly? (Factory, Repository, Decorator, Strategy)
|
||||
|
||||
## 4. CONVENTIONS.md — Coding Standards
|
||||
|
||||
- What is the file naming convention? (check 10+ files — camelCase, kebab-case, PascalCase)
|
||||
- What is the function and variable naming convention?
|
||||
- Are private methods/fields prefixed (e.g., `_methodName`, `#field`)?
|
||||
- What linter and formatter are configured? (check `.eslintrc`, `.prettierrc`, `golangci.yml`)
|
||||
- What are the TypeScript strictness settings? (`strict`, `noImplicitAny`, etc.)
|
||||
- How are errors handled at each layer? (throw vs. return structured error)
|
||||
- What logging library is used and what is the log message format?
|
||||
- How are imports organized? (barrel exports, path aliases, grouping rules)
|
||||
|
||||
## 5. INTEGRATIONS.md — External Services
|
||||
|
||||
- What external APIs are called? (search for `axios.`, `fetch(`, `http.Get(`, base URLs in constants)
|
||||
- How are credentials stored and accessed? (`.env`, secrets manager, env vars)
|
||||
- What databases are connected? (check manifest for `pg`, `mongoose`, `prisma`, `typeorm`, `sqlalchemy`)
|
||||
- Is there an API gateway, service mesh, or proxy between the app and external services?
|
||||
- What monitoring or observability tools are used? (APM, Prometheus, logging pipeline)
|
||||
- Are there message queues or event buses? (Kafka, RabbitMQ, SQS, Pub/Sub)
|
||||
|
||||
## 6. TESTING.md — Test Setup
|
||||
|
||||
- What test runner is configured? (check `scripts.test` in `package.json`, `pytest.ini`, `go test`)
|
||||
- Where are test files located? (alongside source, in `tests/`, in `__tests__/`)
|
||||
- What assertion library is used? (Jest expect, Chai, pytest assert)
|
||||
- How are external dependencies mocked? (jest.mock, dependency injection, fixtures)
|
||||
- Are there integration tests that hit real services vs. unit tests with mocks?
|
||||
- Is there a coverage threshold enforced? (check `jest.config.js`, `.nycrc`, `pyproject.toml`)
|
||||
|
||||
## 7. CONCERNS.md — Known Issues
|
||||
|
||||
- How many TODOs/FIXMEs/HACKs are in production code? (see scan output)
|
||||
- Which files have the highest git churn in the last 90 days? (see scan output)
|
||||
- Are there any files over 500 lines that mix multiple responsibilities?
|
||||
- Do any services make sequential calls that could be parallelized?
|
||||
- Are there hardcoded values (URLs, IDs, magic numbers) that should be config?
|
||||
- What security risks exist? (missing input validation, raw error messages exposed to clients, missing auth checks)
|
||||
- Are there performance patterns that don't scale? (N+1 queries, in-memory caches in multi-instance setups)
|
||||
131
skills/acquire-codebase-knowledge/references/stack-detection.md
Normal file
131
skills/acquire-codebase-knowledge/references/stack-detection.md
Normal file
@@ -0,0 +1,131 @@
|
||||
# Stack Detection Reference
|
||||
|
||||
Load this file when the tech stack is ambiguous — e.g., multiple manifest files present, unfamiliar file extensions, or no obvious `package.json` / `go.mod`.
|
||||
|
||||
---
|
||||
|
||||
## Manifest File → Ecosystem
|
||||
|
||||
| File | Ecosystem | Key fields to read |
|
||||
|------|-----------|--------------------|
|
||||
| `package.json` | Node.js / JavaScript / TypeScript | `dependencies`, `devDependencies`, `scripts`, `main`, `type`, `engines` |
|
||||
| `go.mod` | Go | Module path, Go version, `require` block |
|
||||
| `requirements.txt` | Python (pip) | Package list with pinned versions |
|
||||
| `Pipfile` | Python (pipenv) | `[packages]`, `[dev-packages]`, `[requires]` python version |
|
||||
| `pyproject.toml` | Python (poetry / uv / hatch) | `[tool.poetry.dependencies]`, `[project]`, `[build-system]` |
|
||||
| `setup.py` / `setup.cfg` | Python (setuptools, legacy) | `install_requires`, `python_requires` |
|
||||
| `Cargo.toml` | Rust | `[dependencies]`, `[[bin]]`, `[lib]` |
|
||||
| `pom.xml` | Java / Kotlin (Maven) | `<dependencies>`, `<artifactId>`, `<groupId>`, `<java.version>` |
|
||||
| `build.gradle` / `build.gradle.kts` | Java / Kotlin (Gradle) | `dependencies {}`, `sourceCompatibility` |
|
||||
| `composer.json` | PHP | `require`, `require-dev` |
|
||||
| `Gemfile` | Ruby | `gem` declarations, `ruby` version constraint |
|
||||
| `mix.exs` | Elixir | `deps/0`, `elixir: "~> X.Y"` |
|
||||
| `pubspec.yaml` | Dart / Flutter | `dependencies`, `dev_dependencies`, `environment.sdk` |
|
||||
| `*.csproj` | .NET / C# | `<PackageReference>`, `<TargetFramework>` |
|
||||
| `*.sln` | .NET solution | References multiple `.csproj` projects |
|
||||
| `deno.json` / `deno.jsonc` | Deno (TypeScript runtime) | `imports`, `tasks` |
|
||||
| `bun.lockb` | Bun (JavaScript runtime) | Binary lockfile — check `package.json` for deps |
|
||||
|
||||
---
|
||||
|
||||
## Language Runtime Version Detection
|
||||
|
||||
| Language | Where to find the version |
|
||||
|----------|--------------------------|
|
||||
| Node.js | `.nvmrc`, `.node-version`, `engines.node` in `package.json`, Docker `FROM node:X` |
|
||||
| Python | `.python-version`, `pyproject.toml [requires-python]`, Docker `FROM python:X` |
|
||||
| Go | First line of `go.mod` (`go 1.21`) |
|
||||
| Java | `<java.version>` in `pom.xml`, `sourceCompatibility` in `build.gradle`, Docker `FROM eclipse-temurin:X` |
|
||||
| Ruby | `.ruby-version`, `Gemfile` `ruby 'X.Y.Z'` |
|
||||
| Rust | `rust-toolchain.toml`, `rust-toolchain` file |
|
||||
| .NET | `<TargetFramework>` in `.csproj` (e.g., `net8.0`) |
|
||||
|
||||
---
|
||||
|
||||
## Framework Detection (Node.js / TypeScript)
|
||||
|
||||
| Dependency in `package.json` | Framework |
|
||||
|-----------------------------|-----------|
|
||||
| `express` | Express.js (minimal HTTP server) |
|
||||
| `fastify` | Fastify (high-performance HTTP server) |
|
||||
| `next` | Next.js (SSR/SSG React — check for `pages/` or `app/` directory) |
|
||||
| `nuxt` | Nuxt.js (SSR/SSG Vue) |
|
||||
| `@nestjs/core` | NestJS (opinionated Node.js framework with DI) |
|
||||
| `koa` | Koa (middleware-focused, no built-in router) |
|
||||
| `@hapi/hapi` | Hapi |
|
||||
| `@trpc/server` | tRPC (type-safe API without REST/GraphQL schemas) |
|
||||
| `routing-controllers` | routing-controllers (decorator-based Express wrapper) |
|
||||
| `typeorm` | TypeORM (SQL ORM with decorators) |
|
||||
| `prisma` | Prisma (type-safe ORM, check `prisma/schema.prisma`) |
|
||||
| `mongoose` | Mongoose (MongoDB ODM) |
|
||||
| `sequelize` | Sequelize (SQL ORM) |
|
||||
| `drizzle-orm` | Drizzle (lightweight SQL ORM) |
|
||||
| `react` without `next` | Vanilla React SPA (check for `react-router-dom`) |
|
||||
| `vue` without `nuxt` | Vanilla Vue SPA |
|
||||
|
||||
---
|
||||
|
||||
## Framework Detection (Python)
|
||||
|
||||
| Package | Framework |
|
||||
|---------|-----------|
|
||||
| `fastapi` | FastAPI (async REST, auto OpenAPI docs) |
|
||||
| `flask` | Flask (minimal WSGI web framework) |
|
||||
| `django` | Django (batteries-included, check `settings.py`) |
|
||||
| `starlette` | Starlette (ASGI, often used as FastAPI base) |
|
||||
| `aiohttp` | aiohttp (async HTTP client and server) |
|
||||
| `sqlalchemy` | SQLAlchemy (SQL ORM; check for `alembic` migrations) |
|
||||
| `alembic` | Alembic (SQLAlchemy migration tool) |
|
||||
| `pydantic` | Pydantic (data validation; core to FastAPI) |
|
||||
| `celery` | Celery (distributed task queue) |
|
||||
|
||||
---
|
||||
|
||||
## Monorepo Detection
|
||||
|
||||
Check these signals in order:
|
||||
|
||||
1. `pnpm-workspace.yaml` — pnpm workspaces
|
||||
2. `lerna.json` — Lerna monorepo
|
||||
3. `nx.json` — Nx monorepo (also check `workspace.json`)
|
||||
4. `turbo.json` — Turborepo
|
||||
5. `rush.json` — Rush (Microsoft monorepo manager)
|
||||
6. `moon.yml` — Moon
|
||||
7. `package.json` with `"workspaces": [...]` — npm/yarn workspaces
|
||||
8. Presence of `packages/`, `apps/`, `libs/`, or `services/` directories with their own `package.json`
|
||||
|
||||
If monorepo is detected: each workspace may have **independent** dependencies and conventions. Map each sub-package separately in `STACK.md` and note the monorepo structure in `STRUCTURE.md`.
|
||||
|
||||
---
|
||||
|
||||
## TypeScript Path Alias Detection
|
||||
|
||||
If `tsconfig.json` has a `paths` key, imports with non-relative prefixes are aliases. Map them before documenting structure.
|
||||
|
||||
```json
|
||||
// tsconfig.json example
|
||||
"paths": {
|
||||
"@/*": ["./src/*"],
|
||||
"@components/*": ["./src/components/*"],
|
||||
"@utils/*": ["./src/utils/*"]
|
||||
}
|
||||
```
|
||||
|
||||
Imports like `import { foo } from '@/utils/bar'` resolve to `src/utils/bar`. Document as `src/utils/bar`, not `@/utils/bar`.
|
||||
|
||||
---
|
||||
|
||||
## Docker Base Image → Runtime
|
||||
|
||||
If no manifest file is present but a `Dockerfile` exists, the `FROM` line reveals the runtime:
|
||||
|
||||
| FROM line pattern | Runtime |
|
||||
|------------------|---------|
|
||||
| `FROM node:X` | Node.js X |
|
||||
| `FROM python:X` | Python X |
|
||||
| `FROM golang:X` | Go X |
|
||||
| `FROM eclipse-temurin:X` | Java X (Eclipse Temurin JDK) |
|
||||
| `FROM mcr.microsoft.com/dotnet/aspnet:X` | .NET X |
|
||||
| `FROM ruby:X` | Ruby X |
|
||||
| `FROM rust:X` | Rust X |
|
||||
| `FROM alpine` (alone) | Check what's installed via `RUN apk add` |
|
||||
Reference in New Issue
Block a user