@defai.digital/automatosx 5.0.1

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.
Files changed (77) hide show
  1. package/CHANGELOG.md +2877 -0
  2. package/CONTRIBUTING.md +357 -0
  3. package/FAQ.md +604 -0
  4. package/FIXES.md +277 -0
  5. package/LICENSE +190 -0
  6. package/README.md +603 -0
  7. package/REVIEW-REPORT.md +278 -0
  8. package/TROUBLESHOOTING.md +612 -0
  9. package/automatosx.config.json +219 -0
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.js +11806 -0
  12. package/dist/index.js.map +1 -0
  13. package/docs/README.md +227 -0
  14. package/docs/guide/core-concepts.md +568 -0
  15. package/docs/guide/installation.md +406 -0
  16. package/docs/guide/introduction.md +199 -0
  17. package/docs/guide/quick-start.md +387 -0
  18. package/docs/index.md +132 -0
  19. package/docs/reference/cli-commands.md +894 -0
  20. package/docs/tutorials/first-agent.md +691 -0
  21. package/docs/tutorials/memory-management.md +785 -0
  22. package/examples/AGENTS_INFO.md +293 -0
  23. package/examples/README.md +434 -0
  24. package/examples/abilities/best-practices.md +102 -0
  25. package/examples/abilities/code-generation.md +1035 -0
  26. package/examples/abilities/code-review.md +42 -0
  27. package/examples/abilities/content-creation.md +97 -0
  28. package/examples/abilities/debugging.md +43 -0
  29. package/examples/abilities/documentation.md +54 -0
  30. package/examples/abilities/error-analysis.md +107 -0
  31. package/examples/abilities/general-assistance.md +26 -0
  32. package/examples/abilities/our-architecture-decisions.md +242 -0
  33. package/examples/abilities/our-code-review-checklist.md +217 -0
  34. package/examples/abilities/our-coding-standards.md +389 -0
  35. package/examples/abilities/our-project-structure.md +502 -0
  36. package/examples/abilities/performance-analysis.md +56 -0
  37. package/examples/abilities/problem-solving.md +50 -0
  38. package/examples/abilities/refactoring.md +49 -0
  39. package/examples/abilities/security-audit.md +65 -0
  40. package/examples/abilities/task-planning.md +65 -0
  41. package/examples/abilities/technical-writing.md +77 -0
  42. package/examples/abilities/testing.md +47 -0
  43. package/examples/abilities/troubleshooting.md +80 -0
  44. package/examples/agents/assistant.yaml +45 -0
  45. package/examples/agents/backend.yaml +60 -0
  46. package/examples/agents/ceo.yaml +47 -0
  47. package/examples/agents/coder.yaml +388 -0
  48. package/examples/agents/cto.yaml +47 -0
  49. package/examples/agents/data.yaml +47 -0
  50. package/examples/agents/debugger.yaml +59 -0
  51. package/examples/agents/design.yaml +46 -0
  52. package/examples/agents/devops.yaml +47 -0
  53. package/examples/agents/frontend.yaml +61 -0
  54. package/examples/agents/product.yaml +47 -0
  55. package/examples/agents/quality.yaml +47 -0
  56. package/examples/agents/reviewer.yaml +49 -0
  57. package/examples/agents/security.yaml +47 -0
  58. package/examples/agents/writer.yaml +66 -0
  59. package/examples/claude/commands/ax:agent.md +37 -0
  60. package/examples/claude/commands/ax:clear.md +22 -0
  61. package/examples/claude/commands/ax:init.md +25 -0
  62. package/examples/claude/commands/ax:list.md +19 -0
  63. package/examples/claude/commands/ax:memory.md +25 -0
  64. package/examples/claude/commands/ax:status.md +24 -0
  65. package/examples/claude/commands/ax:update.md +28 -0
  66. package/examples/claude/mcp/automatosx.json +74 -0
  67. package/examples/templates/analyst.yaml +60 -0
  68. package/examples/templates/basic-agent.yaml +28 -0
  69. package/examples/templates/designer.yaml +69 -0
  70. package/examples/templates/developer.yaml +60 -0
  71. package/examples/templates/qa-specialist.yaml +71 -0
  72. package/examples/use-cases/01-web-app-development.md +374 -0
  73. package/package.json +86 -0
  74. package/scripts/check-release.js +128 -0
  75. package/scripts/real-provider-test.sh +357 -0
  76. package/scripts/smoke-test.sh +286 -0
  77. package/tsup.config.ts +16 -0
@@ -0,0 +1,217 @@
1
+ # Our Code Review Checklist - AutomatosX v4
2
+
3
+ > Code review checklist for AutomatosX team
4
+
5
+ ## Before Submitting PR
6
+
7
+ ### Code Quality
8
+
9
+ - [ ] **No `any` types** - All types explicit, use `unknown` if truly unknown
10
+ - [ ] **ESM imports** - All imports have `.js` extension
11
+ - [ ] **Function size** - Functions <50 lines, extract helpers if needed
12
+ - [ ] **Naming** - Clear, descriptive names (no abbreviations)
13
+ - [ ] **Comments** - JSDoc for public APIs, inline for complex logic
14
+
15
+ ### Error Handling
16
+
17
+ - [ ] **Custom errors** - Use AgentValidationError, PathError, etc. from `utils/errors.ts`
18
+ - [ ] **Error context** - Include relevant context in error messages
19
+ - [ ] **Try-catch blocks** - Catch and re-throw with context where appropriate
20
+ - [ ] **No silent failures** - All errors logged or thrown
21
+
22
+ ### Security
23
+
24
+ - [ ] **Path validation** - All file access through PathResolver
25
+ - [ ] **Input sanitization** - User inputs sanitized before use
26
+ - [ ] **Workspace isolation** - Writes only to agent workspace
27
+ - [ ] **File size limits** - Check file sizes to prevent DoS
28
+ - [ ] **No hardcoded secrets** - Use environment variables
29
+
30
+ ### Testing
31
+
32
+ - [ ] **Tests added** - New features have tests (unit + integration)
33
+ - [ ] **Coverage maintained** - Overall coverage ≥70%, core modules ≥85%
34
+ - [ ] **Tests pass** - All 841 tests passing
35
+ - [ ] **Edge cases** - Test edge cases and error scenarios
36
+
37
+ ### Performance
38
+
39
+ - [ ] **No obvious bottlenecks** - Profile if adding expensive operations
40
+ - [ ] **Lazy loading** - Heavy deps use dynamic import
41
+ - [ ] **Caching** - Use TTLCache for expensive operations
42
+ - [ ] **Bundle size** - Check `dist/index.js` stays <250KB
43
+
44
+ ### Logging
45
+
46
+ - [ ] **Structured logging** - Use `logger.info/warn/error` with context
47
+ - [ ] **Log levels** - Appropriate log levels (debug/info/warn/error)
48
+ - [ ] **No console.log** - Use logger, not console.log
49
+
50
+ ### Git
51
+
52
+ - [ ] **Conventional commits** - Format: `type(scope): message`
53
+ - [ ] **Descriptive message** - Clear what and why
54
+ - [ ] **No large files** - No binaries or large files committed
55
+ - [ ] **No sensitive data** - No API keys, passwords, etc.
56
+
57
+ ## Reviewer Checklist
58
+
59
+ ### Code Review
60
+
61
+ - [ ] **Logic correctness** - Does the code do what it's supposed to?
62
+ - [ ] **Type safety** - Are all types correct and complete?
63
+ - [ ] **Error handling** - Are errors handled appropriately?
64
+ - [ ] **Security** - No security vulnerabilities introduced?
65
+
66
+ ### Architecture
67
+
68
+ - [ ] **Import hierarchy** - Follows layer architecture (types → utils → core → agents → cli)
69
+ - [ ] **Module boundaries** - No circular dependencies
70
+ - [ ] **Separation of concerns** - Each module has single responsibility
71
+
72
+ ### Testing
73
+
74
+ - [ ] **Test quality** - Tests are meaningful and comprehensive
75
+ - [ ] **Test coverage** - Coverage meets targets
76
+ - [ ] **Mock providers** - Tests use AUTOMATOSX_MOCK_PROVIDERS=true
77
+
78
+ ### Documentation
79
+
80
+ - [ ] **JSDoc complete** - Public APIs have JSDoc
81
+ - [ ] **README updated** - If adding features, update README
82
+ - [ ] **CHANGELOG updated** - Add entry to CHANGELOG.md
83
+
84
+ ### Performance & Size
85
+
86
+ - [ ] **No new large deps** - Check package.json for new dependencies
87
+ - [ ] **Bundle size** - Run `npm run build` and check dist/index.js size
88
+ - [ ] **Startup time** - CLI startup time reasonable
89
+
90
+ ## Common Issues to Watch For
91
+
92
+ ### Type Safety
93
+
94
+ ❌ **Avoid:**
95
+
96
+ ```typescript
97
+ const data: any = loadData(); // Any type
98
+ function process(x) { } // Implicit any
99
+ ```
100
+
101
+ ✅ **Prefer:**
102
+
103
+ ```typescript
104
+ const data: ProfileData = loadProfile(name);
105
+ function process(x: string): void { }
106
+ ```
107
+
108
+ ### Error Handling
109
+
110
+ ❌ **Avoid:**
111
+
112
+ ```typescript
113
+ try {
114
+ await task();
115
+ } catch (e) {
116
+ // Silent failure
117
+ }
118
+ ```
119
+
120
+ ✅ **Prefer:**
121
+
122
+ ```typescript
123
+ try {
124
+ await task();
125
+ } catch (error) {
126
+ logger.error('Task failed', {
127
+ task: taskName,
128
+ error: (error as Error).message
129
+ });
130
+ throw error;
131
+ }
132
+ ```
133
+
134
+ ### Security
135
+
136
+ ❌ **Avoid:**
137
+
138
+ ```typescript
139
+ const path = join(root, userInput); // Path traversal risk
140
+ ```
141
+
142
+ ✅ **Prefer:**
143
+
144
+ ```typescript
145
+ const resolver = new PathResolver({ projectRoot: root });
146
+ const path = await resolver.resolve(userInput); // Validated
147
+ ```
148
+
149
+ ### Logging
150
+
151
+ ❌ **Avoid:**
152
+
153
+ ```typescript
154
+ console.log('Profile loaded'); // No structure
155
+ ```
156
+
157
+ ✅ **Prefer:**
158
+
159
+ ```typescript
160
+ logger.info('Profile loaded', {
161
+ name: profileName,
162
+ path: profilePath
163
+ });
164
+ ```
165
+
166
+ ## Testing Checklist
167
+
168
+ ### Unit Tests
169
+
170
+ - [ ] Test happy path
171
+ - [ ] Test edge cases
172
+ - [ ] Test error cases
173
+ - [ ] Mock external dependencies
174
+ - [ ] Fast execution (<1s per suite)
175
+
176
+ ### Integration Tests
177
+
178
+ - [ ] Test CLI command integration
179
+ - [ ] Use temp directory for file operations
180
+ - [ ] Mock providers (AUTOMATOSX_MOCK_PROVIDERS=true)
181
+ - [ ] Clean up after tests
182
+
183
+ ### E2E Tests
184
+
185
+ - [ ] Test complete user workflows
186
+ - [ ] Use real config, real file system
187
+ - [ ] Mock providers
188
+ - [ ] Verify final state
189
+
190
+ ## Performance Checklist
191
+
192
+ - [ ] **Lazy load** - Heavy modules use `await import()`
193
+ - [ ] **Cache** - Expensive operations cached with TTL
194
+ - [ ] **Batch** - Batch file operations where possible
195
+ - [ ] **Async** - Use async/await for I/O operations
196
+ - [ ] **Profile** - Profile if performance-critical code
197
+
198
+ ## Security Checklist
199
+
200
+ - [ ] **Path traversal** - No `../` in paths without validation
201
+ - [ ] **Input validation** - All user inputs validated/sanitized
202
+ - [ ] **File permissions** - Workspaces have restrictive permissions (700)
203
+ - [ ] **Size limits** - File size limits to prevent DoS
204
+ - [ ] **Safe YAML** - Use safe YAML parsing (no unsafe schemas)
205
+
206
+ ## Documentation Checklist
207
+
208
+ - [ ] **JSDoc** - Public functions have JSDoc
209
+ - [ ] **Comments** - Complex logic explained
210
+ - [ ] **Examples** - Usage examples for complex features
211
+ - [ ] **README** - Updated if adding user-facing features
212
+ - [ ] **CHANGELOG** - Entry added for changes
213
+
214
+ ---
215
+
216
+ **Last Updated:** 2025-10-07
217
+ **For:** AutomatosX v4.0+
@@ -0,0 +1,389 @@
1
+ # Our Coding Standards - AutomatosX v4
2
+
3
+ > Project-specific coding standards for AutomatosX
4
+
5
+ ## TypeScript Standards
6
+
7
+ ### Type Safety (Strict Mode)
8
+
9
+ **Always use strict TypeScript:**
10
+
11
+ ```typescript
12
+ // tsconfig.json enforces:
13
+ // - strict: true
14
+ // - noUncheckedIndexedAccess: true
15
+ // - noImplicitOverride: true
16
+ // - noFallthroughCasesInSwitch: true
17
+ ```
18
+
19
+ **Type annotations:**
20
+
21
+ ```typescript
22
+ // ✅ Good: Explicit types for public APIs
23
+ export function loadProfile(name: string): Promise<AgentProfile> {
24
+ // ...
25
+ }
26
+
27
+ // ✅ Good: Type parameters
28
+ export class TTLCache<T> {
29
+ get(key: string): T | undefined { }
30
+ }
31
+
32
+ // ❌ Bad: Any types
33
+ function process(data: any) { } // Never use any!
34
+ ```
35
+
36
+ ### Error Handling
37
+
38
+ **Use custom error classes:**
39
+
40
+ ```typescript
41
+ // ✅ Good: Typed errors from utils/errors.ts
42
+ import { AgentValidationError, PathError } from '../utils/errors.js';
43
+
44
+ if (!profile.name) {
45
+ throw new AgentValidationError('Missing required field: name');
46
+ }
47
+
48
+ if (path.includes('..')) {
49
+ throw PathError.traversal(path);
50
+ }
51
+
52
+ // ❌ Bad: Generic Error
53
+ throw new Error('Something went wrong'); // Too vague
54
+ ```
55
+
56
+ **Error context:**
57
+
58
+ ```typescript
59
+ // ✅ Good: Include context
60
+ try {
61
+ await executeTask();
62
+ } catch (error) {
63
+ logger.error('Task execution failed', {
64
+ task: taskName,
65
+ agent: agentName,
66
+ error: (error as Error).message
67
+ });
68
+ throw error;
69
+ }
70
+ ```
71
+
72
+ ### Module System
73
+
74
+ **ESM with .js extensions:**
75
+
76
+ ```typescript
77
+ // ✅ Good: .js extension in imports (required for ESM)
78
+ import { PathResolver } from '../core/path-resolver.js';
79
+ import type { AgentProfile } from '../types/agent.js';
80
+
81
+ // ❌ Bad: No extension
82
+ import { PathResolver } from '../core/path-resolver'; // Won't work
83
+ ```
84
+
85
+ ### File Organization
86
+
87
+ **Directory structure:**
88
+
89
+ ```
90
+ src/
91
+ ├── core/ # Core modules (Router, PathResolver, MemoryManager)
92
+ ├── agents/ # Agent system (ProfileLoader, AbilitiesManager, ContextManager)
93
+ ├── providers/ # Provider implementations (Claude, Gemini, OpenAI)
94
+ ├── cli/ # CLI commands
95
+ ├── types/ # TypeScript type definitions
96
+ └── utils/ # Utilities (logger, errors, formatters)
97
+ ```
98
+
99
+ **File naming:**
100
+
101
+ - Use kebab-case: `path-resolver.ts`, `memory-manager.ts`
102
+ - Types: `agent.ts`, `provider.ts` (no -types suffix)
103
+ - Tests: `path-resolver.test.ts` (co-located with source)
104
+
105
+ ## Code Quality Standards
106
+
107
+ ### Function Size
108
+
109
+ **Keep functions small (<50 lines):**
110
+
111
+ ```typescript
112
+ // ✅ Good: Small, focused function
113
+ private buildPrompt(context: ExecutionContext): string {
114
+ let prompt = '';
115
+
116
+ if (context.abilities) {
117
+ prompt += `# Your Abilities\n\n${context.abilities}\n\n`;
118
+ }
119
+
120
+ if (context.agent.stages) {
121
+ prompt += this.buildStagesSection(context.agent.stages);
122
+ }
123
+
124
+ prompt += `# Task\n\n${context.task}`;
125
+ return prompt;
126
+ }
127
+
128
+ // Break down large functions into smaller helpers
129
+ private buildStagesSection(stages: Stage[]): string {
130
+ // ...
131
+ }
132
+ ```
133
+
134
+ ### Naming Conventions
135
+
136
+ **Variables and functions:**
137
+
138
+ ```typescript
139
+ // ✅ Good: Descriptive names
140
+ const profilePath = join(profilesDir, `${name}.yaml`);
141
+ async function resolveAgentName(input: string): Promise<string> { }
142
+
143
+ // ❌ Bad: Vague names
144
+ const p = join(dir, `${n}.yaml`);
145
+ async function resolve(x: string): Promise<string> { }
146
+ ```
147
+
148
+ **Classes:**
149
+
150
+ ```typescript
151
+ // ✅ Good: PascalCase, descriptive
152
+ export class PathResolver { }
153
+ export class MemoryManager { }
154
+
155
+ // ❌ Bad: Abbreviations
156
+ export class PathRes { } // Too short
157
+ export class PM { } // Unclear
158
+ ```
159
+
160
+ ### Comments and Documentation
161
+
162
+ **JSDoc for public APIs:**
163
+
164
+ ```typescript
165
+ /**
166
+ * Load agent profile from YAML file
167
+ *
168
+ * @param name - Agent name (e.g., "coder", "reviewer")
169
+ * @returns Validated AgentProfile
170
+ * @throws AgentNotFoundError if profile doesn't exist
171
+ * @throws AgentValidationError if profile is invalid
172
+ */
173
+ async loadProfile(name: string): Promise<AgentProfile> {
174
+ // ...
175
+ }
176
+ ```
177
+
178
+ **Inline comments for complex logic:**
179
+
180
+ ```typescript
181
+ // Security: Validate path to prevent traversal attacks
182
+ const resolvedPath = resolve(userPath);
183
+ if (!resolvedPath.startsWith(projectRoot)) {
184
+ throw PathError.traversal(userPath);
185
+ }
186
+ ```
187
+
188
+ ## Security Standards
189
+
190
+ ### Path Validation
191
+
192
+ **Always use PathResolver:**
193
+
194
+ ```typescript
195
+ // ✅ Good: Use PathResolver for all file access
196
+ import { PathResolver } from '../core/path-resolver.js';
197
+
198
+ const resolver = new PathResolver({ projectRoot });
199
+ const safePath = await resolver.resolve(userInput);
200
+
201
+ // ❌ Bad: Direct path manipulation
202
+ const path = join(projectRoot, userInput); // Unsafe!
203
+ ```
204
+
205
+ ### Input Sanitization
206
+
207
+ **Sanitize user inputs:**
208
+
209
+ ```typescript
210
+ // ✅ Good: Sanitize before using in file system
211
+ const agentDirName = agentName
212
+ .replace(/[^a-zA-Z0-9-]/g, '-')
213
+ .toLowerCase();
214
+
215
+ const workspace = join(projectRoot, '.automatosx', 'workspaces', agentDirName);
216
+ ```
217
+
218
+ **File size limits:**
219
+
220
+ ```typescript
221
+ // ✅ Good: Prevent DoS with size limits
222
+ if (content.length > 100 * 1024) {
223
+ throw new AgentValidationError('Profile file too large (max 100KB)');
224
+ }
225
+ ```
226
+
227
+ ### Permissions
228
+
229
+ **Restrictive permissions on Unix:**
230
+
231
+ ```typescript
232
+ // ✅ Good: Restrict workspace permissions
233
+ if (process.platform !== 'win32') {
234
+ await chmod(agentWorkspace, 0o700); // Owner only
235
+ }
236
+ ```
237
+
238
+ ## Testing Standards
239
+
240
+ ### Test Structure
241
+
242
+ **Use Vitest with describe/it:**
243
+
244
+ ```typescript
245
+ import { describe, it, expect, beforeEach } from 'vitest';
246
+
247
+ describe('PathResolver', () => {
248
+ let resolver: PathResolver;
249
+
250
+ beforeEach(() => {
251
+ resolver = new PathResolver({ projectRoot: '/test' });
252
+ });
253
+
254
+ it('should resolve relative paths', async () => {
255
+ const result = await resolver.resolve('./file.txt');
256
+ expect(result).toBe('/test/file.txt');
257
+ });
258
+
259
+ it('should reject path traversal', async () => {
260
+ await expect(
261
+ resolver.resolve('../../../etc/passwd')
262
+ ).rejects.toThrow(PathError);
263
+ });
264
+ });
265
+ ```
266
+
267
+ ### Coverage Targets
268
+
269
+ - **Overall:** 70%+ (currently 84%)
270
+ - **Core modules:** 85%+
271
+ - **CLI commands:** 70%+
272
+ - **Utils:** 90%+
273
+
274
+ ## Logging Standards
275
+
276
+ ### Use Structured Logging
277
+
278
+ **Always use logger from utils/logger:**
279
+
280
+ ```typescript
281
+ import { logger } from '../utils/logger.js';
282
+
283
+ // ✅ Good: Structured logging with context
284
+ logger.info('Profile loaded', {
285
+ name: profileName,
286
+ path: profilePath
287
+ });
288
+
289
+ logger.error('Execution failed', {
290
+ agent: agentName,
291
+ task: taskSummary,
292
+ error: (error as Error).message
293
+ });
294
+
295
+ // ❌ Bad: Console.log
296
+ console.log('Profile loaded'); // No structure, no context
297
+ ```
298
+
299
+ ### Log Levels
300
+
301
+ - **debug:** Development details
302
+ - **info:** Normal operations
303
+ - **warn:** Recoverable issues
304
+ - **error:** Failures requiring attention
305
+
306
+ ## Performance Standards
307
+
308
+ ### Lazy Loading
309
+
310
+ **Defer expensive operations:**
311
+
312
+ ```typescript
313
+ // ✅ Good: Lazy load heavy dependencies
314
+ async executeTask() {
315
+ const { spawn } = await import('child_process'); // Load when needed
316
+ // ...
317
+ }
318
+ ```
319
+
320
+ ### Caching
321
+
322
+ **Use TTLCache for expensive operations:**
323
+
324
+ ```typescript
325
+ // ✅ Good: Cache profiles with TTL
326
+ this.cache = new TTLCache<AgentProfile>({
327
+ maxEntries: 20,
328
+ ttl: 300000, // 5 minutes
329
+ cleanupInterval: 60000
330
+ });
331
+ ```
332
+
333
+ ### Bundle Size
334
+
335
+ **Target: <250KB**
336
+
337
+ - Current: 205KB ✅
338
+ - Avoid large dependencies
339
+ - Use tree-shaking friendly imports
340
+
341
+ ## Git Commit Standards
342
+
343
+ ### Conventional Commits
344
+
345
+ **Format:** `type(scope): message`
346
+
347
+ ```bash
348
+ # Types
349
+ feat(agents): add stage injection to executor
350
+ fix(memory): resolve vector search timeout
351
+ docs(readme): update installation instructions
352
+ test(router): add retry logic tests
353
+ refactor(cli): simplify command parsing
354
+ perf(cache): optimize TTL cleanup interval
355
+ ```
356
+
357
+ ### Commit Messages
358
+
359
+ ```bash
360
+ # ✅ Good: Clear, specific
361
+ feat(stages): inject workflow stages into prompt
362
+
363
+ - Add Stage and Personality interfaces to types
364
+ - Update ProfileLoader to parse stages from YAML
365
+ - Modify Executor to include stages in prompt
366
+ - Add ~560 tokens per request for structured workflow
367
+
368
+ # ❌ Bad: Vague
369
+ fix: bug fix
370
+ update: changes
371
+ ```
372
+
373
+ ## Code Review Checklist
374
+
375
+ When reviewing code:
376
+
377
+ - [ ] Type safety: No `any` types, all public APIs typed
378
+ - [ ] Error handling: Custom errors with context
379
+ - [ ] Security: Path validation, input sanitization
380
+ - [ ] Testing: Tests added, coverage maintained
381
+ - [ ] Performance: No obvious bottlenecks
382
+ - [ ] Logging: Structured logs with context
383
+ - [ ] Documentation: JSDoc for public APIs
384
+ - [ ] Bundle size: No large dependencies added
385
+
386
+ ---
387
+
388
+ **Last Updated:** 2025-10-07
389
+ **For:** AutomatosX v4.0+