Skip to content

Releases: NeuralIO444/Mograph_Jailed_OSX_CLI

MographJailed 0.4.0-dev.3

Pre-release

Choose a tag to compare

@github-actions github-actions released this 05 Oct 01:58

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

Choose a tag to compare

@NeuralIO444 NeuralIO444 released this 02 Oct 07:13

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: 4e3deb33e0ccfcaf8376834bfcc090c36d32f1075ad495dc1af500fe570cd889

or 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.zsh

The 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.lint returned 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.health now 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 is SNAPSHOT_FAILED, a changing source SNAPSHOT_UNSTABLE.
  • Scraper writes scrapedAt in UTC (...Z); project.health treats a bare timestamp as local time, so snapshot freshness is right in any timezone.
  • project.diff no longer reports index shifts as moves (layersMoved, footageMoved counted); mj explain no 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 Foo prefers the exact name over Foo_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); real warnings (#17); validated image stats (#18); volume.inspect gate (#11); plugin.audit size bound and hashing-time guidance (#19); --request - (#21); system.doctor guidance (#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); --json mode (#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_b64 wrapping 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 .AEP projects dedupe and name their latest pointer consistently. Receipts now record copyVerified and sourceStableDuringCopy.
  • sourceUnchanged (#20) is now measured (size and modification time before and after) in image.stats, image.compare, project.ingest, expression.lint, plugin.audit, project.snapshot and the newer frame, protect and library operations, instead of a literal true. preset.get no longer reports it (its source is the hash-verified store).
  • Dashboard (#10): the observer dashboard reads the unwrapped *.latest.json pointer, so project paths show.
  • Version (#12): the runtime and VERSION now report 0.4.0-dev.1; tests/run_contract_audit.sh fails if the constant, VERSION and the newest changelog entry disagree.

Phase 7 (live progress, notifications, status)

  • Renders write <store>/render-progress.json (frames counted from finished PNGs, total from range, fps, ETA) about twice a second; removed when the render ends. The dashboard shows an animated bar and sets the Terminal title to MJ · 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; optional integrations/swiftbar/mj.10s.sh. No menu-bar process by design.
  • Fixed: a successful mj recipe returned non-zero when notifications were off (caught by the new tests).
  • Tests: run_host.sh 39, run_mj_cli.sh 38, run_ui.sh 52.

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 ui is a full-screen dashboard with Overview / Renders / Library / Audit tabs. mj cd replaces the old bare-mj go-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/--width for scripting.
  • Runtime: <store>/renders.jsonl render history; index.verify now reports projects.
  • Added tests/run_ui.sh (41 checks, including real pseudo-terminal sessions).

Project audit queries (Modules 1–3 fold-in)

  • Added trace.asset and audit.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): layer sourceId, text-layer font, footage id; read-only guard still passes.
  • Newest scrape per project path wins; older receipts never replace newer data.
  • AE client: traceAsset(), auditPlugins(). Added tests/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 names range, 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/PYTHONSTARTUP cleared, user site and bytecode disabled for every embedded script.
  • mj last, mj open-last; test bundle only: MJ_TEST_APPS_DIR points 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: c4dpy blocks 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 name version.
  • MJ-owned store (SL-M4): fixed-schema SQLite + FTS5 via Python's stdlib sqlite3 with bound parameters only; migrations by user_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.jsonl when the directory exists; MJ_AUDIT_DIR overrides) and audit.verify (operation 31).
  • system.describe operation descriptors now publish args.allowed / args.required from the validator's own schema table (request_schema_for).
  • Added mj front 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) and tests/run_mj_cli.sh (17 checks).

Power CLI Phases 5–6

  • Added loop.seams, golden.record, golden.check (operations 28–30) and argument names minFrames, 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 sips when present (48 × 1080p frames in ~3 s) and fall back to direct decode otherwise; python3 is the only hard requirement.
  • AE client: loopSeams(), `go...
Read more