Platform Architecture
Path C: Platform of focused CLIs
Section titled “Path C: Platform of focused CLIs”Three architecture paths were evaluated:
| Path | Approach | Verdict |
|---|---|---|
| A | God-mode universal CLI | Rejected — bloated, unfocused |
| B | Separate CLIs, no shared code | Rejected — duplicated effort |
| C | Platform of focused CLIs sharing @crucibledx/smelt |
✅ Chosen |
Path C gives:
- Engineering leverage — shared plugin infrastructure
- Community cohesion — one ecosystem, multiple entry points
- Defensible moat — platform value > any single tool
Ecosystem structure
Section titled “Ecosystem structure”Each product is independent enough to be useful alone, but shares infrastructure for leverage.
Plugin protocol
Section titled “Plugin protocol”Plugins communicate via stdin/stdout JSON — not gRPC, not HTTP. This makes plugins:
- Language-agnostic (any language that reads/writes JSON)
- Easy to test (pipe JSON in, check JSON out)
- Easy to debug (readable text protocol)
Config hierarchy
Section titled “Config hierarchy”Global (~/.crucible/forge.config.yaml) ↓ overridden byProject (.crucible/forge.config.yaml) ↓ overridden byLocal (.crucible/forge.config.local.yaml) ← gitignoredEach Crucible product uses its own config file under .crucible/:
forge.config.yaml— Forge settingsember.config.yaml— Ember settings (future)cast.config.yaml— Cast settings (future)
Technology stack
Section titled “Technology stack”- Language: TypeScript + Bun
- Binary: Single native binary via
bun build --compile - Architecture: Domain-Driven Design (DDD) with three-layer separation
- Testing: Bun test runner, infrastructure boundary mocking
- Validation: Zod schemas for all external data
- License: MIT