Psi now treats launcher-owned startup basis construction as the canonical way to make extension dependencies available at startup.
The launcher reads user and project extension manifests before psi.main
starts, expands recognized psi-owned defaults, validates the effective manifest,
and supplies the resulting dependency basis at launch time.
Runtime introspection and reload/apply still exist, but they are no longer the primary startup dependency mechanism.
This closes the phase-order problem where manifests discovered after JVM startup could not reliably influence the initial classpath.
User scope:
~/.psi/agent/extensions.ednProject scope:
.psi/extensions.ednMerge semantics:
psi ...:psi/init for recognized psi-owned libs when omittedThe manifest uses a top-level :deps map.
Any dep entry with :psi/init is treated as an extension dependency.
Entries without :psi/init are allowed as support deps and appear as
non-extension entries in introspection.
Example:
{:deps
{my/local-ext
{:local/root "/Users/me/dev/my-local-ext"
:psi/init my.local.ext/init
:psi/enabled true}
io.github.me/cool-ext
{:git/url "https://github.com/me/cool-ext"
:git/sha "abc123def456"
:psi/init cool.ext/init}
io.github.someone/packaged-ext
{:mvn/version "0.2.1"
:psi/init packaged.ext/init
:psi/enabled false}
;; support dep, not an extension entry
org.clojure/data.json
{:mvn/version "2.5.1"}}}
Recognized psi-owned extension libs can use concise manifest entries.
Canonical minimal form:
{:deps
{psi/mementum {}
psi/munera {}
psi/work-on {}
psi/workflow-loader {}}}
For those recognized libs, the launcher supplies missing fields from its explicit psi-owned extension catalog, including:
:deps/root:psi/initSelective override remains valid:
{:deps
{psi/mementum {:git/sha "override-sha"}
psi/munera {:psi/init extensions.munera/init}}}
Important rules:
{} syntax is valid only for recognized psi-owned extension libs in the launcher catalog:psi/init for arbitrary third-party librariesEach expanded dep entry must use exactly one dependency coordinate family:
:local/root:mvn/versionValidation rules currently enforced by launcher expansion:
:deps must be a map:git/url and one of :git/sha or :git/tagStartup:
Runtime:
:restart-required remains a runtime convenience/recovery status, not the canonical startup contractFor recognized psi-owned minimal manifest entries such as:
{:deps {psi/workflow-loader {}
psi/mementum {}}}
ownership is split deliberately:
This means launcher-started psi is the authoritative proof path for classpath-sensitive behavior.
Direct bootstrap or in-process test paths that do not cross the launcher boundary are useful for runtime activation testing, but they are not equivalent proofs of launcher-owned classpath construction.
For recognized psi-owned minimal entries, runtime activation is canonicalized through :psi/init and the live registry identity is stable manifest:{lib} rather than a source file path, for example:
manifest:psi/workflow-loadermanifest:psi/mementumThe canonical read surface exposes:
:psi.extensions/user-manifest:psi.extensions/project-manifest:psi.extensions/effective:psi.extensions/diagnostics:psi.extensions/last-applyExample query:
{:action "query"
:query "[:psi.extensions/user-manifest
:psi.extensions/project-manifest
:psi.extensions/effective
:psi.extensions/diagnostics
:psi.extensions/last-apply]"
:entity "{:psi.agent-session/session-id \"sid\"}"}
Current categories include:
:malformed-entry:duplicate-init:missing-git-sha:project-local-root-nonreproducible:load-failure:restart-requiredManifest-installed non-file-backed extensions activated by :psi/init use
stable live-registry identities of the form:
manifest:{lib}Examples:
manifest:psi/mementummanifest:psi/workflow-loader~/.psi/agent/extensions.edn or .psi/extensions.ednpsi ...Use explicit :local/root plus :psi/init for non-catalog third-party work, or
minimal {} syntax for recognized psi-owned extensions when launcher defaults are desired.
:psi/init, or use recognized psi-owned minimal syntax:psi.extensions/effective, :psi.extensions/diagnostics, and :psi.extensions/last-apply as neededCan you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |