@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.
@@ -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.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"}