add-endpoint
Add new HTTP endpoints to Catalyst-Relay server. Use when creating routes, API endpoints, or HTTP handlers.
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
Adding HTTP Endpoints
When to Use
- Creating a new HTTP route
- Adding an API endpoint
- Wiring a new handler to the Hono app
Route File Pattern
Each endpoint gets its own file with colocated schema, types, and handler.
Location: src/server/routes/{category}/{endpoint}.ts
// src/server/routes/auth/login.ts
import { z } from 'zod';
import type { Context } from 'hono';
import type { ISessionManager } from '../types';
// 1. Request schema (colocated)
export const loginRequestSchema = z.object({
url: z.string().url(),
client: z.string().min(1).max(3),
auth: authConfigSchema
});
// 2. Response type (colocated)
export interface LoginResponse {
sessionId: string;
username: string;
expiresAt: number;
}
// 3. Single handler export (factory pattern)
export function loginHandler(sessionManager: ISessionManager) {
return async (c: Context) => {
const body = await c.req.json();
const validation = loginRequestSchema.safeParse(body);
if (!validation.success) {
return c.json({
success: false as const,
error: 'Invalid request',
code: 'VALIDATION_ERROR'
}, 400);
}
// ... implementation ...
return c.json({ success: true as const, data: response });
};
}
Wiring Routes
Register routes in src/server/routes/index.ts:
import { loginHandler } from './auth/login';
export function registerRoutes(app: Hono, sessionManager: ISessionManager) {
// Auth routes
app.post('/login', loginHandler(sessionManager));
// Add your new route here
}
Response Format
All endpoints use a consistent envelope:
// Success
return c.json({ success: true as const, data: result });
// Error
return c.json({
success: false as const,
error: 'Human-readable message',
code: 'MACHINE_CODE'
}, statusCode);
Use as const for literal types in discriminated unions.
Library Mode Mapping
If the endpoint wraps core functionality, add a method to ADTClient:
| HTTP Endpoint | Library Method |
|---|---|
POST /login |
client.login() |
GET /packages |
client.getPackages() |
POST /objects/read |
client.read(objects) |
Documentation Requirements
Create endpoint docs in docs/endpoints/{category}.md.
Required structure:
- Title and description
-
## SectionsTOC with anchor links - Per-endpoint:
- Description paragraph
- Request table (Method, Path, Auth Required)
- Request Body table (Field, Type, Required, Description)
- Response table (Field, Type, Description)
- Example request/response JSON
- Error codes table
- Use cases list
- Library Usage section
See docs/endpoints/auth.md for a complete example.
Checklist
- [ ] Create route file in src/server/routes/{category}/
- [ ] Add Zod schema for request validation
- [ ] Add response type interface
- [ ] Export handler function (factory pattern)
- [ ] Wire route in src/server/routes/index.ts
- [ ] Add library method to ADTClient if applicable
- [ ] Document in docs/endpoints/{category}.md
- [ ] Run typecheck: bun run typecheck
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-01-28
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!