skillscript-runtime v0.24.0
Upgrade impact: none (additive). All four items are backward-compatible — a new export, an optional contract method, an opt-in tool param, and an internal lifecycle fix. Existing programmatic bootstrap() code keeps working; bootstrapFromEnv() is an optional simplification.
From an AMP-backed remote-store adopter dogfooding the runtime:
bootstrapFromEnv()— a blessed programmatic entry point. Most adopters runskillfile initonce, then operate via the web dashboard. This new exported helper stands that dashboard up from your own code exactly the way the CLI does: it loads$SKILLSCRIPT_HOME/.env+skillscript.config.json+connectors.json, resolves the fullSKILLSCRIPT_*env cascade, callsbootstrap(), wires declarative triggers, and assembles theDashboardServer. Returns{ wired, server }(both unstarted; the callerstart()s them and callswired.registry.disposeAll()on shutdown). Precedence: explicit option > env > config.json > default. The CLI'sdashboard/servecommands are now thin wrappers over it — closing the silent "every capability the CLI auto-wires had to be hand-assembled programmatically, and each omission failed silently" asymmetry.SkillStore.version()— optional change-token kills the skill_list N+1 for remote stores. Building theskill_listcatalog loads every skill's body to parse its effectful footprint — free against a local store, but a network round-trip per skill against a remote one, so a polling dashboard hammered the substrate. A new optionalversion()returns a cheap store-wide token (no body loads);skill_listreturns it ascatalog_versionand honors a caller'sif_none_match, replying{ not_modified: true }and skipping the rebuild when nothing changed. The SPA now sends it (and pauses its poll when the browser tab is backgrounded). Bundled stores implement it (FS: per-file mtimes; sqlite:(name, status, current_version)in one query). Optional — a store without it just always rebuilds.- Connector reaping on shutdown.
Registry.disposeAll()(new) disposes connectors holding child processes on runtime shutdown, so a stdio-bridged MCP server child (RemoteMcpConnector) is reaped rather than orphaned to a dead parent across restarts. The CLI shutdown handler calls it;bootstrapFromEnv()callers should too. (Distinct from 0.23.1's respawn-on-death, which self-heals a child that dies while running — this reaps a child on intentional shutdown.)