Ulkan operates on a "Hub and Spoke" model:
- Hub: The
.agent/directory (Single Source of Truth). - Spokes: The adapter files (e.g.,
.claude/,copilot-instructions.md) used by specific tools. - Engine: The
ulkanCLI which manages the synchronization between Hub and Spokes.
| Component | Technology | Rationale |
|---|---|---|
| Language | Python 3.12+ | Modern, typed, compliant with latest standards. |
| CLI Framework | typer |
Type-hint based CLI creation, robust and easy to maintain. |
| Terminal UI | rich |
Beautiful, readable output is critical for developer tools. |
| Communication | httpx |
Modern, async-capable HTTP client for API interactions (PyPI, Skyll). |
| Versioning | packaging |
Robust version comparison logic (SemVer compliant). |
src/ulkan/
├── main.py # Entry point
├── commands.py # CLI command definitions (init, build, adapt, sync, upgrade, etc.)
├── agents.py # Logic for specific AI agent adapters
├── generator.py # Scaffolding logic (creating .agent structure)
├── migrator.py # Logic for ingesting existing agent configs
├── syncer.py # Documentation synchronization logic
├── builder.py # "AI Build" logic (LLM interaction)
├── manager.py # Asset management logic (install, list, search)
├── updater.py # Self-update logic (PyPI check, pip upgrade)
└── blueprints/ # Asset registry (skills, workflows, etc.)
The .agent/ folder contains canonical data:
skills/: Reusable capabilities (e.g., "Create React Component").workflows/: Standard operating procedures (e.g., "Bug Fix Workflow").rules/: Active constraints.docs/: Product context.
The adapt command creates symbolic links or generated files mapping the SSOT to vendor-specific formats.
- Example:
.agent->.claude(Symlink) allows Claude CLI to see the standard structure as its own context.
The sync command ensures AGENTS.md (the human/agent readable index) reflects the actual state of the .agent/ directory.
- User runs
ulkan init. - Generator creates
.agent/structure. - User runs
ulkan adapt --claude. - Adapter symlinks
.agentto.claude. - User runs
ulkan build. - Builder invokes the AI Agent to read project code and populate
AGENTS.mdcontext sections.