← Changelog
v1.3.0
2026-08-25
A thin core: 92 commands to 52, with 30 command families moved into plugins that install in one step and behave exactly as they did before.
This is a minor release rather than a patch because 43 commands are no longer in the binary. Every one still works — the CLI proxies the original spelling to the plugin and names what to install when the plugin is absent — but a machine without the plugin no longer has the command. Read the compatibility notes before upgrading a scripted environment.
Fixed
- Installing a plugin left the command dead (CRITICAL) — four separate
defects stacked, and none was visible to any test, because no test performed a
real install. The registry cache silently dropped
pluginType,binaryName,languageandruntime, so the first request parsed them, the cache write discarded them, and the next read returned a plugin claiming to provide no command — the bug only appeared on the second run. Registry parsing never read those fields anyway. Installing a command-line tool required Docker and Postgres, because the schema step ran even for plugins with no tables. And the release pipeline never compiled anything: it tarred source, so Go plugins shipped with no binary. Tolerating a missing binary is what made all of this silent; it is now a failed install that names the cause. Plugins are cross-compiled for all five supported platforms and the CLI fetches the one matching the machine. - Almost every plugin was invisible — 181 of 184 shipped
plugin.jsonfiles could not be parsed, so nearly the whole catalogue was missing fromnself plugin listand everything else that enumerates installed plugins. Five fields were typed for one of the shapes in use rather than all of them:envVars,permissions,dependencies,systemDependencies,apiEndpoints. All 184 now parse, guarded by a test that reads the real published manifests rather than fixtures written from the struct. - The CLI talked over failing plugins —
Plugin error: plugin exited with code 1printed on top of the plugin’s own message on every extracted command. The plugin’s exit code is now mirrored in silence; only a proxy failure the user has seen nothing for still speaks. --no-deprecation-warningsbroke every extracted command — nself’s own persistent flags were passed through to plugins that do not implement them, so a script using that flag died with “unknown flag”. They are stripped before the plugin runs, as cobra did before the command moved.nself logincould spawn a browser undergo test— it called an unguarded copy ofopenBrowserinstead of the guarded one two files away.nself <cmd> nosucherrored where it used to print help — cobra treats a root command’s unknown first argument differently from a child’s.docker-compose.override.ymlwas inert on every project. It is applied.- nginx refused to start on a fresh project when no trusted certificate chain existed.
- Help text taught a deprecated spelling — all 17
flagsexamples showednself flag, renamed in this release line. - The plugin proxy wrote a raw timestamped log line above its own error.
Added
nself install <name>as a first-class command, with the plugin name suggested on any unknown command.- Command groups in
nself --help, so the golden path reads first. - Plugins may provide several commands via
cliCommands, and a service plugin may also ship one.sentryprovidesnself sentryandnself sentry-server;tenantprovidesnself tenantandnself billing;webhooksis the delivery service and thenself webhookscommand. - Project configuration reaches command plugins. nself resolves the
.envcascade and passes each plugin only the variables its manifest declares, so a plugin never re-implements the cascade. scripts/plugin-counts.shgenerates the free/pro/total plugin counts that documentation had been hand-typing, and had drifted on.
Changed
- The env cascade now follows its documented order, with
NSELF_LEGACY_ENV_ORDERas a one-minor-version escape hatch. - 43 commands moved out of the binary. Each is proxied to its plugin once
installed:
aiai-studioalertsapiauditbillingclawcostsdlqdogfooddrencryptionfederationgatewaygauthgdprinfrak8smailmodelmonitorollamapentest-kitqueueregionsentrysentry-serversoaktenantwafwatchdogwebhooks. - Renamed or absorbed, still working through argv rewriting:
dns-setupandsslintotrust,pitrintodb,flagtoflags,uninstalltoremove,upgradeand therelease-*trio intoupdate.featureandmigrate-from-v099retired. - 121 files over 300 lines down to 7, each documented, with a ratchet that only moves one way.
Known
admincall sites have not been audited against the 43 removed commands. An admin call that shells out to one of those on a machine without the plugin now fails where it used to succeed.- Two permission vocabularies are in use. 121 shipped manifests declare
permissions in a form the CLI’s allowlist does not cover. Both are kept, and
nself plugin infostates which were not checked, rather than a mapping being invented between them. health,self-healandtemplatestay in the core despite being listed for extraction:healthbacksdoctorandstatus, andtemplatecatalogs whatnself init --templatecan clone.