|
|
||
|---|---|---|
| docs | ||
| nix/backends | ||
| roles | ||
| schemas | ||
| src | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| flake.lock | ||
| flake.nix | ||
| README.md | ||
| renovate.json | ||
| zensical.toml | ||
Umbrella ☂️
A metadata framework for defining organizational structure — who works on what, what belongs to whom, and how it all fits together.
Concepts
Org tree
Projects form a tree. Any node can contain sub-projects — no fixed depth, no rigid categories.
The tree lives on the filesystem: directories are parents, .toml files are nodes.
Roles
Roles are the core abstraction — parameterized templates that describe what someone does. Each role has a set of responsibilities, each with a cadence (daily, weekly, monthly, on-demand) and optional trigger/output/tools.
umbrella resolve renders a role template into concrete output:
# System prompt for an AI agent (from a person's assignment)
umbrella resolve adm@hydrar.de@media.visual --format prompt
# Same, with explicit params
umbrella resolve software-maintainer \
--param software=webarc \
--param repo=git.hydrar.de/jmarya/webarc \
--format prompt
# Human-readable job description
umbrella resolve platform-engineer \
--param scope=k8s-prod --format job
People & assignments
People are defined once (ID = email), then linked to projects via role assignments:
[[people]]
id = "alice@example.com"
name = "Alice"
[[assignments]]
person = "alice@example.com"
role = "platform-engineer"
project = "engineering"
config = { scope = "k8s-prod" }
The config provides the {{ param }} values that resolve the role template for that context.
CLI
| Command | What it does |
|---|---|
resolve |
Render a role definition into an AI prompt or job description |
tree |
Print the org tree |
info <path> |
Show project details with linked resources and assignments |
whois <person> |
Show a person's roles and assignments |
resources |
List every repo, domain, and server across the org |
validate |
Cross-reference all data (assignments → people/roles/projects) |
gen-schema |
Generate JSON Schemas from Rust types into schemas/ |
build |
Generate a static org chart site into dist/ |
Structure
All paths are convention-based — no entry point config needed.
umbrella/
schemas/ # generated by cargo run -- gen-schema
roles/definitions/ # 15+ role templates (.yaml)
org/ # your org tree (.toml)
people.toml # people + assignments
infra.toml # nodes + domains
Getting started
cargo run -- gen-schema # generate JSON Schemas from Rust types
cargo run -- validate # cross-reference everything
cargo run -- build # build org chart site into dist/
The source of truth is the Rust types (#[derive(JsonSchema)]). JSON Schemas are generated artifacts — always in sync.
Future ideas
- Graphviz / Mermaid export —
umbrella tree --format dotor--format mermaidfor visual org charts