Files
2026-07-13 12:30:54 +08:00

259 lines
5.1 KiB
Markdown

# Tianji CLI
Command-line tool for developing and deploying Tianji Workers.
## Installation
### From Source (Development)
```bash
# In the Tianji monorepo root
pnpm install
cd packages/cli
pnpm build
# Link globally for development
pnpm link --global
```
### From NPM (When Published)
```bash
npm install -g tianji-cli
# or
pnpm add -g tianji-cli
```
## Usage
### Login to Tianji
Before deploying workers, you need to login to your Tianji instance:
```bash
tianji login
```
You will be prompted for:
- **Server URL**: Your Tianji server URL (e.g., `https://tianji.example.com`)
- **Workspace ID**: Your workspace ID (found in Tianji dashboard)
- **API Key**: Your API key (generate from Tianji settings)
The credentials are saved to `~/.config/tianji/config.json`.
### Create a New Worker Project
```bash
# Create in a new directory
tianji worker init my-worker
# Or initialize in current directory
mkdir my-worker && cd my-worker
tianji worker init
```
This creates a new project with:
- `src/index.ts`: Worker handler function
- `vite.config.ts`: Build configuration
- `package.json`: Dependencies
- `.tianjirc`: Project configuration
### Develop Your Worker
Edit `src/index.ts` to implement your worker logic:
```typescript
export default async function handler(payload: any, context: any) {
// Your worker logic here
return {
success: true,
message: 'Hello from Tianji Worker!',
data: payload,
};
}
```
### Build and Deploy
```bash
# Login first (if not already logged in)
tianji login
# Install dependencies (first time only)
npm install
# Build the worker
npm run build
# Deploy to Tianji
tianji worker deploy
```
The worker will be built using Vite and deployed to your Tianji instance. After deployment, you'll receive a URL to access your worker.
## Project Structure
```
my-worker/
├── src/
│ └── index.ts # Worker entry point
├── dist/ # Built output (generated)
├── package.json # Project dependencies
├── vite.config.ts # Vite build configuration
├── tsconfig.json # TypeScript configuration
├── .tianjirc # Tianji project config
└── README.md # Project documentation
```
## Worker API
Your worker receives two parameters:
### `payload`
The request payload containing query parameters and request body merged together.
### `context`
The request context with the following structure:
```typescript
interface RequestContext {
type: 'http' | 'cron';
request?: {
method: string;
url: string;
headers: Record<string, string>;
};
}
```
- For HTTP requests: `context.type === 'http'` and `context.request` contains request details
- For cron-triggered workers: `context.type === 'cron'`
## Configuration Files
### `.tianjirc`
Project-level configuration stored in your worker project:
```json
{
"name": "my-worker",
"workerId": "clxxx..." // Auto-generated after first deployment
}
```
### `~/.config/tianji/config.json`
Global configuration for CLI authentication:
```json
{
"serverUrl": "https://tianji.example.com",
"workspaceId": "clxxx...",
"apiKey": "your-api-key"
}
```
## Commands
### `tianji login`
Login to Tianji and save credentials.
### `tianji worker init [project-name]`
Create a new Tianji Worker project.
**Options:**
- `project-name`: Optional. Name of the project directory to create.
### `tianji worker deploy`
Build and deploy the current worker project to Tianji.
Must be run from a worker project directory (containing `.tianjirc`).
## Examples
### Simple Echo Worker
```typescript
export default async function handler(payload: any) {
return {
echo: payload,
timestamp: new Date().toISOString(),
};
}
```
### HTTP Method-Based Worker
```typescript
export default async function handler(payload: any, context: any) {
if (context.type !== 'http') {
return { error: 'Only HTTP requests supported' };
}
const method = context.request?.method;
switch (method) {
case 'GET':
return { message: 'Hello GET' };
case 'POST':
return { message: 'Data received', data: payload };
default:
return { error: 'Method not supported' };
}
}
```
### Cron Worker
```typescript
export default async function handler(payload: any, context: any) {
if (context.type === 'cron') {
// Perform scheduled task
console.log('Cron job executed at:', new Date().toISOString());
return { success: true };
}
return { error: 'This worker only runs on schedule' };
}
```
## Troubleshooting
### "Not logged in" Error
Run `tianji login` to authenticate.
### ".tianjirc not found" Error
Make sure you're in a worker project directory. Run `tianji worker init` to create a new project.
### "Build failed" Error
Ensure all dependencies are installed:
```bash
npm install
```
Check that your `src/index.ts` has a default export function.
### "Deployment failed" Error
- Verify your credentials are correct (try logging in again)
- Check that your API key has the necessary permissions
- Ensure your server URL is accessible
## Learn More
- [Tianji Documentation](https://tianji.dev/docs)
- [Worker Documentation](https://tianji.dev/docs/dev)
## License
MIT