Repository navigation
Releases: NeuralIO444/Mograph_Jailed_OSX_CLI
Release list
MographJailed 0.4.0-dev.3
Install/Uninstall plus payload. Dimension prong calls a local dimension binary: probe, safezone, conform. No network.
0.4.0-dev.1: Power CLI for After Effects and Cinema 4D
Pre-release. Power CLI for After Effects and Cinema 4D. Protocol v1 is preserved; the runtime grows from 27 to 46 operations. Renders are qualified against stub hosts only; real After Effects / Cinema 4D qualification is in progress, which is why this is a development release.
Install this exact release
curl -fsSLO https://github.com/NeuralIO444/Mograph_Jailed_OSX_CLI/releases/download/0.4.0-dev.1/mograph-jailed-0.4.0-dev.1.zip
shasum -a 256 mograph-jailed-0.4.0-dev.1.zip # must equal: 4e3deb33e0ccfcaf8376834bfcc090c36d32f1075ad495dc1af500fe570cd889or let the installer verify it for you (it also checks every file against the shipped SHA256SUMS):
MJ_INSTALL_ZIP_URL=https://github.com/NeuralIO444/Mograph_Jailed_OSX_CLI/releases/download/0.4.0-dev.1/mograph-jailed-0.4.0-dev.1.zip \
MJ_INSTALL_SHA256=4e3deb33e0ccfcaf8376834bfcc090c36d32f1075ad495dc1af500fe570cd889 \
zsh install-designer.zshThe zip's SHA-256 is published here, in the attached .sha256 file, and in the release notes. Compare it against a copy you obtained some other way if you need independence from this page. System python3 is required for most operations (see the README's runtime requirements).
What's in it
— 2026-10-01
Power CLI for After Effects and Cinema 4D. Protocol v1 preserved; the public surface grew additively from 27 to 46 operations. The sections below describe the pieces.
Fixes from the independent QA review of this work
project.ingest/expression.lintreturned exit 0 on request errors; now 65 (and the audit log records it). Content errors in a scrape (INVALID_JSON,SCHEMA_MISMATCH,SCRAPE_TOO_LARGE) are exit 65 from every operation that reads one;project.healthnow reports the real one.- Snapshot hooks: also refuse a script under a folder others can write (sticky folders such as /tmp allowed), kill the hook's whole process group on timeout, read the same config values as
mj; staged-copy mismatch isSNAPSHOT_FAILED, a changing sourceSNAPSHOT_UNSTABLE. - Scraper writes
scrapedAtin UTC (...Z);project.healthtreats a bare timestamp as local time, so snapshot freshness is right in any timezone. project.diffno longer reports index shifts as moves (layersMoved,footageMovedcounted);mj explainno longer says "No differences" when there are, and no longer says "Nothing was changed" after a render failure; health forwards the scrape's truncation warnings and trends compare one formula version.mj snapshot Fooprefers the exact name overFoo_v2, and typed*/[]are not wildcards. Installer refuses files not in its checksum list.--request -removes its temp file on signals. Scraper guard handles split/commented calls, more mutators, project settings, other file writes, and computed dispatch.
Review backlog (issues #1-#33)
- Guard and CI: scraper read-only guard enforced in CI and hardened against whole mutator families, assignments and dynamic code (#1 #2 #3, 74-case test).
- Runtime:
--help/--version(#13); error-code reference with completeness test (#24); realwarnings(#17); validated image stats (#18);volume.inspectgate (#11);plugin.auditsize bound and hashing-time guidance (#19);--request -(#21);system.doctorguidance (#23);project.diff(#22);project.health(#32) with store schema v3; teaching lint (#33). - Watcher and dashboard: error codes in the log, collision-free request files,
.AEP(#14); cached receipt ingest (#16);--jsonmode (#25); snapshot hooks (#31). - Human CLI:
mj snapshot/versions/lint/health/diff/explain/watch/doctor/config(#26),mj explain(#28), config file (#29), completions (#30), dashboard offered at install end (#27), installer checksum verification and pinning (#15),_mj_b64wrapping fix (#6). - 46 operations. Tests added: errors 69, scraper guard 98, review fixes 63, human CLI 232.
- Rejected-by-the-guard is a long list, not "every" mutation: it is a text search, and the residual risks are stated in
SECURITY.md.
Fixes from the 2026-09-30 review
project.snapshot(#7, #8, #9): the copy is staged, its SHA-256 and the source's are re-checked, and a mismatch keeps nothing (SNAPSHOT_UNSTABLE); publish is by hard link so an existing snapshot is never overwritten; the project stem is case-insensitive so.AEPprojects dedupe and name their latest pointer consistently. Receipts now recordcopyVerifiedandsourceStableDuringCopy.sourceUnchanged(#20) is now measured (size and modification time before and after) inimage.stats,image.compare,project.ingest,expression.lint,plugin.audit,project.snapshotand the newer frame, protect and library operations, instead of a literaltrue.preset.getno longer reports it (its source is the hash-verified store).- Dashboard (#10): the observer dashboard reads the unwrapped
*.latest.jsonpointer, so project paths show. - Version (#12): the runtime and
VERSIONnow report0.4.0-dev.1;tests/run_contract_audit.shfails if the constant,VERSIONand the newest changelog entry disagree.
Phase 7 (live progress, notifications, status)
- Renders write
<store>/render-progress.json(frames counted from finished PNGs, total fromrange, fps, ETA) about twice a second; removed when the render ends. The dashboard shows an animated bar and sets the Terminal title toMJ · rendering N%. mj notify on|off|test|status: opt-in native notifications for renders, golden checks, recipes and operations running 10 s or more; text passed to osascript as arguments only.mj status(and--swiftbar): one-line status from local files; optionalintegrations/swiftbar/mj.10s.sh. No menu-bar process by design.- Fixed: a successful
mj recipereturned non-zero when notifications were off (caught by the new tests). - Tests:
run_host.sh39,run_mj_cli.sh38,run_ui.sh52.
Terminal experience
mj(bare) is now a launch screen: animated gradient wordmark and a live boot checklist (runtime, After Effects, Cinema 4D/Redshift, GPU, library, audit log, last render).mj uiis a full-screen dashboard with Overview / Renders / Library / Audit tabs.mj cdreplaces the old bare-mjgo-to-folder behavior.scripts/terminal/mj_ui.py: read-only, stdlib-only; truecolor → 256-color → plain/ASCII fallbacks (NO_COLOR,MJ_PLAIN,MJ_ASCII,MJ_NO_ANIM), terminal always restored on exit,--once/--plain/--widthfor scripting.- Runtime:
<store>/renders.jsonlrender history;index.verifynow reportsprojects. - Added
tests/run_ui.sh(41 checks, including real pseudo-terminal sessions).
Project audit queries (Modules 1–3 fold-in)
- Added
trace.assetandaudit.plugins(operations 43–44) over new normalized store tables (schema v2: projects, compositions, layers, assets, fonts, plugins) with in-place v1 migration. - Scraper (
MJ_PROJECT_SCRAPE_1, additive optional fields): layersourceId, text-layerfont, footageid; read-only guard still passes. - Newest scrape per project path wins; older receipts never replace newer data.
- AE client:
traceAsset(),auditPlugins(). Addedtests/run_audit_queries.sh(29 checks).
Power CLI Phases 0–1 (hosts and rendering)
- Added
host.detect,ae.render,c4d.render(operations 40–42) and argument namesrange,timeoutSeconds. - Guarded host runner: closed stdin, own process group, streamed log, hard timeout, licence-prompt detection, single-render lock with stale-lock reclaim.
- Python environment hardening:
PYTHONPATH/PYTHONHOME/PYTHONSTARTUPcleared, user site and bytecode disabled for every embedded script. mj last,mj open-last; test bundle only:MJ_TEST_APPS_DIRpoints host discovery at a stub/Applications.- Added
tests/run_host.sh(31 checks, stub hosts). Contract audit now accepts digits in operation names (c4d.render). - Observed on the target Mac:
c4dpyblocks on an interactive licence prompt until C4D licensing is configured once by hand.
Power CLI Phase 9 (search and recall)
- Added
index.add,index.search,index.verify,preset.add,preset.get(operations 35–39) and argument nameversion. - MJ-owned store (SL-M4): fixed-schema SQLite + FTS5 via Python's stdlib
sqlite3with bound parameters only; migrations byuser_version; content-addressed preset blobs. - AE client:
indexAdd(),indexSearch(),indexVerify(),presetAdd(),presetGet(). - Added
tests/run_library.sh(31 checks).
Power CLI Phase 8 (protect work)
- Added
project.restore,deps.graph,handoff.package(operations 32–34). - Footage from scrapes is classified local/network/unknown from the mount table; only local footage is ever stat'ed or copied.
- AE client:
projectRestore(),depsGraph(),handoffPackage(). - Added
tests/run_protect.sh(31 checks).
Power CLI Phases 8 (audit) and 10 (shell)
- Added opt-in hash-chained audit log (
~/Library/Logs/MographJailed/audit.jsonlwhen the directory exists;MJ_AUDIT_DIRoverrides) andaudit.verify(operation 31). system.describeoperation descriptors now publishargs.allowed/args.requiredfrom the validator's own schema table (request_schema_for).- Added
mjfront end (scripts/shell/mj-cli.zsh): single operations,mj ops, zsh completion, and validated data-only recipes (recipes/render-qa.mjrecipe). - Added
tests/run_audit.sh(17 checks) andtests/run_mj_cli.sh(17 checks).
Power CLI Phases 5–6
- Added
loop.seams,golden.record,golden.check(operations 28–30) and argument namesminFrames,threshold. Protocol v1 preserved; no existing schema changed. - ImageStats signature engine moved into one shared Python block; PNG decoder now accepts 16-bit RGB/RGBA (common for C4D renders).
- Frame operations downscale through
sipswhen present (48 × 1080p frames in ~3 s) and fall back to direct decode otherwise;python3is the only hard requirement. - AE client:
loopSeams(), `go...