Compare commits
10 commits
c478c2ea66
...
307e8f2307
| Author | SHA1 | Date | |
|---|---|---|---|
| 307e8f2307 | |||
| c589a47353 | |||
| b2b263013a | |||
| 68273a7259 | |||
| b0cbb5a3b4 | |||
| f6a9a9e0ff | |||
| 64e3b4c557 | |||
| 89b70fe6f7 | |||
| edbf5dcbbc | |||
| 694c11bcd5 |
17 changed files with 97 additions and 40 deletions
|
|
@ -2,20 +2,26 @@
|
||||||
{
|
{
|
||||||
services.ddclient = {
|
services.ddclient = {
|
||||||
enable = true;
|
enable = true;
|
||||||
usev4 = "if, if=wan";
|
usev4 = "ifv4, ifv4=wan";
|
||||||
|
usev6 = "disabled";
|
||||||
protocol = "hetzner";
|
protocol = "hetzner";
|
||||||
# server = "https://dns.hetzner.com/api/v1/";
|
# server = "https://dns.hetzner.com/api/v1/";
|
||||||
username = "dominik.polakovics@cloonar.com";
|
username = "dominik.polakovics@cloonar.com";
|
||||||
passwordFile = config.sops.secrets.ddclient.path;
|
passwordFile = config.sops.secrets.ddclient.path;
|
||||||
zone = "cloonar.com";
|
zone = "cloonar.com";
|
||||||
domains = [
|
domains = [
|
||||||
"fw.cloonar.com"
|
"audiobooks.cloonar.com"
|
||||||
"vpn.cloonar.com"
|
|
||||||
"git.cloonar.com"
|
|
||||||
"palworld.cloonar.com"
|
|
||||||
"matrix.cloonar.com"
|
|
||||||
"element.cloonar.com"
|
"element.cloonar.com"
|
||||||
"tinder.cloonar.com"
|
"foundry-vtt.cloonar.com"
|
||||||
|
"foundry-ha.cloonar.com"
|
||||||
|
"fw.cloonar.com"
|
||||||
|
"git.cloonar.com"
|
||||||
|
"jellyfin.cloonar.com"
|
||||||
|
"matrix.cloonar.com"
|
||||||
|
"palworld.cloonar.com"
|
||||||
|
"support.cloonar.com"
|
||||||
|
"sync.cloonar.com"
|
||||||
|
"vpn.cloonar.com"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -137,6 +137,7 @@
|
||||||
# multimedia
|
# multimedia
|
||||||
"/dl.cloonar.com/${config.networkPrefix}.97.5"
|
"/dl.cloonar.com/${config.networkPrefix}.97.5"
|
||||||
"/jellyfin.cloonar.com/${config.networkPrefix}.97.5"
|
"/jellyfin.cloonar.com/${config.networkPrefix}.97.5"
|
||||||
|
"/audiobooks.cloonar.com/${config.networkPrefix}.97.5"
|
||||||
|
|
||||||
"/deconz.cloonar.multimedia/${config.networkPrefix}.97.22"
|
"/deconz.cloonar.multimedia/${config.networkPrefix}.97.22"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ let
|
||||||
devices = [
|
devices = [
|
||||||
"device_tracker.dominiks_iphone"
|
"device_tracker.dominiks_iphone"
|
||||||
"device_tracker.dominiks_mp01"
|
"device_tracker.dominiks_mp01"
|
||||||
|
"device_tracker.dominiks_fairphone_6"
|
||||||
];
|
];
|
||||||
in {
|
in {
|
||||||
services.home-assistant.extraComponents = [
|
services.home-assistant.extraComponents = [
|
||||||
|
|
|
||||||
|
|
@ -57,15 +57,6 @@
|
||||||
enableACME = true;
|
enableACME = true;
|
||||||
acmeRoot = null;
|
acmeRoot = null;
|
||||||
|
|
||||||
# Restrict to internal LAN only
|
|
||||||
extraConfig = ''
|
|
||||||
allow ${config.networkPrefix}.96.0/24;
|
|
||||||
allow ${config.networkPrefix}.97.0/24;
|
|
||||||
allow ${config.networkPrefix}.98.0/24;
|
|
||||||
allow ${config.networkPrefix}.99.0/24;
|
|
||||||
deny all;
|
|
||||||
'';
|
|
||||||
|
|
||||||
locations."/" = {
|
locations."/" = {
|
||||||
proxyPass = "http://${config.networkPrefix}.97.11:8096";
|
proxyPass = "http://${config.networkPrefix}.97.11:8096";
|
||||||
proxyWebsockets = true;
|
proxyWebsockets = true;
|
||||||
|
|
@ -82,4 +73,25 @@
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
services.nginx.virtualHosts."audiobooks.cloonar.com" = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
acmeRoot = null;
|
||||||
|
|
||||||
|
locations."/" = {
|
||||||
|
proxyPass = "http://${config.networkPrefix}.97.11:13378";
|
||||||
|
proxyWebsockets = true;
|
||||||
|
|
||||||
|
extraConfig = ''
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Forwarded-Host $http_host;
|
||||||
|
|
||||||
|
# Disable buffering for better streaming performance
|
||||||
|
proxy_buffering off;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,10 @@
|
||||||
publicKey = "yv0AWQl4LFebVa7SvwdxpEmB3PPglwjoKy6A3og93WI=";
|
publicKey = "yv0AWQl4LFebVa7SvwdxpEmB3PPglwjoKy6A3og93WI=";
|
||||||
allowedIPs = [ "${config.networkPrefix}.98.204/32" ];
|
allowedIPs = [ "${config.networkPrefix}.98.204/32" ];
|
||||||
}
|
}
|
||||||
|
{ # FairPhone
|
||||||
|
publicKey = "tLsvuXo6Cp8tzjJau1yJZ9apeQvYa+cGrnAXBBifO3Y=";
|
||||||
|
allowedIPs = [ "${config.networkPrefix}.98.205/32" ];
|
||||||
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
wg_epicenter = {
|
wg_epicenter = {
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ in {
|
||||||
./modules/cyberghost.nix
|
./modules/cyberghost.nix
|
||||||
./modules/pyload.nix
|
./modules/pyload.nix
|
||||||
./modules/jellyfin.nix
|
./modules/jellyfin.nix
|
||||||
|
./modules/audiobookshelf.nix
|
||||||
./modules/power-management.nix
|
./modules/power-management.nix
|
||||||
./modules/disk-monitoring.nix
|
./modules/disk-monitoring.nix
|
||||||
./modules/ugreen-leds.nix
|
./modules/ugreen-leds.nix
|
||||||
|
|
@ -64,6 +65,7 @@ in {
|
||||||
directories = [
|
directories = [
|
||||||
"/var/lib/pyload"
|
"/var/lib/pyload"
|
||||||
"/var/lib/jellyfin"
|
"/var/lib/jellyfin"
|
||||||
|
"/var/lib/audiobookshelf"
|
||||||
"/var/log"
|
"/var/log"
|
||||||
"/var/lib/nixos"
|
"/var/lib/nixos"
|
||||||
"/var/bento"
|
"/var/bento"
|
||||||
|
|
|
||||||
16
hosts/nas/modules/audiobookshelf.nix
Normal file
16
hosts/nas/modules/audiobookshelf.nix
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
{ config, lib, pkgs, ... }: {
|
||||||
|
# Audiobookshelf user with jellyfin and pyload groups for multimedia access
|
||||||
|
users.users.audiobookshelf = {
|
||||||
|
isSystemUser = true;
|
||||||
|
group = "audiobookshelf";
|
||||||
|
extraGroups = [ "jellyfin" "pyload" ];
|
||||||
|
};
|
||||||
|
users.groups.audiobookshelf = {};
|
||||||
|
|
||||||
|
services.audiobookshelf = {
|
||||||
|
enable = true;
|
||||||
|
openFirewall = true; # Opens default port 13378
|
||||||
|
host = "0.0.0.0"; # Listen on all interfaces
|
||||||
|
port = 13378;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -7,8 +7,6 @@
|
||||||
let
|
let
|
||||||
# Disk identifiers from hardware-configuration.nix
|
# Disk identifiers from hardware-configuration.nix
|
||||||
disks = [
|
disks = [
|
||||||
"/dev/disk/by-id/ata-ST18000NM000J-2TV103_ZR52TBSB"
|
|
||||||
"/dev/disk/by-id/ata-ST18000NM000J-2TV103_ZR52V9QX"
|
|
||||||
"/dev/disk/by-id/ata-TOSHIBA_MG10ACA20TE_8582A01SF4MJ"
|
"/dev/disk/by-id/ata-TOSHIBA_MG10ACA20TE_8582A01SF4MJ"
|
||||||
"/dev/disk/by-id/ata-TOSHIBA_MG10ACA20TE_75V2A0H3F4MJ"
|
"/dev/disk/by-id/ata-TOSHIBA_MG10ACA20TE_75V2A0H3F4MJ"
|
||||||
"/dev/disk/by-id/nvme-KIOXIA-EXCERIA_PLUS_G3_SSD_7FJKS1MAZ0E7"
|
"/dev/disk/by-id/nvme-KIOXIA-EXCERIA_PLUS_G3_SSD_7FJKS1MAZ0E7"
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,7 @@ in
|
||||||
home = "/var/lib/pyload";
|
home = "/var/lib/pyload";
|
||||||
createHome = true;
|
createHome = true;
|
||||||
extraGroups = [ "jellyfin" ];
|
extraGroups = [ "jellyfin" ];
|
||||||
|
shell = pkgs.bashInteractive; # Required for filebot-process script
|
||||||
};
|
};
|
||||||
users.groups.pyload = {};
|
users.groups.pyload = {};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ local config = {
|
||||||
{ vim.o.shell, "<M-1>", "Float Terminal 1", "float", nil },
|
{ vim.o.shell, "<M-1>", "Float Terminal 1", "float", nil },
|
||||||
{ vim.o.shell, "<M-2>", "Float Terminal 2", "float", nil },
|
{ vim.o.shell, "<M-2>", "Float Terminal 2", "float", nil },
|
||||||
{ "claude", "<M-3>", "Claude Terminal", "float", nil },
|
{ "claude", "<M-3>", "Claude Terminal", "float", nil },
|
||||||
{ vim.o.shell, "<M-4>", "Float Terminal 4", "float", nil },
|
{ "codex", "<M-4>", "Codex Terminal", "float", nil },
|
||||||
{ vim.o.shell, "<M-5>", "Float Terminal 5", "float", nil },
|
{ vim.o.shell, "<M-5>", "Float Terminal 5", "float", nil },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ let
|
||||||
"calendar.ui.version" = 3;
|
"calendar.ui.version" = 3;
|
||||||
"calendar.timezone.local" = "Europe/Vienna";
|
"calendar.timezone.local" = "Europe/Vienna";
|
||||||
"calendar.week.start" = 1;
|
"calendar.week.start" = 1;
|
||||||
"layout.css.devPixelsPerPx" = "1.25";
|
"layout.css.devPixelsPerPx" = "-1.0";
|
||||||
};
|
};
|
||||||
|
|
||||||
# Base calendar settings (without identity)
|
# Base calendar settings (without identity)
|
||||||
|
|
@ -89,7 +89,7 @@ let
|
||||||
"signon.rememberSignons" = false;
|
"signon.rememberSignons" = false;
|
||||||
"identity.sync.tokenserver.uri" = "https://sync.cloonar.com/1.0/sync/1.5";
|
"identity.sync.tokenserver.uri" = "https://sync.cloonar.com/1.0/sync/1.5";
|
||||||
# "toolkit.legacyUserProfileCustomizations.stylesheets" = true;
|
# "toolkit.legacyUserProfileCustomizations.stylesheets" = true;
|
||||||
"layout.css.devPixelsPerPx" = "1.25";
|
"layout.css.devPixelsPerPx" = "-1.0"; # auto-detect from Wayland compositor
|
||||||
"media.ffmpeg.vaapi.enabled" = true;
|
"media.ffmpeg.vaapi.enabled" = true;
|
||||||
"media.ffmpeg.vaapi-drm-display.enabled" = true;
|
"media.ffmpeg.vaapi-drm-display.enabled" = true;
|
||||||
"gfx.webrender.all" = true;
|
"gfx.webrender.all" = true;
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,21 @@ let
|
||||||
system = pkgs.system;
|
system = pkgs.system;
|
||||||
};
|
};
|
||||||
in {
|
in {
|
||||||
|
# Redis for Authelia session persistence
|
||||||
|
services.redis.servers.authelia = {
|
||||||
|
enable = true;
|
||||||
|
user = "authelia-main";
|
||||||
|
unixSocket = "/run/redis-authelia/redis.sock";
|
||||||
|
unixSocketPerm = 660;
|
||||||
|
settings = {
|
||||||
|
appendonly = "yes"; # Enable AOF persistence
|
||||||
|
appendfsync = "everysec"; # Sync every second
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Add authelia user to redis group for socket access
|
||||||
|
users.users.authelia-main.extraGroups = [ "redis-authelia" ];
|
||||||
|
|
||||||
sops.secrets.authelia-jwt-secret = {
|
sops.secrets.authelia-jwt-secret = {
|
||||||
owner = "authelia-main";
|
owner = "authelia-main";
|
||||||
};
|
};
|
||||||
|
|
@ -106,6 +121,9 @@ in {
|
||||||
inactivity = "45m";
|
inactivity = "45m";
|
||||||
remember_me_duration = "1M";
|
remember_me_duration = "1M";
|
||||||
domain = "cloonar.com";
|
domain = "cloonar.com";
|
||||||
|
redis = {
|
||||||
|
host = "/run/redis-authelia/redis.sock";
|
||||||
|
};
|
||||||
# todo: enable with 4.38
|
# todo: enable with 4.38
|
||||||
# cookies = [
|
# cookies = [
|
||||||
# {
|
# {
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
datasourceUid = "vm-datasource-uid";
|
datasourceUid = "vm-datasource-uid";
|
||||||
relativeTimeRange = { from = 300; to = 0; };
|
relativeTimeRange = { from = 300; to = 0; };
|
||||||
model = {
|
model = {
|
||||||
expr = ''mdadm_array_state == 0'';
|
expr = ''mdadm_array_state < 1'';
|
||||||
instant = false;
|
instant = false;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -35,7 +35,7 @@
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
for = "0s";
|
for = "0s";
|
||||||
noDataState = "NoData";
|
noDataState = "OK";
|
||||||
execErrState = "Error";
|
execErrState = "Error";
|
||||||
annotations = {
|
annotations = {
|
||||||
summary = "RAID array {{ $labels.array }} is degraded";
|
summary = "RAID array {{ $labels.array }} is degraded";
|
||||||
|
|
@ -84,7 +84,7 @@
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
for = "0s";
|
for = "0s";
|
||||||
noDataState = "NoData";
|
noDataState = "OK";
|
||||||
execErrState = "Error";
|
execErrState = "Error";
|
||||||
annotations = {
|
annotations = {
|
||||||
summary = "RAID array {{ $labels.array }} has missing devices";
|
summary = "RAID array {{ $labels.array }} has missing devices";
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
datasourceUid = "vm-datasource-uid";
|
datasourceUid = "vm-datasource-uid";
|
||||||
relativeTimeRange = { from = 300; to = 0; };
|
relativeTimeRange = { from = 300; to = 0; };
|
||||||
model = {
|
model = {
|
||||||
expr = ''smart_health_passed == 0'';
|
expr = ''smart_health_passed < 1'';
|
||||||
instant = false;
|
instant = false;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -35,7 +35,7 @@
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
for = "0s";
|
for = "0s";
|
||||||
noDataState = "NoData";
|
noDataState = "OK";
|
||||||
execErrState = "Error";
|
execErrState = "Error";
|
||||||
annotations = {
|
annotations = {
|
||||||
summary = "S.M.A.R.T. health check FAILED on {{ $labels.device }}";
|
summary = "S.M.A.R.T. health check FAILED on {{ $labels.device }}";
|
||||||
|
|
@ -84,7 +84,7 @@
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
for = "0s";
|
for = "0s";
|
||||||
noDataState = "NoData";
|
noDataState = "OK";
|
||||||
execErrState = "Error";
|
execErrState = "Error";
|
||||||
annotations = {
|
annotations = {
|
||||||
summary = "Reallocated sectors detected on {{ $labels.device }}";
|
summary = "Reallocated sectors detected on {{ $labels.device }}";
|
||||||
|
|
@ -133,7 +133,7 @@
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
for = "0s";
|
for = "0s";
|
||||||
noDataState = "NoData";
|
noDataState = "OK";
|
||||||
execErrState = "Error";
|
execErrState = "Error";
|
||||||
annotations = {
|
annotations = {
|
||||||
summary = "Pending sectors detected on {{ $labels.device }}";
|
summary = "Pending sectors detected on {{ $labels.device }}";
|
||||||
|
|
@ -182,7 +182,7 @@
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
for = "0s";
|
for = "0s";
|
||||||
noDataState = "NoData";
|
noDataState = "OK";
|
||||||
execErrState = "Error";
|
execErrState = "Error";
|
||||||
annotations = {
|
annotations = {
|
||||||
summary = "Offline uncorrectable errors on {{ $labels.device }}";
|
summary = "Offline uncorrectable errors on {{ $labels.device }}";
|
||||||
|
|
@ -231,7 +231,7 @@
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
for = "10m";
|
for = "10m";
|
||||||
noDataState = "NoData";
|
noDataState = "OK";
|
||||||
execErrState = "Error";
|
execErrState = "Error";
|
||||||
annotations = {
|
annotations = {
|
||||||
summary = "High temperature on {{ $labels.device }}";
|
summary = "High temperature on {{ $labels.device }}";
|
||||||
|
|
@ -280,7 +280,7 @@
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
for = "0s";
|
for = "0s";
|
||||||
noDataState = "NoData";
|
noDataState = "OK";
|
||||||
execErrState = "Error";
|
execErrState = "Error";
|
||||||
annotations = {
|
annotations = {
|
||||||
summary = "UDMA CRC errors on {{ $labels.device }}";
|
summary = "UDMA CRC errors on {{ $labels.device }}";
|
||||||
|
|
|
||||||
|
|
@ -115,7 +115,6 @@ in
|
||||||
settings = {
|
settings = {
|
||||||
apiToken = "\${PUSHOVER_API_TOKEN}";
|
apiToken = "\${PUSHOVER_API_TOKEN}";
|
||||||
userKey = "\${PUSHOVER_USER_KEY}";
|
userKey = "\${PUSHOVER_USER_KEY}";
|
||||||
device = "iphone";
|
|
||||||
priority = 2;
|
priority = 2;
|
||||||
retry = "30s";
|
retry = "30s";
|
||||||
expire = "2m";
|
expire = "2m";
|
||||||
|
|
@ -134,7 +133,6 @@ in
|
||||||
settings = {
|
settings = {
|
||||||
apiToken = "\${PUSHOVER_API_TOKEN}";
|
apiToken = "\${PUSHOVER_API_TOKEN}";
|
||||||
userKey = "\${PUSHOVER_USER_KEY}";
|
userKey = "\${PUSHOVER_USER_KEY}";
|
||||||
device = "iphone";
|
|
||||||
priority = 1;
|
priority = 1;
|
||||||
sound = "siren";
|
sound = "siren";
|
||||||
okSound = "magic";
|
okSound = "magic";
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
{ lib, pkgs, runCommand, claude-code }:
|
{ lib, pkgs, runCommand, claude-code }:
|
||||||
|
|
||||||
let
|
let
|
||||||
version = "2.0.76";
|
version = "2.1.12";
|
||||||
|
|
||||||
src = pkgs.fetchzip {
|
src = pkgs.fetchzip {
|
||||||
url = "https://registry.npmjs.org/@anthropic-ai/claude-code/-/claude-code-${version}.tgz";
|
url = "https://registry.npmjs.org/@anthropic-ai/claude-code/-/claude-code-${version}.tgz";
|
||||||
hash = "sha256-46IqiGJZrZM4vVcanZj/vY4uxFH3/4LxNA+Qb6iIHDk=";
|
hash = "sha256-JX72YEM2fXY7qKVkuk+UFeef0OhBffljpFBjIECHMXw=";
|
||||||
};
|
};
|
||||||
|
|
||||||
# Create a modified source with our package-lock.json
|
# Create a modified source with our package-lock.json
|
||||||
|
|
@ -22,7 +22,7 @@ in
|
||||||
|
|
||||||
npmDeps = pkgs.fetchNpmDeps {
|
npmDeps = pkgs.fetchNpmDeps {
|
||||||
src = srcWithLock;
|
src = srcWithLock;
|
||||||
hash = "sha256-xSNyYImDpsW6AltA7d0ayMsfVaBcnyPIQOg/Ea2cGNk=";
|
hash = "sha256-iJwtwAYb/+1Une6Tjxek5ccf4ui3tYWy4kNlHES9He4=";
|
||||||
};
|
};
|
||||||
|
|
||||||
# Remove the old postPatch since srcWithLock already includes package-lock.json
|
# Remove the old postPatch since srcWithLock already includes package-lock.json
|
||||||
|
|
|
||||||
8
utils/pkgs/claude-code/package-lock.json
generated
8
utils/pkgs/claude-code/package-lock.json
generated
|
|
@ -5,13 +5,13 @@
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@anthropic-ai/claude-code": "^2.0.76"
|
"@anthropic-ai/claude-code": "^2.1.12"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@anthropic-ai/claude-code": {
|
"node_modules/@anthropic-ai/claude-code": {
|
||||||
"version": "2.0.76",
|
"version": "2.1.12",
|
||||||
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-code/-/claude-code-2.0.76.tgz",
|
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-code/-/claude-code-2.1.12.tgz",
|
||||||
"integrity": "sha512-BVwPez7Pst729gxHZNb7iUdjrn4UAzO49zC+Bxlyf0fMe3SsutxEhKTT16VMs2qInE9xhEBCxajCCa888mFPBg==",
|
"integrity": "sha512-oJlbUJc6iyuTA6X1z+Wsli4cYWqSHT9Ttc/jBXArrrBQcILPLb5lBOKfbVJJgcH3bNLxsXwnAkZjtmmM5SqtsQ==",
|
||||||
"license": "SEE LICENSE IN README.md",
|
"license": "SEE LICENSE IN README.md",
|
||||||
"bin": {
|
"bin": {
|
||||||
"claude": "cli.js"
|
"claude": "cli.js"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue