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