Changelog

Word-level diffs and asset deduplication

Productv0.9.0

Change-set diffs carry word-level segments for prose fields. Images get a perceptual hash, so a resized copy is found as a duplicate. A new access check says why a call was refused, and myna schema pull --open-pr turns schema drift into a pull request.

Word-level diffs

Reviewing a rewritten body shows the words that moved.

$ myna changes diff chs_01...
update posts/pricing — Clarify the annual discount
FIELD  KIND     BEFORE                 AFTER
body   changed  We offer three plans…  We offer four plans…
  body: We offer [-three-]{+four+} plans for teams …

The dashboard review view renders the same comparison inline. myna_diff_change_set returns it as segments — an ordered list of equal, insert, and delete runs — so an agent summarising its own work reads what a reviewer reads.

Segments appear where they help. Both sides have to be readable prose: a markdown or text value, or a richText document. The longer side has to pass 160 characters, so a title stays whole. For rich text they cover the prose, not marks or node attributes.

They annotate the fields the diff already reported, so rebasing merges exactly what the reviewer read.

Asset deduplication

The same photograph exported again at another size is a new file and an old picture. A checksum cannot see that; myna assets similar can.

$ myna assets similar ast_01...
ID          FILENAME       DISTANCE  STATE
ast_01H...  hero-2400.png  1         published

distance counts differing bits out of 64: 0–2 is the same image re-encoded or resized. --max-distance defaults to 5 and stops at 16.

myna assets upload prints matches as it uploads, and myna_upload_asset returns them in similar, so an agent can reference the image already there instead of leaving the library with two.

Images get their fingerprint at upload, so anything uploaded before 0.9.0 has none until it is uploaded again or replaced. Filter by checksum when you want byte-identical matches instead.

Access checks

myna access says why a call would be refused, and which of three unrelated things is wrong.

$ myna access --capability content:publish --collection posts
  ok   credential — Credential is an API key with 4 scope(s).
  ok   project — Project blog resolves and is reachable with this credential.
  fail capability — Credential does not carry content:publish. It has: content:read, content:write, assets:read, assets:write.
  ok   collection — Collection "posts" exists and is within reach.

  remedy: Mint a key that carries content:publish: myna keys create --scopes content:publish

Both flags are optional; without them you get what the credential can do in the project. The collection check separates a credential confined elsewhere from a collection that is not deployed — a missing resource rather than a permission. The capability check separates a scope never granted from one granted to a connector whose user role no longer allows it.

Agents call myna_explain_denial with the tool that was refused and it resolves the capability that tool needed. The command exits 1 when the call would be denied, so CI can gate on it.

Schema pull requests

myna schema pull --open-pr turns deployed schema drift into a pull request instead of a warning.

$ myna schema pull --open-pr
Opened https://github.com/acme/site/pull/214 against main.

It commits only the files that differ, refuses to run while your schema directory has uncommitted changes, and puts you back on the branch you started from. Branch names derive from the content, so re-running on unchanged drift finds the branch and opens nothing. --branch and --base override. The description lists the files and the operations a myna schema push would have applied.

myna doctor names both remedies now: push the repository, or pull the deployed schema into a pull request.

Upgrading

$ npm install @myna-sh/[email protected]

Additive: nothing removed, minimum supported client unchanged. AssetContract gains a nullable perceptualHash, and change-set diff field changes gain an optional segments.

New capabilities are change-sets.diff.words, assets.similar, and projects.access-check. See the management API reference for reading them and for the routes behind each command.

Affects api · dashboard · sdk · cli · mcp · docs

Give your agent something to work with.

Free to start, no card required. Sign in with GitHub, enable the products you want, and point your agent at them.