Compare commits
27 Commits
polecat/ch
...
a98ccddab1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a98ccddab1 | ||
| 18570628a5 | |||
|
|
0c484b6601 | ||
|
|
4853a18474 | ||
|
|
8b8453a37a | ||
|
|
2b6e289b9a | ||
|
|
70d364544f | ||
|
|
1ffa8524f0 | ||
|
|
be3c27e868 | ||
| c2d286087f | |||
|
|
1172818062 | ||
|
|
9f63e1430c | ||
| b14ef1f62a | |||
| 87719fa9e6 | |||
| 933612da4c | |||
|
|
d2c7599267 | ||
|
|
3d16824eac | ||
| 2cdc15163c | |||
| a77b1230fe | |||
| 623a387127 | |||
| 737f2b09e4 | |||
| cddc9de14a | |||
| 53e3bbe78f | |||
| c258eafe34 | |||
| 03d0b76f97 | |||
| b5f7233214 | |||
| 1203662237 |
@@ -6,7 +6,7 @@
|
|||||||
# Issue prefix for this repository (used by bd init)
|
# Issue prefix for this repository (used by bd init)
|
||||||
# If not set, bd init will auto-detect from directory name
|
# If not set, bd init will auto-detect from directory name
|
||||||
# Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc.
|
# Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc.
|
||||||
# issue-prefix: ""
|
issue-prefix: "x"
|
||||||
|
|
||||||
# Use no-db mode: load from JSONL, no SQLite, write back after each command
|
# Use no-db mode: load from JSONL, no SQLite, write back after each command
|
||||||
# When true, bd will use .beads/issues.jsonl as the source of truth
|
# When true, bd will use .beads/issues.jsonl as the source of truth
|
||||||
@@ -59,4 +59,6 @@ sync-branch: "beads-sync"
|
|||||||
# - linear.url
|
# - linear.url
|
||||||
# - linear.api-key
|
# - linear.api-key
|
||||||
# - github.org
|
# - github.org
|
||||||
# - github.repo
|
# - github.repo
|
||||||
|
|
||||||
|
routing.mode: "explicit"
|
||||||
@@ -12,7 +12,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
|
|
||||||
- uses: https://git.johnogle.info/johno/gitea-actions/nix-setup@main
|
- uses: https://git.johnogle.info/johno/gitea-actions/nix-setup@v1
|
||||||
|
|
||||||
- name: Check flake
|
- name: Check flake
|
||||||
run: nix flake check
|
run: nix flake check
|
||||||
|
|||||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,3 +1,8 @@
|
|||||||
result
|
result
|
||||||
thoughts
|
thoughts
|
||||||
.beads
|
.beads
|
||||||
|
|
||||||
|
# Gas Town (added by gt)
|
||||||
|
.runtime/
|
||||||
|
.claude/
|
||||||
|
.logs/
|
||||||
|
|||||||
36
flake.lock
generated
36
flake.lock
generated
@@ -8,17 +8,17 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1768509852,
|
"lastModified": 1769304777,
|
||||||
"narHash": "sha256-4oZXrqBjK9V8qKHoxlfil20qcJdOU8HXJA4627nX1nQ=",
|
"narHash": "sha256-xHeOLst9nSpPIycpz9x7gEXWC7uOF6xvIpymDEzJvog=",
|
||||||
"owner": "steveyegge",
|
"ref": "refs/heads/main",
|
||||||
"repo": "beads",
|
"rev": "bfffc47715f0b3dccde0d0855e64ec7474628d47",
|
||||||
"rev": "d3db8253ff09e0f139ffbb6f839afe13acbf7bdb",
|
"revCount": 5467,
|
||||||
"type": "github"
|
"type": "git",
|
||||||
|
"url": "ssh://git@git.johnogle.info:2222/johno/beads.git"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "steveyegge",
|
"type": "git",
|
||||||
"repo": "beads",
|
"url": "ssh://git@git.johnogle.info:2222/johno/beads.git"
|
||||||
"type": "github"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"doomemacs": {
|
"doomemacs": {
|
||||||
@@ -81,17 +81,17 @@
|
|||||||
"gastown": {
|
"gastown": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1768682809,
|
"lastModified": 1769306394,
|
||||||
"narHash": "sha256-PCP5PQasLqL5/OVNw6LsjiFfIU4RNniicTUcVq2ggHg=",
|
"narHash": "sha256-SaVgl40lCEEyy8d8Rb/84EdQRLDkR/0CgUfV4k1l1qE=",
|
||||||
"owner": "steveyegge",
|
"ref": "refs/heads/main",
|
||||||
"repo": "gastown",
|
"rev": "341c7d6757cb90e6e71fad2bf8c0fe2a5acb5a76",
|
||||||
"rev": "9cd2696abe68ac0defc612ace5028d327d4f207d",
|
"revCount": 3032,
|
||||||
"type": "github"
|
"type": "git",
|
||||||
|
"url": "ssh://git@git.johnogle.info:2222/johno/gastown.git"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "steveyegge",
|
"type": "git",
|
||||||
"repo": "gastown",
|
"url": "ssh://git@git.johnogle.info:2222/johno/gastown.git"
|
||||||
"type": "github"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"google-cookie-retrieval": {
|
"google-cookie-retrieval": {
|
||||||
|
|||||||
29
flake.nix
29
flake.nix
@@ -43,12 +43,12 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
beads = {
|
beads = {
|
||||||
url = "github:steveyegge/beads";
|
url = "git+ssh://git@git.johnogle.info:2222/johno/beads.git";
|
||||||
inputs.nixpkgs.follows = "nixpkgs-unstable";
|
inputs.nixpkgs.follows = "nixpkgs-unstable";
|
||||||
};
|
};
|
||||||
|
|
||||||
gastown = {
|
gastown = {
|
||||||
url = "github:steveyegge/gastown";
|
url = "git+ssh://git@git.johnogle.info:2222/johno/gastown.git";
|
||||||
flake = false; # No flake.nix upstream yet
|
flake = false; # No flake.nix upstream yet
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -89,11 +89,20 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
# Shared unstable overlays for custom package builds
|
||||||
|
customUnstableOverlays = [
|
||||||
|
# Override claude-code in unstable to use our custom GCS-based build
|
||||||
|
# (needed for corporate networks that block npm registry)
|
||||||
|
(ufinal: uprev: {
|
||||||
|
claude-code = uprev.callPackage ./packages/claude-code {};
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
nixosModules = [
|
nixosModules = [
|
||||||
./roles
|
./roles
|
||||||
inputs.home-manager.nixosModules.home-manager
|
inputs.home-manager.nixosModules.home-manager
|
||||||
{
|
{
|
||||||
nixpkgs.overlays = [ (mkBaseOverlay {}) ];
|
nixpkgs.overlays = [ (mkBaseOverlay { unstableOverlays = customUnstableOverlays; }) ];
|
||||||
}
|
}
|
||||||
(mkHomeManagerConfig {
|
(mkHomeManagerConfig {
|
||||||
sharedModules = [ inputs.plasma-manager.homeModules.plasma-manager ];
|
sharedModules = [ inputs.plasma-manager.homeModules.plasma-manager ];
|
||||||
@@ -106,7 +115,7 @@
|
|||||||
inputs.home-manager-unstable.nixosModules.home-manager
|
inputs.home-manager-unstable.nixosModules.home-manager
|
||||||
inputs.jovian.nixosModules.jovian
|
inputs.jovian.nixosModules.jovian
|
||||||
{
|
{
|
||||||
nixpkgs.overlays = [ (mkBaseOverlay {}) ];
|
nixpkgs.overlays = [ (mkBaseOverlay { unstableOverlays = customUnstableOverlays; }) ];
|
||||||
}
|
}
|
||||||
(mkHomeManagerConfig {
|
(mkHomeManagerConfig {
|
||||||
sharedModules = [ inputs.plasma-manager-unstable.homeModules.plasma-manager ];
|
sharedModules = [ inputs.plasma-manager-unstable.homeModules.plasma-manager ];
|
||||||
@@ -117,17 +126,7 @@
|
|||||||
./roles/darwin.nix
|
./roles/darwin.nix
|
||||||
inputs.home-manager.darwinModules.home-manager
|
inputs.home-manager.darwinModules.home-manager
|
||||||
{
|
{
|
||||||
nixpkgs.overlays = [
|
nixpkgs.overlays = [ (mkBaseOverlay { unstableOverlays = customUnstableOverlays; }) ];
|
||||||
(mkBaseOverlay {
|
|
||||||
# Override claude-code in unstable to use our custom GCS-based build
|
|
||||||
# (needed for corporate networks that block npm registry)
|
|
||||||
unstableOverlays = [
|
|
||||||
(ufinal: uprev: {
|
|
||||||
claude-code = uprev.callPackage ./packages/claude-code {};
|
|
||||||
})
|
|
||||||
];
|
|
||||||
})
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
(mkHomeManagerConfig { sharedModules = []; })
|
(mkHomeManagerConfig { sharedModules = []; })
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ in
|
|||||||
pkgs.unstable.claude-code
|
pkgs.unstable.claude-code
|
||||||
pkgs.unstable.claude-code-router
|
pkgs.unstable.claude-code-router
|
||||||
pkgs.unstable.codex
|
pkgs.unstable.codex
|
||||||
|
pkgs.sqlite
|
||||||
|
|
||||||
# Custom packages
|
# Custom packages
|
||||||
pkgs.custom.tea-rbw
|
pkgs.custom.tea-rbw
|
||||||
@@ -85,12 +86,14 @@ in
|
|||||||
if [ -f "$file" ]; then
|
if [ -f "$file" ]; then
|
||||||
filename=$(basename "$file" .md)
|
filename=$(basename "$file" .md)
|
||||||
dest="$HOME/.claude/commands/humanlayer:''${filename}.md"
|
dest="$HOME/.claude/commands/humanlayer:''${filename}.md"
|
||||||
|
rm -f "$dest" 2>/dev/null || true
|
||||||
|
|
||||||
# Copy file and conditionally remove the "model:" line from frontmatter
|
# Copy file and conditionally remove the "model:" line from frontmatter
|
||||||
${if cfg.allowArbitraryClaudeCodeModelSelection
|
${if cfg.allowArbitraryClaudeCodeModelSelection
|
||||||
then "cp \"$file\" \"$dest\""
|
then "cp \"$file\" \"$dest\""
|
||||||
else "${pkgs.gnused}/bin/sed '/^model:/d' \"$file\" > \"$dest\""
|
else "${pkgs.gnused}/bin/sed '/^model:/d' \"$file\" > \"$dest\""
|
||||||
}
|
}
|
||||||
|
chmod u+w "$dest" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
@@ -99,12 +102,14 @@ in
|
|||||||
if [ -f "$file" ]; then
|
if [ -f "$file" ]; then
|
||||||
filename=$(basename "$file" .md)
|
filename=$(basename "$file" .md)
|
||||||
dest="$HOME/.claude/agents/humanlayer:''${filename}.md"
|
dest="$HOME/.claude/agents/humanlayer:''${filename}.md"
|
||||||
|
rm -f "$dest" 2>/dev/null || true
|
||||||
|
|
||||||
# Copy file and conditionally remove the "model:" line from frontmatter
|
# Copy file and conditionally remove the "model:" line from frontmatter
|
||||||
${if cfg.allowArbitraryClaudeCodeModelSelection
|
${if cfg.allowArbitraryClaudeCodeModelSelection
|
||||||
then "cp \"$file\" \"$dest\""
|
then "cp \"$file\" \"$dest\""
|
||||||
else "${pkgs.gnused}/bin/sed '/^model:/d' \"$file\" > \"$dest\""
|
else "${pkgs.gnused}/bin/sed '/^model:/d' \"$file\" > \"$dest\""
|
||||||
}
|
}
|
||||||
|
chmod u+w "$dest" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
@@ -119,6 +124,7 @@ in
|
|||||||
sleep 0.5
|
sleep 0.5
|
||||||
cp "$file" "$dest" || echo "Warning: Failed to copy $filename.md to commands"
|
cp "$file" "$dest" || echo "Warning: Failed to copy $filename.md to commands"
|
||||||
fi
|
fi
|
||||||
|
chmod u+w "$dest" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
@@ -133,13 +139,17 @@ in
|
|||||||
sleep 0.5
|
sleep 0.5
|
||||||
cp "$file" "$dest" || echo "Warning: Failed to copy $filename.md to skills"
|
cp "$file" "$dest" || echo "Warning: Failed to copy $filename.md to skills"
|
||||||
fi
|
fi
|
||||||
|
chmod u+w "$dest" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# Copy micro-skills (compact reusable knowledge referenced by formulas)
|
# Copy micro-skills (compact reusable knowledge referenced by formulas)
|
||||||
for file in ${./skills/micro}/*.md; do
|
for file in ${./skills/micro}/*.md; do
|
||||||
if [ -f "$file" ]; then
|
if [ -f "$file" ]; then
|
||||||
cp "$file" "$HOME/.claude/commands/skills/$(basename "$file")"
|
dest="$HOME/.claude/commands/skills/$(basename "$file")"
|
||||||
|
rm -f "$dest" 2>/dev/null || true
|
||||||
|
cp "$file" "$dest"
|
||||||
|
chmod u+w "$dest" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
@@ -147,7 +157,10 @@ in
|
|||||||
mkdir -p ~/.beads/formulas
|
mkdir -p ~/.beads/formulas
|
||||||
for file in ${./formulas}/*.formula.toml; do
|
for file in ${./formulas}/*.formula.toml; do
|
||||||
if [ -f "$file" ]; then
|
if [ -f "$file" ]; then
|
||||||
cp "$file" "$HOME/.beads/formulas/$(basename "$file")"
|
dest="$HOME/.beads/formulas/$(basename "$file")"
|
||||||
|
rm -f "$dest" 2>/dev/null || true
|
||||||
|
cp "$file" "$dest"
|
||||||
|
chmod u+w "$dest" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|||||||
@@ -83,15 +83,108 @@
|
|||||||
"d" #'org-agenda-day-view
|
"d" #'org-agenda-day-view
|
||||||
"w" #'org-agenda-week-view))
|
"w" #'org-agenda-week-view))
|
||||||
|
|
||||||
;; (use-package! org-caldav
|
;; org-caldav: Sync Org entries with Nextcloud CalDAV
|
||||||
;; :defer t
|
;; Setup requirements:
|
||||||
;; :config
|
;; 1. Create Nextcloud app password: Settings -> Security -> Devices & sessions
|
||||||
;; (setq org-caldav-url "https://nextcloud.johnogle.info/remote.php/dav/calendars/johno"
|
;; 2. Store in rbw: rbw add nextcloud-caldav (put app password as the secret)
|
||||||
;; org-caldav-calendar-id "personal"
|
;; 3. Run: doom sync
|
||||||
;; org-icalendar-timezone "America/Los_Angeles"
|
;; 4. Test: M-x my/org-caldav-sync-with-rbw (or SPC o a s)
|
||||||
;; org-caldav-inbox "~/org/calendar.org"
|
;;
|
||||||
;; org-caldav-files nil
|
;; Note: Conflict resolution is "Org always wins" - treat Org as source of truth
|
||||||
;; org-caldav-sync-direction 'cal->org))
|
;; for entries that originated in Org.
|
||||||
|
|
||||||
|
;; Define sync wrapper before use-package (so keybinding works)
|
||||||
|
(defun my/org-caldav-sync-with-rbw ()
|
||||||
|
"Run org-caldav-sync with credentials from rbw embedded in URL."
|
||||||
|
(interactive)
|
||||||
|
(require 'org)
|
||||||
|
(require 'org-caldav)
|
||||||
|
(let* ((password (my/get-rbw-password "nextcloud-caldav"))
|
||||||
|
;; Embed credentials in URL (url-encode password in case of special chars)
|
||||||
|
(encoded-pass (url-hexify-string password)))
|
||||||
|
(setq org-caldav-url
|
||||||
|
(format "https://johno:%s@nextcloud.johnogle.info/remote.php/dav/calendars/johno"
|
||||||
|
encoded-pass))
|
||||||
|
(org-caldav-sync)))
|
||||||
|
|
||||||
|
(use-package! org-caldav
|
||||||
|
:after org
|
||||||
|
:commands (org-caldav-sync my/org-caldav-sync-with-rbw)
|
||||||
|
:init
|
||||||
|
(map! :leader
|
||||||
|
(:prefix ("o" . "open")
|
||||||
|
(:prefix ("a" . "agenda/calendar")
|
||||||
|
:desc "Sync CalDAV" "s" #'my/org-caldav-sync-with-rbw)))
|
||||||
|
:config
|
||||||
|
;; Nextcloud CalDAV base URL (credentials added dynamically by sync wrapper)
|
||||||
|
(setq org-caldav-url "https://nextcloud.johnogle.info/remote.php/dav/calendars/johno")
|
||||||
|
|
||||||
|
;; Timezone for iCalendar export
|
||||||
|
(setq org-icalendar-timezone "America/Los_Angeles")
|
||||||
|
|
||||||
|
;; Sync state storage (in org directory for multi-machine sync)
|
||||||
|
(setq org-caldav-save-directory (expand-file-name ".org-caldav/" org-directory))
|
||||||
|
|
||||||
|
;; Backup file for entries before modification
|
||||||
|
(setq org-caldav-backup-file (expand-file-name ".org-caldav/backup.org" org-directory))
|
||||||
|
|
||||||
|
;; Limit past events to 30 days (avoids downloading years of history)
|
||||||
|
(setq org-caldav-days-in-past 30)
|
||||||
|
|
||||||
|
;; Sync behavior: bidirectional by default
|
||||||
|
(setq org-caldav-sync-direction 'twoway)
|
||||||
|
|
||||||
|
;; What changes from calendar sync back to Org (conservative: title and timestamp only)
|
||||||
|
(setq org-caldav-sync-changes-to-org 'title-and-timestamp)
|
||||||
|
|
||||||
|
;; Deletion handling: ask before deleting
|
||||||
|
(setq org-caldav-delete-calendar-entries 'ask)
|
||||||
|
(setq org-caldav-delete-org-entries 'ask)
|
||||||
|
|
||||||
|
;; Enable TODO/VTODO sync
|
||||||
|
(setq org-icalendar-include-todo 'all)
|
||||||
|
(setq org-caldav-sync-todo t)
|
||||||
|
|
||||||
|
;; Calendar-specific configuration
|
||||||
|
(setq org-caldav-calendars
|
||||||
|
'(;; Personal calendar: two-way sync with family-shared Nextcloud calendar
|
||||||
|
(:calendar-id "personal"
|
||||||
|
:inbox "~/org/personal-calendar.org"
|
||||||
|
:files ("~/org/personal-calendar.org"))
|
||||||
|
|
||||||
|
;; Tasks calendar: one-way sync (org → calendar only)
|
||||||
|
;; SCHEDULED/DEADLINE items from todo.org push to private Tasks calendar.
|
||||||
|
;; No inbox = no download from calendar (effectively one-way).
|
||||||
|
;; Note: Create 'tasks' calendar in Nextcloud first, keep it private.
|
||||||
|
(:calendar-id "tasks"
|
||||||
|
:files ("~/org/todo.org"))))
|
||||||
|
|
||||||
|
;; Handle UNTIL in recurring events
|
||||||
|
;; org-caldav ignores UNTIL from RRULE - events repeat forever.
|
||||||
|
;; This advice extracts UNTIL and adds a DEADLINE without repeater,
|
||||||
|
;; which Org 9.7+ interprets as the recurrence end date.
|
||||||
|
(defun my/org-caldav-add-until-deadline (orig-fun eventdata-alist)
|
||||||
|
"Advice to add DEADLINE for UNTIL in recurring events."
|
||||||
|
(let ((result (funcall orig-fun eventdata-alist)))
|
||||||
|
(let* ((rrule-props (alist-get 'rrule-props eventdata-alist))
|
||||||
|
(until-str (cadr (assq 'UNTIL rrule-props))))
|
||||||
|
(when until-str
|
||||||
|
(save-excursion
|
||||||
|
(org-back-to-heading t)
|
||||||
|
;; Store original UNTIL for reference
|
||||||
|
(org-entry-put nil "CALDAV_UNTIL" until-str)
|
||||||
|
;; Parse UNTIL: format is YYYYMMDD or YYYYMMDDTHHMMSSZ
|
||||||
|
(when (string-match "^\\([0-9]\\{4\\}\\)\\([0-9]\\{2\\}\\)\\([0-9]\\{2\\}\\)" until-str)
|
||||||
|
(let* ((year (string-to-number (match-string 1 until-str)))
|
||||||
|
(month (string-to-number (match-string 2 until-str)))
|
||||||
|
(day (string-to-number (match-string 3 until-str)))
|
||||||
|
(deadline-ts (format "<%d-%02d-%02d>" year month day)))
|
||||||
|
(org-add-planning-info 'deadline deadline-ts))))))
|
||||||
|
result))
|
||||||
|
|
||||||
|
(advice-add 'org-caldav-insert-org-event-or-todo
|
||||||
|
:around #'my/org-caldav-add-until-deadline)
|
||||||
|
)
|
||||||
|
|
||||||
(defun my/get-rbw-password (alias)
|
(defun my/get-rbw-password (alias)
|
||||||
"Return the password for ALIAS via rbw, unlocking the vault only if needed."
|
"Return the password for ALIAS via rbw, unlocking the vault only if needed."
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
;; ...Or *all* packages (NOT RECOMMENDED; will likely break things)
|
;; ...Or *all* packages (NOT RECOMMENDED; will likely break things)
|
||||||
;; (unpin! t)
|
;; (unpin! t)
|
||||||
|
|
||||||
;; (package! org-caldav)
|
(package! org-caldav)
|
||||||
|
|
||||||
;; Note: Packages with custom recipes must be pinned for nix-doom-emacs-unstraightened
|
;; Note: Packages with custom recipes must be pinned for nix-doom-emacs-unstraightened
|
||||||
;; to build deterministically. Update pins when upgrading packages.
|
;; to build deterministically. Update pins when upgrading packages.
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
{ lib
|
{ lib
|
||||||
, stdenv
|
, stdenv
|
||||||
, fetchurl
|
, fetchurl
|
||||||
, autoPatchelfHook
|
, patchelf
|
||||||
|
, glibc
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
@@ -38,8 +39,14 @@ in stdenv.mkDerivation {
|
|||||||
|
|
||||||
dontUnpack = true;
|
dontUnpack = true;
|
||||||
dontBuild = true;
|
dontBuild = true;
|
||||||
|
# Bun standalone binaries have JS code appended after the ELF sections
|
||||||
|
# stripping/patching would remove or corrupt this appended data
|
||||||
|
dontStrip = true;
|
||||||
|
dontPatchELF = true;
|
||||||
|
|
||||||
nativeBuildInputs = lib.optionals stdenv.isLinux [ autoPatchelfHook ];
|
# Don't use autoPatchelfHook - it rewrites the ELF and strips the appended
|
||||||
|
# bun bundle (the JS code is appended after the ELF sections)
|
||||||
|
nativeBuildInputs = lib.optionals stdenv.isLinux [ patchelf ];
|
||||||
|
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
runHook preInstall
|
runHook preInstall
|
||||||
@@ -49,6 +56,14 @@ in stdenv.mkDerivation {
|
|||||||
runHook postInstall
|
runHook postInstall
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
# Manually patch the interpreter for bun standalone binaries
|
||||||
|
# patchelf --set-interpreter modifies in-place without rewriting the entire ELF,
|
||||||
|
# preserving the appended JS bundle that bun needs at runtime
|
||||||
|
postFixup = lib.optionalString stdenv.isLinux ''
|
||||||
|
interpreter="${glibc}/lib/${if stdenv.hostPlatform.system == "aarch64-linux" then "ld-linux-aarch64.so.1" else "ld-linux-x86-64.so.2"}"
|
||||||
|
patchelf --set-interpreter "$interpreter" $out/bin/claude
|
||||||
|
'';
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
description = "Terminal-based AI coding assistant from Anthropic";
|
description = "Terminal-based AI coding assistant from Anthropic";
|
||||||
homepage = "https://www.anthropic.com/claude-code";
|
homepage = "https://www.anthropic.com/claude-code";
|
||||||
|
|||||||
Reference in New Issue
Block a user