Files and specs
A workspace's and a project's files, what lives in ~/.raea, and every field of each spec file.
A workspace and its project
What raea workspace init Example and then raea project new Launch make, under raea.root (git config --global raea.root, else ~/Studio). The workspace is one git repo; media/ and out/ go to LFS.
example
.gitattributes
.raea
workspace
controllers
.gitkeep
projects
.gitkeep
launch
.raea
project
AGENTS.md
brand
.gitkeep
brief.ts
media
.gitkeep
out
.gitkeep
taste.ts~/.raea
The files and folders under ~/.raea that raea's CLI, its engine and the raea app keep, the environment variable that moves each (when there is one) and the files that name them.
| path | moved by | named in |
|---|---|---|
~/.raea/Library/Caches | apps/app/host/acp/fence.ts | |
~/.raea/account.json | RAEA_ACCOUNT | apps/app/host/auth.ts |
~/.raea/actions.jsonl | io/shell/src/fs/mod.rs | |
~/.raea/app-prefs.json | RAEA_APP_PREFS | apps/app/host/render-layers.ts |
~/.raea/bin | io/assets/src/lib.rs, runtime/bundle/lib/src/lib.rs, runtime/page/src/faces.rs | |
~/.raea/cache | apps/app/host/take.ts | |
~/.raea/env | RAEA_ENV_FILE | apps/app/host/director.ts, apps/app/host/plugins.ts, io/gen-core/src/fal.rs, io/gen-core/src/fish.rs, io/gen-core/src/made.rs, io/gen-core/src/modal.rs, io/gen-core/src/openrouter.rs, io/gen-core/src/replicate.rs, io/gen-core/src/tripo.rs, io/home/src/lib.rs |
~/.raea/evals/skills | apps/app/host/evals/skills.ts | |
~/.raea/feed | apps/app/host/feed-items.ts | |
~/.raea/feed/media | apps/app/host/paths.ts | |
~/.raea/library | RAEA_LIBRARY_HOME | apps/app/host/library/local.ts |
~/.raea/library/granted.json | RAEA_LIBRARY_GRANTS | apps/app/host/library/service.ts |
~/.raea/library/hashes.json | RAEA_LIBRARY_STATE | apps/app/host/library/scan.ts |
~/.raea/library/requests.json | RAEA_LIBRARY_REQUESTS | apps/app/host/library/service.ts |
~/.raea/media | apps/app/host/compositions.ts | |
~/.raea/models | RAEA_MODELS | apps/app/host/library/embed.ts, apps/app/host/library/words.ts |
~/.raea/node.json | RAEA_NODE_FILE | apps/app/host/link.ts, apps/app/host/reach.ts |
~/.raea/npm | RAEA_NPM_HOME | io/npm/src/store.rs |
~/.raea/npm/store | io/npm/src/lib.rs, io/npm/src/store.rs | |
~/.raea/objects | io/shell/src/fs/mod.rs | |
~/.raea/onboarding.json | RAEA_ONBOARDING_FILE | apps/app/host/onboard-account.ts, apps/app/host/onboard.ts |
~/.raea/plugins | RAEA_PLUGINS | apps/app/host/packages.ts, engine/bundle/src/edit.rs |
~/.raea/plugins.json | RAEA_PLUGINS_FILE | apps/app/host/plugins.ts |
~/.raea/publish/drive.json | RAEA_DRIVE_PICKS | apps/app/host/publish-source.ts |
~/.raea/publish/ready.json | RAEA_PUBLISH_READY | apps/app/host/publish-ready.ts |
~/.raea/taste | RAEA_TASTE | apps/app/host/taste.ts, engine/cli/src/guide.rs, engine/cli/src/spec.rs |
~/.raea/taste/corrections.jsonl | apps/app/host/taste.ts | |
~/.raea/taste/taste.ts | engine/cli/src/guide.rs | |
~/.raea/update | RAEA_UPDATE_DIR | apps/app/host/onboard.ts, apps/app/host/update.ts |
~/.raea/usage-queue.json | apps/app/host/telemetry.ts |
The spec files
Each spec's fields, as raea/brief's types (sdk/raea/src/brief.gen.ts, generated from the schemas in core/brief that
raea spec checks against): brief.ts is a Brief, NAME.script.ts a Script, taste.ts a Taste, plan.ts a Plan and
controllers/ID.ts a Controller. A field marked ? may be left out.
export type Brief = { title: string, logline?: string,
/**
* who the work is for (a person or a client)
*/
for?: string,
/**
* YYYY-MM-DD
*/
due?: string,
/**
* who watches or plays it, and where
*/
audience?: string,
/**
* the one thing they should think afterwards
*/
believe?: string,
/**
* pitch, explain, story, play, tool: an open set, one guide each; a piece can mix two
*/
mode?: Array<string>,
/**
* the narrator and the tone
*/
voice?: string, sound?: string,
/**
* the project's committed world: palette by role, type, camera language, light, references
*/
look?: string,
/**
* the anti-goals
*/
notDoing?: Array<string>,
/**
* facts an agent wrote and the person hasn't confirmed, by key ("voice", "audience")
*/
assumed?: Array<string>,
/**
* prose sections beyond the fields above (Goal, Background), in order
*/
sections?: Array<Section>, deliver?: Array<Deliverable>, references?: Array<Reference>,
/**
* the tasks, in stages ("Act one", "The cut")
*/
stages?: Array<Stage>, agents?: Array<Agent>, };
export type Section = { heading: string, text: string, };
export type Deliverable = { name: string,
/**
* "90 s", "16:9", "with sound"
*/
specs?: Array<string>,
/**
* the feed item it lands as
*/
item?: string,
/**
* its own brief module, when it differs from the project in mode, look or audience
*/
brief?: string,
/**
* its script module (storyboard or screenplay)
*/
script?: string, };
export type Reference = { target: string, note?: string, };
export type Stage = { name: string, tasks: Array<Task>, };
export type Mark = "todo" | "done" | "dropped";
export type Task = { text: string,
/**
* a task linked to an item takes the item's state (the work is the truth); this is for unlinked ones
*/
mark?: Mark, agents?: Array<string>, item?: string, tags?: Array<string>, due?: string,
/**
* the craft verb it was written as ("quieter"): agents read it, the page shows the text
*/
verb?: string, };
export type Agent = { name: string, role?: string, };
export type Script = { title: string, logline?: string, scenes: Array<Scene>, };
export type Scene = {
/**
* where and when ("INT. SENATE - NIGHT", or "The brief page")
*/
heading?: string, beats: Array<Beat>,
/**
* what the scene must land
*/
payoff?: string, };
export type Beat = {
/**
* what's seen (a screenplay's action)
*/
onScreen: string,
/**
* the move ("push in on the knife", "orbit left, keeps moving through the cut")
*/
camera?: string,
/**
* how this beat is cut into ("match on motion", "hard cut")
*/
cut?: string, lines?: Array<Line>,
/**
* sound and music cues ("strings drop out", "the theme's second hit")
*/
cues?: Array<string>, seconds?: number,
/**
* the word the beat cuts on, so a new take keeps the cut in sync with the transcript
*/
onWord?: string, };
export type Line = {
/**
* a character, or "narrator"
*/
who: string, says: string,
/**
* a screenplay's parenthetical ("quietly")
*/
how?: string, };
export type Taste = { title: string,
/**
* when this file is read ("Read for pitch, explain and story")
*/
note?: string, for?: string,
/**
* the kinds of work with their own taste file (motion, games, sound, ui)
*/
kinds?: Array<string>, sections: Array<TasteSection>, };
export type TasteSection = {
/**
* "Always", "Never", "Camera"
*/
heading: string, rules: Array<Rule>, };
export type Rule = { text: string, check?: Check, };
export type Check = { "form": "text-hold", "value": number } | { "form": "text-above", "value": number } | { "form": "text-below", "value": number } | { "form": "text-margin", "value": number } | { "form": "loudness", "value": number } | { "form": "still-max", "value": number };
export type Plan = { concept: Concept,
/**
* by name; the build's parts are typed from these keys, so a planned part the build skips is a tsc error
*/
parts: { [key in string]: Part }, };
export type Concept = {
/**
* what it is ("flight feather", "toy rocking horse")
*/
what: string, style: string,
/**
* its largest extent, in metres
*/
size: number,
/**
* how close it's seen, in metres: sets how much detail up close must hold
*/
seenFrom: number, material?: string, use?: string, };
export type Level = "primary" | "secondary" | "tertiary";
export type Count = number | { min: number, max: number, };
export type Part = {
/**
* the label it carries into the world ("seat", "leaf", "gem")
*/
role: string, level: Level,
/**
* the part it sits on or in; none for the root
*/
parent?: string, count?: Count,
/**
* its own, else its parent's, else the concept's
*/
material?: string, style?: string,
/**
* what a near crop of it must show
*/
near?: string, };
export type Controller = { id: string, title: string, help?: string, groups: Array<Group>, };
export type Group = { id: string, title: string, help?: string, fields: Array<Field>, };
export type Field = { id: string, label: string, help?: string, } & ({ "type": "toggle", value: boolean, } | { "type": "choice", options: Array<string>, value: string, } | { "type": "number", value: number, unit?: string, min?: number, max?: number, step?: number, } | { "type": "text", value: string, placeholder?: string, multiline?: boolean, } | { "type": "list", value: Array<string>, placeholder?: string, } | { "type": "agents", value: Array<string>, } | { "type": "channels", value: Array<string>, } | { "type": "workflow", value: Array<Step>, channels?: Array<string>, } | { "type": "servers", value: Array<string>, } | { "type": "skills", value: Array<string>, });
export type Kind = { "type": "toggle", value: boolean, } | { "type": "choice", options: Array<string>, value: string, } | { "type": "number", value: number, unit?: string, min?: number, max?: number, step?: number, } | { "type": "text", value: string, placeholder?: string, multiline?: boolean, } | { "type": "list", value: Array<string>, placeholder?: string, } | { "type": "agents", value: Array<string>, } | { "type": "channels", value: Array<string>, } | { "type": "workflow", value: Array<Step>, channels?: Array<string>, } | { "type": "servers", value: Array<string>, } | { "type": "skills", value: Array<string>, };
export type Step = { name: string, by?: string, back?: string, };