Tier 0 Observer - NeuralIO444/Mograph_Jailed_OSX_CLI GitHub Wiki
Tier 0 is the "look at everything, change nothing" layer. It's designed so the worst possible outcome of running it on a production machine is some JSON files appearing in a folder you chose.
After Effects project
β (1) scrape β you run the scraper in AE, once per project
βΌ
MJ_PROJECT_SCRAPE_1.json (a receipt: comps, layers, expressions, effects, fonts, footage)
β (2) project.ingest β validate + summarize the receipt
β (3) expression.lint β spell-check every expression
βΌ
findings + summaries (JSON you can read, diff, or feed to other tools)
Any .aep file ββ (4) project.snapshot βββΆ timestamped versioned copies, never overwritten
Any Plug-ins folder ββ (5) plugin.audit βββΆ whatβs installed, hashed
Steps 2β5 are CLI commands. Step 1 happens inside After Effects (see AE Scraper).
In After Effects: File β Scripts β Run Script File, pick integrations/after-effects/MographJailed_ProjectScraper.jsx, choose where the receipt goes. Full walkthrough: AE Scraper.
mj project.ingest path=/Users/you/AE_Receipts/MyProject.20260929T150000Z.scrape.jsonValidates the receipt against the MJ_PROJECT_SCRAPE_1 schema and returns a summary: comp/layer/expression/effect counts, fonts, footage β plus missing footage (path on disk is gone) and unlinked footage (no path at all). Malformed or hostile JSON fails closed here.
mj expression.lint path=/Users/you/AE_Receipts/MyProject.20260929T150000Z.scrape.jsonStatic analysis over every scraped expression β a spell-checker for AE expressions:
| Code | Severity | Meaning |
|---|---|---|
E001 |
error | References a layer that doesn't exist in the comp |
E002 |
error | References an effect that isn't applied to the layer |
W001 |
warning |
sampleImage() inside a loop (render-time performance trap) |
W002 |
warning | Hard-coded absolute path (breaks on other machines) |
W003 |
warning | Expression over 2,000 characters |
I001 |
info | Uses ExtendScript dynamic evaluation (opaque to analysis) |
It reports; it never fixes. Findings are capped at 200.
mj project.snapshot path=/Users/you/Movies/MyProject.aep output=/Users/you/AE_VersionsHashes the project and saves a timestamped, hash-suffixed copy into your versions folder β using an APFS copy-on-write clone when available, so it's instant and nearly free on disk.
- Unchanged? Skipped, not re-copied (hash comparison).
- Already exists? Refused β it will never overwrite a snapshot.
- Source file? Never touched. Byte-identical before and after.
-
Not an
.aep? Rejected up front.
Every snapshot writes a .snapshot.json receipt next to it, and a <name>.latest.json pointer to the newest version.
mj plugin.audit path="/Applications/Adobe After Effects 2025/Plug-ins"Enumerates one directory level, classifies files/bundles/symlinks, and SHA-256 hashes what it can read. Answers "what's on this machine" without installing or touching anything. Entries capped at 500.
Dashboard gives you the btop-style terminal view over snapshots, vitals, lint findings, and watcher state. Watcher snapshots your .aep files automatically.
- Schema:
docs/MJ_PROJECT_SCRAPE_1.mdin the repo - Full spec:
docs/TIER0_OBSERVER.mdin the repo - Safety model: Safety