-
Notifications
You must be signed in to change notification settings - Fork 0
Feature/crq 016 nixify 2025 10 06 #1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
- Configured `lint-staged` in `package.json` to run `statix check` on `.nix` files as part of the pre-commit hook. - Updated `flake.nix` to include `pkgs.statix` in the `devShell` to make `statix` available in the development environment. - Created `scripts/test-pre-commit-nix-statix.sh`, a test driver script that verifies `statix check` functionality by testing against malformed and correctly formatted Nix files within a simulated Nix environment. - Corrected the `.husky/pre-commit` script to ensure the pre-commit checks run within the Nix development shell.
- Introduced a `lint-nix` target in `Makefile.nix` to execute `statix check .` within the Nix development shell, enabling linting of all Nix files in the project. - Integrated the `lint-nix` target into the main `Makefile` and its `help` output for easy access and discoverability.
- Introduced a `lint-nix` target in `Makefile.nix` to execute `statix check .` within the Nix development shell, enabling linting of all Nix files in the project. - Integrated the `lint-nix` target into the main `Makefile` and its `help` output for easy access and discoverability.
WalkthroughAdds Nix-based build, dev-shell, and CI tooling (flake, packages, shell, scripts), multiple macOS sandbox policies, Makefile targets for Nix, pre-commit hook migration to nix develop with statix, documentation (Nix onboarding, README update), gitignore updates, submodules, QA reports, and an Android libuv compatibility patch. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor Dev as Developer
participant Git as Git/Husky
participant Nix as nix develop
participant Node as node
participant Statix as statix
Dev->>Git: commit
Git->>Nix: run pre-commit hook
Nix->>Node: node scripts/pre-commit.js
Node-->>Git: exit code
Nix->>Statix: statix check (*.nix) via lint-staged
Statix-->>Nix: results
Git-->>Dev: allow/deny commit
sequenceDiagram
autonumber
actor Dev as Developer
participant Nix as nix build/run/flake
participant Flake as flake.nix
participant Der as gemini-cli derivation
participant FS as bundle/
participant Out as result/bin,gems
Dev->>Nix: nix build
Nix->>Flake: evaluate outputs
Flake->>Der: create derivation
Der->>FS: verify bundle/gemini.js
Der->>Out: install wrapper + assets
Dev->>Nix: nix run .#gemini
Nix->>Out: execute bin/gemini
Estimated code review effortπ― 4 (Complex) | β±οΈ ~60 minutes Poem
Pre-merge checks and finishing touchesβ Failed checks (2 warnings)
β Passed checks (1 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 |
PR Compliance Guide πBelow is a summary of compliance checks for this PR:
Compliance status legendπ’ - Fully Compliantπ‘ - Partial Compliant π΄ - Not Compliant βͺ - Requires Further Human Verification π·οΈ - Compliance label |
||||||||||||||||||||
PR Code Suggestions β¨Explore these optional code suggestions:
|
|||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 24
π§Ή Nitpick comments (8)
bundle/sandbox-macos-restrictive-proxied.sb (1)
74-79: Consider making include directory count configurable.The hardcoded limit of 5 include directories (INCLUDE_DIR_0 through INCLUDE_DIR_4) may be insufficient for some use cases. Consider documenting this limitation or implementing a more flexible approach if users frequently need more directories.
nix/shell.nix (1)
1-4: Consider pinning Node.js version for reproducibility.The shell uses
nodejs_latest, which will track the latest Node.js version in nixpkgs. This can lead to different versions across systems and over time, reducing reproducibilityβa core Nix principle.Consider pinning to a specific Node.js version that matches your system requirements (README.md specifies Node.js 20+):
{ pkgs }: pkgs.mkShell { - buildInputs = [ pkgs.nodejs_latest pkgs.which pkgs.git ]; + buildInputs = [ pkgs.nodejs_20 pkgs.which pkgs.git ]; }Alternatively, if you prefer to track the latest stable version explicitly:
{ pkgs }: pkgs.mkShell { - buildInputs = [ pkgs.nodejs_latest pkgs.which pkgs.git ]; + buildInputs = [ pkgs.nodejs pkgs.which pkgs.git ]; }Where
pkgs.nodejsis the current stable version maintained by nixpkgs.test_node2nix_failure.nix (1)
2-2: Remove unused...parameter.The
...parameter on line 2 is not used in this module. For clarity, remove it from the function signature.Apply this diff:
-{ pkgs, ... }: +{ pkgs }:QA_Report2.md (1)
7-9: Add language identifier to fenced code block.The code block showing the error message should specify a language for proper syntax highlighting.
Based on static analysis.
Apply this diff:
-``` +```text SystemError [ERR_SYSTEM_ERROR]: A system error occurred: uv_interface_addresses returned Unknown system error 13 (Unknown system error 13)</blockquote></details> <details> <summary>nix/packages.nix (2)</summary><blockquote> `20-39`: **Fragile installPhase with rm/cp pattern.** The installPhase copies `node_modules`, then removes several symlinks/directories, then copies packages back from the source tree. This pattern is fragile and error-prone: 1. If any of the `rm -f` targets don't exist, it continues silently 2. The `cp -r packages/*` commands assume specific directory structure 3. No validation that the copied packages contain expected files Consider either: - Using `buildNpmPackage`'s built-in workspace support if this is a monorepo - Adding existence checks before rm/cp operations - Validating that required files exist after copying --- `50-50`: **Importing from parent directory may cause build issues.** Importing `../test_node2nix_failure.nix` from outside the nix/ subdirectory can cause problems with: - Relative path resolution in different build contexts - Nix flake pure evaluation mode - IDE/tooling that expects imports to be within the same tree Consider either: - Moving `test_node2nix_failure.nix` into the nix/ directory - Or using a flake input to reference it more reliably </blockquote></details> <details> <summary>flake.nix (2)</summary><blockquote> `26-63`: **Remove debugging output and add proper error handling.** The installPhase contains debugging echo statements that should be removed for production. Additionally, the phase expects a `bundle` directory but doesn't document how it's generated. ```diff installPhase = '' mkdir -p $out/bin mkdir -p $out/share/gemini-cli - echo "=== Checking source contents ===" - ls -la - find . -name "*bundle*" -o -name "gemini.js" | head -10 - if [ -d bundle ]; then - echo "β Found bundle directory, copying..." cp -r bundle $out/share/gemini-cli/ chmod +x $out/share/gemini-cli/bundle/gemini.js if [ -f $out/share/gemini-cli/bundle/gemini.js ]; then - echo "β Successfully copied gemini.js ($(stat -c%s $out/share/gemini-cli/bundle/gemini.js) bytes)" - # Create wrapper script cat > $out/bin/gemini << EOF #!/usr/bin/env bash exec ${pkgs.nodejs_22}/bin/node $out/share/gemini-cli/bundle/gemini.js "\$@" EOF chmod +x $out/bin/gemini # Create direct symlink ln -s $out/share/gemini-cli/bundle/gemini.js $out/bin/gemini.js - - echo "β Gemini CLI package created successfully" else - echo "β Failed to copy gemini.js" + echo "Error: Failed to copy gemini.js" >&2 exit 1 fi else - echo "β No bundle directory found in source" - echo "Available directories and files:" - ls -la + echo "Error: No bundle directory found in source" >&2 + echo "The bundle must be generated before building the Nix package." >&2 + echo "Run: npm run bundle (or equivalent)" >&2 exit 1 fi '';Also document in a comment or README how to generate the bundle before building.
94-97: Duplicate app definitions.Both
defaultandgeminiapps point to the same program. This duplication is unnecessary unless you plan to add different apps later.Consider simplifying to:
apps.default = { type = "app"; program = "${gemini-cli}/bin/gemini"; };Or if you want both names for discoverability, you can use attribute inheritance:
apps = { default = { type = "app"; program = "${gemini-cli}/bin/gemini"; }; gemini = apps.default; };
π Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
β Files ignored due to path filters (1)
flake.lockis excluded by!**/*.lock
π Files selected for processing (28)
.#QA_Report.md(1 hunks).gitignore(1 hunks).gitignore.bak(1 hunks).gitmodules(1 hunks).husky/pre-commit(1 hunks)Makefile(3 hunks)QA_Report2.md(1 hunks)README.md(1 hunks)bundle/sandbox-macos-permissive-closed.sb(1 hunks)bundle/sandbox-macos-permissive-open.sb(1 hunks)bundle/sandbox-macos-permissive-proxied.sb(1 hunks)bundle/sandbox-macos-restrictive-closed.sb(1 hunks)bundle/sandbox-macos-restrictive-open.sb(1 hunks)bundle/sandbox-macos-restrictive-proxied.sb(1 hunks)docs/memes/zosloader.md(1 hunks)docs/tutorials/Nix_Onboarding_Guide.md(1 hunks)flake.nix(1 hunks)libuv-android-fix.patch(1 hunks)nix/packages.nix(1 hunks)nix/shell.nix(1 hunks)package.json(1 hunks)scripts/nix-inspect.sh(1 hunks)scripts/test-pre-commit-nix-statix.sh(1 hunks)task.md~(1 hunks)test_node2nix_failure.nix(1 hunks)vendor/js2nix(1 hunks)vendor/node2nix(1 hunks)vendor/nodejs-mobile(1 hunks)
π§° Additional context used
πͺ checkmake (0.2.2)
Makefile
[warning] 6-6: Target body for "help" exceeds allowed length of 5 (32).
(maxbodylength)
[warning] 4-4: Missing required phony target "all"
(minphony)
[warning] 197-197: Target "nix" should be declared PHONY.
(phonydeclared)
πͺ markdownlint-cli2 (0.18.1)
QA_Report2.md
7-7: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
π Additional comments (16)
bundle/sandbox-macos-restrictive-proxied.sb (1)
16-63: LGTM: Sysctl allowlist follows Chromium's sandbox.The sysctl read permissions are appropriately scoped to hardware and kernel information, following Chromium's battle-tested sandbox policy.
package.json (1)
128-131: Ensurestatixis available to lint-staged.
lint-stagedexecutes via Husky/NPM, which wonβt havestatixunless the hook enters a nix shell or installs it separately. Please confirm the hook runs inside an environment wherestatixis on PATH; otherwise commits will fail on machines without nix..gitignore (1)
55-55: LGTM!Adding the telemetry log to gitignore is appropriate and follows standard practices for keeping generated log files out of version control.
vendor/nodejs-mobile (1)
1-1: Submodule pointer LGTM.Commit reference recorded; no issues spotted.
test_node2nix_failure.nix (2)
21-21: Clarify the intended source directory.Using
src = ./.;refers to the current directory where this Nix file is evaluated, which may not be the repository root. This could lead to unexpected behavior if the test needs access to the full repository.Verify this is the intended behavior. If you need the repository root, use:
- src = ./.; # Use the current directory as source + src = ./..; # Use the parent directory (likely repo root)Or if only minimal files are needed:
- src = ./.; # Use the current directory as source + src = pkgs.runCommand "minimal-src" {} "mkdir -p $out";
39-45: LGTM!The no-op
installPhaseis appropriate for a test derivation where the build phase is the primary concern. The module export structure is clean.QA_Report2.md (1)
1-50: Valuable troubleshooting documentation.This QA report provides excellent documentation of the systematic investigation into node2nix failures on Termux. The step-by-step approach and conclusion about sandbox restrictions will be helpful for future maintainers encountering similar issues.
Makefile (5)
6-39: Help target length is acceptable for comprehensive documentation.While the static analysis tool flags this target as exceeding 5 lines, the comprehensive documentation of all available targets (including the new Nix integration) justifies the length. The help text is well-organized with clear sections.
Note: If you prefer to address the static analysis warning, you could split into
helpandhelp-nixtargets, but the current unified approach provides better user experience.
46-47: LGTM!The
bundletarget follows the same pattern as other npm script wrappers in this Makefile.
100-104: LGTM!The
lint-nixtarget appropriately usesstatixfor Nix file linting and correctly ignoresMakefile.nix.
106-146: LGTM!These Nix build and test targets are well-implemented:
- Dependency checks verify required tools
- Build targets create logs directory and capture output
- Test target includes proper symlink verification and timeout handling
- Comprehensive test coverage (--help, --version, simple prompt)
148-197: LGTM!The remaining Nix integration targets are well-designed:
- Shell and run targets provide direct Nix interaction
- Clean targets handle both npm and Nix artifacts
- Composite targets (build-all, test-all, clean-all, dev-setup) follow the DRY principle
- Default
nixtarget appropriately shows help.husky/pre-commit (1)
1-1: Confirm Nix shell includes Node.js
scripts/pre-commit.js exists; please verify that runningnix developprovidesnodein your PATH so the pre-commit hook succeeds.flake.nix (3)
81-87: Retainstatixin devShell
Statix is invoked by the Makefileβslint-nixtask and inscripts/test-pre-commit-nix-statix.shtests, so includingpkgs.statixindevShells.default.buildInputsis necessary.
5-5: Security & maintenance risk: custom nixpkgs repoThe flake pulls from
github:meta-introspector/nixpkgs, which is not the official NixOS/nixpkgs. Manually verify that this repo tracks upstream without undocumented patches or delays in security updates. If thereβs no compelling reason for a separate repo, switch to the official nixpkgs channel.
7-7: Verify necessity of custom node2nix fork
flake.nix usesgithub:meta-introspector/node2nix(isFork=true, forkCount=0, last push 2025-09-26). Document any deviations from upstream (svanderburg/node2nix) justifying this fork or revert to the official source.
| @@ -0,0 +1 @@ | |||
| [email protected] No newline at end of file | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove temporary lockfile artifact.
The file name prefix .#[...] indicates an Emacs lock/backup file. Keeping it under source control is noise and risks future conflicts. Please drop this file from the commit.
π€ Prompt for AI Agents
In .#QA_Report.md around lines 1 to 1: this is an Emacs temporary lock/backup
file that should not be committed; remove it from the repo by deleting the file
and unstaging it (git rm --cached or git rm if it was added), add a rule like
".#*" or ".#QA_Report.md" to .gitignore (or a broader Emacs temp pattern) to
prevent re-adding, and create a new commit that removes the file and updates
.gitignore.
| # API keys and secrets | ||
| .env | ||
| .env~ | ||
|
|
||
| # gemini-cli settings | ||
| # We want to keep the .gemini in the root of the repo and ignore any .gemini | ||
| # in subdirectories. In our root .gemini we want to allow for version control | ||
| # for subcommands. | ||
| **/.gemini/ | ||
| !/.gemini/ | ||
| .gemini/* | ||
| !.gemini/config.yaml | ||
| !.gemini/commands/ | ||
|
|
||
| # Note: .gemini-clipboard/ is NOT in gitignore so Gemini can access pasted images | ||
|
|
||
| # Dependency directory | ||
| node_modules | ||
| bower_components | ||
| package-lock.json | ||
|
|
||
| # Editors | ||
| .idea | ||
| *.iml | ||
|
|
||
| # OS metadata | ||
| .DS_Store | ||
| Thumbs.db | ||
|
|
||
| # TypeScript build info files | ||
| *.tsbuildinfo | ||
|
|
||
| # Ignore built ts files | ||
| dist | ||
|
|
||
| # Docker folder to help skip auth refreshes | ||
| .docker | ||
|
|
||
| bundle | ||
|
|
||
| # Test report files | ||
| junit.xml | ||
| packages/*/coverage/ | ||
|
|
||
| # Generated files | ||
| packages/cli/src/generated/ | ||
| packages/core/src/generated/ | ||
| .integration-tests/ | ||
| packages/vscode-ide-companion/*.vsix | ||
|
|
||
| # GHA credentials | ||
| gha-creds-*.json | ||
|
|
||
| # Log files | ||
| patch_output.log |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove backup file from version control.
Backup files (.bak extension) should not be committed to the repository, as they create confusion about which configuration is authoritative and clutter version history.
If this represents the desired .gitignore content, rename it:
mv .gitignore.bak .gitignoreOtherwise, remove it entirely:
rm .gitignore.bakVerify the actual .gitignore file is present and properly configured:
#!/bin/bash
# Check for .gitignore file
if [ -f .gitignore ]; then
echo "β .gitignore exists"
echo "Content preview:"
head -20 .gitignore
else
echo "β .gitignore not found"
fi
# Check if both files exist (which would be confusing)
if [ -f .gitignore ] && [ -f .gitignore.bak ]; then
echo "β Both .gitignore and .gitignore.bak exist"
echo "Differences:"
diff -u .gitignore .gitignore.bak || true
fiπ€ Prompt for AI Agents
In .gitignore.bak (lines 1-55): this file is a backup and should not be
committed; either rename it to .gitignore if it is the intended canonical ignore
file or delete .gitignore.bak from the repository and commit that removal. After
doing so, ensure there is a single .gitignore with the desired content in the
repo (if you renamed, stage and commit the new .gitignore; if you deleted,
verify .gitignore exists and is correct), and remove the backup from version
control so it no longer shows up in commits or diffs.
| (subpath (string-append (param "HOME_DIR") "/.gemini")) | ||
| (subpath (string-append (param "HOME_DIR") "/.npm")) | ||
| (subpath (string-append (param "HOME_DIR") "/.cache")) | ||
| (subpath (string-append (param "HOME_DIR") "/.gitconfig")) | ||
| ;; Allow writes to included directories from --include-directories | ||
| (subpath (param "INCLUDE_DIR_0")) | ||
| (subpath (param "INCLUDE_DIR_1")) | ||
| (subpath (param "INCLUDE_DIR_2")) | ||
| (subpath (param "INCLUDE_DIR_3")) | ||
| (subpath (param "INCLUDE_DIR_4")) | ||
| (literal "/dev/stdout") | ||
| (literal "/dev/stderr") | ||
| (literal "/dev/null") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Allow Gitβs lock file alongside .gitconfig.
Git writes via ~/.gitconfig.lock before renaming back to ~/.gitconfig. Because the policy only whitelists ~/.gitconfig, any command that updates global git config (including tooling invoked by this project) will fail with Operation not permitted. Please add the lockfile path (e.g. another (subpath (string-append (param "HOME_DIR") "/.gitconfig.lock"))) and mirror the fix across the other sandbox profiles introduced here.
π€ Prompt for AI Agents
bundle/sandbox-macos-permissive-closed.sb around lines 12 to 24: add a subpath
entry for the Git lockfile by adding a (subpath (string-append (param
"HOME_DIR") "/.gitconfig.lock")) immediately next to the existing ~/.gitconfig
entry so Git can create/rename the lockfile; then apply the same addition
(mirror the .gitconfig.lock subpath) to the other sandbox profile files in this
bundle that whitelist ~/.gitconfig so all profiles permit Gitβs temporary
lockfile writes.
| (subpath (string-append (param "HOME_DIR") "/.gemini")) | ||
| (subpath (string-append (param "HOME_DIR") "/.npm")) | ||
| (subpath (string-append (param "HOME_DIR") "/.cache")) | ||
| (subpath (string-append (param "HOME_DIR") "/.gitconfig")) | ||
| ;; Allow writes to included directories from --include-directories | ||
| (subpath (param "INCLUDE_DIR_0")) | ||
| (subpath (param "INCLUDE_DIR_1")) | ||
| (subpath (param "INCLUDE_DIR_2")) | ||
| (subpath (param "INCLUDE_DIR_3")) | ||
| (subpath (param "INCLUDE_DIR_4")) | ||
| (literal "/dev/stdout") | ||
| (literal "/dev/stderr") | ||
| (literal "/dev/null") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mirror the .gitconfig.lock allowance here.
This profile shares the same write allow-list as the closed variant, so it will hit the same git failure path. Please add the lockfile allowance here once you update the other profiles.
π€ Prompt for AI Agents
In bundle/sandbox-macos-permissive-open.sb around lines 12 to 24, the profile
permits writes to ~/.gitconfig but omits the corresponding .gitconfig.lock
allowance; add a matching subpath entry for the lockfile (i.e., append a subpath
built from the HOME_DIR param for ".gitconfig.lock") alongside the existing
.gitconfig entry so this permissive profile mirrors the closed variant and
avoids the git lock failure.
| (subpath (string-append (param "HOME_DIR") "/.gemini")) | ||
| (subpath (string-append (param "HOME_DIR") "/.npm")) | ||
| (subpath (string-append (param "HOME_DIR") "/.cache")) | ||
| (subpath (string-append (param "HOME_DIR") "/.gitconfig")) | ||
| ;; Allow writes to included directories from --include-directories | ||
| (subpath (param "INCLUDE_DIR_0")) | ||
| (subpath (param "INCLUDE_DIR_1")) | ||
| (subpath (param "INCLUDE_DIR_2")) | ||
| (subpath (param "INCLUDE_DIR_3")) | ||
| (subpath (param "INCLUDE_DIR_4")) | ||
| (literal "/dev/stdout") | ||
| (literal "/dev/stderr") | ||
| (literal "/dev/null") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add the git lockfile path.
Please extend the write allow-list with ~/.gitconfig.lock here as well so global git config writes keep working while the proxy sandbox is active.
π€ Prompt for AI Agents
In bundle/sandbox-macos-permissive-proxied.sb around lines 12 to 24, the write
allow-list includes ~/.gitconfig but not the corresponding git lockfile, so
global git config writes can fail under the proxy sandbox; add an entry for the
lockfile by inserting (subpath (string-append (param "HOME_DIR")
"/.gitconfig.lock")) adjacent to the ~/.gitconfig line (keeping same
indentation/format) so the sandbox permits writes to the lockfile.
| #### Install with Nix | ||
|
|
||
| For Nix users, you can install the Gemini CLI using our Nix flake. This provides a reproducible development environment and ensures all dependencies are managed by Nix. | ||
|
|
||
| ```bash | ||
| nix profile install github:meta-introspector/gemini-cli?ref=feature/working-gemini-cli-nix-store | ||
| ``` | ||
|
|
||
| For more detailed instructions on setting up your development environment with Nix, including how to contribute, please refer to our [Nix Onboarding Guide](./docs/tutorials/Nix_Onboarding_Guide.md). | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
π§© Analysis chain
Update Nix installation command to reference the official repository.
The Nix installation command points to github:meta-introspector/gemini-cli?ref=feature/working-gemini-cli-nix-store, which references:
- A different GitHub organization (
meta-introspectorinstead ofgoogle-gemini) - A feature branch instead of a stable reference
This will confuse users and prevent them from installing the official version. Once this PR merges to main, the command should reference the canonical repository.
Apply this diff to use the official repository:
-nix profile install github:meta-introspector/gemini-cli?ref=feature/working-gemini-cli-nix-store
+nix profile install github:google-gemini/gemini-cliIf Nix support is not yet ready on main, consider:
- Moving this documentation to a separate branch-specific README until the feature is stable
- Adding a note that this is experimental and referencing the feature branch explicitly
- Using a more stable reference like a tag once available
Verify that the referenced documentation file exists:
π Script executed:
#!/bin/bash
# Description: Check if the Nix Onboarding Guide exists
# Expected: The file should exist at docs/tutorials/Nix_Onboarding_Guide.md
fd -t f "Nix_Onboarding_Guide.md"Length of output: 38
Use official google-gemini/gemini-cli in Nix install command
Replace the meta-introspector reference and feature branch with the canonical repo:
-nix profile install github:meta-introspector/gemini-cli?ref=feature/working-gemini-cli-nix-store
+nix profile install github:google-gemini/gemini-cliπ Committable suggestion
βΌοΈ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| #### Install with Nix | |
| For Nix users, you can install the Gemini CLI using our Nix flake. This provides a reproducible development environment and ensures all dependencies are managed by Nix. | |
| ```bash | |
| nix profile install github:meta-introspector/gemini-cli?ref=feature/working-gemini-cli-nix-store | |
| ``` | |
| For more detailed instructions on setting up your development environment with Nix, including how to contribute, please refer to our [Nix Onboarding Guide](./docs/tutorials/Nix_Onboarding_Guide.md). | |
| #### Install with Nix | |
| For Nix users, you can install the Gemini CLI using our Nix flake. This provides a reproducible development environment and ensures all dependencies are managed by Nix. | |
π€ Prompt for AI Agents
In README.md around lines 49 to 58, the Nix install command points to
github:meta-introspector/gemini-cli?ref=feature/working-gemini-cli-nix-store;
update the command to use the official canonical repository by replacing that
reference with github:google-gemini/gemini-cli (optionally add ?ref=main or the
correct release tag if you need a specific version), and ensure the surrounding
text still mentions using the Nix flake and links to the Nix Onboarding Guide.
| local size=$(stat -c%s "$file" 2>/dev/null || echo "unknown") | ||
| local readable_size=$(numfmt --to=iec "$size" 2>/dev/null || echo "$size bytes") | ||
| echo "β $desc found: $file ($readable_size)" | ||
| return 0 | ||
| else | ||
| echo "β $desc missing: $file" | ||
| return 1 | ||
| fi | ||
| } | ||
|
|
||
| # Function to check directory | ||
| check_directory() { | ||
| local dir="$1" | ||
| local desc="$2" | ||
|
|
||
| if [ -d "$dir" ]; then | ||
| echo "β $desc exists: $dir" | ||
| return 0 | ||
| else | ||
| echo "β $desc missing: $dir" | ||
| return 1 | ||
| fi | ||
| } | ||
|
|
||
| echo "=== Step 1: Basic File Checks ===" | ||
| check_file "$PROJECT_DIR/flake.nix" "Flake configuration" | ||
| check_file "$PROJECT_DIR/package.json" "Package configuration" | ||
| check_directory "$PROJECT_DIR/bundle" "Bundle directory" | ||
| check_file "$PROJECT_DIR/bundle/gemini.js" "Bundle gemini.js" | ||
|
|
||
| echo "" | ||
| echo "=== Step 2: Nix Build Status ===" | ||
| cd "$PROJECT_DIR" | ||
|
|
||
| if [ -L result ]; then | ||
| result_path=$(readlink result) | ||
| echo "β Nix result found: $result_path" | ||
|
|
||
| echo "Result structure:" | ||
| find result -type f -name "gemini*" 2>/dev/null | head -10 | ||
|
|
||
| echo "Checking result/bin/:" | ||
| ls -la result/bin/ 2>/dev/null || echo "No bin directory in result" | ||
|
|
||
| echo "Checking result/share/:" | ||
| find result/share -name "*gemini*" 2>/dev/null | head -5 || echo "No gemini files in share" | ||
|
|
||
| else | ||
| echo "β No Nix result found" | ||
| fi | ||
|
|
||
| echo "" | ||
| echo "=== Step 3: Bundle Analysis ===" | ||
| if [ -f bundle/gemini.js ]; then | ||
| echo "Bundle gemini.js analysis:" | ||
| echo "Size: $(stat -c%s bundle/gemini.js | numfmt --to=iec)" | ||
| echo "Permissions: $(stat -c%A bundle/gemini.js)" | ||
| echo "Modified: $(stat -c%y bundle/gemini.js)" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Make file/size probes portable
Calls like stat -c%s / stat -c%A and numfmt --to=iec require GNU coreutils; on macOS they fail outright, so the inspection tool exits before doing any work. Please add a portability shim (e.g., detect the OS and use the BSD stat -f%z / stat -f%Sp, fall back when numfmt is absent) or reuse the python -c/ls alternatives so the script runs on both Linux and macOS.
Also applies to: 81-83
π€ Prompt for AI Agents
scripts/nix-inspect.sh lines 26-83: the script uses GNU-only utilities (stat
-c*, numfmt --to=iec) which break on macOS; add small portability shims and use
them instead of direct calls. Implement helper functions (e.g., get_size PATH,
get_perms PATH, get_mtime PATH, human_readable SIZE) that: 1) detect and prefer
GNU stat/numfmt when available; 2) fallback to BSD stat flags (stat -f%z, -f%Sp,
-f%Sm) if GNU stat is absent; 3) if numfmt is missing, produce a human-readable
size via a short python -c snippet or simple bash division; and 4) ensure all
calls in the file (lines ~26β83, including the bundle/gemini.js checks at 81β83)
are replaced to call these helpers and handle missing-tool errors gracefully
(print a readable value or "unknown" instead of failing).
| SCRIPT_DIR=$(dirname "$(readlink -f "$0")") | ||
| ORIGINAL_PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix non-portable path resolution
readlink -f is GNU-only; on macOS it errors out (illegal option -- f) and the script exits before running any checks. Replace it with a portable pattern such as SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" so the test harness works across Linux and macOS.
-SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
-ORIGINAL_PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+ORIGINAL_PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"π Committable suggestion
βΌοΈ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| SCRIPT_DIR=$(dirname "$(readlink -f "$0")") | |
| ORIGINAL_PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" | |
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | |
| ORIGINAL_PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" |
π€ Prompt for AI Agents
In scripts/test-pre-commit-nix-statix.sh around lines 5 to 6, the script uses
readlink -f which is GNU-only and fails on macOS; replace that usage with a
POSIX-compatible pattern to resolve the script directory (e.g., change to a
cd+pwd pattern using BASH_SOURCE) so it works on both Linux and macOS; update
SCRIPT_DIR assignment to use a portable form such as changing the readlink -f
invocation to a subshell that cds to the script's directory and prints the
absolute path, and keep ORIGINAL_PROJECT_ROOT computed from that SCRIPT_DIR as
before.
| nix build | ||
| error: builder for '/nix/store/i76afndbdhp59n6j1m7hfm8svcgcvqbf-gemini-cli-0.3.4.drv' failed with exit code 1; | ||
| last 10 log lines: | ||
| > npm error gyp ERR! stack at ChildProcess.emit (node:events:519:28) | ||
| > npm error gyp ERR! stack at ChildProcess._handle.onexit (node:internal/child_process:293:12) | ||
| > npm error gyp ERR! System Linux 6.1.99-android14-11-30958380-abS928BXXS4BYH3 | ||
| > npm error gyp ERR! command "/nix/store/13ar46sdd3qls1q4w35qv7v9a6wpj63c-nodejs-22.19.0/bin/node" "/nix/store/13ar46sdd3qls1q4w35q\ | ||
| v7v9a6wpj63c-nodejs-22.19.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild" | ||
| > npm error gyp ERR! cwd /tmp/nix-shell.gw9Gzz/nix-build-gemini-cli-0.3.4.drv-0/source/node_modules/keytar | ||
| > npm error gyp ERR! node -v v22.19.0 | ||
| > npm error gyp ERR! node-gyp -v v11.2.0 | ||
| > npm error gyp ERR! not ok | ||
| > npm error Log files were not written due to an error writing to the directory: /nix/store/8bl73fdv81mghzl335mbms555fac6qx7-gemini\ | ||
| -cli-0.3.4-npm-deps/_logs | ||
| > npm error You can rerun the command with `--loglevel=verbose` to see the logs in your terminal | ||
| For full logs, run 'nix log /nix/store/i76afndbdhp59n6j1m7hfm8svcgcvqbf-gemini-cli-0.3.4.drv'. | ||
| sh-5.2$ | ||
| To resolve the `nix build` error for `gemini-cli-0.3.4` and vendorize all dependencies, including `libsecret`, using `node2nix` and Nix, we need to ensure that all native dependencies (like `libsecret` for `keytar`) are managed within the Nix environment. This approach avoids relying on Termuxβs package manager (`pkg`) and ensures a reproducible build. Below is a comprehensive guide to achieve this. | ||
|
|
||
| ### Overview | ||
| The previous error indicates a `node-gyp` failure when building `keytar`, likely due to missing native dependencies like `libsecret`, `python`, or build tools. Using `node2nix`, weβll vendorize the Node.js dependencies, and weβll configure the Nix derivation to include `libsecret` and other required tools from Nixpkgs, avoiding Termux-specific packages. Since youβre running on Termux (Android), weβll also address potential platform-specific issues. | ||
|
|
||
| ### Steps to Vendorize Dependencies and Use Nix for `libsecret` | ||
|
|
||
| #### 1. **Install `node2nix`** | ||
| Ensure `node2nix` is installed in your Nix environment: | ||
| ```bash | ||
| nix-env -iA nixpkgs.node2nix | ||
| ``` | ||
| Verify the installation: | ||
| ```bash | ||
| node2nix --version | ||
| ``` | ||
|
|
||
| #### 2. **Prepare the `gemini-cli` Source** | ||
| Navigate to the `gemini-cli` source directory: | ||
| ```bash | ||
| cd /data/data/com.termux.nix/files/home/pick-up-nix2/vendor/external/gemini-cli | ||
| ``` | ||
| Ensure `package.json` and `package-lock.json` exist. If `package-lock.json` is missing, generate it: | ||
| ```bash | ||
| nix-shell -p nodejs --run "npm install" | ||
| ``` | ||
| This runs `npm install` in a Nix shell with Node.js, creating `package-lock.json` without relying on Termuxβs Node.js. | ||
|
|
||
| #### 3. **Generate Nix Expressions with `node2nix`** | ||
| Run `node2nix` to vendorize the Node.js dependencies: | ||
| ```bash | ||
| node2nix -i package.json -l package-lock.json -o node-packages.nix -c default.nix -e node-env.nix | ||
| ``` | ||
| Since youβre using Node.js 22 (from the error log), specify the Node.js version: | ||
| ```bash | ||
| node2nix --nodejs-22 -i package.json -l package-lock.json | ||
| ``` | ||
| This generates: | ||
| - `node-packages.nix`: Lists all vendored dependencies. | ||
| - `default.nix`: The main build expression. | ||
| - `node-env.nix`: Node.js environment setup. | ||
|
|
||
| #### 4. **Modify the Generated `default.nix`** | ||
| The generated `default.nix` needs to include native dependencies for `keytar` (e.g., `libsecret`, `python3`, `pkg-config`, and build tools). Edit `default.nix` to look like this: | ||
| ```nix | ||
| { pkgs ? import <nixpkgs> {} }: | ||
|
|
||
| let | ||
| nodePackages = import ./node-packages.nix { inherit pkgs; }; | ||
| in | ||
| nodePackages."gemini-cli-0.3.4".override { | ||
| nativeBuildInputs = with pkgs; [ | ||
| python3 | ||
| pkg-config | ||
| gnumake | ||
| gcc | ||
| ]; | ||
| buildInputs = with pkgs; [ | ||
| libsecret | ||
| ]; | ||
| preBuild = '' | ||
| export HOME=$TMPDIR | ||
| npm config set scripts-prepend-node-path true | ||
| ''; | ||
| postInstall = '' | ||
| mkdir -p $out/bin | ||
| cp node_modules/.bin/gemini $out/bin/gemini || true | ||
| chmod +x $out/bin/gemini | ||
| ''; | ||
| meta = with pkgs.lib; { | ||
| description = "Gemini CLI"; | ||
| license = licenses.mit; # Adjust as needed | ||
| }; | ||
| } | ||
| ``` | ||
| Key changes: | ||
| - **Native Build Inputs**: | ||
| - `python3`: Required by `node-gyp`. | ||
| - `pkg-config`: For locating `libsecret`. | ||
| - `gnumake` and `gcc`: Build tools for native compilation. | ||
| - **Build Inputs**: | ||
| - `libsecret`: Required by `keytar` for keyring access. | ||
| - **Pre-build Setup**: | ||
| - `HOME=$TMPDIR`: Avoids permission issues in the Nix store. | ||
| - `npm config set scripts-prepend-node-path true`: Ensures `node` is found during the build. | ||
| - **Post-install**: | ||
| - Copies the `gemini` binary to `$out/bin`, with `|| true` to avoid failures if the binary is missing (as seen in the previous error). | ||
|
|
||
| #### 5. **Handle `keytar` in `node-packages.nix`** | ||
| The `keytar` dependency requires native compilation, which is likely causing the `node-gyp` error. To ensure it builds correctly: | ||
| - Open `node-packages.nix` and locate the `keytar` entry (it will be under the `nodeDependencies` list). | ||
| - Ensure itβs not skipped. You can add: | ||
| ```nix | ||
| keytar = { | ||
| name = "keytar"; | ||
| version = "<version>"; | ||
| src = fetchurl { | ||
| url = "https://registry.npmjs.org/keytar/-/keytar-<version>.tgz"; | ||
| sha512 = "<hash>"; | ||
| }; | ||
| buildInputs = [ pkgs.libsecret ]; | ||
| nativeBuildInputs = [ pkgs.python3 pkgs.pkg-config pkgs.gnumake pkgs.gcc ]; | ||
| npmFlags = [ "--build-from-source" ]; | ||
| }; | ||
| ``` | ||
| This forces `keytar` to build from source with the necessary dependencies. | ||
|
|
||
| Alternatively, if prebuilt binaries are available and compatible with Android, you can skip the build step: | ||
| ```nix | ||
| dontNpmBuild = true; | ||
| ``` | ||
| However, prebuilt binaries may not exist for Android, so building from source is safer. | ||
|
|
||
| #### 6. **Ensure `libsecret` is Available** | ||
| Instead of relying on Termuxβs `pkg install libsecret`, use Nixβs `libsecret` package. The `buildInputs = [ pkgs.libsecret ];` in `default.nix` ensures itβs included. To verify itβs available: | ||
| ```bash | ||
| nix-shell -p libsecret --run "pkg-config --modversion libsecret-1" | ||
| ``` | ||
| If this fails, ensure your Nix channel is up to date: | ||
| ```bash | ||
| nix-channel --update | ||
| ``` | ||
|
|
||
| #### 7. **Test the Build** | ||
| Run the build using the generated Nix expressions: | ||
| ```bash | ||
| nix build -f default.nix | ||
| ``` | ||
| If it fails, check the log for details: | ||
| ```bash | ||
| nix log /nix/store/i76afndbdhp59n6j1m7hfm8svcgcvqbf-gemini-cli-0.3.4.drv | ||
| ``` | ||
| For verbose logging, modify `default.nix` to add `--loglevel=verbose`: | ||
| ```nix | ||
| preBuild = '' | ||
| export HOME=$TMPDIR | ||
| npm config set scripts-prepend-node-path true | ||
| npm install --loglevel=verbose | ||
| ''; | ||
| ``` | ||
|
|
||
| #### 8. **Debugging in `nix-shell`** | ||
| If the build fails, debug interactively: | ||
| ```bash | ||
| nix-shell -f default.nix | ||
| ``` | ||
| Inside the shell, run: | ||
| ```bash | ||
| npm install --build-from-source --loglevel=verbose | ||
| ``` | ||
| Check for specific errors, especially in the `keytar` build. Verify that `libsecret` is found: | ||
| ```bash | ||
| pkg-config --modversion libsecret-1 | ||
| ``` | ||
|
|
||
| #### 9. **Handle Termux-Specific Issues** | ||
| Since youβre on Termux (Android, Linux 6.1.99-android14), there may be platform-specific challenges: | ||
| - **Filesystem Permissions**: | ||
| Ensure Termux has access to the Nix store and source directory: | ||
| ```bash | ||
| termux-setup-storage | ||
| chmod -R u+w /data/data/com.termux.nix/files/home/pick-up-nix2 | ||
| ``` | ||
| - **Nix Store Issues**: | ||
| If the Nix store is immutable or causes errors, try cleaning it: | ||
| ```bash | ||
| nix-store --gc | ||
| ``` | ||
| - **Android-Specific `keytar` Issues**: | ||
| `keytar` may not support Androidβs keyring system. If compilation fails, consider patching `gemini-cli` to remove `keytar`: | ||
| ```bash | ||
| sed -i '/keytar/d' package.json | ||
| ``` | ||
| Then regenerate the Nix expressions: | ||
| ```bash | ||
| node2nix --nodejs-22 -i package.json -l package-lock.json | ||
| ``` | ||
|
|
||
| #### 10. **Integrate with Your Project** | ||
| If `gemini-cli` is part of a larger Nix project, include the generated `default.nix` in your main `default.nix`: | ||
| ```nix | ||
| { pkgs ? import <nixpkgs> {} }: | ||
|
|
||
| let | ||
| geminiCli = import /data/data/com.termux.nix/files/home/pick-up-nix2/vendor/external/gemini-cli/default.nix { inherit pkgs; }; | ||
| in | ||
| pkgs.stdenv.mkDerivation { | ||
| name = "my-project"; | ||
| buildInputs = [ geminiCli ]; | ||
| # ... other project settings | ||
| } | ||
| ``` | ||
|
|
||
| #### 11. **If the Issue Persists** | ||
| If the build fails, provide: | ||
| - The full build log (`nix log ...`). | ||
| - The generated `node-packages.nix` and `default.nix`. | ||
| - The `package.json` from `gemini-cli`. | ||
| - Confirmation of whether `keytar` is required or can be removed. | ||
|
|
||
| ### Summary | ||
| - Use `node2nix` to vendorize all Node.js dependencies, including `keytar`. | ||
| - Modify `default.nix` to include `libsecret`, `python3`, `pkg-config`, `gnumake`, and `gcc` from Nixpkgs. | ||
| - Build `keytar` from source or consider removing it if itβs not essential. | ||
| - Debug with `nix-shell` and verbose logging. | ||
| - Address Termux-specific issues by ensuring permissions and updating the Nix channel. | ||
|
|
||
| This approach ensures all dependencies, including `libsecret`, are managed by Nix, avoiding reliance on Termuxβs package manager. Let me know if you need help with specific steps, such as editing the Nix files or analyzing the build log! No newline at end of file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Drop editor backup file
task.md~ is a tilde-suffixed backup artifact and should not be committed. Please remove it from the repo to avoid duplicated or stale documentation copies.
π€ Prompt for AI Agents
In task.md~ around lines 1 to 225, this is an editor backup (tilde-suffixed)
that should not be committed; remove the file from the repository and history
and prevent future commits by deleting it (git rm task.md~ and commit), add a
rule to .gitignore (or update existing ignore entries) to exclude *~ backup
files, and if it was already committed consider removing it from history (git
filter-repo or git rm --cached + commit and push) so no stale backup remains in
the repo.
| if ! node2nix -i package.json -o $out/output/node-packages.nix -c $out/output/default.nix 2> $out/output/stderr.log > $out/output/stdout.log; then | ||
| echo "node2nix failed with exit code $?" >> $out/output/stderr.log | ||
| exit 1 | ||
| fi |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
π οΈ Refactor suggestion | π Major
Improve error handling and output redirection.
The current error handling has several issues:
- Output redirection order: Stderr should be redirected before stdout to avoid buffering issues
- Exit code in error message: Using
$?on line 34 is misleadingβit will always show1because you're already in the failure branch - No verification of actual failure: This derivation doesn't distinguish between successful and failed node2nix runs
Apply this diff to improve the implementation:
- # Run node2nix and capture stderr and stdout
- if ! node2nix -i package.json -o $out/output/node-packages.nix -c $out/output/default.nix 2> $out/output/stderr.log > $out/output/stdout.log; then
- echo "node2nix failed with exit code $?" >> $out/output/stderr.log
+ # Run node2nix and capture stderr and stdout (redirect stderr first)
+ set +e # Allow command to fail
+ node2nix -i package.json -o $out/output/node-packages.nix -c $out/output/default.nix > $out/output/stdout.log 2> $out/output/stderr.log
+ EXIT_CODE=$?
+ set -e # Re-enable exit on error
+
+ if [ $EXIT_CODE -ne 0 ]; then
+ echo "node2nix failed with exit code $EXIT_CODE" >> $out/output/stderr.log
exit 1
fiThis ensures proper exit code capture and clearer error reporting.
π€ Prompt for AI Agents
In test_node2nix_failure.nix around lines 33 to 36, the node2nix invocation
mishandles output redirection and exit-code reporting; capture the exit status
immediately after running node2nix by assigning $? to a variable, redirect
stderr before stdout to avoid buffering issues, and only enter the failure
branch when that captured exit code is non-zero; on failure append a clear
message including the captured exit code to stderr.log and ensure stdout and
stderr files are preserved for debugging.
User description
TLDR
Dive Deeper
Reviewer Test Plan
Testing Matrix
Linked issues / bugs
PR Type
Enhancement
Description
Add comprehensive Nix integration with flake configuration
Implement Nix-based build system and development environment
Add Nix linting with statix pre-commit checks
Create macOS sandbox security profiles for different network policies
Diagram Walkthrough
File Walkthrough
5 files
Create Nix flake with development environmentΒ Β Β Β Β Β Β Β Β Β Β ΒAdd comprehensive Nix integration targetsΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΒAdd Nix build inspection utilityΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΒDefine Nix package configurationsΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΒCreate Nix shell environmentΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β2 files
Create statix pre-commit test driverΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΒAdd node2nix failure test caseΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β5 files
Add comprehensive Nix onboarding documentationΒ Β Β Β Β Β Β Β Β Β ΒAdd Nix installation instructionsΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΒDocument node2nix execution failuresΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΒAdd Nix build troubleshooting documentationΒ Β Β Β Β Β Β Β Β Β Β Β Β ΒAdd mathematical sequence analysis documentationΒ Β Β Β Β Β Β Β Β8 files
Add statix linting to lint-stagedΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΒExecute pre-commit checks in Nix shellΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΒAdd restrictive macOS sandbox with proxyΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΒAdd restrictive macOS sandbox with open networkΒ Β Β Β Β Β Β Β Β ΒAdd restrictive macOS sandbox with closed networkΒ Β Β Β Β Β Β ΒAdd permissive macOS sandbox with proxyΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΒAdd permissive macOS sandbox with closed networkΒ Β Β Β Β Β Β Β ΒAdd permissive macOS sandbox with open networkΒ Β Β Β Β Β Β Β Β Β Β1 files
Add Android libuv compatibility patchΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β1 files
Backup original gitignore configurationΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β1 files
Add node2nix submodule configurationΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β3 files
Summary by CodeRabbit
New Features
Bug Fixes
Documentation
Chores