ai-project-bootstrap
Docs / Contributing / Adding a technology

Adding a technology

Create one folder. Change no code. That constraint is the whole design.

technologies/<id>/
  manifest.json          required — everything else is optional
  setup.md               → a section in docs/setup.md
  ios.md  android.md     → platform subsections of that section
  architecture.md        → a section in docs/architecture.md
  cursor-rule.mdc        → .cursor/rules/<id>.mdc, and every other AI tool
  claude-skill.md        → .claude/skills/<id>/SKILL.md
  env.md                 → .env.example
  folders.json           → project folders
  package.fragment.json  → package.json
  dependencies.json      → dependencies + install commands
  detect.json            → signals analyze uses to guess this technology
  prompts/*.md           → prompts/
  checklists/*.md        → checklists/
  templates/**           → mirrored into the project root

A missing file means the module contributes nothing to that builder. Nothing is required except the manifest.

The manifest

{
  "id": "stripe",
  "name": "Stripe",
  "category": "payments",
  "description": "Card payments and subscriptions.",
  "requires": [],
  "conflicts": [],
  "dependencies": [],
  "priority": 45,
  "pricing": {
    "model": "usage-based",
    "notes": "No monthly fee. 2.9% + 30¢ per transaction. Checked 2026-08-07.",
    "url": "https://stripe.com/pricing"
  }
}
→category must exist in config/categories.json. A category with no installed modules is skipped rather than shown empty.
→priority controls order within a category, lower first — it keeps the technology table and the wizard's options stable and intentional as the catalogue grows.
→requires are hard prerequisites, pulled in transitively. conflicts are mutual exclusions. dependencies are soft edges affecting order only.

Conventions inside a module

→claude-skill.md is plain content with no frontmatter — the builder synthesises it from the manifest and the Cursor rule's globs.
→env.md documents variables in a markdown table with Key, Required, Description and Example columns. Prose around the table is ignored.
→architecture.md is rendered verbatim, so a fenced mermaid block shows up exactly as written. There is no separate diagram mechanism to learn.
→detect.json is only needed when dependencies.json has no npm package that uniquely identifies the technology — a CI config, a non-JS framework.
→dependencies.json and package.fragment.json may be templated: they are parsed after rendering, so a module can vary by what else was selected.
→templates/ has three reserved subtrees: root/, github/ and hygiene/. Everything else mirrors to the project root at its own path.
→_name in a template path becomes .name on output — npm rewrites a packaged .gitignore, so sources store _gitignore.
The test suite finds your module on its own

tests/moduleContract.test.ts iterates the directory, so a malformed module fails CI without anyone writing a test for it. Run pnpm docs:tech-table if you added a new category.

On this page
The manifestConventions inside a module
Source: CONTRIBUTING.md §Adding a technology