Install the CLI globally:
1
2
npm install -g @streetjs/cli
street --version # street v1.0.3
street create <project-name>Scaffolds a complete, production-ready Street project.
1
2
3
street create my-api
street create my-api --install # auto-install npm dependencies
street create my-api -i # shorthand
Generated structure:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
my-api/
├── src/
│ ├── main.ts
│ ├── controllers/
│ │ ├── example.controller.ts
│ │ └── health.controller.ts
│ ├── services/
│ │ └── example.service.ts
│ ├── repositories/
│ │ └── example.repository.ts
│ ├── middleware/
│ │ └── auth.ts
│ └── gateways/
│ └── chat.gateway.ts
├── tests/
│ └── integration.test.ts
├── migrations/
├── uploads/
├── docker-init/
│ └── 001_enable_pgcrypto.sql
├── package.json
├── tsconfig.json
├── street.config.ts
├── Dockerfile
├── docker-compose.yml
├── .env.example
├── .gitignore
└── README.md
The generated project includes:
NodeNext ESMstreet devStarts the development server with hot-reload.
1
2
3
4
5
cd my-api
street dev
# [street] Starting development server...
# [street] Listening on http://0.0.0.0:3000
# [street] Watching for file changes...
src/ for changes (300ms debounce)SIGTERM/SIGINT for clean shutdownstreet buildCompiles TypeScript for production.
1
2
3
4
5
cd my-api
street build
# [street] Building project for production...
# [street] Build completed in 2.1s
# [street] Output: ./dist/
Uses the project’s tsconfig.json. Output goes to ./dist/.
street startStarts the production server from compiled output.
1
2
3
4
5
cd my-api
street build
street start
# [street] Starting production server...
# [street] Node env: production
Requires dist/main.js to exist. Run street build first.
street testRuns the project’s test suite using Node’s built-in test runner.
1
2
cd my-api
street test
*.test.js files in dist/tests/node --teststreet generate <type> <name>Generates a controller, service, or repository with full boilerplate.
1
2
3
4
5
6
7
8
street generate controller users
# [street] Generated controller: src/controllers/users.controller.ts
street generate service users
# [street] Generated service: src/services/users.service.ts
street generate repository users
# [street] Generated repository: src/repositories/users.repository.ts
Valid types: controller, service, repository
Name conventions:
| Input | Class | File | Route (controller) |
|---|---|---|---|
users |
Users |
users |
/api/users |
blog-post |
BlogPost |
blog-post |
/api/blog-posts |
user_profile |
UserProfile |
user-profile |
/api/user-profiles |
category |
Category |
category |
/api/categories |
Generated controllers include full CRUD endpoints (GET /, GET /:id, POST /, PUT /:id, DELETE /:id) with @ApiOperation annotations.
street migrate:create <name>Creates a timestamped SQL migration file pair.
1
2
3
street migrate:create create_users_table
# [street] Created migration: 20260101120000_create_users_table.sql
# [street] Created rollback: 20260101120000_create_users_table.rollback.sql
Files are created in migrations/ with a UTC timestamp prefix for deterministic ordering.
Generated up migration:
1
2
3
4
5
6
7
8
9
10
11
-- Migration: create_users_table
-- Created: 2026-01-01T12:00:00.000Z
-- Description:
-- Write your SQL migration here.
-- Example:
-- CREATE TABLE create_users_table (
-- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
-- updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
-- );
street migrate:runRuns all pending SQL migrations in order.
1
2
3
cd my-api
street build
street migrate:run
street_migrations table.sql files in timestamp orderRequired environment variables:
1
2
3
4
5
PG_HOST=localhost
PG_PORT=5432
PG_DATABASE=mydb
PG_USER=postgres
PG_PASSWORD=secret
1
2
3
4
street --version # street v1.0.3
street --help # show all commands
street -v # shorthand version
street -h # shorthand help
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# .github/workflows/deploy.yml
- name: Build
run: npm run build
- name: Run migrations
run: street migrate:run
env:
PG_HOST: $
PG_DATABASE: $
PG_USER: $
PG_PASSWORD: $
- name: Start server
run: street start &
1
2
3
4
5
6
7
#!/bin/sh
# docker-entrypoint.sh
set -e
echo "Running migrations..."
street migrate:run
echo "Starting server..."
exec street start