mix allm_pipeline.names (allm_pipeline v0.1.0)

Copy Markdown View Source

Emits the installed ALLM.Pipeline.Registry's per-pipeline metadata as a machine-readable list of names.

mix allm_pipeline.names [--format json|elixir]

--format json (the default) prints a single-line JSON object on stdout:

{"pipeline_names":["committee",...],"browser_pipelines":["project","project_refresh","video"]}

pipeline_names are the entries' names rendered as strings, in declaration order; browser_pipelines are those with browser: true, same order. This is the committed-artifact source (scripts/pipeline-names.json) the shell stage-scraper.sh reads, and the input the sst/scraper.ts / entrypoint codegen consumes — a single source of truth for the pipeline-name allowlists that would otherwise be hand-mirrored across four runtimes.

--format elixir prints the same two lists as an inspectable term, for a human eyeballing the registry.

Host-agnostic registry discovery

This is a package task and the package names no host module (a host dep is deliberately absent, so the reach is a compile error — see this repo's CLAUDE.md §1). So it finds the registry the same way Mix.Tasks.AllmPipeline.Nilability finds schema modules: it enumerates every loaded module via Application.loaded_applications/0 + Application.spec/2 and keeps the one exporting the __allm_pipeline_registry__?/0 marker that use ALLM.Pipeline.Registry injects. A host must install exactly one registry — zero matches or more than one is a Mix.raise.

It reads name and browser only, never entry (whose MFAs name host modules), so it stays leaf-clean.

Summary

Functions

Render a validated pipelines: list as a :json or :elixir string.

Functions

render(pipelines, atom)

@spec render([map()], :json | :elixir) :: String.t()

Render a validated pipelines: list as a :json or :elixir string.

Pure — no I/O, no registry discovery — so it is unit-testable against a fixture registry's __registry__(:pipelines) structure.

The JSON object's key order is fixed (pipeline_names then browser_pipelines) by assembling the string explicitly: an Elixir map does not preserve insertion order, so encoding one would reorder the keys and the bash jq/grep consumers depend on the order being stable.