vinta-ai-workflows 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +830 -0
- package/LICENSE +21 -0
- package/README.md +547 -0
- package/package.json +27 -0
- package/schemas/README.md +84 -0
- package/schemas/mcp-preflight-cache.v1.schema.json +50 -0
- package/schemas/prs-context-comments.v1.schema.json +51 -0
- package/schemas/prs-context-frontmatter.v1.schema.json +77 -0
- package/schemas/sub-agent.v1.schema.json +105 -0
- package/schemas/vinta-ai-workflows-config.v1.schema.json +283 -0
- package/skills/vinta-analyze-codebase/SKILL.md +325 -0
- package/skills/vinta-bootstrap-ai-tools/SKILL.md +375 -0
- package/skills/vinta-bootstrap-ai-tools/resources/stacks/README.md +50 -0
- package/skills/vinta-bootstrap-ai-tools/resources/stacks/django/notes.md +52 -0
- package/skills/vinta-bootstrap-ai-tools/resources/stacks/medplum/notes.md +45 -0
- package/skills/vinta-bootstrap-ai-tools/resources/stacks/nextjs-app-router/notes.md +35 -0
- package/skills/vinta-bootstrap-ai-tools/resources/stacks/python-package/notes.md +31 -0
- package/skills/vinta-bootstrap-ai-tools/resources/stacks/typescript-monorepo/notes.md +32 -0
- package/skills/vinta-derive-skills/SKILL.md +200 -0
- package/skills/vinta-derive-skills/resources/amend-plan-template.md +355 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/add-one-off-script/SKILL.md +292 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/add-one-off-script/resources/one_off_script_base.py +602 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/add-one-off-script/resources/one_off_script_base.ts +624 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/create-qa-use-cases/SKILL.md +232 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/create-spec/SKILL.md +235 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/open-pr-from-context/SKILL.md +78 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/open-pr-from-context/scripts/open-pr.sh +357 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/plan-feature/SKILL.md +418 -0
- package/skills/vinta-derive-skills/resources/implement-plan-template.md +375 -0
- package/skills/vinta-derive-skills/resources/prs-context-template.md +91 -0
- package/skills/vinta-derive-skills/resources/systematic-debugging-mcp-tools.md +125 -0
- package/skills/vinta-derive-skills/resources/systematic-debugging-template.md +167 -0
- package/skills/vinta-derive-subagents/SKILL.md +192 -0
- package/skills/vinta-install-ai-tools-setup/SKILL.md +138 -0
- package/skills/vinta-install-ai-tools-setup/resources/setup-ai-tools.mjs +392 -0
- package/skills/vinta-migrate-plans-specs/SKILL.md +229 -0
- package/skills/vinta-sync-ai-tools/SKILL.md +184 -0
- package/skills/vinta-update-project-skills/SKILL.md +178 -0
- package/skills/vinta-write-agents-md/SKILL.md +192 -0
- package/vinta-ai-workflows.mjs +316 -0
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vinta-analyze-codebase
|
|
3
|
+
description: Walk a repository and produce a structured inventory of its languages, frameworks, build tools, test setups, deploy targets, monorepo shape, env model, multi-tenancy patterns, and CI providers. Used by [vinta-bootstrap-ai-tools](../vinta-bootstrap-ai-tools/SKILL.md) as the first step before drafting AGENTS.md / sub-agents / skills, but also runnable standalone when you want a quick "what is this codebase made of" report. Produces an in-memory inventory that downstream skills consume; does not write files.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Analyze codebase
|
|
7
|
+
|
|
8
|
+
Build an inventory of what's in the repo so other skills don't have to re-discover it. The output is a structured summary, **not** a written file — the orchestrator passes it as context to the next sub-skill.
|
|
9
|
+
|
|
10
|
+
## What to scan, in order
|
|
11
|
+
|
|
12
|
+
Stop at the first finding for each section unless the section says otherwise. Don't recurse into `node_modules/`, `.git/`, `dist/`, `build/`, `.turbo/`, `.next/`, `__pycache__/`, `.venv/`, `target/`.
|
|
13
|
+
|
|
14
|
+
### 1. Top-level fingerprint
|
|
15
|
+
|
|
16
|
+
`ls -la` at repo root + `git log --oneline -10`. Capture:
|
|
17
|
+
- Repo name (from `package.json:name`, `pyproject.toml:[project].name`, `Cargo.toml:[package].name`, or git remote).
|
|
18
|
+
- Default branch (`git symbolic-ref refs/remotes/origin/HEAD` or fall back to `main`/`master`).
|
|
19
|
+
- Code host (parse `git remote get-url origin` — github.com / gitlab / bitbucket / self-hosted).
|
|
20
|
+
- Existing `AGENTS.md` / `CLAUDE.md` / `.cursorrules` / `.github/copilot-instructions.md` / `CONTRIBUTING.md` — read these in full. Existing conventions are gospel.
|
|
21
|
+
|
|
22
|
+
### 2. Languages + package managers
|
|
23
|
+
|
|
24
|
+
| Signal file | Language / package manager |
|
|
25
|
+
|---|---|
|
|
26
|
+
| `package.json` | JavaScript / TypeScript |
|
|
27
|
+
| `pnpm-lock.yaml`, `pnpm-workspace.yaml` | pnpm + (likely) workspaces |
|
|
28
|
+
| `yarn.lock` | yarn |
|
|
29
|
+
| `package-lock.json` | npm |
|
|
30
|
+
| `tsconfig.json` (one or many) | TypeScript |
|
|
31
|
+
| `pyproject.toml` | Python (modern) |
|
|
32
|
+
| `requirements*.txt`, `setup.py`, `setup.cfg` | Python (legacy) |
|
|
33
|
+
| `Cargo.toml` | Rust |
|
|
34
|
+
| `go.mod` | Go |
|
|
35
|
+
| `Gemfile` | Ruby |
|
|
36
|
+
| `pom.xml`, `build.gradle*` | Java / Kotlin |
|
|
37
|
+
| `composer.json` | PHP |
|
|
38
|
+
|
|
39
|
+
Capture every match — many repos are polyglot. Read each lockfile / `package.json` / `pyproject.toml` to extract direct dependencies (skip transitive).
|
|
40
|
+
|
|
41
|
+
### 3. Frameworks (from dependencies)
|
|
42
|
+
|
|
43
|
+
Match top-level deps against this table:
|
|
44
|
+
|
|
45
|
+
| Dep / signal | Framework |
|
|
46
|
+
|---|---|
|
|
47
|
+
| `react`, `react-dom` | React |
|
|
48
|
+
| `next` | Next.js (check `next.config.*` for App Router signals: `app/` directory) |
|
|
49
|
+
| `vite`, `@vitejs/*` | Vite |
|
|
50
|
+
| `@medplum/core`, `@medplum/fhirtypes`, `@medplum/react` | **Medplum** (FHIR backend) |
|
|
51
|
+
| `mantine`, `@mantine/*` | Mantine UI |
|
|
52
|
+
| `tailwindcss` | Tailwind |
|
|
53
|
+
| `@vercel/*` | Vercel platform / SDKs |
|
|
54
|
+
| `playwright`, `@playwright/test` | Playwright e2e |
|
|
55
|
+
| `vitest`, `jest` | Vitest / Jest |
|
|
56
|
+
| `biome`, `@biomejs/biome` | Biome lint+format |
|
|
57
|
+
| `eslint`, `prettier` | ESLint / Prettier |
|
|
58
|
+
| `Django` (in pyproject / requirements) | **Django** |
|
|
59
|
+
| `psqlextra`, `django-postgres-extra` | Django + PG partitioning |
|
|
60
|
+
| `strawberry-graphql` | Strawberry GraphQL |
|
|
61
|
+
| `fastapi` | FastAPI |
|
|
62
|
+
| `flask` | Flask |
|
|
63
|
+
| `pytest` | pytest |
|
|
64
|
+
| `mypy`, `ruff`, `black` | Python lint/type tools |
|
|
65
|
+
| `tRPC`, `@trpc/*` | tRPC |
|
|
66
|
+
| `prisma`, `@prisma/client` | Prisma |
|
|
67
|
+
| `drizzle-orm` | Drizzle |
|
|
68
|
+
| `mongoose` | Mongoose / MongoDB |
|
|
69
|
+
|
|
70
|
+
Record stack matches — these drive which template directories `vinta-bootstrap-ai-tools` copies from.
|
|
71
|
+
|
|
72
|
+
### 4. Build / dev / lint / test commands
|
|
73
|
+
|
|
74
|
+
For Node/TS: read `package.json:scripts`. Capture: `dev`, `build`, `test`, `test:*`, `lint`, `lint:fix`, `format`, `typecheck`. Also: workspace tasks (`turbo run …`, `pnpm --filter …`).
|
|
75
|
+
|
|
76
|
+
For Python: read `pyproject.toml:[tool.poetry.scripts]` / `[project.scripts]` + `Makefile` + `tox.ini` + `noxfile.py`. Capture: test runner command, lint command, type-check command, dev server command.
|
|
77
|
+
|
|
78
|
+
For other languages: read `Makefile` + `justfile` + language-specific files (`Cargo.toml:[bin]`, etc).
|
|
79
|
+
|
|
80
|
+
Note: many repos have the test command in CI config but not surfaced as a top-level script. Read `.github/workflows/*.yml` / `.gitlab-ci.yml` / `.circleci/config.yml` / `Jenkinsfile` to confirm.
|
|
81
|
+
|
|
82
|
+
### 5. Monorepo shape
|
|
83
|
+
|
|
84
|
+
- `pnpm-workspace.yaml` → list workspaces.
|
|
85
|
+
- `turbo.json` → tasks + pipeline graph.
|
|
86
|
+
- `nx.json` / `lerna.json` → Nx / Lerna.
|
|
87
|
+
- `apps/` + `lib/` (or `apps/` + `packages/`) directory pattern → conventional monorepo layout.
|
|
88
|
+
- Single-package repos: report as such; downstream skills need to know.
|
|
89
|
+
|
|
90
|
+
For each app/package: name + path + framework (cross-ref the [Frameworks (from dependencies)](#3-frameworks-from-dependencies) scan above) + entry point.
|
|
91
|
+
|
|
92
|
+
### 6. Tests
|
|
93
|
+
|
|
94
|
+
- Unit / integration: where are they? `apps/*/src/**/*.test.ts`, `tests/`, `__tests__/`, `<pkg>/tests/unit`, `<pkg>/tests/integration`. Glob.
|
|
95
|
+
- E2E: `e2e/`, `playwright/`, `cypress/`. Read fixtures + setup files for: auth strategy, seed helpers, tenant scoping in seeds.
|
|
96
|
+
- Test data: factories, fixtures, mocks. Note conventions (`@medplum/mock`, `factory_boy`, MSW, etc).
|
|
97
|
+
|
|
98
|
+
### 7. Deploy / release model
|
|
99
|
+
|
|
100
|
+
- `.github/workflows/deploy*.yml` / `.gitlab-ci.yml` deploy stages — capture target (Vercel, AWS, Heroku, K8s, custom), trigger (push to main vs release tag vs manual), environments named (`staging`, `production`, `preview`).
|
|
101
|
+
- `vercel.json` / `vercel.ts` → Vercel project config.
|
|
102
|
+
- `Dockerfile` + `docker-compose*.yml` → containerized.
|
|
103
|
+
- `helm/`, `k8s/`, `kustomize/` → Kubernetes.
|
|
104
|
+
- `scripts/deploy*` / `scripts/release*` → manual deploy paths.
|
|
105
|
+
- For Medplum repos: look for `pnpm bots:deploy`, `deploy-bots.ts`, AccessPolicy seed scripts.
|
|
106
|
+
|
|
107
|
+
### 8. Environments + multi-tenancy
|
|
108
|
+
|
|
109
|
+
- `.env.example` files at root + per-app — list var names (not values), note prefix patterns (`VITE_`, `NEXT_PUBLIC_`, `REACT_APP_`).
|
|
110
|
+
- Vite `envPrefix` allowlist (`vite.config.ts`).
|
|
111
|
+
- Turbo `tasks.<name>.env` arrays (cache hash inputs).
|
|
112
|
+
- Multi-tenancy signals:
|
|
113
|
+
- `tenant_id` columns in models / SQL schemas → row-level multi-tenancy.
|
|
114
|
+
- `meta.account` references in FHIR resource creation → Medplum tenant compartmenting.
|
|
115
|
+
- `Organization` resource + `_compartment=Organization/<id>` queries → Medplum org-scoped.
|
|
116
|
+
- `<env>__<name>` prefix patterns in deploy scripts → per-env isolation in shared backend.
|
|
117
|
+
- `psqlextra` partitioning by tenant key → partition-based isolation.
|
|
118
|
+
- Single-tenant: explicitly note absence of these signals.
|
|
119
|
+
|
|
120
|
+
### 9. CI / CD
|
|
121
|
+
|
|
122
|
+
- CI provider: GitHub Actions, GitLab CI, CircleCI, Jenkins, Buildkite, custom.
|
|
123
|
+
- Workflow files, named jobs, on-which-events (push, pull_request, schedule, release).
|
|
124
|
+
- Required checks (branch protection if visible via `.github/branch-protection.yml` or surfaced in CONTRIBUTING).
|
|
125
|
+
- Pre-commit hooks: `.pre-commit-config.yaml`, `.husky/`, `lefthook.yml`.
|
|
126
|
+
|
|
127
|
+
### 10. Documentation already present
|
|
128
|
+
|
|
129
|
+
- `README.md` at root + per-app.
|
|
130
|
+
- `docs/` directory.
|
|
131
|
+
- Architecture decision records (`docs/adr/`, `docs/architecture/`).
|
|
132
|
+
|
|
133
|
+
### 11. Existing AI-tooling artifacts
|
|
134
|
+
|
|
135
|
+
This is a load-bearing input for the rest of the bootstrap flow — surface every artifact found, even partial/legacy ones. Read each in full; they tell you what conventions already exist so the downstream `vinta-write-agents-md` / `vinta-derive-subagents` / `vinta-derive-skills` steps can **preserve, merge, or migrate** rather than overwrite.
|
|
136
|
+
|
|
137
|
+
**Instruction documents** — search for any of these and capture their content:
|
|
138
|
+
|
|
139
|
+
- `AGENTS.md` (root + per-app in monorepos).
|
|
140
|
+
- `CLAUDE.md`, `.cursorrules`, `.cursor/rules/*.mdc`, `.github/copilot-instructions.md`.
|
|
141
|
+
- Codex / Cursor / Copilot instructions inside vendor dirs (`.codex/AGENTS.md`, etc.).
|
|
142
|
+
- Anything tagged "AI conventions" / "Coding agent guide" / "LLM rules" in CONTRIBUTING / docs.
|
|
143
|
+
|
|
144
|
+
**Skills** — for each vendor path, list every skill found with its `name` + `description` (from frontmatter):
|
|
145
|
+
|
|
146
|
+
| Path | What lives there |
|
|
147
|
+
|---|---|
|
|
148
|
+
| `.claude/skills/<name>/SKILL.md` | Claude Code project skills |
|
|
149
|
+
| `.cursor/skills/<name>/SKILL.md` | Cursor project skills |
|
|
150
|
+
| `.codex/skills/<name>/SKILL.md` | Codex project skills (legacy path) |
|
|
151
|
+
| `.github/skills/<name>/SKILL.md` | Copilot project skills |
|
|
152
|
+
| `.agents/skills/<name>/SKILL.md` | Universal skills (Codex/Cursor/Copilot) |
|
|
153
|
+
| `ai-tools/skills/<name>/SKILL.md` | Vinta canonical layout (already-bootstrapped) |
|
|
154
|
+
|
|
155
|
+
For each skill, also classify:
|
|
156
|
+
|
|
157
|
+
- `vinta-managed` — directory name starts with `vinta-` (installed by `vinta-ai-workflows`; can be left alone or refreshed via that CLI).
|
|
158
|
+
- `foundation-shape` — name matches the Vinta foundation set (`plan-feature`, `create-spec`, `create-qa-use-cases`, `implement-plan`, `add-e2e-test`, `add-env-var`).
|
|
159
|
+
- `project-custom` — anything else; written by the team.
|
|
160
|
+
|
|
161
|
+
**Sub-agents** — list every agent file with its name + description:
|
|
162
|
+
|
|
163
|
+
| Path | Format | Purpose |
|
|
164
|
+
|---|---|---|
|
|
165
|
+
| `.claude/agents/<name>.md` | markdown + frontmatter | Claude Code |
|
|
166
|
+
| `.cursor/agents/<name>.md` | markdown + frontmatter | Cursor |
|
|
167
|
+
| `.codex/agents/<name>.toml` | TOML | Codex |
|
|
168
|
+
| `.github/agents/<name>.agent.md` | markdown + frontmatter | Copilot |
|
|
169
|
+
| `ai-tools/agents/<name>.yaml` | YAML | Vinta canonical |
|
|
170
|
+
|
|
171
|
+
For each agent, also classify:
|
|
172
|
+
|
|
173
|
+
- `foundation-shape` — name matches `implementer` / `reviewer` / `fixer`.
|
|
174
|
+
- `stack-specialist` — recognizable stack agent (e.g. `migration-author`, `deploy-author`).
|
|
175
|
+
- `project-custom` — anything else.
|
|
176
|
+
|
|
177
|
+
**Setup wiring** — note presence of:
|
|
178
|
+
|
|
179
|
+
- `ai-tools/scripts/setup-ai-tools.mjs` (Vinta canonical multi-vendor setup).
|
|
180
|
+
- `package.json#scripts.setup:ai-tools` or similar alias.
|
|
181
|
+
- Symlinks: `AGENTS.md → ai-tools/AGENTS.md`, `.claude/skills → ../ai-tools/skills`, etc.
|
|
182
|
+
|
|
183
|
+
**Plan/spec docs** — flag presence (full inventory comes later from [vinta-migrate-plans-specs](../vinta-migrate-plans-specs/SKILL.md)):
|
|
184
|
+
|
|
185
|
+
- `ai-plans/` directory contents.
|
|
186
|
+
- Loose `IMPLEMENTATION_PLAN.md`, `SPEC.md`, `RFC.md` at root or under `docs/`.
|
|
187
|
+
|
|
188
|
+
**PR / MR templates** — list every existing template file (case-insensitive). Used by `implement-plan` / `amend-plan` to scaffold the prs-context `# Description` so generated PRs match the project's existing convention. Search:
|
|
189
|
+
|
|
190
|
+
- GitHub:
|
|
191
|
+
- `.github/pull_request_template.md` (and `PULL_REQUEST_TEMPLATE.md` casing).
|
|
192
|
+
- `.github/PULL_REQUEST_TEMPLATE/*.md` (multi-template directory).
|
|
193
|
+
- `pull_request_template.md` and `PULL_REQUEST_TEMPLATE.md` at repo root.
|
|
194
|
+
- `docs/pull_request_template.md` and `docs/PULL_REQUEST_TEMPLATE.md`.
|
|
195
|
+
- GitLab:
|
|
196
|
+
- `.gitlab/merge_request_templates/*.md`.
|
|
197
|
+
- Bitbucket / others: typically configured server-side, no file convention. Note in inventory if user-supplied.
|
|
198
|
+
|
|
199
|
+
For each template found, capture:
|
|
200
|
+
- Path (relative to repo root).
|
|
201
|
+
- A one-line summary of the section structure (`## Summary`, `## Test plan`, `## Screenshots`, `<!-- comments -->`, etc.) so downstream skills know how to fill it.
|
|
202
|
+
|
|
203
|
+
Output goes into `existing_ai_artifacts.pr_templates` (see schema below). The full content is read on demand by `implement-plan` / `amend-plan` when drafting prs-context files; analyze-codebase only enumerates.
|
|
204
|
+
|
|
205
|
+
If anything is found, **do NOT overwrite** — the downstream skills will read this section and decide preserve / merge / migrate per artifact, gated on user confirmation in [vinta-bootstrap-ai-tools](../vinta-bootstrap-ai-tools/SKILL.md#e-existing-ai-artifacts-per-artifact-disposition)'s **Existing AI artifacts (per-artifact disposition)** interview group.
|
|
206
|
+
|
|
207
|
+
## Output: structured inventory
|
|
208
|
+
|
|
209
|
+
Return a single structured object (in conversation, as a tool result, or just printed for the user / orchestrator to read). Shape:
|
|
210
|
+
|
|
211
|
+
```yaml
|
|
212
|
+
repo:
|
|
213
|
+
name: <string>
|
|
214
|
+
default_branch: <string>
|
|
215
|
+
code_host: github | gitlab | bitbucket | self-hosted | unknown
|
|
216
|
+
existing_ai_artifacts:
|
|
217
|
+
instructions:
|
|
218
|
+
- { path: AGENTS.md, content: <full text> }
|
|
219
|
+
- { path: .github/copilot-instructions.md, content: <full text> }
|
|
220
|
+
- ...
|
|
221
|
+
skills:
|
|
222
|
+
- { path: .claude/skills/checkout-flow/SKILL.md, name: checkout-flow,
|
|
223
|
+
description: <from frontmatter>, classification: project-custom }
|
|
224
|
+
- { path: ai-tools/skills/plan-feature/SKILL.md, name: plan-feature,
|
|
225
|
+
description: <...>, classification: foundation-shape }
|
|
226
|
+
- ...
|
|
227
|
+
agents:
|
|
228
|
+
- { path: .claude/agents/migration-author.md, name: migration-author,
|
|
229
|
+
description: <...>, classification: stack-specialist }
|
|
230
|
+
- ...
|
|
231
|
+
setup:
|
|
232
|
+
- ai-tools/scripts/setup-ai-tools.mjs
|
|
233
|
+
- package.json#scripts.setup:ai-tools
|
|
234
|
+
pr_templates:
|
|
235
|
+
- { path: .github/pull_request_template.md, sections: [Summary, Test plan, Screenshots] }
|
|
236
|
+
- { path: .github/PULL_REQUEST_TEMPLATE/feature.md, sections: [...] }
|
|
237
|
+
plans_dir_present: true | false # full migration list comes from vinta-migrate-plans-specs
|
|
238
|
+
# downstream skills MUST read existing_ai_artifacts before drafting anything new.
|
|
239
|
+
|
|
240
|
+
languages:
|
|
241
|
+
- typescript | python | rust | go | ...
|
|
242
|
+
|
|
243
|
+
package_managers:
|
|
244
|
+
- pnpm | npm | yarn | poetry | pip | cargo | ...
|
|
245
|
+
|
|
246
|
+
frameworks:
|
|
247
|
+
# each with version range + path of signal file
|
|
248
|
+
- { name: react, version: "^19", signal: package.json }
|
|
249
|
+
- { name: medplum, version: "^5", signal: package.json }
|
|
250
|
+
- { name: django, version: "^5.1", signal: pyproject.toml }
|
|
251
|
+
- ...
|
|
252
|
+
|
|
253
|
+
monorepo:
|
|
254
|
+
type: turbo | pnpm-workspaces | nx | lerna | none
|
|
255
|
+
apps:
|
|
256
|
+
- { name: <string>, path: <string>, framework: <string>, port: <int|null> }
|
|
257
|
+
packages:
|
|
258
|
+
- { name: <string>, path: <string>, role: shared-lib | sdk | ... }
|
|
259
|
+
|
|
260
|
+
commands:
|
|
261
|
+
install: <e.g. pnpm install>
|
|
262
|
+
dev: <e.g. pnpm dev>
|
|
263
|
+
build: <e.g. pnpm build>
|
|
264
|
+
test_unit: <e.g. pnpm test>
|
|
265
|
+
test_e2e: <e.g. pnpm test:e2e>
|
|
266
|
+
lint: <e.g. pnpm lint>
|
|
267
|
+
format: <e.g. pnpm format>
|
|
268
|
+
typecheck: <e.g. pnpm build (tsc) — or null if no separate command>
|
|
269
|
+
|
|
270
|
+
tests:
|
|
271
|
+
unit_framework: vitest | jest | pytest | ...
|
|
272
|
+
unit_paths: [<glob>]
|
|
273
|
+
e2e_framework: playwright | cypress | none
|
|
274
|
+
e2e_paths: [<path>]
|
|
275
|
+
test_data_helpers: [<file>] # factories, mock clients, seed scripts
|
|
276
|
+
|
|
277
|
+
deploy:
|
|
278
|
+
targets: [vercel, aws-ecs, heroku, k8s, medplum-bots, npm-publish, ...]
|
|
279
|
+
envs: [staging, production, preview, dev-<handle>, ...]
|
|
280
|
+
ci_provider: github-actions | gitlab-ci | circleci | jenkins | none
|
|
281
|
+
workflow_files: [<path>]
|
|
282
|
+
triggers: [push:main, release, manual, ...]
|
|
283
|
+
manual_deploy_paths: [<script paths that humans run by hand, e.g. npx medplum post Bundle ...>]
|
|
284
|
+
|
|
285
|
+
env_model:
|
|
286
|
+
example_files: [<.env.example paths>]
|
|
287
|
+
vars_count: <int>
|
|
288
|
+
vite_envprefix: [<list>] | null
|
|
289
|
+
turbo_env_lists: { <task>: [<vars>] } | null
|
|
290
|
+
multi_tenancy:
|
|
291
|
+
pattern: row-level | medplum-compartment | partitioned | per-env-prefix | none
|
|
292
|
+
evidence: [<file:line refs>]
|
|
293
|
+
|
|
294
|
+
ci:
|
|
295
|
+
provider: github-actions | gitlab-ci | ...
|
|
296
|
+
jobs: [<name>]
|
|
297
|
+
pre_commit: husky | pre-commit | lefthook | none
|
|
298
|
+
|
|
299
|
+
docs:
|
|
300
|
+
readme: present | absent
|
|
301
|
+
docs_dir: <path or null>
|
|
302
|
+
adrs: <path or null>
|
|
303
|
+
|
|
304
|
+
stacks_matched:
|
|
305
|
+
# cross-ref to bootstrap-ai-tools/resources/stacks/<name>
|
|
306
|
+
- medplum
|
|
307
|
+
- typescript-monorepo
|
|
308
|
+
- django
|
|
309
|
+
- ...
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## Rules
|
|
313
|
+
|
|
314
|
+
- **Read, don't guess.** Every claim in the inventory cites a file. If you can't find the signal, the field is `null` or `unknown`, not a guess.
|
|
315
|
+
- **Don't run code.** No `pnpm install`, no `pytest`, no shell commands beyond `ls`, `cat`, `grep`, `git log`. Pure read.
|
|
316
|
+
- **Stop at the first match per section unless the section says otherwise.** A repo is a TypeScript repo if `package.json` + `tsconfig.json` exist; you don't need to grep every `.ts` file to confirm.
|
|
317
|
+
- **Existing AI artifacts override stack defaults.** If `AGENTS.md` exists, its content beats your detection. Surface conflicts (e.g. AGENTS.md says "use yarn" but lockfile is `pnpm-lock.yaml`) as findings, don't silently pick one.
|
|
318
|
+
- **Never use `§N` shorthand in any inventory output, summary, or downstream prompt.** Reference sections by their full heading name. `§N` references break when the source's section numbering changes.
|
|
319
|
+
|
|
320
|
+
## Pitfalls
|
|
321
|
+
|
|
322
|
+
- **Treating dev-deps as framework signals.** A repo with `playwright` in `devDependencies` doesn't necessarily have e2e tests — confirm by checking for `playwright.config.*` + `e2e/` or equivalent.
|
|
323
|
+
- **Inferring multi-tenancy from a `tenant_id` column on one model.** Check that the column is on the hot tables and that queries actually filter by it. A vestigial column is not a tenancy pattern.
|
|
324
|
+
- **Reporting `medplum-bots` as a deploy target without verifying.** `@medplum/core` in deps → SDK usage. A `bots/` directory + `deploy-bots.ts` script → actual bot deploy path. Different things.
|
|
325
|
+
- **Polyglot repos with mismatched conventions per language.** Report each language's conventions separately if they diverge (e.g. JS uses Biome, Python uses ruff). Don't average.
|