Repository navigation
Releases: Lockyc/mycelium
Release list
v0.8.0
- feat(scan): a broken sidecar becomes an invalid-sidecar finding, not a failed scan
- refactor: use slices.Contains and strings.TrimRight over hand-rolled helpers
- docs(comments): state the rule, not the history behind it
- feat: validate lints kind/status; audit reports unknown edge types
- fix(release): refuse to release from anywhere but dev
- fix(query): reject extra positional arguments instead of dropping them
- fix(scan): skip an unreadable subdirectory instead of aborting the scan
- fix(demo): always build myco fresh into the temp workspace
- fix(hub): a fresh hub starts before the first push
- fix(hub): stamp docGraph.url only on a component whose payload is served
- fix(transport): bound node push and hub query with HTTP timeouts
- fix(hub): write graph.json, MAP.md and repos/ atomically
- feat(audit): report a duplicate-name finding when two entries share a name
- fix(graph): CanonicalID drops the port and strips .git after the slash
- fix(graph): Used by follows use edges that target a capability
- docs(claude): drop the v0.5.0 map-size and fill-rate measurements
- docs(examples): the demo's audit reports an orphan by design
- docs(schema): list nodes among graph.json's top-level keys
- docs(readme): scan records the commit at the scanned ref, not tags
- docs(claude): /q/* has no auth gate; reads are gated by the deployment
- fix(release): advance main with ff-only fetches, so a clone without a local main releases
Full Changelog: v0.7.2...v0.8.0
v0.7.2
- docs: myco query flags go anywhere; list every components filter
- docs: add the deferred-work register (docs/FOLLOWUPS.md), wired from CLAUDE.md
- chore(deps): bump the actions group with 2 updates (#1)
- chore(meta): curate GitHub topics
- chore(meta): clarify repo summary / GitHub description
- chore(deps): bump github.com/pelletier/go-toml/v2 in the gomod group
v0.7.1
myco query is now the frictionless first-class way to explore the graph, and
the docs are reframed to match. Non-breaking.
myco query — first-class, no jq, no schema knowledge
- Default hub via
$MYCELIUM_HUB.--urlnow defaults to$MYCELIUM_HUB, so
myco query <name>needs no flag — set the env var once and query the live graph
directly. An explicit--dirstill selects a local artifact over the ambient hub. - Flags work in any position.
myco query used-by config-core --url <hub>no
longer silently drops the trailing flag — the CLI loop-parses so flags and the
positional can interleave. - A real error when no source is configured. No
--url, no$MYCELIUM_HUB, and no
localgraph.jsonnow yields "no graph source: set $MYCELIUM_HUB … or pass
--url/--dir" instead of a crypticopen graph.json: no such file.
Docs reframed to the real hierarchy
MAP.md (its generated preamble), README, and schema/graph.md now lead with the
same model: read MAP.md to orient → query with myco query (first-class, no need
to know the JSON shape) → hand-written jq over the raw graph.json for
specific/programmatic cases only → /q/* over URL is a bonus for when the binary
isn't around.
Full Changelog: v0.7.0...v0.7.1
v0.7.0
First-class graph queries, and a breaking graph.json shape change.
⚠️ Breaking: graph.json components are now flat
Each component's declared mycelium.toml fields serialize at the component top
level — .components[].summary, .components[].provides[], .components[].stack[] —
instead of under a .sidecar wrapper. This makes components consistent with overlay
nodes (already flat).
Migration: any consumer that queried .components[].sidecar.provides[] must drop
the .sidecar hop → .components[].provides[] (same for summary, stack).
First-class queries — no hand-written jq
Mycelium now provides the common graph queries instead of leaving agents to
construct them:
myco query <name> [args]—capability,component,components(filtered by
kind/stack),used-by,uses,search— over a localgraph.json(--dir) or
a live hub (--url); readable text, or--jsonto pipe. Baremyco queryprints a
self-documenting index.- Hub
/q/*routes — the same queries over HTTP:GET /q(index),
/q/capability/<name>,/q/components?kind=&stack=,/q/used-by/<name>,
/q/search?q=. Already-filtered JSON, explicit404on an unknown query name — never
the silent-empty result that hand-written jq gives.
Query semantics live once in internal/query; the CLI and the HTTP routes are thin
adapters over it. Docs (MAP.md, schema/graph.md §Querying, README) now lead with the
query interface and demote jq to a labelled fallback.
Full Changelog: v0.6.2...v0.7.0
v0.6.2
Makes each repo's doc-graph self-navigating from graph.json.
docGraph.url— each component's doc-graph digest now carries aurllinking
straight to that repo's full doc-graph payload (e.g.
/repos/github.com/lockyc/mycelium/docgraph.json). A consumer reading the digest
ingraph.jsonfollows the link instead of translating the component'sid
into the route by hand. The digest still answers "healthy / how big" inline; the
urlis the one extra hop, and only when you want to walk the full graph.- The route is single-sourced (
RepoDocGraphRoute/ theRepoDocGraph*
constants): the hub stamps theurl, writes the payload, and the serve handler
parses the same prefix/suffix — the link a consumer follows and the route the hub
answers cannot drift.
Additive and backward-compatible: url is a new field on the existing docGraph
digest (schemaVersion 1 unchanged); relative, so it resolves against whichever hub
served the graph.
Full Changelog: v0.6.1...v0.6.2
v0.6.1
Completes the v0.6.0 doc-graph ingestion feature: the node now captures each repo's
doc-graph digest on a bare repo store, not just working-tree checkouts.
- Digests captured on bare repos. The node runs
docgraph graph --json --ref <scanned ref>(docgraph v3.1.0's ref mode reads the committed ref from the git
object store), so it no longer skips bare repos — the reference deployment's bare
Forgejo store now populatesdocGraphdigests and serves/repos/<id>/docgraph.json. - Ref-consistency resolved. The digest now reflects the exact ref Mycelium
scanned (the same ref used for the sidecar and recorded commit), on every repo —
not the node's working-tree state. This closes the working-tree caveat of v0.6.0. - Runtime requirement: capturing digests needs
docgraph v3.1.0+on the node's
PATH. An older or absentdocgraphdegrades gracefully to no digest — the scan
never fails.
No change to the graph.json / docGraph shape (schemaVersion 1); digests simply
start appearing where the store is bare.
Full Changelog: v0.6.0...v0.6.1
v0.6.0
Mycelium now ingests each repo's docgraph doc-graph during scan, so "which repo" and "what are its docs / is its doc-graph healthy" become one query against the served graph. The node shells out to docgraph graph --json per repo (read-only, best-effort — an absent binary, a bare repo, or bad output degrades to no doc-graph and never fails the scan), pins schemaVersion 1, and both summarizes and stores the result.
Doc-graph ingestion
- Per-component
docGraphdigest ingraph.json— a compact summary (doc count, content/metadata edge counts, island paths, and which conventional entry docs are present), carried on eachComponent. The queryable "is this repo's doc-graph healthy / how big" signal, kept small on purpose (island paths but not full node/edge lists). - Full per-repo payload served at
GET /repos/<id>/docgraph.json— the completedocgraph graph --json, pushed out-of-band on the manifest and written by the hub torepos/<id>/docgraph.json. Never inlined intograph.json; there for traversal when the digest isn't enough. MAP.mdrot flag — a component with ≥1 doc-graph island gets a tersedocs: N islands ⚠marker; a clean doc-graph adds nothing to the map.myco auditdoc-rot signals — new fleet-widedoc-rot(a repo with unfindable/unplaced docs) anddocgraph-version(a repo whose docgraph is newer than the pinnedschemaVersion 1) findings, turning per-repo doc rot into an ecosystem-visible fact.- Ref caveat (v1): docgraph audits the working tree while Mycelium scans a committed ref, so a doc-graph reflects the node's checkout state — documented in
schema/graph.md; a precise per-ref capture is deferred until a real divergence bites.
Docs & tooling
- Conformed the doc graph to docgraph v3 and flipped the pre-push hook to the
/v3install path. - Regenerated the docgraph pre-push hook; added a
just installrecipe. schema/graph.md,CLAUDE.md, andREADME.mdreconciled to the built behavior — the digest shape, the/repos/<id>/docgraph.jsonroute, the schemaVersion pin, and the ref caveat.
No breaking changes: the docGraph field is additive and omitted when a repo has no docs or no docgraph on the node.
Full Changelog: v0.5.0...v0.6.0
v0.5.0
Breaking release. The word "catalog" is gone from Mycelium. A catalog is a browse-list of obtainable items; Mycelium's output has edges, which a catalog structurally can't express. The merged model is a graph — so the artifacts are now named for what they are and for the job each does.
There are no compatibility shims. The old names are gone, and the old routes return 404.
Breaking — rendered artifacts
| Before | After | Job |
|---|---|---|
CATALOG.md |
MAP.md |
the lossy map to read into context to orient |
catalog.json |
graph.json |
the full-fidelity graph to query with jq |
The filenames now carry the usage rule that the docs used to have to assert: read the map, query the graph.
Breaking — HTTP routes
/CATALOG.md→/MAP.md/catalog.json→/graph.json/still serves the map (nowMAP.md)
The old paths return 404, enforced by a regression test.
Breaking — CLI flags
build, serve, and audit now all take --dir for the artifact directory (replacing --catalog and build's --out). One directory concept, one flag name.
myco build --dir .myco serve --dir .myco audit --dir .
scan --out is unchanged — it names a file (the manifest), a genuinely different concept. This is the point of the change: --out now means exactly one thing, where before it meant "a file" on scan and "a directory" on build.
Breaking — schema and sidecar
schema/catalog.md→schema/graph.md- This repo's own
mycelium.tomlcapabilitycatalog→ecosystem-graph
Internal
internal/catalog→internal/graph;type Catalog→type Graph- Artifact filenames now have a single source of truth (
graph.MapName,graph.GraphJSONName) rather than being re-encoded per package
Upgrading
Update any consumer that fetches /CATALOG.md or /catalog.json, and any invocation passing --catalog or build --out. A myco serve invocation still passing --catalog is a hard parse error, not a warning — if you run the hub from a service unit, update the unit and the binary together.
Full Changelog: v0.4.0...v0.5.0
v0.4.0
v0.3.0
Feature release.
CATALOG.mdnow renders each component's tags as backtick pills under its kind/status line, so signals that previously lived only incatalog.json(e.g. aprelaunchtag, or stack/domain tags) are visible in the map agents read.
Full Changelog: v0.2.1...v0.3.0