feat(nix): expose openspec as a consumable overlay - #1439
Conversation
Refactor the flake so the package derivation is defined once, in
`overlays.default`, and every other output consumes it. Previously the
derivation lived inline in `packages.default`, so anyone who wanted
`openspec` in their own package set had to copy the derivation rather than
import it.
What changed:
- Add `overlays.default`, a standard `final: _prev:` overlay that exposes
`pkgs.openspec`. The derivation is written against `final`, so downstream
overlay composition and `overrideAttrs` behave as expected.
- Route `packages.{default,openspec}` through the overlay via a `pkgsFor`
helper (`import nixpkgs { overlays = [ self.overlays.default ]; }`), so the
flake's own package resolves exactly as a consumer's would. No more
duplicated build definition.
- Refresh the nixpkgs pin in `flake.lock`.
`apps` and `devShells` are unchanged in behaviour.
Usage — a downstream flake:
nixpkgs.overlays = [ openspec.overlays.default ];
# -> pkgs.openspec
or devenv, via `devenv.yaml`:
inputs:
openspec:
url: github:Fission-AI/OpenSpec
overlays:
- default
Assisted-by: Claude Opus 4.8 <noreply@anthropic.com>
📝 WalkthroughWalkthroughThe flake refactors per-system package generation around a default overlay. ChangesFlake package wiring
Estimated code review effort: 2 (Simple) | ~10 minutes Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
flake.nix (1)
51-56: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winPlan a pnpm/fetcher migration for this derivation.
pnpm_9is EOL and being phased out in Nixpkgs, while this flake is onnixos-unstableand still usespnpm_9plusfetchPnpmDepswithfetcherVersion = 3. Update the build/dev/dependency-fetching path to a supported pnpm version such aspnpm_11and usefetcherVersion = 4, regenerating thepnpmDepshash accordingly.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@flake.nix` around lines 51 - 56, Update the derivation’s pnpm dependency-fetching and build/development configuration from pnpm_9 to a supported version such as pnpm_11, change fetchPnpmDeps to fetcherVersion 4, and regenerate the pnpmDeps hash for the new fetcher output. Ensure all related pnpm references use the same supported version.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@flake.nix`:
- Around line 51-56: Update the derivation’s pnpm dependency-fetching and
build/development configuration from pnpm_9 to a supported version such as
pnpm_11, change fetchPnpmDeps to fetcherVersion 4, and regenerate the pnpmDeps
hash for the new fetcher output. Ensure all related pnpm references use the same
supported version.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 98cc6ee4-1eab-44dc-82a6-b6998b56fa17
📒 Files selected for processing (1)
flake.nix
Code review — verdict: good to merge after one small fixReviewed against four criteria: real need, does it work, breaking-change risk, and scope creep. 1. Real need — yes, narrowlyToday the derivation lives inline in 2. Does it work — yes, and CI proves the overlay path specificallyThis is the part I wanted to be sure of, because an overlay can evaluate fine and still not be what
3. Breaking changes — none that I can find
4. Scope — correctly surgicalPackaging-only. No OpenSpec design surface expanded. This is exactly the shape a change like this should have. One thing to fix before merge (non-blocking for correctness, but it does regress a script)
if ! grep -q "(builtins.fromJSON (builtins.readFile ./package.json)).version" "$FLAKE_FILE"; then
echo "⚠️ Warning: flake.nix doesn't use dynamic version from package.json"That pattern matches So anyone running Either fix works:
I'd take the first — it keeps this PR to purely the overlay restructure. Nits (no action needed)
|
alfred-openspec
left a comment
There was a problem hiding this comment.
The overlay itself is sound and Nix CI passes, but the new version syntax regresses scripts/update-flake.sh's dynamic-version check; the CI log reproduces the false warning. Please keep the original version assignment or update the checker, and remove the stale flake.lock claim from the PR body.
Refactor the flake so the package derivation is defined once, in
overlays.default, and every other output consumes it. Previously the derivation lived inline inpackages.default, so anyone who wantedopenspecin their own package set had to copy the derivation rather than import it.What changed:
overlays.default, a standardfinal: _prev:overlay that exposespkgs.openspec. The derivation is written againstfinal, so downstream overlay composition andoverrideAttrsbehave as expected.packages.{default,openspec}through the overlay via apkgsForhelper (import nixpkgs { overlays = [ self.overlays.default ]; }), so the flake's own package resolves exactly as a consumer's would. No more duplicated build definition.flake.lock.appsanddevShellsare unchanged in behaviour.Usage — a downstream flake:
or devenv, via
devenv.yaml:Summary by CodeRabbit