@defai.digital/ax-cli 1.1.1 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ax-cli/CUSTOM.md +97 -0
- package/package.json +12 -1
- package/packages/schemas/README.md +388 -0
- package/packages/schemas/dist/index.d.ts +14 -0
- package/packages/schemas/dist/index.d.ts.map +1 -0
- package/packages/schemas/dist/index.js +19 -0
- package/packages/schemas/dist/index.js.map +1 -0
- package/packages/schemas/dist/public/core/brand-types.d.ts +308 -0
- package/packages/schemas/dist/public/core/brand-types.d.ts.map +1 -0
- package/packages/schemas/dist/public/core/brand-types.js +243 -0
- package/packages/schemas/dist/public/core/brand-types.js.map +1 -0
- package/packages/schemas/dist/public/core/enums.d.ts +227 -0
- package/packages/schemas/dist/public/core/enums.d.ts.map +1 -0
- package/packages/schemas/dist/public/core/enums.js +222 -0
- package/packages/schemas/dist/public/core/enums.js.map +1 -0
- package/packages/schemas/dist/public/core/id-types.d.ts +286 -0
- package/packages/schemas/dist/public/core/id-types.d.ts.map +1 -0
- package/packages/schemas/dist/public/core/id-types.js +136 -0
- package/packages/schemas/dist/public/core/id-types.js.map +1 -0
- package/packages/schemas/package.json +54 -0
- package/packages/schemas/vitest.config.ts +29 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Custom Instructions for AX CLI
|
|
2
|
+
|
|
3
|
+
**Project**: @defai.digital/ax-cli v1.1.0
|
|
4
|
+
**Type**: cli
|
|
5
|
+
**Language**: TypeScript
|
|
6
|
+
**Stack**: React, Vitest, Zod, Commander, Ink, ESM, TypeScript
|
|
7
|
+
|
|
8
|
+
Generated: 11/19/2025, 2:45:34 AM
|
|
9
|
+
|
|
10
|
+
## Project Context
|
|
11
|
+
|
|
12
|
+
- **Entry Point**: `dist/index.js`
|
|
13
|
+
- **Package Manager**: npm
|
|
14
|
+
- **Module System**: ESM
|
|
15
|
+
- **CLI Tool**: This is a command-line interface application
|
|
16
|
+
|
|
17
|
+
## Code Conventions
|
|
18
|
+
|
|
19
|
+
### TypeScript
|
|
20
|
+
- Use explicit type annotations for function parameters and returns
|
|
21
|
+
- Prefer `const` and `let` over `var`
|
|
22
|
+
- Use strict mode (strict type checking enabled)
|
|
23
|
+
- **CRITICAL**: Always use `.js` extension in import statements (ESM requirement)
|
|
24
|
+
- Example: `import { foo } from "./bar.js"` (NOT "./bar" or "./bar.ts")
|
|
25
|
+
|
|
26
|
+
### ES Modules
|
|
27
|
+
- Use `import/export` syntax (not `require/module.exports`)
|
|
28
|
+
- Top-level await is supported
|
|
29
|
+
|
|
30
|
+
### Validation
|
|
31
|
+
- Use **zod** for runtime validation
|
|
32
|
+
- Validate all external inputs (API requests, file reads, user input)
|
|
33
|
+
- Use `.safeParse()` for error handling
|
|
34
|
+
|
|
35
|
+
## File Structure
|
|
36
|
+
|
|
37
|
+
- **Source Code**: `src/`
|
|
38
|
+
- **Tests**: `tests/`
|
|
39
|
+
- **Tools**: `src/tools/`
|
|
40
|
+
|
|
41
|
+
### Typical Structure
|
|
42
|
+
- Commands: `src/commands/`
|
|
43
|
+
- Utilities: `src/utils/`
|
|
44
|
+
- Types: `src/types/`
|
|
45
|
+
|
|
46
|
+
### Key Files
|
|
47
|
+
- `package.json`: Node.js package configuration
|
|
48
|
+
- `tsconfig.json`: TypeScript configuration
|
|
49
|
+
- `vitest.config.ts`: Vitest test configuration
|
|
50
|
+
- `.eslintrc.js`: ESLint configuration
|
|
51
|
+
- `README.md`: Project documentation
|
|
52
|
+
- `CLAUDE.md`: Claude-specific instructions
|
|
53
|
+
|
|
54
|
+
## Development Workflow
|
|
55
|
+
|
|
56
|
+
### Before Making Changes
|
|
57
|
+
1. Read relevant files with `view_file` to understand current implementation
|
|
58
|
+
2. Use `search` to find related code or patterns
|
|
59
|
+
3. Check existing tests to understand expected behavior
|
|
60
|
+
|
|
61
|
+
### Making Changes
|
|
62
|
+
1. **NEVER** use `create_file` on existing files - use `str_replace_editor` instead
|
|
63
|
+
2. Make focused, atomic changes
|
|
64
|
+
3. Preserve existing code style and patterns
|
|
65
|
+
4. Update related tests when modifying functionality
|
|
66
|
+
|
|
67
|
+
### After Changes
|
|
68
|
+
1. Run linter: `eslint . --ext .js,.jsx,.ts,.tsx`
|
|
69
|
+
2. Run tests: `vitest run`
|
|
70
|
+
3. Build: `tsc`
|
|
71
|
+
|
|
72
|
+
## Testing Guidelines
|
|
73
|
+
|
|
74
|
+
### Vitest
|
|
75
|
+
- Use `describe`, `it`, `expect` for test structure
|
|
76
|
+
- Place tests in `tests/` directory or `*.test.ts` files
|
|
77
|
+
- Test edge cases: empty inputs, null/undefined, boundary conditions
|
|
78
|
+
- Include Unicode and special character tests where relevant
|
|
79
|
+
|
|
80
|
+
### Coverage Requirements
|
|
81
|
+
- Aim for high test coverage (80%+ for new code)
|
|
82
|
+
- Always test error paths and edge cases
|
|
83
|
+
- Test both success and failure scenarios
|
|
84
|
+
|
|
85
|
+
## Available Scripts
|
|
86
|
+
|
|
87
|
+
- **Development**: `bun run src/index.ts`
|
|
88
|
+
- **Build**: `tsc`
|
|
89
|
+
- **Test**: `vitest run`
|
|
90
|
+
- **Lint**: `eslint . --ext .js,.jsx,.ts,.tsx`
|
|
91
|
+
|
|
92
|
+
### Quick Commands
|
|
93
|
+
```bash
|
|
94
|
+
npm run dev # Start development
|
|
95
|
+
npm test # Run tests
|
|
96
|
+
npm run build # Build for production
|
|
97
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@defai.digital/ax-cli",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "Enterprise-Class AI Command Line Interface - Primary support for GLM (General Language Model) with multi-provider AI orchestration powered by AutomatosX.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"workspaces": [
|
|
@@ -16,6 +16,17 @@
|
|
|
16
16
|
"bin": {
|
|
17
17
|
"ax-cli": "dist/index.js"
|
|
18
18
|
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"packages/schemas/dist",
|
|
22
|
+
"packages/schemas/package.json",
|
|
23
|
+
".ax-cli",
|
|
24
|
+
"LICENSE",
|
|
25
|
+
"README.md",
|
|
26
|
+
"automatosx.config.json",
|
|
27
|
+
"eslint.config.js",
|
|
28
|
+
"vitest.config.ts"
|
|
29
|
+
],
|
|
19
30
|
"scripts": {
|
|
20
31
|
"build": "tsc",
|
|
21
32
|
"build:bun": "bun run tsc",
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
# @ax-cli/schemas
|
|
2
|
+
|
|
3
|
+
Single Source of Truth (SSOT) Type System for AX CLI.
|
|
4
|
+
|
|
5
|
+
This package provides centralized Zod schemas, brand types, and enums for the entire ax-cli ecosystem, ensuring type safety and runtime validation across all modules.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @ax-cli/schemas
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## What is Single Source of Truth (SSOT)?
|
|
14
|
+
|
|
15
|
+
**單一真相來源(SSOT)**:所有模組 (API / MCP / Usage) 共享同一套型別定義契約。
|
|
16
|
+
|
|
17
|
+
Before @ax-cli/schemas, type definitions were scattered across the codebase, leading to:
|
|
18
|
+
- Duplicated schema definitions
|
|
19
|
+
- Inconsistent validation logic
|
|
20
|
+
- Type mismatches between modules
|
|
21
|
+
- High refactoring costs
|
|
22
|
+
|
|
23
|
+
### Architecture: Before vs. After
|
|
24
|
+
|
|
25
|
+
**BEFORE** (Distributed, Inconsistent):
|
|
26
|
+
```
|
|
27
|
+
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
28
|
+
│ API Handler │ │ MCP Adapter │ │ Usage Module │
|
|
29
|
+
├─────────────────┤ ├─────────────────┤ ├─────────────────┤
|
|
30
|
+
│ • Own schemas │ │ • Own schemas │ │ • Own schemas │
|
|
31
|
+
│ • Own types │ │ • Own types │ │ • Own types │
|
|
32
|
+
│ • Own enums │ │ • Own enums │ │ • Own enums │
|
|
33
|
+
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
34
|
+
❌ ❌ ❌
|
|
35
|
+
Duplicated Duplicated Duplicated
|
|
36
|
+
Diverges over time Diverges over time Diverges over time
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**AFTER** (Centralized, Consistent):
|
|
40
|
+
```
|
|
41
|
+
┌──────────────────────────────┐
|
|
42
|
+
│ @ax-cli/schemas │
|
|
43
|
+
├──────────────────────────────┤
|
|
44
|
+
│ • Brand Types (ID safety) │
|
|
45
|
+
│ • Centralized Enums │
|
|
46
|
+
│ • Zod Schemas (validation) │
|
|
47
|
+
│ • TypeScript Types │
|
|
48
|
+
└───────────────┬──────────────┘
|
|
49
|
+
│
|
|
50
|
+
┌─────────────┼─────────────┐
|
|
51
|
+
│ │ │
|
|
52
|
+
▼ ▼ ▼
|
|
53
|
+
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
|
54
|
+
│ API Handler │ │ MCP Adapter │ │Usage Module │
|
|
55
|
+
├─────────────┤ ├─────────────┤ ├─────────────┤
|
|
56
|
+
│ import {...}│ │ import {...}│ │ import {...}│
|
|
57
|
+
│ from │ │ from │ │ from │
|
|
58
|
+
│ '@ax-cli/ │ │ '@ax-cli/ │ │ '@ax-cli/ │
|
|
59
|
+
│ schemas' │ │ schemas' │ │ schemas' │
|
|
60
|
+
└─────────────┘ └─────────────┘ └─────────────┘
|
|
61
|
+
✅ ✅ ✅
|
|
62
|
+
Same contract Same contract Same contract
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Benefits
|
|
66
|
+
|
|
67
|
+
**1. Zero Divergence**
|
|
68
|
+
All modules consume the same source - when you update `ModelId` schema, all consumers get the update automatically.
|
|
69
|
+
|
|
70
|
+
**2. Reduced Refactoring Cost**
|
|
71
|
+
Change once in `@ax-cli/schemas`, propagate everywhere. No need to hunt down all duplicate definitions.
|
|
72
|
+
|
|
73
|
+
**3. Compile-Time Safety**
|
|
74
|
+
TypeScript catches type mismatches across module boundaries:
|
|
75
|
+
```typescript
|
|
76
|
+
// API handler expects ModelId
|
|
77
|
+
function handleRequest(model: ModelId) { ... }
|
|
78
|
+
|
|
79
|
+
// MCP adapter provides ModelId (same type!)
|
|
80
|
+
const mcpModel = ModelIdSchema.parse(input);
|
|
81
|
+
handleRequest(mcpModel); // ✅ Type-safe!
|
|
82
|
+
|
|
83
|
+
// Usage module also uses ModelId (same type!)
|
|
84
|
+
const usageModel = getModelFromDB(); // Returns ModelId
|
|
85
|
+
handleRequest(usageModel); // ✅ Type-safe!
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**4. Runtime Validation Consistency**
|
|
89
|
+
All modules use the same Zod schemas, ensuring consistent validation rules across API boundaries, MCP adapters, and usage tracking.
|
|
90
|
+
|
|
91
|
+
## Features
|
|
92
|
+
|
|
93
|
+
- **Brand Types**: Compile-time nominal typing for ID types to prevent mixing
|
|
94
|
+
- **Centralized Enums**: Single source of truth for all enum values
|
|
95
|
+
- **Zod Schemas**: Runtime validation with TypeScript type inference
|
|
96
|
+
- **Zero Runtime Cost**: Brand types are compile-time only (erased during compilation)
|
|
97
|
+
- **100% Test Coverage**: Comprehensive test suite (123 tests)
|
|
98
|
+
|
|
99
|
+
## Quick Start
|
|
100
|
+
|
|
101
|
+
### Using Brand Types
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
import { ModelId, ModelIdSchema } from '@ax-cli/schemas';
|
|
105
|
+
|
|
106
|
+
// ✅ Safe: Runtime validation + branding
|
|
107
|
+
const modelId = ModelIdSchema.parse('glm-4.6');
|
|
108
|
+
|
|
109
|
+
// ✅ Type-safe function signatures
|
|
110
|
+
function getModelConfig(id: ModelId) {
|
|
111
|
+
// TypeScript prevents passing other ID types here
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// ❌ Compile error: Can't pass plain string
|
|
115
|
+
getModelConfig('glm-4.6'); // TypeScript error!
|
|
116
|
+
|
|
117
|
+
// ✅ Correct: Parse first
|
|
118
|
+
getModelConfig(ModelIdSchema.parse('glm-4.6'));
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Using Enums
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
import { MessageRoleEnum, type MessageRole } from '@ax-cli/schemas';
|
|
125
|
+
|
|
126
|
+
// ✅ Use in Zod schemas
|
|
127
|
+
const MessageSchema = z.object({
|
|
128
|
+
role: MessageRoleEnum,
|
|
129
|
+
content: z.string(),
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// ✅ Use type for function signatures
|
|
133
|
+
function handleMessage(role: MessageRole, content: string) {
|
|
134
|
+
// role is typed as 'system' | 'user' | 'assistant' | 'tool'
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## API Reference
|
|
139
|
+
|
|
140
|
+
### Brand Types
|
|
141
|
+
|
|
142
|
+
All ID types are branded to prevent accidental mixing:
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
import {
|
|
146
|
+
ApiResponseId,
|
|
147
|
+
ToolCallId,
|
|
148
|
+
ModelId,
|
|
149
|
+
MCPServerId,
|
|
150
|
+
// ... and their corresponding schemas
|
|
151
|
+
ApiResponseIdSchema,
|
|
152
|
+
ToolCallIdSchema,
|
|
153
|
+
ModelIdSchema,
|
|
154
|
+
MCPServerIdSchema,
|
|
155
|
+
} from '@ax-cli/schemas';
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Available Brand Types:**
|
|
159
|
+
- `ApiResponseId` / `ApiResponseIdSchema`
|
|
160
|
+
- `ToolCallId` / `ToolCallIdSchema`
|
|
161
|
+
- `ModelId` / `ModelIdSchema`
|
|
162
|
+
- `TenantId` / `TenantIdSchema`
|
|
163
|
+
- `ApiKeyId` / `ApiKeyIdSchema`
|
|
164
|
+
- `MCPServerId` / `MCPServerIdSchema`
|
|
165
|
+
- `UsageRecordId` / `UsageRecordIdSchema`
|
|
166
|
+
- `PlanId` / `PlanIdSchema`
|
|
167
|
+
- `SessionId` / `SessionIdSchema`
|
|
168
|
+
- `RequestId` / `RequestIdSchema`
|
|
169
|
+
|
|
170
|
+
### Enums
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
import {
|
|
174
|
+
MessageRoleEnum,
|
|
175
|
+
FinishReasonEnum,
|
|
176
|
+
TransportEnum,
|
|
177
|
+
EditorCommandEnum,
|
|
178
|
+
} from '@ax-cli/schemas';
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**MessageRoleEnum**: `'system' | 'user' | 'assistant' | 'tool'`
|
|
182
|
+
|
|
183
|
+
**FinishReasonEnum**: `'stop' | 'length' | 'tool_calls' | 'content_filter'`
|
|
184
|
+
|
|
185
|
+
**TransportEnum**: `'stdio' | 'http' | 'sse'`
|
|
186
|
+
|
|
187
|
+
**EditorCommandEnum**: `'view' | 'create' | 'str_replace' | 'insert' | 'undo_edit'`
|
|
188
|
+
|
|
189
|
+
### Brand Type Utilities
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
import {
|
|
193
|
+
brand,
|
|
194
|
+
unbrand,
|
|
195
|
+
isBranded,
|
|
196
|
+
createBrandFactory,
|
|
197
|
+
type Brand,
|
|
198
|
+
} from '@ax-cli/schemas';
|
|
199
|
+
|
|
200
|
+
// Create custom brand types
|
|
201
|
+
const MyIdSchema = z.string().transform((val) => brand<string, 'MyId'>(val));
|
|
202
|
+
type MyId = Brand<string, 'MyId'>;
|
|
203
|
+
|
|
204
|
+
// Remove branding (use sparingly!)
|
|
205
|
+
const plainString = unbrand(brandedId);
|
|
206
|
+
|
|
207
|
+
// Check if value is branded
|
|
208
|
+
if (isBranded(value, 'ModelId')) {
|
|
209
|
+
// TypeScript knows this is a ModelId
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Security Best Practices
|
|
214
|
+
|
|
215
|
+
### CRITICAL: Brand Types Are Compile-Time Only
|
|
216
|
+
|
|
217
|
+
Brand types provide **ZERO runtime validation**. You **MUST** validate all external inputs at system boundaries.
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
// ❌ UNSAFE: No runtime validation!
|
|
221
|
+
const tenantId = userInput as TenantId; // DON'T DO THIS!
|
|
222
|
+
|
|
223
|
+
// ✅ SAFE: Validates with Zod
|
|
224
|
+
const result = TenantIdSchema.safeParse(userInput);
|
|
225
|
+
if (result.success) {
|
|
226
|
+
const tenantId = result.data; // Type-safe AND runtime-safe
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### When to Validate
|
|
231
|
+
|
|
232
|
+
Always validate at these boundaries:
|
|
233
|
+
|
|
234
|
+
- **API boundaries**: HTTP requests, MCP inputs
|
|
235
|
+
- **File I/O**: Reading configs, user settings
|
|
236
|
+
- **Database queries**: WHERE clauses with user IDs
|
|
237
|
+
- **Environment variables**
|
|
238
|
+
- **Command-line arguments**
|
|
239
|
+
|
|
240
|
+
### Safe Validation Pattern
|
|
241
|
+
|
|
242
|
+
```typescript
|
|
243
|
+
import { ModelIdSchema, type ModelId } from '@ax-cli/schemas';
|
|
244
|
+
|
|
245
|
+
function updateModel(modelName: string): void {
|
|
246
|
+
// ✅ Validate at boundary
|
|
247
|
+
const result = ModelIdSchema.safeParse(modelName);
|
|
248
|
+
|
|
249
|
+
if (!result.success) {
|
|
250
|
+
throw new Error(`Invalid model ID: ${result.error.message}`);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Now we have a branded ModelId
|
|
254
|
+
const modelId: ModelId = result.data;
|
|
255
|
+
|
|
256
|
+
// Use in type-safe functions
|
|
257
|
+
processModel(modelId);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function processModel(id: ModelId): void {
|
|
261
|
+
// TypeScript ensures only ModelId can be passed here
|
|
262
|
+
// No accidental mixing with other ID types!
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## Migration Guide
|
|
267
|
+
|
|
268
|
+
### Adding Brand Types to Existing Code
|
|
269
|
+
|
|
270
|
+
**Step 1**: Import the schema
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
import { ModelIdSchema } from '@ax-cli/schemas';
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
**Step 2**: Use `.parse()` at object creation boundaries
|
|
277
|
+
|
|
278
|
+
```typescript
|
|
279
|
+
// Before
|
|
280
|
+
const config = {
|
|
281
|
+
model: 'glm-4.6', // Plain string
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
// After
|
|
285
|
+
const config = {
|
|
286
|
+
model: ModelIdSchema.parse('glm-4.6'), // Branded ModelId
|
|
287
|
+
};
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**Step 3**: Update function signatures
|
|
291
|
+
|
|
292
|
+
```typescript
|
|
293
|
+
// Before
|
|
294
|
+
function getConfig(model: string) { }
|
|
295
|
+
|
|
296
|
+
// After
|
|
297
|
+
function getConfig(model: ModelId) { }
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
**Step 4**: Fix TypeScript errors by adding `.parse()` at call sites
|
|
301
|
+
|
|
302
|
+
```typescript
|
|
303
|
+
// Before
|
|
304
|
+
getConfig('glm-4.6'); // Now causes TypeScript error
|
|
305
|
+
|
|
306
|
+
// After
|
|
307
|
+
getConfig(ModelIdSchema.parse('glm-4.6')); // Type-safe!
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Default Values
|
|
311
|
+
|
|
312
|
+
For constants and defaults, parse at definition:
|
|
313
|
+
|
|
314
|
+
```typescript
|
|
315
|
+
import { ModelIdSchema } from '@ax-cli/schemas';
|
|
316
|
+
|
|
317
|
+
const DEFAULT_CONFIG = {
|
|
318
|
+
model: ModelIdSchema.parse('glm-4.6'),
|
|
319
|
+
// ... other fields
|
|
320
|
+
};
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
## Performance
|
|
324
|
+
|
|
325
|
+
- **Brand types**: Zero runtime cost (compile-time only)
|
|
326
|
+
- **Zod validation**: ~1-2μs per validation (negligible)
|
|
327
|
+
- **Test performance**: 123 tests in <20ms
|
|
328
|
+
|
|
329
|
+
## Testing
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
# Run tests
|
|
333
|
+
npm test
|
|
334
|
+
|
|
335
|
+
# Run tests in watch mode
|
|
336
|
+
npm run test:watch
|
|
337
|
+
|
|
338
|
+
# Type checking
|
|
339
|
+
npm run typecheck
|
|
340
|
+
|
|
341
|
+
# Build
|
|
342
|
+
npm run build
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
## Architecture
|
|
346
|
+
|
|
347
|
+
```
|
|
348
|
+
packages/schemas/
|
|
349
|
+
├── src/
|
|
350
|
+
│ ├── index.ts # Public API
|
|
351
|
+
│ ├── public/
|
|
352
|
+
│ │ └── core/
|
|
353
|
+
│ │ ├── brand-types.ts # Brand type utilities
|
|
354
|
+
│ │ ├── enums.ts # Centralized enums
|
|
355
|
+
│ │ └── id-types.ts # ID brand types
|
|
356
|
+
│ └── __tests__/
|
|
357
|
+
│ ├── brand-types.test.ts # 40 tests
|
|
358
|
+
│ ├── enums.test.ts # 31 tests
|
|
359
|
+
│ └── id-types.test.ts # 52 tests
|
|
360
|
+
└── dist/ # Compiled output
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
## Version
|
|
364
|
+
|
|
365
|
+
Current version: 0.1.0
|
|
366
|
+
|
|
367
|
+
## License
|
|
368
|
+
|
|
369
|
+
MIT
|
|
370
|
+
|
|
371
|
+
## Related Packages
|
|
372
|
+
|
|
373
|
+
- `@ax-cli/schemas` (this package): Type system foundation
|
|
374
|
+
- `ax-cli`: Main CLI application
|
|
375
|
+
|
|
376
|
+
## Contributing
|
|
377
|
+
|
|
378
|
+
When adding new brand types or enums:
|
|
379
|
+
|
|
380
|
+
1. Add implementation to `src/public/core/`
|
|
381
|
+
2. Export from `src/index.ts`
|
|
382
|
+
3. Add comprehensive tests
|
|
383
|
+
4. Update this README
|
|
384
|
+
5. Run `npm test` and `npm run typecheck`
|
|
385
|
+
|
|
386
|
+
## Support
|
|
387
|
+
|
|
388
|
+
For issues and questions, please open an issue in the main ax-cli repository.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ax-cli/schemas - Single Source of Truth Type System
|
|
3
|
+
*
|
|
4
|
+
* This package provides centralized Zod schemas, brand types, and enums
|
|
5
|
+
* for the entire ax-cli ecosystem.
|
|
6
|
+
*
|
|
7
|
+
* SECURITY: All exports are controlled. Internal helpers are not exposed.
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
export { brand, unbrand, isBranded, createBrandFactory, type __brand, type Brand, type ExtractBrand, type ExtractBase, } from './public/core/brand-types.js';
|
|
12
|
+
export { ApiResponseId, ToolCallId, ToolCallIdSchema, ModelId, ModelIdSchema, TenantId, ApiKeyId, MCPServerId, MCPServerIdSchema, UsageRecordId, PlanId, SessionId, RequestId, type ApiResponseId as ApiResponseIdType, type ToolCallId as ToolCallIdType, type ModelId as ModelIdType, type TenantId as TenantIdType, type ApiKeyId as ApiKeyIdType, type MCPServerId as MCPServerIdType, type UsageRecordId as UsageRecordIdType, type PlanId as PlanIdType, type SessionId as SessionIdType, type RequestId as RequestIdType, } from './public/core/id-types.js';
|
|
13
|
+
export { MessageRoleEnum, FinishReasonEnum, TransportEnum, EditorCommandEnum, type MessageRole, type FinishReason, type Transport, type EditorCommand, } from './public/core/enums.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EACL,KAAK,EACL,OAAO,EACP,SAAS,EACT,kBAAkB,EAClB,KAAK,OAAO,EACZ,KAAK,KAAK,EACV,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,OAAO,EACP,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,MAAM,EACN,SAAS,EACT,SAAS,EACT,KAAK,aAAa,IAAI,iBAAiB,EACvC,KAAK,UAAU,IAAI,cAAc,EACjC,KAAK,OAAO,IAAI,WAAW,EAC3B,KAAK,QAAQ,IAAI,YAAY,EAC7B,KAAK,QAAQ,IAAI,YAAY,EAC7B,KAAK,WAAW,IAAI,eAAe,EACnC,KAAK,aAAa,IAAI,iBAAiB,EACvC,KAAK,MAAM,IAAI,UAAU,EACzB,KAAK,SAAS,IAAI,aAAa,EAC/B,KAAK,SAAS,IAAI,aAAa,GAChC,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,aAAa,GACnB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ax-cli/schemas - Single Source of Truth Type System
|
|
3
|
+
*
|
|
4
|
+
* This package provides centralized Zod schemas, brand types, and enums
|
|
5
|
+
* for the entire ax-cli ecosystem.
|
|
6
|
+
*
|
|
7
|
+
* SECURITY: All exports are controlled. Internal helpers are not exposed.
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
// Core brand type utilities
|
|
12
|
+
export { brand, unbrand, isBranded, createBrandFactory, } from './public/core/brand-types.js';
|
|
13
|
+
// ID Brand Types
|
|
14
|
+
export { ApiResponseId, ToolCallId, ToolCallIdSchema, ModelId, ModelIdSchema, TenantId, ApiKeyId, MCPServerId, MCPServerIdSchema, UsageRecordId, PlanId, SessionId, RequestId, } from './public/core/id-types.js';
|
|
15
|
+
// Centralized Enums
|
|
16
|
+
export { MessageRoleEnum, FinishReasonEnum, TransportEnum, EditorCommandEnum, } from './public/core/enums.js';
|
|
17
|
+
// Additional exports will be added as we implement them:
|
|
18
|
+
// - Domain schemas (Usage, API, MCP)
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,4BAA4B;AAC5B,OAAO,EACL,KAAK,EACL,OAAO,EACP,SAAS,EACT,kBAAkB,GAKnB,MAAM,8BAA8B,CAAC;AAEtC,iBAAiB;AACjB,OAAO,EACL,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,OAAO,EACP,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,MAAM,EACN,SAAS,EACT,SAAS,GAWV,MAAM,2BAA2B,CAAC;AAEnC,oBAAoB;AACpB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,iBAAiB,GAKlB,MAAM,wBAAwB,CAAC;AAEhC,yDAAyD;AACzD,qCAAqC"}
|