Replaces the per-repo installer + cachix pair with the shared action, which
installs Nix with the Logos Attic cache (cache.nix.logos.co) preconfigured and
publishes what the job builds — master to the public cache, every other ref to
ci.
Each converted job also gains
environment: ${{ github.ref == 'refs/heads/master' && 'public-cache' || '' }}
because ATTIC_TOKEN_PUBLIC only exists inside that environment. Without it the
secret resolves empty on master and publishing is silently skipped — the job
still passes, so the omission would not show up as a failure.
The action installs Nix itself on every runner, macOS included. That is a
deliberate reversal of the workaround these files carried: the comments here
said cachix/install-nix-action collides with the runner's pre-existing _nixbld
users (eDSRecordAlreadyExists), so DeterminateSystems' installer was used
instead. It no longer reproduces — logos-delivery-module has already been
converted the plain way and its `build-and-test (macos-latest)` leg passes.
Keeping the workaround would have meant a second installer plus a duplicated
substituter/key block in ten files, guarding against something two green runs
say does not happen. If it ever recurs it fails loudly at install, which is
recoverable; the silent-skip above is the failure mode worth engineering
against.
One property is deliberately NOT carried over: the old cachix step ran with
`continue-on-error: true` so a failed cache push could not fail a job whose
tests passed. The action exposes no equivalent, and adding one here would also
swallow genuine setup failures now that the same step installs Nix rather than
only publishing at the end.
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
These were already wrong before any deletion. module-builder repointed the
cdylib Qt glue onto logos-plugin-qt's logos-qt-host-generator (5081088) and the
docs kept naming logos-qt-generator, so the pipeline they describe has not been
the pipeline that runs for some time.
That matters more here than in most docs: guidelines/ and docs/ are SHIPPED —
flake.nix copies them into the dev-boost output, and generate-agents-md.ts
embeds them into every scaffolded module's AGENTS.md/CLAUDE.md. So the stale
line was being handed to module authors, and to agents reading the scaffold, as
the instruction. That is why the six doctests/outputs/ files change too: they
are the recorded scaffolder output, and they carry the same text.
Only the middle step moves. `logos-cpp-generator --backend cdylib` — the Qt-free
C-ABI export wrapper — is a different tool doing a different job and is
deliberately untouched; it remains correct in every one of these blocks.
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Universal modules build as header-first cdylibs now, but the docs still
described the old `logos-cpp-generator --from-header --backend qt` path that
emitted `<name>_qt_glue.h` + `<name>_dispatch.cpp` and listed them explicitly
in CMakeLists SOURCES. None of that is current:
- The generator derives a `.lidl` from the impl header, then runs the cdylib
backend → `<name>_cdylib_glue.{h,cpp}` (uniform Qt-plugin glue) +
`<name>_module_impl.cpp` (Qt-free C-ABI export wrapper).
- `mkLogosModule` runs the pipeline automatically — no `preConfigure`.
- `LogosModule.cmake` globs `generated_code/` — modules must NOT list the
generated files in SOURCES (the bug fixed in #12).
Updated across the board:
- guidelines/{codegen.md (rewritten),universal-module,nix-build,metadata-json}
- docs/{spec.md,project.md}, README.md
- skills/{create-universal-module,nix-flake-setup,wrap-external-lib}
- generators/generate-agents-md.ts, mcp-server/tools/build-help.ts
(build-help now flags the "generated_code in SOURCES" mistake directly)
- regenerated llms-full.txt + llms.txt
- refreshed the committed example trees (outputs/logos-*) to match current
`init` output: minimal flake (no preConfigure), CMakeLists without the
generated_code sources, and regenerated AGENTS.md/CLAUDE.md/.claude skills
- re-rendered dev-boost-scaffold-module.md
No source-code/behavior changes — docs + generated context only.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
`init --type module` scaffolds a universal module whose CMakeLists.txt listed
two generated files explicitly in `logos_module(SOURCES ...)`:
generated_code/<name>_qt_glue.h
generated_code/<name>_dispatch.cpp
Those were the filenames the *old* universal codegen emitted. Since universal
modules switched to the header-first cdylib mechanism (module-builder), the
codegen now emits `<name>_cdylib_glue.{h,cpp}` + `<name>_module_impl.cpp`, so
the hardcoded names no longer exist and CMake fails at configure:
CMake Error at LogosModule.cmake (add_library):
Cannot find source file: generated_code/<name>_qt_glue.h
LogosModule.cmake already globs `generated_code/*.cpp` + `*.h` automatically
(excluding logos_sdk/*_api), so the explicit listing was both wrong and
redundant. Drop both lines and rely on the glob — matching the convention in
the in-tree universal modules (test-basic-module-cpp, test-context-module-cpp:
"LogosModule.cmake picks up from generated_code/ automatically"). The
`cSourceLines` suffix (external-lib .c sources) is preserved on `_impl.cpp`.
Verified: scaffold → `nix build` (green) → `lm methods` (echo discoverable) →
`nix build .#unit-tests` (green). The dev-boost-scaffold-module doctest was
previously a false-green from a Cachix hit; this exercises the real build.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The scaffolded module flake.nix hard-coded a preConfigure calling
`logos-cpp-generator --from-header ... --backend qt`. The logos-qt-sdk
split moved Qt-plugin glue generation to `logos-qt-generator`, and
logos-cpp-generator now hard-errors on `--backend qt` ("Qt glue generation
moved to logos-qt-generator"). So every scaffolded universal module (and
the module half of `full-app`) failed to build against a post-split
cpp-sdk — masked until now only by Cachix hits on pre-split builds.
Drop the hand-written preConfigure entirely. logos-module-builder's
mkLogosModule already runs the generator automatically for
`interface: "universal"` modules (via logos-qt-generator + the .lidl
sidecar), and the scaffold's conventional <Pascal>Impl / <name>_impl.h
naming matches the builder's defaults — so no preConfigure or codegen
metadata is needed. Verified: `init --type module` then `nix build`
produces the plugin via the autoCodegen path.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs: emit daemon-client logoscore examples, drop inline (-c) mode
logos-logoscore-cli's inline mode (`logoscore -m <dir> -l <mod> -c
"mod.method(args)" --quit-on-finish`) is being removed. Update everything
dev-boost emits/ships so generated module docs and guidance use the daemon +
client workflow instead:
logoscore -D -m ./result/lib -l <module> & # start a daemon
logoscore call <module> <method> [args...] # call a method (positional)
logoscore stop # stop when done
- Code generators: generate-agents-md.ts, build-help.ts, scaffold.ts now emit
the daemon/start + `call` + `stop` sequence (scaffold derives positional
method + space-separated args instead of a `module.method(args)` string).
- Guidelines (testing.md, universal-module.md) and skills (testing-modules,
create-universal-module, package-lgx, create-full-app) rewritten to the
daemon/client flow; CI guidance is "background daemon, run calls, stop".
- docs/spec.md and templates/full-app/README.md examples updated.
- llms-full.txt re-synced to match (it aggregates the above).
`tsc` still compiles (nix build of the default package passes).
Note: doctests/outputs/* are regenerated end-to-end by the doctest harness
(doctests/run.sh, which scaffolds + builds + executes the commands), so those
snapshots refresh from the updated generators on the next doctest run rather
than being hand-edited here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: address review — omit empty call args; fix llms type-detection line
- scaffold.ts: no-arg sample methods left `sampleCallArgs` empty, producing a
trailing space / empty arg in the suggested `logoscore call`. Derive a
`sampleCall` that omits the args when empty.
- llms-full.txt: the type-auto-detection line still said "`-c` args" while the
surrounding section documents the `call` client command — now "`call` args".
tsc still compiles (nix build of .#default passes).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs: daemon starts clean — drop -l, load modules via load-module
Follow-up to dropping inline mode: logoscore's daemon now starts clean (the
-l/--load-modules autoload flag is removed). Update everything dev-boost
emits/ships to start a clean daemon and load modules with `load-module`:
logoscore -D -m <dir> &
logoscore load-module <module>
logoscore call <module> <method> [args]
logoscore stop
- Generators (generate-agents-md.ts, build-help.ts, scaffold.ts) emit a
`load-module` step instead of `-D … -l <module>`.
- Guidelines/skills/docs/template + llms-full.txt updated (comma-separated
`-l a,b` examples become one `load-module` per module).
tsc compiles (nix build of .#default passes).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>