One commanddoes it all.
A company’s model is a folder of Markdown files in a repository of its own. The command line makes that folder, checks it, keeps its vocabulary current and puts the Obsidian plugin beside it, all from one menu.
Nothing here is installed from a registry. The command runs straight from a release on GitHub, and #semver:* is what picks it: npm reads the repository’s release tags as version numbers and takes the highest, so it runs the newest release on the day you run it. The quotes keep the shell from reading the * as a file pattern, and --yes answers the question npx asks before any release it has not run before. It needs Node 22 or newer.
Run it
In a terminal, from any folder. It opens a menu, asks for what it needs, and says what it did. Then the menu comes back, with the latest pick above it, green when it went through and red when not, until you pick Quit, type q or press Ctrl+C.
npx --yes 'github:companygraph/meta-model#semver:*'
$ npx --yes 'github:companygraph/meta-model#semver:*'
CompanyGraph tooling <release> · companygraph.io
1 Make a model a new instance in a folder, or beside the files already in one 2 Check a model the mechanical checks, as its CI runs them 3 Move a model to <release> its vendored core, skills, manifest and workflow tag together 4 Obsidian plugin install it in a vault, or update it there 5 Quit or q, or Ctrl+C › Pick 1-5
What the menu does
1 · Make a model. It asks for a folder and the company’s name, and writes the instance there: the vocabulary under meta/core/, a manifest with a hash for every file it owns, a folder for each type with a README naming its schema, the entities no instance passes without, a CI workflow, and for Claude an AGENTS.md, a CLAUDE.md and three skills. A folder that already holds files, a repository or an Obsidian vault, is added to only once you say yes, and nothing in it is written over. Then it offers the Obsidian plugin.
2 · Check a model. The mechanical checks, the same ones the workflow runs on every push and pull request once the folder is a repository on GitHub. They apply the rules of the vocabulary the instance copied in, never a newer one. Whether an entity keeps its schema’s writing rules is judged by reading, which the companygraph-validate skill does.
3 · Move a model to a newer release. A release lands in the vocabulary, the skills, the manifest and the workflow’s pin, so it moves them together. It first shows every file it would write or remove, and writes only once you say yes. A vocabulary file edited inside the instance stops it and is named; the model itself, AGENTS.md and CLAUDE.md are never touched.
4 · Obsidian plugin. An instance is a folder of Markdown files, which is what an Obsidian vault is. The plugin checks the model as you type, completes what the schemas declare and marks what breaks where it is written. It is not in Obsidian’s community directory, so the menu installs it: the newest release into .obsidian/plugins/companygraph/, switched on, and any plugin already on stays on. Run again, it updates the plugin and keeps its settings.
What Obsidian still asks. The first time it opens the vault, Obsidian asks whether you trust the vault’s author; say yes. If the plugin is still not under Installed plugins, the vault was once opened in restricted mode: Settings → Community plugins → Turn on community plugins. Obsidian keeps that switch outside the vault, so no command can set it.
Without the menu
Each entry is also a command, for a script or a CI step, and its flags say what the menu asks. Without a terminal, in a pipe or in CI, the bare command only prints what it can do.
npx --yes 'github:companygraph/meta-model#semver:*' init ~/git/acme --name "Acme" --agent claude npx --yes 'github:companygraph/meta-model#semver:*' check ~/git/acme npx --yes 'github:companygraph/meta-model#semver:*' upgrade ~/git/acme --dry-run npx --yes 'github:companygraph/meta-model#semver:*' obsidian ~/git/acme
The flags. init takes --here to write into a folder that already holds files, and --folders values,processes to write only the types named. upgrade takes --dry-run, which only shows, and --force, which overwrites an edited vocabulary file and says so. obsidian takes --release for one release of the plugin. The meta-model’s README names them all.