{"_id":"@cooplux/enfilade","_rev":"2-4a7936b86177151cf8c2ac287ddc8235","name":"@cooplux/enfilade","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@cooplux/enfilade","version":"0.1.0","_id":"@cooplux/enfilade@0.1.0","maintainers":[{"name":"kaaterskillsawmill","email":"kaaterskillsawmill@gmail.com"}],"dist":{"shasum":"d9b3e19a1f6ba05caf4c9e0e738fd559e34f8b9c","tarball":"https://registry.npmjs.org/@cooplux/enfilade/-/enfilade-0.1.0.tgz","fileCount":1,"integrity":"sha512-KhYIRs/L/dqTv2DyLR/YHbcgHCvaG8QVsKbC9OtDlMc9cvCe+ktVINCSeVv1K65oWaKj3uX4pPGnfOTXfx1Zfw==","signatures":[{"sig":"MEUCIQC1SjOESs3HUssKN2FfGnaDtk6siVglR+RGAaWwmXK9TQIgG+ytmOrXaZ7ICpX+rH4kZEtdy5VL1MbXRrc40+kylV0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63},"private":false,"_npmUser":{"name":"kaaterskillsawmill","email":"kaaterskillsawmill@gmail.com"},"_npmVersion":"10.9.8","directories":{},"_nodeVersion":"22.23.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/enfilade_0.1.0_1783916104371_0.24999770276030064","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@cooplux/enfilade","version":"0.2.0","description":"Static coherence linter and topological planner for multi-tool CLI workflows (bin `flow`) — lint, plan, graph, and drive the flow between your constellation tools. No network, no execution in check/plan/graph; run is a thin artifact-gated driver.","keywords":["workflow","dag","pipeline","lint","topological","orchestration","flow","actionlint","coherence"],"author":{"name":"Dane Anthony Cooper"},"license":"MIT","type":"module","bin":{"flow":"dist/index.js","enfilade":"dist/index.js"},"engines":{"node":">=20.0.0"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/katterskillsawmill/cooplux.git","directory":"packages/enfilade"},"scripts":{"build":"tsup src/index.ts --format esm --clean","dev":"tsx src/index.ts","typecheck":"tsc --noEmit","test":"node --test","prepublishOnly":"npm run build"},"dependencies":{"chalk":"^5.3.0","commander":"^12.1.0","execa":"^9.3.0"},"devDependencies":{"@types/node":"^22.0.0","tsup":"^8.2.3","tsx":"^4.16.2","typescript":"^5.5.4"},"gitHead":"eb0e07dc3144d245e353fece9038cada9404d7c7","_id":"@cooplux/enfilade@0.2.0","bugs":{"url":"https://github.com/katterskillsawmill/cooplux/issues"},"homepage":"https://github.com/katterskillsawmill/cooplux#readme","_nodeVersion":"22.23.1","_npmVersion":"12.0.1","dist":{"integrity":"sha512-yuE4YuOuCB1V1Iez38MAmkz4vU0XiOTvF0HW8bjOwtIfB0giWe9+mx3A9U6txY8ls0kpspZVrh8Se+478Jeh8Q==","shasum":"8a292c05c315492d242f9f662c6ece1ad090540d","tarball":"https://registry.npmjs.org/@cooplux/enfilade/-/enfilade-0.2.0.tgz","fileCount":4,"unpackedSize":43066,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDs8gbD3fzwVDCPy5TBWQk5efWGyKysievX8b1MZB6RdAIgPOET+e1MgT0MJJQEMEzSq/y9Ffw/EwNqxzk2YqjMeuE="}]},"_npmUser":{"name":"kaaterskillsawmill","email":"kaaterskillsawmill@gmail.com"},"directories":{},"maintainers":[{"name":"kaaterskillsawmill","email":"kaaterskillsawmill@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/enfilade_0.2.0_1784281196616_0.29518644598904054"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-13T04:15:04.233Z","modified":"2026-07-17T09:39:56.878Z","0.1.0":"2026-07-13T04:15:04.483Z","0.2.0":"2026-07-17T09:39:56.741Z"},"maintainers":[{"name":"kaaterskillsawmill","email":"kaaterskillsawmill@gmail.com"}],"readme":"# @cooplux/enfilade\n\n> Static coherence linter and topological planner for multi-tool CLI workflows. Bin: **`flow`** (alias `enfilade`).\n\n`enfilade` is *\"terraform plan for a fleet of dev CLIs.\"* You describe the order your tools run in — a\nDAG of delegated commands (`datum validate …`, `praxis run …`, `qbts run …`, `plux route …`) linked by\nthe artifacts they consume and produce — and `enfilade` lints that flow for coherence, plans a\ndeterministic execution order, renders it as text, and (optionally) drives it as a thin, artifact-gated\nrunner.\n\n> **Scope disclaimer (read first):** this is developer tooling. It lints and sequences CLI steps. It\n> computes no rates, makes no underwriting / pricing / compliance / accuracy decisions, and certifies\n> nothing. \"CoopLux Ultra-Luxury Underwriting OS\" is brand poetry; the tool is a flow linter.\n\nThe name is literal, not affectation: an **enfilade** is Ted Nelson's Xanadu versioning-tree structure\nfor a linked graph (and, plainly, \"a thread on a line / a suite of aligned rooms\") — the aptest name in\nthe family for a DAG-threading linter.\n\n## Install / use\n\n```bash\nnpx @cooplux/enfilade init            # scaffold an example enfilade.json\n# or\nnpm i -g @cooplux/enfilade && flow --help\n```\n\nNode ≥ 20. No network. No telemetry. Nothing bundled.\n\n## Commands\n\nPure (offline, side-effect-free, safe to run in read-only audit mode on any flow):\n\n- `flow init [dir]` — scaffold a check-clean example `enfilade.json`.\n- `flow check [file] [--json]` — the coherence linter. Decides every finding from the manifest\n  **topology alone** — no disk reads, no network, no execution — so the same manifest lints identically\n  on every machine.\n- `flow plan [file]` — run `check`, then write a durable, reviewable `enfilade-plan.json` (topological\n  order + parallel waves + DAG fingerprint) with a **separate** disk-diagnostic level (which artifacts\n  exist, their current content-hash).\n- `flow graph [file] [--dot]` — render the flow as deterministic **Mermaid** (default) or **DOT** text.\n  No headless browser; diff-able in a PR.\n- `flow status [file] [--json]` — one-screen summary + DAG fingerprint.\n- `flow fingerprint [file]` — print the deterministic `sha256-<base64>` of the canonicalized DAG (the\n  flow change-gate: re-plan downstream only when it moves).\n\nThin driver (the family's one exec surface):\n\n- `flow run [file] [--dry-run] [--skip-check] [--force]` — advance each node **only** when its child\n  process exits `0` **and** (for nodes declaring `produces`) a produced artifact's **content-hash\n  changed** — freshly written, verified by `sha256`, never by mtime. Writes `enfilade-receipt.json`.\n\n## The one-executor doctrine\n\n**`enfilade` sequences; `praxis` / `qbts` / `plux` execute.** `run` is a *thin driver only*: it has no\nretries, no manual gates, and no attestation — those live inside the node it delegates to (`praxis`\nowns attested human gates; `qbts`/`plux` own retries/routing). This is enforced, not just documented:\n`check` flags any node that re-implements gating/retry/attestation, and a test asserts *\"enfilade run\ndelegates, never gates.\"*\n\n## Manifest (`enfilade.json`)\n\n```jsonc\n{\n  \"enfilade\": \"cooplux.enfilade.manifest.v1\",\n  \"name\": \"example-flow\",\n  \"externals\": [\"reference/source.csv\"],        // artifacts that pre-exist (produced by no node)\n  \"nodes\": [\n    {\n      \"id\": \"validate-reference\",\n      \"run\": [\"datum\", \"validate\", \"./reference\"],  // tokenized argv (argv[0] = executable)\n      \"consumes\": [\"reference/source.csv\"],\n      \"produces\": [\"reference/datum-report.json\"]\n    },\n    {\n      \"id\": \"approve-release\",\n      \"run\": [\"praxis\", \"run\", \"./release.praxis.json\"],\n      \"needs\": [\"validate-reference\"],\n      \"consumes\": [\"reference/datum-report.json\"],\n      \"produces\": [\"release/attestation.jsonl\"],\n      \"manual\": true                               // an attended praxis gate\n    },\n    {\n      \"id\": \"publish\",\n      \"run\": [\"node\", \"./scripts/publish.mjs\"],\n      \"needs\": [\"approve-release\"],\n      \"consumes\": [\"release/attestation.jsonl\"],\n      \"irreversible\": true                         // must be gated upstream — enforced by check\n    }\n  ]\n}\n```\n\nEdges come from explicit `needs` **and** are derived from `consumes` → `produces` so the graph can't\nsilently drift from the artifacts. A `${VAR}` in an argv token substitutes a **value only** from the\nnode's `vars` map (restricted to an inert charset — no spaces, quotes, or shell metacharacters); it can\nnever introduce a new argv token. `when` is the plain **name** of an environment variable (a truthy\ncheck, never an expression, never `eval`).\n\n## What `check` catches (structured findings)\n\n- **cycle** — via one iterative pass of Kahn's algorithm (never recursive DFS). *FATAL.*\n- **attended-gate** — the safety invariant: an irreversible node with no attested (`praxis`) gate\n  upstream, or downstream of a manual gate that doesn't delegate to `praxis`. *FATAL.*\n- **dangling-consume** — a consumed artifact that no node produces and isn't a declared `external`.\n  Always an error, independent of disk state.\n- **duplicate-producer**, **duplicate-id**, **unknown-need**, **self-dependency** — graph integrity.\n- **orphan-produce**, **no-run** — advisory warnings.\n- **executor-doctrine** — a node re-implementing retry/gate/attestation (see the doctrine above).\n- **unsafe-var / unsafe-when / unknown-var** — substitution/gating safety.\n\n`run --skip-check` may only downgrade the non-fatal findings — **cycles and the gate-before-irreversible\ninvariant stay FATAL** regardless of the flag.\n\n## Environment\n\n| Variable | Purpose | Default |\n| --- | --- | --- |\n| `ENFILADE_MANIFEST` | manifest path when no `[file]` is given | `enfilade.json` |\n\n## Boundary\n\n`enfilade` lints the **statically declared** flow skeleton. It cannot reason about runtime-dynamic\nbranching (a step that decides its own successors at runtime) — that belongs to `praxis` / the per-tool\nengine. Part of the CoopLux constellation (`cli`, `plux`, `datum`, `praxis`, `enfilade`).\n\n## License\n\nMIT © Dane Anthony Cooper\n","readmeFilename":"README.md","description":"Static coherence linter and topological planner for multi-tool CLI workflows (bin `flow`) — lint, plan, graph, and drive the flow between your constellation tools. No network, no execution in check/plan/graph; run is a thin artifact-gated driver.","homepage":"https://github.com/katterskillsawmill/cooplux#readme","keywords":["workflow","dag","pipeline","lint","topological","orchestration","flow","actionlint","coherence"],"repository":{"type":"git","url":"git+https://github.com/katterskillsawmill/cooplux.git","directory":"packages/enfilade"},"author":{"name":"Dane Anthony Cooper"},"bugs":{"url":"https://github.com/katterskillsawmill/cooplux/issues"},"license":"MIT"}