Repository navigation
[0.38.2] - 2026-11-03
Fixed
project repo move,project repo rename, andproject renamerewritegraph.relationshipsendpoints andgraph.nodesidentities that encodeproject/namein the same save as the catalog change. URL identities such asgithub://org/namestay.--dry-runand--jsonlist each rewrite (graph.relationships[id=<id>].from_endpoint.project: platform -> zz-probe). A split manifest writes that rewrite into the fragment that owns the relationship. The 0.38.1 notes did not actually do this. Verify:metagit project -p platform repo move -n admin-api --to-project zz-probe --manifest-only, thenconfig validate. Endpoints left on the old project: 0.config validaterejects a{project, repo}endpoint when that repo is not in the named project. It no longer resolves the repo name through the global index. When the name exists in exactly one other project the message isgraph.relationships[id=<id>].from: repo 'admin-api' is not in project 'platform' (it is declared in 'zz-probe'). Normal and--strictboth exit 1. Verify: point one moved endpoint back at the old project and runconfig validateandconfig validate --strict.config setparses JSON or a YAML flow value when the field is a dict, list, or model. The confirmation prints the path exactly as given, selectors included. A value that does not parse, or a result that fails validation, exits non-zero and does not save. Verify:config set 'workspace.projects[name=x].repos[name=y].tags' '{"type":"application"}', thenconfig getthat same path.config patch --op appendappends the supplied value, checked against the list item type. The schema example is only for the web add-row button. A patch runs the same graph and component checks asconfig validateand exits non-zero when the result is invalid. Verify:config patch --op append --path workspace.projects[name=p].repos --value '{"name":"extra","url":"https://github.com/acme/extra.git"}' --save.config patch --filehonours a top-level"save": trueand rejects unknown top-level keys. Verify: a file{"save": true, "operations": [...]}with no--saveflag writes, and a file with an extra key exits non-zero.- Paths printed by validate and duplicate-repo warnings work unchanged with
config get,config set, andconfig patch.fromis an alias offrom_endpoint.graph.nodes[id=]matchesidentity. Relationship paths use[id=]. A bad selector prints one line, including the candidate list, and exits 2.--jsonprints{"ok": false, "error": "..."}. Verify:config get 'graph.relationships[id=edge].from.project'andconfig get 'graph.nodes[id=github://org/name].identity'. config diffmatches projects and repos byname, relationships byid, and nodes byidentity. A pure reorder is oneorderentry.--by-indexcompares by position. Verify:config split --by all --globon a manifest whose projects are not in filename order, thenconfig diffthe original against the split. Content differences: 0.orderentries: 1.project repo add --tag key=value(repeatable) setstagson the new repository in the same save. Repository entries have no free-formmetadatamap. Verify:project repo add -n NAME --url URL --tag type=application --tag team=core.project repo moveaccepts repeated-n, checks every name, then saves once. An unknown name writes nothing. Verify:project repo move -n a -n b --to-project TARGET --manifest-only.merge integrateregeneration takes the target's deletion when a mapped path is not in the target HEAD (git rm --cached --ignore-unmatch) and does notgit adda path that is gitignored after the regenerate command. Verify: merge a branch that still edits a generated file the target deleted and gitignored, withmerge.regeneratematching that path. The merge commits and the path stays untracked.merge integraterefuses when the target branch is checked out in any worktree. No flag overrides this. The error andmetagit merge --helpsay to rungit -C <path> switch --detachin that checkout first. This rule has been in effect since 0.36.0; the message now names the command.
Full Changelog: 0.38.1...0.38.2