Keeping edikt Up to Date
Current entry point
v0.7.1 is the current release and the entry point for upgrading. diktahq/edikt's prior public releases stopped at v0.4.5 — v0.5.x was retracted (ADR-042) and v0.6.0 was never published — but v0.7.0 restarted the release line and it, along with v0.7.1, is fully installable. If you have an installed project on v0.4.x, run /edikt:upgrade and it carries you straight to v0.7.1 in one pass — the migration and schema-upgrade steps handle the full jump uniformly.
edikt has two layers that need updating separately: the global templates (installed on your machine) and the project configuration (committed in each repo).
How versioning works
Every edikt install writes its version to ~/.edikt/VERSION. Every project records its edikt version in .edikt/config.yaml:
edikt_version: "0.1.0"/edikt:doctor compares the two and warns when they differ:
[!!] project on edikt 0.1.0, installed is 0.2.0 — run /edikt:upgrade/edikt:upgrade reads both, shows a diff, applies changes, and bumps edikt_version in your config when done.
Update flow
Step 1 — Update global templates
curl -fsSL https://raw.githubusercontent.com/diktahq/edikt/v0.7.1/install.sh | bashThis takes ~10 seconds. Your commands, templates, and ~/.edikt/VERSION are now current.
Step 2 — Upgrade each project
Open the project in Claude Code and say:
"Upgrade edikt"
edikt first checks if your global install is current. If a newer version exists on GitHub, it tells you to re-run the installer before proceeding — ensuring project upgrades always use the latest templates. Use --offline to skip this check in air-gapped environments.
Then it shows a diff of what will change:
WHAT'S NEW
─────────────────────────────────────────────────────
v0.2.0 — New agents, rule pack updates, hook improvements
─────────────────────────────────────────────────────
Installed edikt: 0.2.0
Project edikt: 0.1.0
EDIKT UPGRADE
─────────────────────────────────────────────────────
Hooks (.claude/settings.json)
⬆ SessionStart — updated
✓ PostToolUse — up to date
Agents (.claude/agents/)
⬆ dba.md — template updated
✓ architect.md — up to date
— my-reviewer.md — custom, skipped
Rule packs (.claude/rules/)
⬆ go.md 1.0.0 → 1.1.0
✓ testing.md — up to date
— my-custom.md — custom, skipped
─────────────────────────────────────────────────────
Apply these upgrades? (y/n/select)You can apply everything, cancel, or choose sections. After applying, edikt_version in .edikt/config.yaml is bumped to match.
Step 3 — Share with your team
git add .claude/ .edikt/config.yaml && git commit -m "chore: upgrade edikt to 0.2.0"
git pushYour team gets the upgrade on next pull.
Protecting customizations
Agents — Add <!-- edikt:custom --> to any agent file to skip it during upgrade. Or list custom agents in config:
agents:
custom:
- dba # team has customized
- my-team-reviewer # not from edikt templatesRules — Files without the <!-- edikt:generated --> marker are always skipped. Files with an extend: config keep the extension untouched while the base pack updates.
Hooks — edikt only updates its own hook entries. Hooks you added yourself are never removed.
Config — edikt_version is updated. New config blocks (like artifacts: in v0.1.1) are added if missing. Existing values are never overwritten.
Commands — install.sh checks for <!-- edikt:custom --> before overwriting commands. Customized commands survive reinstall.
What gets upgraded
Hooks — New edikt versions add hook capabilities or fix bugs. Old inline bash hooks get migrated to ~/.edikt/hooks/*.sh script references.
Agent templates — Specialist agents are periodically improved with better prompts and domain coverage.
Rule packs — Rule packs are versioned. Outdated packs are updated. Manually edited files are always skipped.
CLAUDE.md sentinels — v0.1.1 migrates CLAUDE.md section markers from HTML comments (<!-- edikt:start -->) to visible text markers ([edikt:start]: #). Claude Code v2.1.72+ hides HTML comments, so the old markers were invisible to the model. Upgrade detects and migrates automatically.
Earlier versions
Nobody upgrading today lands on these, and /edikt:upgrade applies whatever migrations they introduced as part of the single v0.4.x → v0.7.1 pass. They're recorded for context, not as recipes to follow.
v0.2.0 — replaced the flat governance.md with topic-grouped rule files, gave every agent template maxTurns / disallowedTools / effort, and added four hook events. /edikt:gov:compile performs the format migration itself; there was never a manual step.
v0.3.0 — introduced the three-list directive schema (directives:, manual_directives:, suppressed_directives:), Invariant Records, generated reminders: and verification: lists, and /edikt:gov:score. v0.2.x blocks carrying only directives: stay readable — the missing lists are treated as empty.
v0.5.0 — retracted (ADR-042), never released. Its two real changes, the hook JSON protocol and the versioned ~/.edikt/ layout, both survive inside v0.7.0. There is no v0.5.x install path.
Sentinel-to-sidecar migration (mechanics reference — not a version to install)
This migration moved compiled governance metadata out of in-body sentinel blocks into co-located sidecars (<artifact>.edikt.yaml) — a one-way structural change; the prose .md becomes immutable to edikt, and the sidecar holds every compiled directive. It originally shipped as v0.6.0's headline change, but v0.6.0 itself was never a published release — no public project ran this as a standalone step. It's documented here because /edikt:upgrade still runs it internally, as one step of the real v0.4.x → v0.7.0 path below.
The migration is two-phase: Phase A (edikt migrate sidecars --apply, pure Go, no LLM) strips every in-body sentinel block and writes a skeleton sidecar with the legacy content preserved verbatim in a transient migration_preserved: field; Phase B (/edikt:gov:compile) dispatches the sidecar-extractor agent to turn that preserved content into canonical directives, with a post-extraction lossless gate verifying nothing was dropped.
Full step-by-step detail, recovery paths, and rollback mechanics are in Sidecar Migration — the per-artifact walkthrough with example output and edge cases.
Upgrading to v0.7 — the real path, v0.4.x → v0.7.1 directly
This is the upgrade path that actually applies to you. diktahq/edikt's releases were retracted or unpublished between v0.4.5 and v0.7.0 — v0.5.x and v0.6.0 were never published. If you're on a real, installed project today and haven't upgraded since, you're on v0.4.x, and /edikt:upgrade carries you straight to v0.7.1 in one run: the v0.6.0-era sentinel migration above, the v0.7.0 sidecar schema upgrade, and a recompile under v0.7.0's corrected grading — all in one pass, no intermediate version to install separately.
Read this before you run it, not after — one change here isn't a migration step at all. Grading now reads the actual obligation strength of what you wrote (RFC-2119 modal force: MUST/SHALL/REQUIRED, either polarity) instead of a three-word negative-marker list, and the deny channel that was supposed to block must-grade writes now actually does. Measured directly against this project's own corpus before shipping: 404 of 420 directives previously graded advisory move to must. The moment you upgrade, roughly 400 rules that were previously informational-only become enforced, blocking write-time rules — against a corpus you didn't just change. This isn't a bug to route around; it's existing rules finally enforcing what they say. If a refusal looks wrong, reword the directive rather than bypassing the gate.
Recommended upgrade steps:
1. Update launcher: curl -fsSL https://raw.githubusercontent.com/diktahq/edikt/v0.7.1/install.sh | bash
2. Re-run upgrade: /edikt:upgrade
(auto-runs sentinel migration, schema v1→v2 upgrade, and compile)
3. Review the result: /edikt:doctor
4. Spot-check a few directives your team wrote as bare "MUST" statements — expect them to
now grade `must` and enforce at write time, correctly, if that's what you intended.
5. Commit: git add .claude/ .edikt/ docs/ && git commit -m "chore: upgrade edikt to 0.7.1"Full detail — the exact refusal messages, the sidecar schema v1→v2 change, and recovery paths — is in Upgrading to v0.7.0.
Payload version management
edikt's payload (templates, commands, hooks, agents) is versioned independently of the launcher binary. You can upgrade, roll back, pin a version, or run multiple versions side by side.
Upgrade
Fetch the latest payload and activate it:
edikt upgradeIf you're on Homebrew, brew upgrade edikt updates the launcher. edikt upgrade updates the payload. They're independent.
Rollback
Revert to the previous payload version:
edikt rollbackRollback is payload-only. edikt rollback flips ~/.edikt/current back to the previous generation. It does not undo migrations (M1-M5). Migrations are permanent structural changes to your ~/.edikt/ layout and ~/.claude/ command files. If a migration caused a problem, contact support — don't expect rollback to fix it.
Note. On a fresh install,
install.shmakes a one-time backup of your~/.claude/settings.jsonat~/.edikt/backup/pre-v0.6.0-<timestamp>/before applying edikt's managed permissions block. There is no dedicated host-file rollback command — restore that file manually if you ever need to.
Pinning a version
Stay on a specific version:
edikt use v0.7.1 # activate v0.7.1 immediately
edikt upgrade --pin v0.7.1 # fetch v0.7.1 and pin itWhen pinned, edikt upgrade is a no-op until you clear the pin:
edikt upgrade --pin clear # remove pin, next upgrade proceedsListing installed versions
edikt listOutput:
v0.4.3
v0.7.0
* v0.7.1 (current)Pruning old versions
Keep only the N most recent versions (default: 3):
edikt prune # remove all but 3 most recent + current
edikt prune --keep 5 # keep 5
edikt prune --dry-run # preview what would be removededikt prune never removes the current version or any pinned version.
What edikt upgrade does
- Fetches the latest release tarball from GitHub
- Verifies the SHA256 checksum against
SHA256SUMS - Extracts to
~/.edikt/versions/<tag>/ - Runs any pending migrations (M1-M5) against your current install
- Flips
~/.edikt/currentto the new version - Updates
~/.edikt/lock.yaml
If verification fails, the new version is not activated. Your current version is untouched.
Project-mode installs
If edikt is installed per-project (.edikt/ inside the repo), edikt upgrade run from the project directory upgrades that project's payload independently of the global install.
cd my-project
edikt upgrade # upgrades the project-local payload onlyChecking if a project needs upgrading
"What's our status?"
Or directly:
"Run doctor"
Doctor shows version status:
[!!] project on edikt 0.1.0, installed is 0.2.0 — run /edikt:upgrade
[!!] go.md outdated (installed: 1.0.0, available: 0.1.0) — run /edikt:upgradeManaging multiple projects
For teams with many repos:
- One person runs the installer
- Upgrades each project: "upgrade edikt"
- Commits and pushes
There's no central push mechanism — edikt stays offline-first and git-native.