Adom Wiki
Public Made by Adomby adom
How the Adom Wiki (wiki.adom.inc) works and how to drive it with the adom-wiki CLI: the two storage layers (git page repo vs package registry), hosting source by pushing files (not a tarball), making packages, cutting per-platform releases, and the three-tier skill layout (user skills ship, dev-skills/ and publish-skills/ stay source-only). adom-wiki is the current tool; adompkg is deprecated. Read this first before publishing or installing.
Packages that install a CLI should declare their agent-permission posture, and the registry should compose it
The problem
Every package that installs a CLI into a user's container creates a permission surface, and
nothing in the registry describes it. The agent running in that container has to get past
Claude Code's auto-mode classifier on every call, and the classifier has no idea what
adom-mouser or adom-bridge are. So it judges them on the words in the command string.
This is not theoretical. Measured on a current workspace today:
- The golden image ships exactly one permission rule:
"allow": ["Bash(adom-wiki:*)"]. Every other CLI we install (8 of them) falls through to the classifier on every call. - No package in the dependency tree writes
permissionsat all. That single rule is unowned and hand-seeded, so nobody can even say which package is responsible for it. - A long-lived container has accumulated 121 one-off allow rules in
.claude/settings.local.json, nearly all hyper-specific approvals likeBash(rmdir ~/.claude/skills/hydrogen-tab-icons). That is a log of a human clicking approve, one command at a time, for months.
And the accumulation never converges, because Bash(...) rules are prefix matches on the
literal command string while our CLIs put flags before the verb:
adom-bridge --target AdomLapper --ai-thread "x" wsl_unregister '{...}'
There is no prefix that expresses "allow the read-only verbs, not the destructive ones". So approvals are written one command at a time and generalize to nothing.
Why this belongs in the registry, not in one package
The obvious workaround is a single Adom-owned package that seeds a big allow list. That is wrong for three reasons:
- Only the publisher knows their own verbs. The package that ships
adom-mouserknows which of its calls are read-only catalog queries and which mutate something. A central list encodes that second-hand and goes stale the moment any CLI changes. - It does not scale past us. An org publishing their own CLI to the wiki cannot edit an Adom-owned list, so their users get the same blind classifier we have today. The whole point of the registry is that third parties ship first-class packages.
- Uninstall has to work. Rules seeded by an install script accumulate forever. Rules derived from what is installed disappear when the package does.
So: a declarative field the package owns, and a registry client that aggregates.
Proposed shape
A block in package.json, alongside scripts.install:
"agent_permissions": {
// Deterministic prefix rules for commands whose leading token is stable.
"allow_bash": ["adom-mouser", "adom-digikey"],
// Natural language the auto-mode classifier reads. "$defaults" is NOT the package's
// to touch; the client owns composition.
"allow": [
"adom-mouser verbs: read-only queries against Mouser's public catalog API."
],
"soft_deny": [
"adom-mouser cart or order verbs: they spend money."
],
"environment": [
"adom-mouser is a parts-search CLI installed by the Adom registry."
]
}
adom-wiki pkg install / update / uninstall then composes every installed package's
declarations into ~/.claude/settings.json, into a managed region the client owns and
regenerates:
"autoMode": {
"allow": ["$defaults", "...composed from installed packages..."],
"soft_deny": ["$defaults", "..."],
"environment": ["$defaults", "..."]
}
Requirements that make or break it:
- Regenerate, not append. The block is derived state, keyed on what is installed. This is what stops the 121-rule pile from happening again, and it makes uninstall correct for free.
- Never clobber the user. Anything outside the managed region survives untouched, and a user's own rule wins over a package's.
- Packages cannot grant themselves anything dangerous.
hard_denyis not writable by a package, and a package can only speak about its own binaries. Otherwise a malicious package publishes "allow everything" and the whole gate is gone. This is the part that needs the most care in review. - Composition is the client's job.
"$defaults"and ordering are decided byadom-wiki, not by any package.
Why it matters beyond convenience
There are already two gates in this architecture and only one of them is informed. When an agent in a container drives the user's own desktop through Adom Bridge, the desktop applies its own approval gate: it refuses any call without caller identity, requires a per-call reason for gated verbs, and shows both to the user in their Activity Log. The container-side classifier, which is the one actually blocking, knows none of that.
Right now the cost lands on users as constant interruption, and the workaround they learn is to run with permissions bypassed entirely, which is strictly worse than a classifier that has been told the truth.
Interim
Until this exists, Hydrogen will seed an autoMode block for the Adom toolchain from its
own bootstrap so the golden image is usable. That is a stopgap and should be deleted the
day the registry can compose this properly, not grown.