# CLI reference Install `@openmirai/typeforge` from [npmjs](https://www.npmjs.com/package/@openmirai/typeforge). Add a script so the binary resolves from `node_modules/.bin`: ```json { "scripts": { "generate:types": "typeforge generate --all" } } ``` ## Install | Package manager | Command | | --- | --- | | npm | `npm install --save-dev @openmirai/typeforge` | | pnpm | `pnpm add -D @openmirai/typeforge` | | yarn | `yarn add -D @openmirai/typeforge` | | bun | `bun add -d @openmirai/typeforge` | ## Commands × package managers Replace `` with the flags for that subcommand (see below). | Subcommand | npm | pnpm | yarn | bun | | --- | --- | --- | --- | --- | | `init ` | `npx typeforge init ` | `pnpm exec typeforge init ` | `yarn typeforge init ` | `bunx typeforge init ` | | `generate ` | `npx typeforge generate ` | `pnpm exec typeforge generate ` | `yarn typeforge generate ` | `bunx typeforge generate ` | | `check ` | `npx typeforge check ` | `pnpm exec typeforge check ` | `yarn typeforge check ` | `bunx typeforge check ` | | `accept-base ` | `npx typeforge accept-base ` | `pnpm exec typeforge accept-base ` | `yarn typeforge accept-base ` | `bunx typeforge accept-base ` | Recommended day-to-day: `npm run generate:types` (or the equivalent for your package manager). ## Subcommands ### `init` ```bash typeforge init --source --client axios|fetch|custom [--layout monolith|packages] ``` Creates `http.ts`, `known-types.ts`, `source.ts`, and `generated/` under `apiRoot`. ### `generate` ```bash typeforge generate --source [--source ...] [--spec ] [--check] [--accept-base] typeforge generate --all [--check] [--accept-base] ``` `--all` walks every directory under `apiRoot` that contains `source.ts`. ### `check` Shorthand for `generate --check`. Exits with code 1 when generated files would change. ### `accept-base` Updates `generated/base.ts` and patches `models.ts` `BaseResponse` to match the spec envelope. ## Common flags | Flag | Applies to | Meaning | | --- | --- | --- | | `--source ` | init, generate, check, accept-base | Source directory name under `apiRoot` | | `--all` | generate | Generate every source | | `--spec ` | generate, check, accept-base | Override spec path for this run | | `--check` | generate | Drift check only; do not write files | | `--accept-base` | generate | Accept envelope base type drift | | `--client axios\|fetch\|custom` | init | HTTP adapter template | | `--layout monolith\|packages` | init | Default `apiRoot` layout | `--check` and `--accept-base` cannot be used together. ## Spec resolution order 1. `--spec ` 2. Environment variable `OPENAPI_SPEC_` (key uppercased, `-` → `_`) 3. `spec` field in `//source.ts` 4. `typeforge.local.json` (gitignored) 5. `//spec.json` snapshot ## Type-safe `source.ts` ```ts import { defineSourceConfig } from "@openmirai/typeforge"; export default defineSourceConfig({ spec: "./specs/acme.json", pathPrefix: "/api/acme/v3", generationMode: "authoritative", naming: "path", }); ``` The CLI reads `source.ts` at generate time (including `defineSourceConfig(...)` wrappers). Use synthetic paths like `/api/acme/v3` in examples and tests.