Files and specs

A workspace's and a project's files, what lives in ~/.raea, and every field of each spec file.

View as Markdown

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.

pathmoved bynamed in
~/.raea/Library/Cachesapps/app/host/acp/fence.ts
~/.raea/account.jsonRAEA_ACCOUNTapps/app/host/auth.ts
~/.raea/actions.jsonlio/shell/src/fs/mod.rs
~/.raea/app-prefs.jsonRAEA_APP_PREFSapps/app/host/render-layers.ts
~/.raea/binio/assets/src/lib.rs, runtime/bundle/lib/src/lib.rs, runtime/page/src/faces.rs
~/.raea/cacheapps/app/host/take.ts
~/.raea/envRAEA_ENV_FILEapps/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/skillsapps/app/host/evals/skills.ts
~/.raea/feedapps/app/host/feed-items.ts
~/.raea/feed/mediaapps/app/host/paths.ts
~/.raea/libraryRAEA_LIBRARY_HOMEapps/app/host/library/local.ts
~/.raea/library/granted.jsonRAEA_LIBRARY_GRANTSapps/app/host/library/service.ts
~/.raea/library/hashes.jsonRAEA_LIBRARY_STATEapps/app/host/library/scan.ts
~/.raea/library/requests.jsonRAEA_LIBRARY_REQUESTSapps/app/host/library/service.ts
~/.raea/mediaapps/app/host/compositions.ts
~/.raea/modelsRAEA_MODELSapps/app/host/library/embed.ts, apps/app/host/library/words.ts
~/.raea/node.jsonRAEA_NODE_FILEapps/app/host/link.ts, apps/app/host/reach.ts
~/.raea/npmRAEA_NPM_HOMEio/npm/src/store.rs
~/.raea/npm/storeio/npm/src/lib.rs, io/npm/src/store.rs
~/.raea/objectsio/shell/src/fs/mod.rs
~/.raea/onboarding.jsonRAEA_ONBOARDING_FILEapps/app/host/onboard-account.ts, apps/app/host/onboard.ts
~/.raea/pluginsRAEA_PLUGINSapps/app/host/packages.ts, engine/bundle/src/edit.rs
~/.raea/plugins.jsonRAEA_PLUGINS_FILEapps/app/host/plugins.ts
~/.raea/publish/drive.jsonRAEA_DRIVE_PICKSapps/app/host/publish-source.ts
~/.raea/publish/ready.jsonRAEA_PUBLISH_READYapps/app/host/publish-ready.ts
~/.raea/tasteRAEA_TASTEapps/app/host/taste.ts, engine/cli/src/guide.rs, engine/cli/src/spec.rs
~/.raea/taste/corrections.jsonlapps/app/host/taste.ts
~/.raea/taste/taste.tsengine/cli/src/guide.rs
~/.raea/updateRAEA_UPDATE_DIRapps/app/host/onboard.ts, apps/app/host/update.ts
~/.raea/usage-queue.jsonapps/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.

TS
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, };