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; unset, ~/Studio where workspaces already are, else ~/Documents/raea, or ~/raea when iCloud keeps Documents). The workspace is one git repo; media/ and out/ go to LFS.

example
  .gitattributes
  .raea
    workspace
  projects
    .gitkeep
    launch
      .raea
        project
      AGENTS.md
      artifacts
        .gitkeep
      assets
        .gitkeep
      brief.ts
      components
        .gitkeep
      compositions
        .gitkeep
      controllers
        .gitkeep
      out
        .gitkeep
      tsconfig.json
  shared
    artifacts
      .gitkeep
    assets
      .gitkeep
    components
      .gitkeep
    compositions
      .gitkeep
    controllers
      .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-host.jsonapps/app/host/host-file.ts, engine/cli/src/app.ts
~/.raea/app-prefs.jsonRAEA_APP_PREFSapps/app/host/app-prefs.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, apps/app/host/fingerprint.ts
~/.raea/feed/mediaapps/app/host/paths.ts
~/.raea/fingerprintsRAEA_FINGERPRINTSapps/app/host/fingerprint.ts
~/.raea/fingerprints/defaultapps/app/host/fingerprint.ts
~/.raea/inboxRAEA_INBOX_DIRapps/app/host/inbox.ts, engine/cli/src/show.ts
~/.raea/inbox/INBOX.jsonlengine/cli/src/cli.rs
~/.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/sessionsRAEA_SESSIONS_DIRapps/app/host/sessions.ts
~/.raea/storage-used.jsonRAEA_STORAGE_USEDapps/app/host/storage/back.ts
~/.raea/storage.jsonRAEA_STORAGE_FILEapps/app/host/storage/service.ts
~/.raea/tasteRAEA_TASTEapps/app/host/taste.ts, 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>, } | { "type": "rule", check: string, values: Record<string, number | string | boolean>, level?: 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>, } | { "type": "rule", check: string, values: Record<string, number | string | boolean>, level?: string, };
export type Step = { name: string, by?: string, back?: string, };