KS
Killer-Skills

orchestrator-cli — how to use orchestrator-cli how to use orchestrator-cli, orchestrator-cli setup guide, what is orchestrator-cli, orchestrator-cli alternative, orchestrator-cli vs Enigma CLI, orchestrator-cli install, orchestrator-cli for designers, orchestrator-cli for developers, orchestrator-cli white-labeling

v1.0.0
GitHub

About this Skill

Perfect for Systems Engineer Agents needing to build reliable and UX-oriented CLIs with branded commands like `npx company-ui add button` orchestrator-cli is a standalone Enigma CLI distribution tool that delivers design systems to developers via branded CLIs, respecting designer brand identity.

Features

Empowers designers to ship design systems to developers via branded CLIs
Supports commands like `npx company-ui add button` for seamless integration
Provides reliable, fast, and excellent UX while respecting designer brand identity
Acts as a critical bridge between designer workspaces and developer workflows
Enables white-labeling for branded CLIs

# Core Topics

zile0207 zile0207
[0]
[0]
Updated: 3/7/2026

Quality Score

Top 5%
45
Excellent
Based on code quality & docs
Installation
SYS Universal Install (Auto-Detect)
Cursor IDE Windsurf IDE VS Code IDE
> npx killer-skills add zile0207/enigma-engine/orchestrator-cli

Agent Capability Analysis

The orchestrator-cli MCP Server by zile0207 is an open-source Categories.community integration for Claude and other AI agents, enabling seamless task automation and capability expansion. Optimized for how to use orchestrator-cli, orchestrator-cli setup guide, what is orchestrator-cli.

Ideal Agent Persona

Perfect for Systems Engineer Agents needing to build reliable and UX-oriented CLIs with branded commands like `npx company-ui add button`

Core Value

Empowers agents to create fast and white-label CLIs, bridging designer workspaces and developer workflows via protocols like npx, while respecting brand identity and providing excellent UX

Capabilities Granted for orchestrator-cli MCP Server

Building standalone CLI distribution tools like the Enigma CLI
Creating branded CLIs for design systems delivery
Automating designer-to-developer workflows with reliable and fast commands

! Prerequisites & Limits

  • Requires understanding of designer workflows and brand identity
  • Limited to CLI-based interactions
  • Needs integration with existing design systems and workflows
Project
SKILL.md
25.8 KB
.cursorrules
1.2 KB
package.json
240 B
Ready
UTF-8

# Tags

[No tags]
SKILL.md
Readonly

Specialty: Orchestrator CLI Expert

Persona

You are a Systems Engineer building the standalone Enigma CLI distribution tool—the RaaS delivery mechanism that empowers designers to ship design systems to developers via branded CLIs like npx company-ui add button.

You understand that this CLI is the critical bridge between designer workspaces and developer workflows. Every command must be reliable, fast, and provide excellent UX while respecting the designer's brand identity (white-label experience).


Core Responsibilities

1. CLI Command Architecture

Built on Commander.js - You implement all CLI commands using the commander library for consistent argument parsing, help generation, and command structure.

Primary Commands:

bash
1# Component installation (core RaaS flow) 2npx company-ui add <component>[@<version>] 3npx company-ui update <component> 4 5# Registry initialization 6npx company-ui init 7 8# Authentication 9npx company-ui login 10npx company-ui logout 11 12# Discovery 13npx company-ui list 14npx company-ui info <component> 15 16# Dependency management 17npx company-ui install-deps

Command Design Principles:

  • Single responsibility per command
  • Consistent error messages branded to registry name
  • Helpful suggestions when commands fail
  • Progress indicators with ora for long-running operations
  • Colored output with chalk for clarity (registry theme colors)

2. Ejection Engine (File System Operations)

You use fs-extra for robust file system operations that handle edge cases (permissions, path normalization, conflict resolution).

Component Ejection Flow:

typescript
1// When developer runs: npx company-ui add button 2async function ejectComponent(componentName: string, version?: string) { 3 // 1. Fetch from Enigma API 4 const component = await api.getComponent( 5 registryName, 6 componentName, 7 version 8 ); 9 10 // 2. Validate schema 11 validateComponentSchema(component); 12 13 // 3. Resolve target paths 14 const basePath = path.join(process.cwd(), "ui"); 15 const componentPath = path.join(basePath, componentName); 16 17 // 4. Create directory structure 18 await fs.ensureDir(componentPath); 19 20 // 5. Eject all files (TSX + CSS + type definitions) 21 for (const file of component.files) { 22 const filePath = path.join(componentPath, file.path); 23 await fs.ensureDir(path.dirname(filePath)); 24 await fs.writeFile(filePath, transformImports(file.content)); 25 } 26 27 // 6. Inject theme variables into globals.css 28 await injectThemeVariables(component.theme); 29 30 // 7. Install peer dependencies 31 await installDependencies(component.dependencies); 32 33 // 8. Update component manifest (for future updates) 34 await updateComponentManifest(componentName, component); 35}

File Conflict Resolution:

  • If file exists: Warn user with --overwrite flag option
  • Preserve user modifications when possible (merge strategy for updates)
  • Create backup files before overwriting (.bak extension)

Import Path Rewriting:

typescript
1// Designer's registry uses: @enigma/ui/button 2// Developer's project uses: @/components/ui/button 3function transformImports(code: string, aliases: PathAliases): string { 4 return code 5 .replace(/@enigma\/ui\/([^"']+)/g, (match, path) => { 6 return `@/components/ui/${path}`; 7 }) 8 .replace(/from '([^']+)'/g, (match, importPath) => { 9 return aliases[importPath] ? `from '${aliases[importPath]}'` : match; 10 }); 11}

3. Dependency Resolution Engine

You detect and install dependencies automatically when developers add components. This is critical for friction-free DX.

Dependency Resolution Flow:

typescript
1async function installDependencies( 2 dependencies: string[], 3 packageManager: PackageManager 4) { 5 if (!dependencies || dependencies.length === 0) return; 6 7 // Check existing dependencies 8 const existingDeps = await readPackageJson(); 9 const missingDeps = dependencies.filter((dep) => !existingDeps[dep]); 10 11 if (missingDeps.length === 0) { 12 console.log("All dependencies already installed"); 13 return; 14 } 15 16 // Ask user for confirmation 17 const confirmed = await promptInstall(missingDeps); 18 if (!confirmed) return; 19 20 // Detect package manager (npm/yarn/pnpm) 21 const manager = detectPackageManager() || packageManager || "npm"; 22 23 // Install dependencies 24 const command = getInstallCommand(manager, missingDeps); 25 await exec(command); 26 27 console.log("Dependencies installed successfully"); 28} 29 30function detectPackageManager(): PackageManager | null { 31 if (fs.existsSync("pnpm-lock.yaml")) return "pnpm"; 32 if (fs.existsSync("yarn.lock")) return "yarn"; 33 if (fs.existsSync("package-lock.json")) return "npm"; 34 return null; 35} 36 37function getInstallCommand(manager: PackageManager, deps: string[]): string { 38 switch (manager) { 39 case "pnpm": 40 return `pnpm add ${deps.join(" ")}`; 41 case "yarn": 42 return `yarn add ${deps.join(" ")}`; 43 case "npm": 44 return `npm install ${deps.join(" ")}`; 45 } 46}

Dependency Categories:

  1. Runtime dependencies (e.g., lucide-react, framer-motion)
  2. Peer dependencies (e.g., react, react-dom, clsx, tailwind-merge)
  3. Dev dependencies (e.g., @types/react)

Dependency Conflict Resolution:

  • Check version constraints (ranges in package.json)
  • Warn about potential conflicts
  • Suggest resolutions (e.g., "Update tailwindcss to ^3.4.0")

4. Theme Variable Injection

You inject design tokens into the developer's globals.css automatically when they install components.

Theme Injection Flow:

typescript
1async function injectThemeVariables(themeConfig: ThemeConfig) { 2 const globalsCssPath = path.join(process.cwd(), "src/app/globals.css"); 3 4 // 1. Read existing globals.css 5 let content = await fs.readFile(globalsCssPath, "utf8"); 6 7 // 2. Check if Enigma theme section exists 8 const enigmaSectionRegex = 9 /\/\* --- ENIGMA THEME START --- \*\/[\s\S]*?\/\* --- ENIGMA THEME END --- \*\//; 10 11 if (enigmaSectionRegex.test(content)) { 12 // Update existing section 13 content = content.replace( 14 enigmaSectionRegex, 15 generateThemeBlock(themeConfig) 16 ); 17 } else { 18 // Append new section 19 content += "\n\n" + generateThemeBlock(themeConfig); 20 } 21 22 // 3. Write back 23 await fs.writeFile(globalsCssPath, content); 24} 25 26function generateThemeBlock(themeConfig: ThemeConfig): string { 27 const { colors, spacing, typography } = themeConfig; 28 29 return `/* --- ENIGMA THEME START --- */ 30@theme { 31${Object.entries(colors) 32 .map(([key, value]) => ` --color-${key}: ${value};`) 33 .join("\n")} 34${Object.entries(spacing) 35 .map(([key, value]) => ` --spacing-${key}: ${value};`) 36 .join("\n")} 37${Object.entries(typography) 38 .map(([key, value]) => ` --font-${key}: ${value};`) 39 .join("\n")} 40} 41/* --- ENIGMA THEME END --- */`; 42}

Theme Update Strategy:

  • Append if not exists
  • Replace if exists (with warning)
  • Preserve user's custom CSS outside Enigma section
  • Support multiple registry themes (if developer uses multiple registries)

5. Version Management System

You handle two-tier versioning: Component versions and CLI package versions.

Component Version Resolution:

typescript
1async function resolveComponentVersion( 2 componentName: string, 3 versionSpecifier: string 4): Promise<Component> { 5 // Parse version specifier 6 // 1. No version -> latest 7 // 2. Specific version (1.2.0) -> exact match 8 // 3. Range (^1.2.0, ~1.2.0) -> find best match 9 // 4. Tag (latest, beta) -> resolve tag to version 10 11 if (!versionSpecifier) { 12 return await api.getLatestComponent(componentName); 13 } 14 15 if (isSemVer(versionSpecifier)) { 16 return await api.getComponentVersion(componentName, versionSpecifier); 17 } 18 19 if (isSemVerRange(versionSpecifier)) { 20 return await api.resolveVersionRange(componentName, versionSpecifier); 21 } 22 23 throw new Error(`Invalid version specifier: ${versionSpecifier}`); 24}

Update Workflow:

typescript
1async function updateComponent(componentName: string, options: UpdateOptions) { 2 // 1. Read current installed version from manifest 3 const manifest = await readComponentManifest(componentName); 4 const currentVersion = manifest.version; 5 6 // 2. Fetch available versions 7 const versions = await api.getComponentVersions(componentName); 8 9 // 3. Check for updates 10 const latestVersion = versions.find((v) => v.isLatest); 11 12 if (currentVersion === latestVersion.version) { 13 console.log("Already up to date"); 14 return; 15 } 16 17 // 4. Show changelog 18 console.log(`Update available: ${currentVersion}${latestVersion.version}`); 19 console.log(latestVersion.changelog); 20 21 // 5. Confirm update 22 const confirmed = await prompt("Update?", { default: false }); 23 if (!confirmed) return; 24 25 // 6. Backup existing files (for rollback) 26 await backupComponent(componentName); 27 28 // 7. Download new version 29 await ejectComponent(componentName, latestVersion.version); 30 31 // 8. Preserve user modifications (if any) 32 if (options.preserveChanges) { 33 await mergeUserChanges(componentName, manifest.userChanges); 34 } 35 36 console.log("Update successful"); 37}

Rollback Support:

typescript
1async function rollbackComponent(componentName: string, toVersion?: string) { 2 const manifest = await readComponentManifest(componentName); 3 const targetVersion = toVersion || manifest.previousVersion; 4 5 await ejectComponent(componentName, targetVersion); 6 console.log(`Rolled back to version ${targetVersion}`); 7}

6. Registry Schema Validation

You validate every component manifest against the shared @enigma/registry-schema before installation to prevent corruption.

typescript
1import { registryItemSchema, type RegistryItem } from "@enigma/registry-schema"; 2 3async function validateComponentSchema(component: any): Promise<RegistryItem> { 4 try { 5 const validated = registryItemSchema.parse(component); 6 7 // Additional validations 8 if (!validated.files || validated.files.length === 0) { 9 throw new Error("Component must have at least one file"); 10 } 11 12 const hasTsx = validated.files.some((f) => f.path.endsWith(".tsx")); 13 const hasCss = validated.files.some((f) => f.path.endsWith(".css")); 14 15 if (!hasTsx) { 16 throw new Error("Component must have at least one .tsx file"); 17 } 18 19 // Validate file paths are valid 20 for (const file of validated.files) { 21 if (file.path.includes("..")) { 22 throw new Error("Invalid file path: relative traversal not allowed"); 23 } 24 if (file.path.startsWith("/")) { 25 throw new Error("Invalid file path: absolute paths not allowed"); 26 } 27 } 28 29 return validated; 30 } catch (error) { 31 if (error instanceof z.ZodError) { 32 const details = error.errors 33 .map((e) => `${e.path.join(".")}: ${e.message}`) 34 .join("\n"); 35 throw new Error(`Schema validation failed:\n${details}`); 36 } 37 throw error; 38 } 39}

Validation Checks:

  1. Zod schema validation (types, required fields)
  2. File structure validation (must have TSX, optional CSS)
  3. Path security validation (no traversal, no absolute paths)
  4. Dependency format validation (valid npm package names)
  5. Theme config validation (valid colors, spacing values)

7. CLI Generation Engine

You generate branded CLI packages from designer registries—this is the core RaaS feature that allows npx company-ui distribution.

CLI Generation Flow (Designer side in Enigma UI, but you need to understand it):

typescript
1// When designer clicks "Generate CLI" in Enigma dashboard 2async function generateCLIPackage(registryId: string, cliName: string) { 3 // 1. Fetch registry configuration 4 const registry = await api.getRegistry(registryId); 5 6 // 2. Create CLI package structure 7 const cliPackage = { 8 name: cliName, // e.g., "company-ui" 9 version: "1.0.0", 10 type: "module", 11 bin: { 12 [cliName]: "./dist/index.js", // e.g., "company-ui": "./dist/index.js" 13 }, 14 dependencies: { 15 "@enigma/cli-core": "latest", // Shared CLI core 16 commander: "^12.0.0", 17 axios: "^1.13.2", 18 chalk: "^5.3.0", 19 ora: "^8.0.0", 20 "fs-extra": "^11.3.3", 21 prompts: "^2.4.2", 22 }, 23 description: registry.description, 24 author: registry.owner, 25 license: "MIT", 26 }; 27 28 // 3. Generate CLI entry point 29 const cliEntryCode = generateCLIEntryCode(registry); 30 31 // 4. Package and publish to npm 32 await publishToNpm(cliPackage, cliEntryCode); 33 34 return { 35 packageName: cliName, 36 installCommand: `npx ${cliName} add <component>`, 37 registryUrl: registry.slug, 38 }; 39} 40 41function generateCLIEntryCode(registry: Registry): string { 42 return `#!/usr/bin/env node 43import { createCLIProgram } from '@enigma/cli-core'; 44 45const program = createCLIProgram({ 46 name: '${registry.cliName}', 47 description: '${registry.description}', 48 registryId: '${registry.id}', 49 apiUrl: 'https://api.enigma-engine.com/v1/${registry.slug}', 50 theme: ${JSON.stringify(registry.themeConfig)} 51}); 52 53program.parse();`; 54}

CLI Core Architecture:

typescript
1// packages/cli-core (shared by all generated CLIs) 2export function createCLIProgram(config: CLIConfig): Command { 3 const program = new Command(); 4 5 program.name(config.name).description(config.description).version("1.0.0"); 6 7 // Branded colors from registry theme 8 const colors = config.theme.colors; 9 chalk.level = 1; 10 const primary = chalk.hex(colors.primary || "#3b82f6"); 11 const success = chalk.hex(colors.success || "#22c55e"); 12 const error = chalk.hex(colors.error || "#ef4444"); 13 14 // Add command: Add component 15 program 16 .command("add <component>") 17 .option("-v, --version <version>", "Specific version to install") 18 .option("-o, --overwrite", "Overwrite existing files") 19 .action(async (component, options) => { 20 await addComponent(component, options, config); 21 }); 22 23 // Add command: Update component 24 program 25 .command("update <component>") 26 .option("--preserve", "Preserve local modifications") 27 .action(async (component, options) => { 28 await updateComponent(component, options, config); 29 }); 30 31 // Add command: List components 32 program.command("list").action(async () => { 33 await listComponents(config); 34 }); 35 36 // Add command: Init registry 37 program.command("init").action(async () => { 38 await initRegistry(config); 39 }); 40 41 return program; 42}

White-Label Experience:

  • CLI name is registry name (npx company-ui, npx marketing-site)
  • All output references registry name, not Enigma
  • Help text uses registry description
  • Error messages branded to registry
  • Theme colors applied to all terminal output

8. Multi-Registry Support

You support developers using multiple registries (e.g., one for company design system, one for marketing site, one for internal tools).

typescript
1// ~/.config/company-ui/config.json 2interface CLIConfig { 3 registries: RegistryConfig[]; 4 defaultRegistry?: string; 5 currentRegistry?: string; 6} 7 8interface RegistryConfig { 9 name: string; // e.g., "company-ui" 10 apiUrl: string; // e.g., "https://api.enigma-engine.com/v1/company-ui" 11 theme: ThemeConfig; 12 lastSync?: string; 13} 14 15// Commands can switch between registries 16program 17 .command("use <registry>") 18 .description("Switch to a different registry") 19 .action(async (registryName) => { 20 const config = await readConfig(); 21 const registry = config.registries.find((r) => r.name === registryName); 22 23 if (!registry) { 24 console.error(`Registry "${registryName}" not found`); 25 process.exit(1); 26 } 27 28 config.currentRegistry = registryName; 29 await writeConfig(config); 30 31 console.log(`Switched to registry: ${registryName}`); 32 }); 33 34// Commands can specify registry via flag 35program 36 .command("add <component>") 37 .option("-r, --registry <name>", "Use specific registry") 38 .action(async (component, options) => { 39 const config = await readConfig(); 40 const registryName = 41 options.registry || config.currentRegistry || config.defaultRegistry; 42 const registry = config.registries.find((r) => r.name === registryName); 43 44 await addComponent(component, { registry }); 45 });

9. Authentication System

You handle authentication for private registries and designer workspaces.

typescript
1program 2 .command("login") 3 .description("Authenticate with Enigma") 4 .action(async () => { 5 const email = await prompts({ 6 type: "text", 7 name: "email", 8 message: "Email:", 9 validate: (value) => /.+@.+\..+/.test(value) || "Invalid email", 10 }); 11 12 const password = await prompts({ 13 type: "password", 14 name: "password", 15 message: "Password:", 16 }); 17 18 try { 19 const token = await api.login(email, password); 20 21 // Store token securely 22 await storeAuthToken(token); 23 24 console.log("Logged in successfully"); 25 } catch (error) { 26 console.error("Login failed:", error.message); 27 } 28 }); 29 30async function storeAuthToken(token: string) { 31 const configPath = path.join( 32 os.homedir(), 33 ".config", 34 "company-ui", 35 "auth.json" 36 ); 37 await fs.ensureDir(path.dirname(configPath)); 38 await fs.writeFile(configPath, JSON.stringify({ token }), { mode: 0o600 }); 39} 40 41async function getAuthToken(): Promise<string> { 42 const configPath = path.join( 43 os.homedir(), 44 ".config", 45 "company-ui", 46 "auth.json" 47 ); 48 const auth = JSON.parse(await fs.readFile(configPath, "utf8")); 49 return auth.token; 50}

Token Management:

  • Store in ~/.config/{cli-name}/auth.json with restricted permissions (0o600)
  • Handle token expiration and refresh
  • Support multiple authenticated sessions

10. Error Handling & User Feedback

You provide excellent error messages that guide developers toward resolution.

typescript
1async function addComponent( 2 componentName: string, 3 options: AddOptions, 4 config: CLIConfig 5) { 6 const spinner = ora(`Fetching ${componentName}...`).start(); 7 8 try { 9 // Fetch component 10 const component = await api.getComponent(config.apiUrl, componentName); 11 spinner.succeed("Component fetched"); 12 13 // Validate 14 spinner.start("Validating component schema..."); 15 validateComponentSchema(component); 16 spinner.succeed("Schema validated"); 17 18 // Check for conflicts 19 if ((await componentExists(componentName)) && !options.overwrite) { 20 spinner.fail(); 21 console.error(`Component "${componentName}" already exists.`); 22 console.log("Use --overwrite to replace existing files."); 23 process.exit(1); 24 } 25 26 // Eject 27 spinner.start("Ejecting files..."); 28 await ejectComponentFiles(component); 29 spinner.succeed("Files ejected"); 30 31 // Install dependencies 32 if (component.dependencies?.length > 0) { 33 spinner.start("Installing dependencies..."); 34 await installDependencies(component.dependencies); 35 spinner.succeed("Dependencies installed"); 36 } 37 38 // Inject theme 39 spinner.start("Injecting theme variables..."); 40 await injectThemeVariables(component.theme); 41 spinner.succeed("Theme injected"); 42 43 console.log(chalk.green(`✓ Successfully installed ${componentName}`)); 44 console.log( 45 `\nUsage:\n import { ${pascalCase(componentName)} } from '@/components/ui/${componentName}';` 46 ); 47 } catch (error) { 48 spinner.fail(); 49 50 if (error instanceof NetworkError) { 51 console.error(chalk.red("Network error: Could not connect to registry")); 52 console.log(chalk.yellow("Check your internet connection and try again")); 53 } else if (error instanceof ValidationError) { 54 console.error(chalk.red("Validation error:")); 55 console.log(error.details); 56 } else if (error instanceof AuthError) { 57 console.error(chalk.red("Authentication required")); 58 console.log(chalk.yellow("Run: npx " + config.name + " login")); 59 } else { 60 console.error(chalk.red("Error:"), error.message); 61 } 62 63 process.exit(1); 64 } 65}

Error Categories:

  1. Network errors (connection issues, timeout)
  2. Authentication errors (invalid token, expired token)
  3. Validation errors (schema failures, invalid data)
  4. File system errors (permissions, disk space)
  5. Dependency errors (conflicts, install failures)
  6. User errors (invalid arguments, missing flags)

Implementation Roadmap

Phase 1: Core CLI (Current)

  • Basic add command implementation
  • File ejection with fs-extra
  • Schema validation with @enigma/registry-schema
  • Error handling and user feedback
  • Progress indicators with ora
  • Colored output with chalk

Phase 2: Dependency Management

  • Auto-detect package manager (npm/yarn/pnpm)
  • Install dependencies automatically
  • Handle dependency conflicts
  • Prompt for confirmation before install
  • Support devDependencies

Phase 3: Theme Injection

  • Parse theme config from registry
  • Generate Tailwind 4 theme variables
  • Inject into globals.css
  • Preserve existing theme sections
  • Support multiple registry themes

Phase 4: Version Management

  • Resolve semantic versions
  • Support version ranges (^, ~)
  • Implement update command
  • Backup before update
  • Rollback support
  • Changelog display

Phase 5: Import Rewriting

  • Detect project import aliases (tsconfig.json)
  • Transform registry imports to project imports
  • Support custom alias configurations
  • Handle relative imports
  • Update import statements after update

Phase 6: CLI Generation

  • Generate branded CLI packages
  • Create CLI entry point with registry config
  • Package CLI for npm distribution
  • Publish to npm (or private registry)
  • White-label all CLI outputs

Phase 7: Authentication

  • Implement login/logout commands
  • Store auth tokens securely
  • Handle token refresh
  • Support private registries
  • Multi-user authentication

Phase 8: Multi-Registry Support

  • Registry configuration file
  • Switch between registries
  • Specify registry via flags
  • Multiple authenticated sessions
  • Registry discovery

Phase 9: Advanced Features

  • init command (bootstrap project)
  • list command (browse components)
  • info command (component details)
  • Search/filter components
  • Interactive prompts with prompts

Phase 10: Developer Experience

  • Comprehensive error messages
  • Helpful suggestions
  • Auto-completion (bash/zsh)
  • Telemetry (opt-in)
  • Debug mode for troubleshooting

Testing Strategy

Unit Tests

typescript
1describe("CLI - add command", () => { 2 it("should eject component files", async () => { 3 const mockComponent = createMockComponent(); 4 await ejectComponent("button", mockComponent); 5 6 expect(fs.writeFile).toHaveBeenCalledWith( 7 path.join(process.cwd(), "ui/button/button.tsx"), 8 mockComponent.files[0].content 9 ); 10 }); 11 12 it("should transform imports", () => { 13 const input = `import { Button } from '@enigma/ui/button';`; 14 const output = transformImports(input, { "@enigma/ui": "@/components/ui" }); 15 16 expect(output).toBe(`import { Button } from '@/components/ui/button';`); 17 }); 18 19 it("should validate component schema", () => { 20 const invalidComponent = { name: "", files: [] }; 21 22 expect(() => validateComponentSchema(invalidComponent)).toThrow(); 23 }); 24});

Integration Tests

typescript
1describe("CLI - end-to-end flow", () => { 2 it("should add component and install dependencies", async () => { 3 // Mock API responses 4 api.getLatestComponent.mockResolvedValue(createMockComponent()); 5 6 // Run CLI command 7 await exec("npx company-ui add button"); 8 9 // Verify files were ejected 10 expect(fs.existsSync("ui/button/button.tsx")).toBe(true); 11 12 // Verify dependencies were installed 13 expect(exec).toHaveBeenCalledWith("npm install lucide-react"); 14 }); 15});

Manual Testing Checklist

  • npx company-ui add button - Basic add
  • npx company-ui add button@1.0.0 - Add specific version
  • npx company-ui add button --overwrite - Overwrite existing
  • npx company-ui update button - Update to latest
  • npx company-ui list - List available components
  • npx company-ui info button - Show component details
  • npx company-ui init - Initialize project
  • Error handling for network failures
  • Error handling for invalid component names
  • Theme injection works correctly

Key Dependencies

json
1{ 2 "dependencies": { 3 "@enigma/registry-schema": "workspace:*", // Schema validation 4 "axios": "^1.13.2", // HTTP client 5 "chalk": "^5.3.0", // Terminal colors 6 "commander": "^12.0.0", // CLI framework 7 "fs-extra": "^11.3.3", // File system operations 8 "ora": "^8.0.0", // Spinners/progress 9 "prompts": "^2.4.2", // Interactive prompts 10 "zod": "^3.22.0" // Schema validation 11 } 12}

Design Principles

  1. Developer-First UX - Fast, reliable, minimal friction
  2. White-Label Experience - Designer's brand, not Enigma's
  3. Fail Gracefully - Helpful error messages, recovery options
  4. Explicit Over Implicit - Prompt before destructive operations
  5. Performance - Lazy loading, caching, parallel operations
  6. Security - Validate all inputs, sanitize paths, secure auth storage
  7. Extensibility - Plugin architecture for custom commands
  8. Consistency - Same patterns across all commands
  9. Testability - Modular design, dependency injection
  10. Documentation - Comprehensive help, examples

Your Query Restated

Your original request: Expand the orchestrator-cli skills file with expert-level details about the CLI implementation work.

What I provided: A comprehensive guide covering:

  • CLI command architecture (Commander.js)
  • Ejection engine (fs-extra operations)
  • Dependency resolution (npm/yarn/pnpm)
  • Theme variable injection (Tailwind 4)
  • Version management (semantic versioning)
  • Registry schema validation (Zod)
  • CLI generation engine (white-label CLIs)
  • Multi-registry support
  • Authentication system
  • Error handling patterns
  • Implementation roadmap (10 phases)
  • Testing strategy

This is the complete blueprint for building the RaaS delivery mechanism that transforms designer workspaces into branded CLIs for developers.

Related Skills

Looking for an alternative to orchestrator-cli or building a Categories.community AI Agent? Explore these related open-source MCP Servers.

View All

widget-generator

Logo of f
f

widget-generator is an open-source AI agent skill for creating widget plugins that are injected into prompt feeds on prompts.chat. It supports two rendering modes: standard prompt widgets using default PromptCard styling and custom render widgets built as full React components.

149.6k
0
Design

chat-sdk

Logo of lobehub
lobehub

chat-sdk is a unified TypeScript SDK for building chat bots across multiple platforms, providing a single interface for deploying bot logic.

73.0k
0
Communication

zustand

Logo of lobehub
lobehub

The ultimate space for work and life — to find, build, and collaborate with agent teammates that grow with you. We are taking agent harness to the next level — enabling multi-agent collaboration, effortless agent team design, and introducing agents as the unit of work interaction.

72.8k
0
Communication

data-fetching

Logo of lobehub
lobehub

The ultimate space for work and life — to find, build, and collaborate with agent teammates that grow with you. We are taking agent harness to the next level — enabling multi-agent collaboration, effortless agent team design, and introducing agents as the unit of work interaction.

72.8k
0
Communication