An agent composition framework for Claude Code. Compose specialized subagents from atomic skills: pick a stack, choose your skills from an interactive grid, and compile subagents that carry exactly the skills you selected.
npx agents-inc initEverything the CLI can do — the full command reference, the stack list, the skill catalog and the guides — lives in packages/cli/README.md. This file describes the repository itself.
/
├── apps/
│ ├── editor/ the editor (Vite + React, deployed to Cloudflare)
│ └── server/ the API worker (Hono)
├── packages/
│ ├── cli/ the published CLI — this is @agents-inc/cli on npm
│ ├── matrix/ the skill catalog the web app reads
│ ├── ui/ the design system shared by the web app
│ ├── eslint-config/ shared configs
│ ├── prettier-config/
│ ├── typescript-config/
│ └── vitest-config/
├── docs/
│ ├── cli/ the CLI's product documentation
│ └── web/ the web planning notes
├── .github/workflows/
└── .husky/
packages/cli is the only workspace that publishes to npm. Its README.md is the one npm shows, which is why the product documentation lives there rather than here.
packages/cli/alias/ holds the tiny agents-inc alias package that makes npx agents-inc work. It is deliberately outside the packages/* workspace glob: it is published by hand, in lockstep with the CLI.
The repository uses bun and Turborepo. One install covers every workspace:
bun installThe web app then needs one variable before it will build. apps/editor/src/env.schema.ts supplies a localhost default for bun dev, but deliberately withholds it in production mode — a deployed bundle silently pointing at localhost is the exact failure it exists to prevent — and vite build is a production build. So copy the template once:
cp apps/editor/.env.example apps/editor/.envWithout it bun run build stops at editor#build with Invalid environment: VITE_API_URL. CI never hits this: the check job does not build the web app, and the deploy job sets VITE_API_URL to the real API explicitly.
The root scripts fan out through turbo to whichever workspaces define the matching task, so bun run build builds the CLI, the web app and the worker in dependency order:
| Script | What it does |
|---|---|
bun run build |
Builds every workspace |
bun run dev |
Starts every workspace's dev task |
bun run lint |
Lints every workspace |
bun run typecheck |
Typechecks every workspace |
bun run test |
Runs the unit tests |
bun run test:e2e |
Runs the end-to-end suites |
bun run deploy |
Deploys the Cloudflare workspaces |
bun run format |
Formats the repo (one run from the root, not through turbo) |
bun run deps:check |
Reports dependency version mismatches |
Two of those do not fan out, on purpose, and the reasons are written down where they apply:
formatruns once from the root because Prettier reads.prettierignoreonly from its working directory. See the//formatnote inpackage.json.- Formatting inside
packages/cliis still the CLI's own — 100 columns, semicolons, double quotes. Prettier picks the nearest config walking up from each file, sopackages/cli/prettier.config.mjswins there and the root config never touches it.
bun run deps:check will not complain that the CLI and the web app disagree on React, Vitest, TypeScript and ESLint. That split is deliberate for now and is excluded in .syncpackrc.cjs; unifying the versions is REPO-06 in todo/repo.md.
- todo/ — everything still outstanding, one tracker per workspace: repo.md for this repository itself, then
cli.md,editor.md,www.mdandserver.md - packages/cli/README.md — the CLI: commands, stacks, skills, subagents
- docs/cli/index.md — the CLI's full documentation
MIT