Compare commits
348 Commits
6a2c1e2330
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 3bcd4c3c13 | |||
| d975d49844 | |||
| 1ead7fe7be | |||
| 7dd2fc7e59 | |||
| 95ffe7b908 | |||
| ce02cc5538 | |||
| 0dbc007a90 | |||
| 57e0d49278 | |||
| ee44b26147 | |||
| 675306ec91 | |||
| a829f160fb | |||
| 4cfe0387e2 | |||
| 2efccdb4de | |||
| 8aafaf7d35 | |||
| dce57f907a | |||
| 1bda05280e | |||
| d39071da06 | |||
| 781f379aff | |||
| 2203b48cde | |||
| 35f6f7890f | |||
| 83958847f4 | |||
| b66b0c4003 | |||
| efd2771d8c | |||
| 94331531e2 | |||
| 5b1e7efcd2 | |||
| 730dd23967 | |||
| 8f5caaed41 | |||
| db2bbb86ba | |||
| 72c3710a3c | |||
| b62f3c20ac | |||
| dd31da5a8f | |||
| bc6d8b6305 | |||
| fce3aa45ec | |||
| 949917a809 | |||
| 0dd1ecef91 | |||
| fcdb52cc42 | |||
| b6500b97ff | |||
| 8f756554ad | |||
| 583b9ea5f3 | |||
| 6a30a431f8 | |||
| 38818e7508 | |||
| 94c64e9d33 | |||
| a9854ac144 | |||
| 8b109af08b | |||
| 82dde7d749 | |||
| 59ce48d65e | |||
| 9b9c580a7f | |||
| 0e27b181ad | |||
| 6b43660491 | |||
| db5e8855d2 | |||
| 2f1f60b836 | |||
| a13a19e8e9 | |||
| fee4b43104 | |||
| faf3afad79 | |||
| db116cc4de | |||
| 75ee011369 | |||
| ae63c4737a | |||
| d6bc3c0293 | |||
| fd3a38da62 | |||
| e30ca9d8dd | |||
| 79eb5c27e9 | |||
| 677728c440 | |||
| 483b05fc27 | |||
| cb4709b1a6 | |||
| dc650e4722 | |||
| f5dd89582d | |||
| 585259480e | |||
| 2248d7d781 | |||
| 0b79904103 | |||
| 2929a10d62 | |||
| 4cac77f4c7 | |||
| 1586549896 | |||
| 5ae3aa4e6c | |||
| 4aee96241c | |||
| 3478fac832 | |||
| e364dbe76d | |||
| 55a69316a5 | |||
| 41011923ac | |||
| 916e732ce6 | |||
| 3f9c9cd154 | |||
| 8c2c1a2aab | |||
| e7c6df1c9b | |||
| 34ebb265e6 | |||
| b65735929c | |||
| 804305abf9 | |||
| af8555cbe1 | |||
| 210d8f3b1f | |||
| b417e67e16 | |||
| 32e928c56b | |||
| 12481d7468 | |||
| 7c92cc5c6a | |||
| 0a568cba6f | |||
| 43dff3e8e5 | |||
| 4c9db2b822 | |||
| 6389bf4e25 | |||
| 9285e69086 | |||
| 1ecb690f0d | |||
| 83cb9cdec1 | |||
| 754deff57f | |||
| d3093b13eb | |||
| a2386de8ce | |||
| 13cf1c296b | |||
| 890146bc9d | |||
| ed39959b61 | |||
| 828b5d7374 | |||
| b9bdd36a05 | |||
| a49be3040f | |||
| 19617326f0 | |||
| 14f79f54ec | |||
| 5b19722ab1 | |||
| 4fae852ab1 | |||
| 959bccc375 | |||
| 030010a66f | |||
| 16d14bcb1e | |||
| d47e0fd6da | |||
| 78b31a187f | |||
| 56efbd8ab5 | |||
| bfe1f82943 | |||
| 7033407c23 | |||
| dd7091b10a | |||
| 388feede95 | |||
| 99a20c9ac7 | |||
| 2883d6f4f3 | |||
| 725d2fa9c4 | |||
| 4939523735 | |||
| bae21e1538 | |||
| 1bf71bf066 | |||
| d06e8d975e | |||
| 9cbd0cc316 | |||
| 0089087f52 | |||
| ed193de628 | |||
| 565e4573ca | |||
| 3be3997cf6 | |||
| 47302d98ed | |||
| 52cf601f39 | |||
| 0a2145f063 | |||
| e48a8de02e | |||
| ce1ce79f83 | |||
| df33251ada | |||
| f9ea95f346 | |||
| 27b6af253f | |||
| 8ddf5bf850 | |||
| 12710cd3d5 | |||
| 4363b8c88f | |||
| e031da34b8 | |||
| 72876ca9f7 | |||
| 58d4bc6f13 | |||
| ff724c51bc | |||
| 53b56a096f | |||
| 1160b48da7 | |||
| 1a3ae09be3 | |||
| 7d4129b02b | |||
| 750237e4c4 | |||
| 414476baf2 | |||
| b04a1ee845 | |||
| 0b853ebf4b | |||
| 22a5026f38 | |||
| 4457e2bd6d | |||
| 93a9f7fb52 | |||
| 301355a082 | |||
| 1af04c10df | |||
| d205b4b129 | |||
| 3be1b5c384 | |||
| 7493af6218 | |||
| b5776e547c | |||
| ff4e9ee337 | |||
| c4ea029874 | |||
| a7972e7211 | |||
| a93f576142 | |||
| 529d243565 | |||
| 239456efbc | |||
| d6b2ce04ef | |||
| f04730d4ff | |||
| e87f85710d | |||
| 4840108bb0 | |||
| 254b6fa48f | |||
| b3247589e0 | |||
| 2c36290054 | |||
| 55f2be9dbe | |||
| 7b435f09b3 | |||
| 5ce228aee7 | |||
| f644fcbd5f | |||
| 2207666a34 | |||
| f3858f4418 | |||
| 554accb4aa | |||
| 7155c9d126 | |||
| e16b55d155 | |||
| 8bd73165d4 | |||
| fa369973b7 | |||
| ff667438a0 | |||
| ad2675829a | |||
| 2ca4e72ad7 | |||
| 8977ed2212 | |||
| 648c5b1dde | |||
| cba482d26d | |||
| 58df524ac5 | |||
| 76f4f2278e | |||
| 09909cbe42 | |||
| dd7bc3193d | |||
| 381f29cbea | |||
| 8bfc6cd698 | |||
| 6012da3ceb | |||
| 35d495e872 | |||
| f4be58c648 | |||
| 17ecac6524 | |||
| 2b9dc9b7da | |||
| da814d8d56 | |||
| ecf481893c | |||
| 9091d55af2 | |||
| 23d3c5c83a | |||
| 60cf0651dc | |||
| 8054b6f1e0 | |||
| 7f8d95c7c4 | |||
| 58642c9e15 | |||
| d58c4fee0d | |||
| 159bc5c6a5 | |||
| 6409b5425d | |||
| c877e48e0a | |||
| d04a6ed67e | |||
| 5b43fde4ce | |||
| 889440aef8 | |||
| e40d5b02f7 | |||
| ab87e785b6 | |||
| 9cfe4d3c43 | |||
| d14a33378f | |||
| 6ef5f761d5 | |||
| d7f895d084 | |||
| 583c72f6bd | |||
| 79a39ee163 | |||
| 201db9d842 | |||
| fc3a7dc402 | |||
| 1b51954bbd | |||
| cec4c12dc2 | |||
| c8f612e7a3 | |||
| 57121926d2 | |||
| e16bffcb07 | |||
| 612c024965 | |||
| 46181a340a | |||
| 459c408bd6 | |||
| c068a44761 | |||
| aef49d9f4d | |||
| a9f98f6927 | |||
| 4f7c4ccc0b | |||
| a84fbe2f59 | |||
| 145351a30d | |||
| 50c8e8be50 | |||
| 1eecdb8103 | |||
| bf40f85b39 | |||
| 6b1b09f9a6 | |||
| c25d42759c | |||
| 30fb73fec0 | |||
| c0885dc6ca | |||
| 934cbff81d | |||
| 8e8250ed56 | |||
| 03eac376d2 | |||
| 7181356f5e | |||
| 7fcd6eac8e | |||
| f7b4aa257f | |||
| 254b3d255f | |||
| 5ffb87f458 | |||
| 5368461675 | |||
| abe101d58e | |||
| 1137705b20 | |||
| bda86e86ea | |||
| 628681bc58 | |||
| 33033aa6e7 | |||
| 7334018e6f | |||
| f74803cd88 | |||
| d0ee271e7b | |||
| 66f36cf71c | |||
| fbdcf51e6c | |||
| c71e232fe7 | |||
| aed1aa2ad9 | |||
| 6a0538c8b8 | |||
| 1fcbc2fd83 | |||
| 6a0fa7a02d | |||
| 07223be230 | |||
| de944a017c | |||
| 26e9a0e0c9 | |||
| c2f9a321a2 | |||
| bad0979caf | |||
| 85628b1924 | |||
| aae87a78ad | |||
| 81905c0287 | |||
| c26ce95e57 | |||
| b7601bf665 | |||
| a2d90bbc00 | |||
| 2fef58e066 | |||
| bf4d5229a9 | |||
| b13bba26d5 | |||
| e01f37321e | |||
| 91b8358331 | |||
| ffe0d2a3ec | |||
| 613cd70f49 | |||
| e7f675cea4 | |||
| 3c56092131 | |||
| bcd78baf09 | |||
| 2d3b8070d7 | |||
| bbe528ebce | |||
| 06fe355250 | |||
| 767cc4c512 | |||
| 7dab619256 | |||
| 926a2def67 | |||
| aa70174040 | |||
| 6600b2325d | |||
| 447ccd705e | |||
| 6b56dfa595 | |||
| 5fda65e0a5 | |||
| de818cf4e8 | |||
| b786abbed6 | |||
| 0de28843a3 | |||
| a06a87802b | |||
| 54338e7498 | |||
| b15ec5d6ae | |||
| 58787c5917 | |||
| ec7975936f | |||
| 3b87ac54a6 | |||
| 76b01e120c | |||
| 675692e3f3 | |||
| 6fa4b9d72e | |||
| 542ebb3ee3 | |||
| 4eee3de44a | |||
| 32a65d912a | |||
| d755464eb0 | |||
| da462b6717 | |||
| 5c40f08146 | |||
| 401b25b9a0 | |||
| 3ed5ff019d | |||
| 62e62b8e20 | |||
|
|
9e9c2b5349 | ||
|
|
28e24c284e | ||
| 709f754697 | |||
| 17627f5074 | |||
| 2e2e52aa78 | |||
| 591bd25a3d | |||
| 03793989a5 | |||
| e69024f921 | |||
| f664d4b46a | |||
| 84d9ac50a6 | |||
| 7ccbbb418b | |||
| 3c294d2194 | |||
| 82a4f44a19 | |||
| 6677b1e14b | |||
| 8315866dd7 | |||
| b4cac89e95 | |||
| 54bdee7e8f | |||
| 11381a1ff9 | |||
| e97dcbfcc5 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -9,4 +9,5 @@ result-*
|
|||||||
|
|
||||||
nixos-efi-vars.fd
|
nixos-efi-vars.fd
|
||||||
|
|
||||||
/.pre-commit-config.yaml
|
.direnv/
|
||||||
|
.pre-commit-config.yaml
|
||||||
|
|||||||
7
.mcp.json
Normal file
7
.mcp.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"nixos": {
|
||||||
|
"command": "mcp-nixos"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,29 +4,31 @@
|
|||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
mkNode = hostname: tags: {
|
inherit (inputs.nixpkgs) lib;
|
||||||
|
utils = import ../utils { inherit lib; };
|
||||||
|
hostDirNames = utils.dirNames ../hosts;
|
||||||
|
|
||||||
|
mkNode = hostname: meta: {
|
||||||
imports = [ ../hosts/${hostname} ];
|
imports = [ ../hosts/${hostname} ];
|
||||||
deployment = {
|
deployment = {
|
||||||
targetHost = self.nixosConfigurations.${hostname}.config.ssh.publicHostname;
|
inherit (meta.deployment) targetHost targetUser tags;
|
||||||
targetUser = self.nixosConfigurations.${hostname}.config.ssh.username;
|
buildOnTarget = builtins.any (t: t != "local" && t != "arm") meta.deployment.tags;
|
||||||
buildOnTarget = builtins.any (t: t != "local") tags;
|
|
||||||
inherit tags;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
nodes = lib.genAttrs hostDirNames (hostname: mkNode hostname (utils.hostMeta ../hosts/${hostname}));
|
||||||
in
|
in
|
||||||
inputs.colmena.lib.makeHive {
|
inputs.colmena.lib.makeHive (
|
||||||
|
{
|
||||||
meta = {
|
meta = {
|
||||||
nixpkgs = import inputs.nixpkgs {
|
nixpkgs = import inputs.nixpkgs { localSystem = "x86_64-linux"; };
|
||||||
localSystem = "x86_64-linux";
|
specialArgs = {
|
||||||
|
inherit inputs;
|
||||||
|
outputs = self;
|
||||||
|
dotsPath = ../dots;
|
||||||
|
myUtils = utils;
|
||||||
};
|
};
|
||||||
|
|
||||||
nodeNixpkgs = builtins.mapAttrs (_: v: v.pkgs) self.nixosConfigurations;
|
|
||||||
nodeSpecialArgs = builtins.mapAttrs (_: v: v._module.specialArgs or { }) self.nixosConfigurations;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
astyanax = mkNode "astyanax" [ "local" ];
|
|
||||||
andromache = mkNode "andromache" [ "local" ];
|
|
||||||
vm = mkNode "vm" [ "local" ];
|
|
||||||
hecuba = mkNode "hecuba" [ "cloud" ];
|
|
||||||
eetion = mkNode "eetion" [ "arm" ];
|
|
||||||
}
|
}
|
||||||
|
// nodes
|
||||||
|
)
|
||||||
|
|||||||
@@ -27,8 +27,6 @@ alias ipa="ip -brief address"
|
|||||||
alias ipl="ip -brief link"
|
alias ipl="ip -brief link"
|
||||||
alias ipr="ip route"
|
alias ipr="ip route"
|
||||||
|
|
||||||
alias clip="xclip -sel clip"
|
|
||||||
|
|
||||||
alias df="df -kTh"
|
alias df="df -kTh"
|
||||||
alias fzfpac="pacman -Slq | fzf -m --preview 'pacman -Si {1}' | xargs -ro sudo pacman -S"
|
alias fzfpac="pacman -Slq | fzf -m --preview 'pacman -Si {1}' | xargs -ro sudo pacman -S"
|
||||||
alias path='echo -e ${PATH//:/\\n}' # Pretty print path variables
|
alias path='echo -e ${PATH//:/\\n}' # Pretty print path variables
|
||||||
|
|||||||
@@ -4,3 +4,4 @@
|
|||||||
# Set NeoVim as default editor
|
# Set NeoVim as default editor
|
||||||
export EDITOR=nvim
|
export EDITOR=nvim
|
||||||
export SUDO_EDITOR="$EDITOR"
|
export SUDO_EDITOR="$EDITOR"
|
||||||
|
export SYSTEMD_EDITOR="$EDITOR"
|
||||||
|
|||||||
221
dots/.bin/git-cb
221
dots/.bin/git-cb
@@ -1,221 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
readonly ALLOWED_MAIN_BRANCHES=("main" "master" "develop")
|
|
||||||
readonly BRANCH_TYPES=(
|
|
||||||
"feat For new features"
|
|
||||||
"hotfix For urgent fixes"
|
|
||||||
"fix For fixes"
|
|
||||||
"release For preparing releases"
|
|
||||||
"chore For non-code tasks"
|
|
||||||
)
|
|
||||||
|
|
||||||
error() {
|
|
||||||
echo "Error: $1" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
warn() {
|
|
||||||
echo "Warning: $1" >&2
|
|
||||||
}
|
|
||||||
|
|
||||||
check_dependencies() {
|
|
||||||
local missing=()
|
|
||||||
for cmd in git fzf; do
|
|
||||||
if ! command -v "$cmd" &> /dev/null; then
|
|
||||||
missing+=("$cmd")
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ ${#missing[@]} -gt 0 ]]; then
|
|
||||||
error "Missing required commands: ${missing[*]}"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
check_git_repo() {
|
|
||||||
if ! git rev-parse --git-dir &> /dev/null; then
|
|
||||||
error "Not in a git repository"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
check_current_branch() {
|
|
||||||
local current_branch
|
|
||||||
current_branch=$(git branch --show-current)
|
|
||||||
|
|
||||||
local is_main_branch=false
|
|
||||||
for branch in "${ALLOWED_MAIN_BRANCHES[@]}"; do
|
|
||||||
if [[ "$current_branch" == "$branch" ]]; then
|
|
||||||
is_main_branch=true
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ "$is_main_branch" == false ]]; then
|
|
||||||
warn "Not branching from a main branch (current: $current_branch)"
|
|
||||||
read -rp "Continue anyway? [y/N] " response
|
|
||||||
if [[ ! "$response" =~ ^[Yy]$ ]]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_user_email() {
|
|
||||||
local email
|
|
||||||
email=$(git config --get user.email 2>/dev/null)
|
|
||||||
|
|
||||||
if [[ -z "$email" ]]; then
|
|
||||||
error "Git user email not configured. Run: git config user.email 'your@email.com'"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "$email"
|
|
||||||
}
|
|
||||||
|
|
||||||
select_branch_type() {
|
|
||||||
local selected
|
|
||||||
selected=$(printf '%s\n' "${BRANCH_TYPES[@]}" | \
|
|
||||||
fzf --prompt="Select branch type: " \
|
|
||||||
--height=40% \
|
|
||||||
--border \
|
|
||||||
--info=inline) || error "Branch type selection cancelled"
|
|
||||||
|
|
||||||
echo "${selected%% *}"
|
|
||||||
}
|
|
||||||
|
|
||||||
select_jira_ticket() {
|
|
||||||
local email=$1
|
|
||||||
|
|
||||||
if ! command -v jira &> /dev/null; then
|
|
||||||
warn "Jira CLI not found. Proceeding without ticket ID."
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Fetching Jira tickets for $email..." >&2
|
|
||||||
local jira_data
|
|
||||||
jira_data=$(jira issue list --assignee="$email" --order-by=priority --plain --no-headers 2>/dev/null) || {
|
|
||||||
warn "Could not fetch Jira tickets. Proceeding without ticket ID."
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if [[ -z "$jira_data" ]]; then
|
|
||||||
warn "No Jira tickets found. Proceeding without ticket ID."
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "$jira_data" >&2
|
|
||||||
echo "" >&2
|
|
||||||
|
|
||||||
local formatted_tickets
|
|
||||||
formatted_tickets=$(echo "$jira_data" | awk '{
|
|
||||||
ticket_id = $2
|
|
||||||
$1 = $2 = ""
|
|
||||||
description = $0
|
|
||||||
gsub(/^[ \t]+/, "", description)
|
|
||||||
if (length(description) > 60) {
|
|
||||||
description = substr(description, 1, 57) "..."
|
|
||||||
}
|
|
||||||
print ticket_id " - " description
|
|
||||||
}')
|
|
||||||
|
|
||||||
if [[ -z "$formatted_tickets" ]]; then
|
|
||||||
warn "No tickets to display. Proceeding without ticket ID."
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
local selected_ticket
|
|
||||||
selected_ticket=$(echo -e "SKIP - Create branch without ticket ID\n$formatted_tickets" | \
|
|
||||||
fzf --prompt="Select Jira ticket (or skip): " \
|
|
||||||
--height=40% \
|
|
||||||
--border \
|
|
||||||
--info=inline) || error "Ticket selection cancelled"
|
|
||||||
|
|
||||||
if [[ "$selected_ticket" != "SKIP"* ]]; then
|
|
||||||
echo "${selected_ticket%% -*}"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_branch_description() {
|
|
||||||
local ticket_id=$1
|
|
||||||
local editor="${EDITOR:-vi}"
|
|
||||||
local tmpfile
|
|
||||||
tmpfile=$(mktemp)
|
|
||||||
|
|
||||||
trap "rm -f '$tmpfile'" EXIT
|
|
||||||
|
|
||||||
if [[ -n "$ticket_id" ]]; then
|
|
||||||
cat > "$tmpfile" << EOF
|
|
||||||
# Selected ticket: $ticket_id
|
|
||||||
# Enter your branch description below in kebab-case (e.g., my-description):
|
|
||||||
# The ticket ID will be automatically included in the branch name.
|
|
||||||
# Lines starting with # will be ignored.
|
|
||||||
|
|
||||||
EOF
|
|
||||||
else
|
|
||||||
cat > "$tmpfile" << 'EOF'
|
|
||||||
# Enter your branch description below in kebab-case (e.g., my-description):
|
|
||||||
# Lines starting with # will be ignored.
|
|
||||||
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
|
|
||||||
"$editor" "$tmpfile" < /dev/tty > /dev/tty
|
|
||||||
|
|
||||||
local desc
|
|
||||||
desc=$(grep -v '^#' "$tmpfile" | tr -d '\n' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
|
||||||
|
|
||||||
echo "$desc"
|
|
||||||
}
|
|
||||||
|
|
||||||
validate_description() {
|
|
||||||
local desc=$1
|
|
||||||
|
|
||||||
if [[ -z "$desc" ]]; then
|
|
||||||
error "No description provided"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ! "$desc" =~ ^[a-z0-9]+(-[a-z0-9]+)*$ ]]; then
|
|
||||||
error "Invalid branch description format.\nUse lowercase letters, numbers, and hyphens only.\nNo trailing or consecutive hyphens allowed.\nExample: my-feature-description"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
create_branch() {
|
|
||||||
local type=$1
|
|
||||||
local ticket_id=$2
|
|
||||||
local desc=$3
|
|
||||||
|
|
||||||
local branch
|
|
||||||
if [[ -n "$ticket_id" ]]; then
|
|
||||||
branch="$type/$ticket_id-$desc"
|
|
||||||
else
|
|
||||||
branch="$type/$desc"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if git show-ref --verify --quiet "refs/heads/$branch"; then
|
|
||||||
error "Branch '$branch' already exists"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "Creating branch: $branch"
|
|
||||||
git checkout -b "$branch"
|
|
||||||
}
|
|
||||||
|
|
||||||
main() {
|
|
||||||
check_dependencies
|
|
||||||
check_git_repo
|
|
||||||
check_current_branch
|
|
||||||
|
|
||||||
local email
|
|
||||||
email=$(get_user_email)
|
|
||||||
|
|
||||||
local type
|
|
||||||
type=$(select_branch_type)
|
|
||||||
|
|
||||||
echo "About to call select_jira_ticket" >&2
|
|
||||||
local ticket_id=""
|
|
||||||
ticket_id=$(select_jira_ticket "$email")
|
|
||||||
local desc
|
|
||||||
desc=$(get_branch_description "$ticket_id")
|
|
||||||
validate_description "$desc"
|
|
||||||
create_branch "$type" "$ticket_id" "$desc"
|
|
||||||
}
|
|
||||||
|
|
||||||
main "$@"
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
cd "$ZK_PATH" || echo "No zettelkasten directory found"
|
|
||||||
git a . && git commit -m "Update" && git push
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if [ ! -d ~/.zk ]; then
|
|
||||||
echo "[zk] Setting up zettelkasten"
|
|
||||||
gh repo clone zk ~/.zk
|
|
||||||
else
|
|
||||||
echo "[zk] Zettelkasten already set up."
|
|
||||||
fi
|
|
||||||
|
|
||||||
read -p "Would you like open your zettelkasten? [y/N] " -n 1 -r
|
|
||||||
echo
|
|
||||||
|
|
||||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
||||||
if [ -x "$(command -v zk)" ]; then
|
|
||||||
zk
|
|
||||||
else
|
|
||||||
echo "Error: 'zk' command not found or not executable"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
@@ -13,6 +13,7 @@ if ok then
|
|||||||
cc_config.interactions = cc_config.interactions or {}
|
cc_config.interactions = cc_config.interactions or {}
|
||||||
cc_config.interactions.chat = cc_config.interactions.chat or {}
|
cc_config.interactions.chat = cc_config.interactions.chat or {}
|
||||||
cc_config.interactions.chat.tools = cc_config.interactions.chat.tools or {}
|
cc_config.interactions.chat.tools = cc_config.interactions.chat.tools or {}
|
||||||
|
cc_config.interactions.chat.variables = cc_config.interactions.chat.variables or {}
|
||||||
|
|
||||||
require("mcphub.extensions.codecompanion").setup({
|
require("mcphub.extensions.codecompanion").setup({
|
||||||
make_vars = true,
|
make_vars = true,
|
||||||
|
|||||||
35
dots/.config/nvim/after/plugin/hydra.lua
Normal file
35
dots/.config/nvim/after/plugin/hydra.lua
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
local hydra_repl = "hydra-repl"
|
||||||
|
|
||||||
|
if not vim.fn.executable(hydra_repl) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local function send(lines)
|
||||||
|
vim.system({ hydra_repl, table.concat(lines, "\n") })
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_paragraph(buf)
|
||||||
|
local start_ = vim.fn.search("^$", "bnW")
|
||||||
|
local end_ = vim.fn.search("^$", "nW") - 1
|
||||||
|
if end_ < vim.api.nvim_win_get_cursor(0)[1] then
|
||||||
|
end_ = vim.api.nvim_buf_line_count(buf)
|
||||||
|
end
|
||||||
|
return vim.api.nvim_buf_get_lines(buf, start_, end_, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_selection(buf)
|
||||||
|
return vim.api.nvim_buf_get_lines(buf, vim.fn.line("'<") - 1, vim.fn.line("'>"), false)
|
||||||
|
end
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd("FileType", {
|
||||||
|
pattern = "javascript",
|
||||||
|
callback = function(e)
|
||||||
|
if vim.fn.fnamemodify(vim.api.nvim_buf_get_name(e.buf), ":e") ~= "hydra" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local buf = e.buf
|
||||||
|
vim.keymap.set("n", "<CR>", function() send(get_paragraph(buf)) end, { buffer = buf, desc = "hydra: send block" })
|
||||||
|
vim.keymap.set("v", "<CR>", function() send(get_selection(buf)) end, { buffer = buf, desc = "hydra: send selection" })
|
||||||
|
end,
|
||||||
|
})
|
||||||
@@ -87,7 +87,6 @@ local servers = {
|
|||||||
},
|
},
|
||||||
openscad_ls = {},
|
openscad_ls = {},
|
||||||
pyright = {},
|
pyright = {},
|
||||||
-- tsserver = {},
|
|
||||||
svelte = {
|
svelte = {
|
||||||
plugin = {
|
plugin = {
|
||||||
svelte = {
|
svelte = {
|
||||||
@@ -96,7 +95,6 @@ local servers = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
tailwindcss = {},
|
tailwindcss = {},
|
||||||
-- vtsls = {},
|
|
||||||
ts_ls = {},
|
ts_ls = {},
|
||||||
-- vtsls = {
|
-- vtsls = {
|
||||||
-- maxTsServerMemory = 16384,
|
-- maxTsServerMemory = 16384,
|
||||||
|
|||||||
@@ -1,23 +1,5 @@
|
|||||||
local ls = require("luasnip")
|
local ls = require("luasnip")
|
||||||
|
|
||||||
local s = ls.snippet
|
|
||||||
local sn = ls.snippet_node
|
|
||||||
local t = ls.text_node
|
|
||||||
local i = ls.insert_node
|
|
||||||
local f = ls.function_node
|
|
||||||
local c = ls.choice_node
|
|
||||||
local d = ls.dynamic_node
|
|
||||||
local r = ls.restore_node
|
|
||||||
local l = require("luasnip.extras").lambda
|
|
||||||
local rep = require("luasnip.extras").rep
|
|
||||||
local p = require("luasnip.extras").partial
|
|
||||||
local m = require("luasnip.extras").match
|
|
||||||
local n = require("luasnip.extras").nonempty
|
|
||||||
local dl = require("luasnip.extras").dynamic_lambda
|
|
||||||
local fmt = require("luasnip.extras.fmt").fmt
|
|
||||||
local fmta = require("luasnip.extras.fmt").fmta
|
|
||||||
local conds = require("luasnip.extras.expand_conditions")
|
|
||||||
|
|
||||||
ls.config.set_config({
|
ls.config.set_config({
|
||||||
history = true,
|
history = true,
|
||||||
update_events = "TextChanged,TextChangedI",
|
update_events = "TextChanged,TextChangedI",
|
||||||
@@ -27,287 +9,5 @@ ls.config.set_config({
|
|||||||
store_selection_keys = "<Tab>",
|
store_selection_keys = "<Tab>",
|
||||||
})
|
})
|
||||||
|
|
||||||
local function copy(args)
|
|
||||||
return args[1]
|
|
||||||
end
|
|
||||||
|
|
||||||
local function bash(_, _, command)
|
|
||||||
local file = io.popen(command, "r")
|
|
||||||
local res = {}
|
|
||||||
if file then
|
|
||||||
for line in file:lines() do
|
|
||||||
table.insert(res, line)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return res
|
|
||||||
end
|
|
||||||
|
|
||||||
local date_input = function(args, snip, old_state, date_format)
|
|
||||||
print(args, snip, old_state)
|
|
||||||
return sn(nil, i(1, os.date(date_format or "%Y-%m-%d")))
|
|
||||||
end
|
|
||||||
|
|
||||||
-- -- FIXME: EXAMPLE
|
|
||||||
-- ls.add_snippets("all", {
|
|
||||||
-- -- arg1: trigger `fn`,
|
|
||||||
-- -- arg2: nodes to insert into buffer on expansion.
|
|
||||||
-- s("fn", {
|
|
||||||
-- t("//Parameters: "), -- Text.
|
|
||||||
-- f(copy, 2), -- 1: function, 2: placeholders to copy text from
|
|
||||||
-- t({ "", "function " }), -- placeholder/insert.
|
|
||||||
-- i(1),
|
|
||||||
-- t("("), -- placeholder with initial text.
|
|
||||||
-- i(2, "int foo"), -- linebreak
|
|
||||||
-- t({ ") {", "\t" }), -- last placeholder, snippet exit point
|
|
||||||
-- i(0),
|
|
||||||
-- t({ "", "}" }),
|
|
||||||
-- }),
|
|
||||||
-- s("class", {
|
|
||||||
-- -- Choice: Switch between two different Nodes, first parameter is its position, second a list of nodes.
|
|
||||||
-- c(1, {
|
|
||||||
-- t("public "),
|
|
||||||
-- t("private "),
|
|
||||||
-- }),
|
|
||||||
-- t("class "),
|
|
||||||
-- i(2),
|
|
||||||
-- t(" "),
|
|
||||||
-- c(3, {
|
|
||||||
-- t("{"),
|
|
||||||
-- -- sn: Nested Snippet. Instead of a trigger, it has a position, just like insert-nodes. !!! These don't expect a 0-node!!!!
|
|
||||||
-- -- Inside Choices, Nodes don't need a position as the choice node is the one being jumped to.
|
|
||||||
-- sn(nil, {
|
|
||||||
-- t("extends "),
|
|
||||||
-- -- restoreNode: stores and restores nodes.
|
|
||||||
-- -- pass position, store-key and nodes.
|
|
||||||
-- r(1, "other_class", i(1)),
|
|
||||||
-- t(" {"),
|
|
||||||
-- }),
|
|
||||||
-- sn(nil, {
|
|
||||||
-- t("implements "),
|
|
||||||
-- -- no need to define the nodes for a given key a second time.
|
|
||||||
-- r(1, "other_class"),
|
|
||||||
-- t(" {"),
|
|
||||||
-- }),
|
|
||||||
-- }),
|
|
||||||
-- t({ "", "\t" }),
|
|
||||||
-- i(0),
|
|
||||||
-- t({ "", "}" }),
|
|
||||||
-- }),
|
|
||||||
-- -- Alternative printf-like notation for defining snippets. It uses format
|
|
||||||
-- -- string with placeholders similar to the ones used with Python's .format().
|
|
||||||
-- s(
|
|
||||||
-- "fmt1",
|
|
||||||
-- fmt("To {title} {} {}.", {
|
|
||||||
-- i(2, "Name"),
|
|
||||||
-- i(3, "Surname"),
|
|
||||||
-- title = c(1, { t("Mr."), t("Ms.") }),
|
|
||||||
-- })
|
|
||||||
-- ),
|
|
||||||
-- -- To escape delimiters use double them, e.g. `{}` -> `{{}}`.
|
|
||||||
-- -- Multi-line format strings by default have empty first/last line removed.
|
|
||||||
-- -- Indent common to all lines is also removed. Use the third `opts` argument
|
|
||||||
-- -- to control this behaviour.
|
|
||||||
-- s(
|
|
||||||
-- "fmt2",
|
|
||||||
-- fmt(
|
|
||||||
-- [[
|
|
||||||
-- foo({1}, {3}) {{
|
|
||||||
-- return {2} * {4}
|
|
||||||
-- }}
|
|
||||||
-- ]],
|
|
||||||
-- {
|
|
||||||
-- i(1, "x"),
|
|
||||||
-- rep(1),
|
|
||||||
-- i(2, "y"),
|
|
||||||
-- rep(2),
|
|
||||||
-- }
|
|
||||||
-- )
|
|
||||||
-- ),
|
|
||||||
-- -- Empty placeholders are numbered automatically starting from 1 or the last
|
|
||||||
-- -- value of a numbered placeholder. Named placeholders do not affect numbering.
|
|
||||||
-- s(
|
|
||||||
-- "fmt3",
|
|
||||||
-- fmt("{} {a} {} {1} {}", {
|
|
||||||
-- t("1"),
|
|
||||||
-- t("2"),
|
|
||||||
-- a = t("A"),
|
|
||||||
-- })
|
|
||||||
-- ),
|
|
||||||
-- -- The delimiters can be changed from the default `{}` to something else.
|
|
||||||
-- s("fmt4", fmt("foo() { return []; }", i(1, "x"), { delimiters = "[]" })),
|
|
||||||
-- -- `fmta` is a convenient wrapper that uses `<>` instead of `{}`.
|
|
||||||
-- s("fmt5", fmta("foo() { return <>; }", i(1, "x"))),
|
|
||||||
-- -- By default all args must be used. Use strict=false to disable the check
|
|
||||||
-- s(
|
|
||||||
-- "fmt6",
|
|
||||||
-- fmt("use {} only", { t("this"), t("not this") }, { strict = false })
|
|
||||||
-- ),
|
|
||||||
-- -- Use a dynamic_node to interpolate the output of a
|
|
||||||
-- -- function (see date_input above) into the initial
|
|
||||||
-- -- value of an insert_node.
|
|
||||||
-- s("novel", {
|
|
||||||
-- t("It was a dark and stormy night on "),
|
|
||||||
-- d(1, date_input, {}, { user_args = { "%A, %B %d of %Y" } }),
|
|
||||||
-- t(" and the clocks were striking thirteen."),
|
|
||||||
-- }),
|
|
||||||
-- -- Parsing snippets: First parameter: Snippet-Trigger, Second: Snippet body.
|
|
||||||
-- -- Placeholders are parsed into choices with 1. the placeholder text(as a snippet) and 2. an empty string.
|
|
||||||
-- -- This means they are not SELECTed like in other editors/Snippet engines.
|
|
||||||
-- ls.parser.parse_snippet(
|
|
||||||
-- "lspsyn",
|
|
||||||
-- "Wow! This ${1:Stuff} really ${2:works. ${3:Well, a bit.}}"
|
|
||||||
-- ),
|
|
||||||
|
|
||||||
-- -- When wordTrig is set to false, snippets may also expand inside other words.
|
|
||||||
-- ls.parser.parse_snippet(
|
|
||||||
-- { trig = "te", wordTrig = false },
|
|
||||||
-- "${1:cond} ? ${2:true} : ${3:false}"
|
|
||||||
-- ),
|
|
||||||
|
|
||||||
-- -- When regTrig is set, trig is treated like a pattern, this snippet will expand after any number.
|
|
||||||
-- ls.parser.parse_snippet({ trig = "%d", regTrig = true }, "A Number!!"),
|
|
||||||
-- -- Using the condition, it's possible to allow expansion only in specific cases.
|
|
||||||
-- s("cond", {
|
|
||||||
-- t("will only expand in c-style comments"),
|
|
||||||
-- }, {
|
|
||||||
-- condition = function(line_to_cursor, matched_trigger, captures)
|
|
||||||
-- -- optional whitespace followed by //
|
|
||||||
-- return line_to_cursor:match("%s*//")
|
|
||||||
-- end,
|
|
||||||
-- }),
|
|
||||||
-- -- there's some built-in conditions in "luasnip.extras.expand_conditions".
|
|
||||||
-- s("cond2", {
|
|
||||||
-- t("will only expand at the beginning of the line"),
|
|
||||||
-- }, {
|
|
||||||
-- condition = conds.line_begin,
|
|
||||||
-- }),
|
|
||||||
-- -- The last entry of args passed to the user-function is the surrounding snippet.
|
|
||||||
-- s(
|
|
||||||
-- { trig = "a%d", regTrig = true },
|
|
||||||
-- f(function(_, snip)
|
|
||||||
-- return "Triggered with " .. snip.trigger .. "."
|
|
||||||
-- end, {})
|
|
||||||
-- ),
|
|
||||||
-- -- It's possible to use capture-groups inside regex-triggers.
|
|
||||||
-- s(
|
|
||||||
-- { trig = "b(%d)", regTrig = true },
|
|
||||||
-- f(function(_, snip)
|
|
||||||
-- return "Captured Text: " .. snip.captures[1] .. "."
|
|
||||||
-- end, {})
|
|
||||||
-- ),
|
|
||||||
-- s({ trig = "c(%d+)", regTrig = true }, {
|
|
||||||
-- t("will only expand for even numbers"),
|
|
||||||
-- }, {
|
|
||||||
-- condition = function(line_to_cursor, matched_trigger, captures)
|
|
||||||
-- return tonumber(captures[1]) % 2 == 0
|
|
||||||
-- end,
|
|
||||||
-- }),
|
|
||||||
-- -- Use a function to execute any shell command and print its text.
|
|
||||||
-- s("bash", f(bash, {}, "ls")),
|
|
||||||
-- -- Short version for applying String transformations using function nodes.
|
|
||||||
-- s("transform", {
|
|
||||||
-- i(1, "initial text"),
|
|
||||||
-- t({ "", "" }),
|
|
||||||
-- -- lambda nodes accept an l._1,2,3,4,5, which in turn accept any string transformations.
|
|
||||||
-- -- This list will be applied in order to the first node given in the second argument.
|
|
||||||
-- l(l._1:match("[^i]*$"):gsub("i", "o"):gsub(" ", "_"):upper(), 1),
|
|
||||||
-- }),
|
|
||||||
|
|
||||||
-- s("transform2", {
|
|
||||||
-- i(1, "initial text"),
|
|
||||||
-- t("::"),
|
|
||||||
-- i(2, "replacement for e"),
|
|
||||||
-- t({ "", "" }),
|
|
||||||
-- -- Lambdas can also apply transforms USING the text of other nodes:
|
|
||||||
-- l(l._1:gsub("e", l._2), { 1, 2 }),
|
|
||||||
-- }),
|
|
||||||
-- s({ trig = "trafo(%d+)", regTrig = true }, {
|
|
||||||
-- -- env-variables and captures can also be used:
|
|
||||||
-- l(l.CAPTURE1:gsub("1", l.TM_FILENAME), {}),
|
|
||||||
-- }),
|
|
||||||
-- -- Set store_selection_keys = "<Tab>" (for example) in your
|
|
||||||
-- -- luasnip.config.setup() call to populate
|
|
||||||
-- -- TM_SELECTED_TEXT/SELECT_RAW/SELECT_DEDENT.
|
|
||||||
-- -- In this case: select a URL, hit Tab, then expand this snippet.
|
|
||||||
-- s("link_url", {
|
|
||||||
-- t('<a href="'),
|
|
||||||
-- f(function(_, snip)
|
|
||||||
-- -- TM_SELECTED_TEXT is a table to account for multiline-selections.
|
|
||||||
-- -- In this case only the first line is inserted.
|
|
||||||
-- return snip.env.TM_SELECTED_TEXT[1] or {}
|
|
||||||
-- end, {}),
|
|
||||||
-- t('">'),
|
|
||||||
-- i(1),
|
|
||||||
-- t("</a>"),
|
|
||||||
-- i(0),
|
|
||||||
-- }),
|
|
||||||
-- -- Shorthand for repeating the text in a given node.
|
|
||||||
-- s("repeat", { i(1, "text"), t({ "", "" }), rep(1) }),
|
|
||||||
-- -- Directly insert the ouput from a function evaluated at runtime.
|
|
||||||
-- s("part", p(os.date, "%Y")),
|
|
||||||
-- -- use matchNodes (`m(argnode, condition, then, else)`) to insert text
|
|
||||||
-- -- based on a pattern/function/lambda-evaluation.
|
|
||||||
-- -- It's basically a shortcut for simple functionNodes:
|
|
||||||
-- s("mat", {
|
|
||||||
-- i(1, { "sample_text" }),
|
|
||||||
-- t(": "),
|
|
||||||
-- m(1, "%d", "contains a number", "no number :("),
|
|
||||||
-- }),
|
|
||||||
-- -- The `then`-text defaults to the first capture group/the entire
|
|
||||||
-- -- match if there are none.
|
|
||||||
-- s("mat2", {
|
|
||||||
-- i(1, { "sample_text" }),
|
|
||||||
-- t(": "),
|
|
||||||
-- m(1, "[abc][abc][abc]"),
|
|
||||||
-- }),
|
|
||||||
-- -- It is even possible to apply gsubs' or other transformations
|
|
||||||
-- -- before matching.
|
|
||||||
-- s("mat3", {
|
|
||||||
-- i(1, { "sample_text" }),
|
|
||||||
-- t(": "),
|
|
||||||
-- m(
|
|
||||||
-- 1,
|
|
||||||
-- l._1:gsub("[123]", ""):match("%d"),
|
|
||||||
-- "contains a number that isn't 1, 2 or 3!"
|
|
||||||
-- ),
|
|
||||||
-- }),
|
|
||||||
-- -- `match` also accepts a function in place of the condition, which in
|
|
||||||
-- -- turn accepts the usual functionNode-args.
|
|
||||||
-- -- The condition is considered true if the function returns any
|
|
||||||
-- -- non-nil/false-value.
|
|
||||||
-- -- If that value is a string, it is used as the `if`-text if no if is explicitly given.
|
|
||||||
-- s("mat4", {
|
|
||||||
-- i(1, { "sample_text" }),
|
|
||||||
-- t(": "),
|
|
||||||
-- m(1, function(args)
|
|
||||||
-- -- args is a table of multiline-strings (as usual).
|
|
||||||
-- return (#args[1][1] % 2 == 0 and args[1]) or nil
|
|
||||||
-- end),
|
|
||||||
-- }),
|
|
||||||
-- -- The nonempty-node inserts text depending on whether the arg-node is
|
|
||||||
-- -- empty.
|
|
||||||
-- s("nempty", {
|
|
||||||
-- i(1, "sample_text"),
|
|
||||||
-- n(1, "i(1) is not empty!"),
|
|
||||||
-- }),
|
|
||||||
-- -- dynamic lambdas work exactly like regular lambdas, except that they
|
|
||||||
-- -- don't return a textNode, but a dynamicNode containing one insertNode.
|
|
||||||
-- -- This makes it easier to dynamically set preset-text for insertNodes.
|
|
||||||
-- s("dl1", {
|
|
||||||
-- i(1, "sample_text"),
|
|
||||||
-- t({ ":", "" }),
|
|
||||||
-- dl(2, l._1, 1),
|
|
||||||
-- }),
|
|
||||||
-- -- Obviously, it's also possible to apply transformations, just like lambdas.
|
|
||||||
-- s("dl2", {
|
|
||||||
-- i(1, "sample_text"),
|
|
||||||
-- i(2, "sample_text_2"),
|
|
||||||
-- t({ "", "" }),
|
|
||||||
-- dl(3, l._1:gsub("\n", " linebreak ") .. l._2, { 1, 2 }),
|
|
||||||
-- }),
|
|
||||||
-- }, {
|
|
||||||
-- key = "all",
|
|
||||||
-- })
|
|
||||||
|
|
||||||
require("luasnip.loaders.from_lua").lazy_load({ paths = { "~/.config/nvim/snips" } })
|
require("luasnip.loaders.from_lua").lazy_load({ paths = { "~/.config/nvim/snips" } })
|
||||||
require("luasnip.loaders.from_vscode").lazy_load({ paths = { "~/.config/Code - Insiders/User/snippets" } })
|
require("luasnip.loaders.from_vscode").lazy_load({ paths = { "~/.config/Code - Insiders/User/snippets" } })
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
-- require("m_taskwarrior_d").setup()
|
|
||||||
--
|
|
||||||
-- vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost" }, {
|
|
||||||
-- group = vim.api.nvim_create_augroup("TWTask", { clear = true }),
|
|
||||||
-- pattern = "*.md",
|
|
||||||
-- callback = function()
|
|
||||||
-- vim.cmd("TWSyncTasks")
|
|
||||||
-- end,
|
|
||||||
-- })
|
|
||||||
@@ -1,3 +1 @@
|
|||||||
vim.opt.termguicolors = true
|
|
||||||
|
|
||||||
require("nvim-highlight-colors").setup({})
|
require("nvim-highlight-colors").setup({})
|
||||||
|
|||||||
@@ -28,9 +28,6 @@ require("lint").linters_by_ft = {
|
|||||||
yaml = { "yamllint" },
|
yaml = { "yamllint" },
|
||||||
}
|
}
|
||||||
|
|
||||||
-- TODO: Wouldn't it be possible / nice to only try to load the linters when they are
|
|
||||||
-- actually needed?
|
|
||||||
|
|
||||||
vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost", "InsertLeave" }, {
|
vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost", "InsertLeave" }, {
|
||||||
callback = function()
|
callback = function()
|
||||||
require("lint").try_lint()
|
require("lint").try_lint()
|
||||||
|
|||||||
@@ -1,16 +1,28 @@
|
|||||||
vim.cmd([[
|
vim.g.tidal_default_config = { socket_name = "default", target_pane = "tidal:1.1" }
|
||||||
" Tidalcycles (sclang and vim-tidal)
|
vim.g.tidal_no_mappings = 1
|
||||||
let g:tidal_default_config = {"socket_name": "default", "target_pane": "tidal:1.1"}
|
|
||||||
let g:tidal_no_mappings = 1
|
|
||||||
|
|
||||||
au FileType tidal nm <buffer> <leader>ep <Plug>TidalParagraphSend
|
vim.api.nvim_create_autocmd("FileType", {
|
||||||
au FileType tidal nm <buffer> <leader>ee <Plug>TidalLineSend
|
pattern = "tidal",
|
||||||
au FileType tidal nnoremap <buffer> <leader>h :TidalHush<cr>
|
callback = function(e)
|
||||||
au FileType tidal com! -nargs=1 S :TidalSilence <args>
|
local buf = e.buf
|
||||||
au FileType tidal com! -nargs=1 P :TidalPlay <args>
|
vim.keymap.set("n", "<leader>ep", "<Plug>TidalParagraphSend", { buffer = buf, desc = "Tidal: send paragraph" })
|
||||||
au FileType tidal com! -nargs=0 H :TidalHush
|
vim.keymap.set("n", "<leader>ee", "<Plug>TidalLineSend", { buffer = buf, desc = "Tidal: send line" })
|
||||||
|
vim.keymap.set("n", "<leader>h", ":TidalHush<cr>", { buffer = buf, desc = "Tidal: hush" })
|
||||||
|
vim.api.nvim_buf_create_user_command(buf, "S", "TidalSilence <args>", { nargs = 1 })
|
||||||
|
vim.api.nvim_buf_create_user_command(buf, "P", "TidalPlay <args>", { nargs = 1 })
|
||||||
|
vim.api.nvim_buf_create_user_command(buf, "H", "TidalHush", { nargs = 0 })
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
" SuperCollider
|
-- SuperCollider
|
||||||
au BufEnter,BufWinEnter,BufNewFile,BufRead *.sc,*.scd se filetype=supercollider
|
vim.api.nvim_create_autocmd({ "BufEnter", "BufWinEnter", "BufNewFile", "BufRead" }, {
|
||||||
au Filetype supercollider packadd scvim
|
pattern = { "*.sc", "*.scd" },
|
||||||
]])
|
callback = function()
|
||||||
|
vim.bo.filetype = "supercollider"
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd("FileType", {
|
||||||
|
pattern = "supercollider",
|
||||||
|
command = "packadd scvim",
|
||||||
|
})
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
|
require("zk.utils")
|
||||||
|
|
||||||
vim.cmd([[
|
vim.cmd([[
|
||||||
" Change local buffer to directory of current file after the plugin has loaded
|
" Change local buffer to directory of current file after the plugin has loaded
|
||||||
autocmd VimEnter * lcd %:p:h
|
execute 'autocmd BufEnter' g:zk_path . '/*.md' 'silent lcd %:p:h'
|
||||||
|
|
||||||
" " Override wiki index mapping to also cd into the wiki
|
" " Override wiki index mapping to also cd into the wiki
|
||||||
nm <leader>ww <plug>(wiki-index)
|
nm <leader>ww <plug>(wiki-index)
|
||||||
@@ -11,11 +13,16 @@ nm <leader>ww <plug>(wiki-index)
|
|||||||
" nm <leader>s <plug>(wiki-link-follow-split)
|
" nm <leader>s <plug>(wiki-link-follow-split)
|
||||||
" nm <leader>v <plug>(wiki-link-follow-vsplit)
|
" nm <leader>v <plug>(wiki-link-follow-vsplit)
|
||||||
|
|
||||||
autocmd BufEnter *.md if expand('%:t') =~ '_' | echo 'hierarchical relation' | endif
|
function! ZKContextualEcho()
|
||||||
autocmd BufEnter *.md if expand('%:t') =~ '--' | echo 'relation' | endif
|
let l:name = expand('%:t')
|
||||||
autocmd BufEnter *.md if expand('%:t') =~ '<>' | echo 'dichotomy' | endif
|
if l:name =~ '_' | echo 'hierarchical relation'
|
||||||
autocmd BufEnter *.md if expand('%:t') =~ 'my-' | echo 'personal file' | endif
|
elseif l:name =~ '--' | echo 'relation'
|
||||||
autocmd BufEnter *.md if expand('%:t') =~ 'project_' | echo 'project file' | endif
|
elseif l:name =~ '<>' | echo 'dichotomy'
|
||||||
|
elseif l:name =~ 'my-' | echo 'personal file'
|
||||||
|
elseif l:name =~ 'project_' | echo 'project file'
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
execute 'autocmd BufEnter' g:zk_path . '/*.md' 'call ZKContextualEcho()'
|
||||||
|
|
||||||
" Only load wiki.vim for zk directory
|
" Only load wiki.vim for zk directory
|
||||||
let g:wiki_index_name='index'
|
let g:wiki_index_name='index'
|
||||||
@@ -76,7 +83,7 @@ let g:wiki_templates = [
|
|||||||
"
|
"
|
||||||
|
|
||||||
let g:wiki_filetypes=['md']
|
let g:wiki_filetypes=['md']
|
||||||
let g:wiki_root='~/.zk'
|
let g:wiki_root=g:zk_path
|
||||||
let g:wiki_global_load=0
|
let g:wiki_global_load=0
|
||||||
let g:wiki_link_creation = {
|
let g:wiki_link_creation = {
|
||||||
\ 'md': {
|
\ 'md': {
|
||||||
|
|||||||
18
dots/.config/nvim/flake.lock
generated
18
dots/.config/nvim/flake.lock
generated
@@ -42,11 +42,11 @@
|
|||||||
},
|
},
|
||||||
"nixCats": {
|
"nixCats": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1770584904,
|
"lastModified": 1777273601,
|
||||||
"narHash": "sha256-9Zaz8lbKF2W9pwXZEnbiGsicHdBoU+dHt3Wv3mCJoZ8=",
|
"narHash": "sha256-xBUa8Tl9V7IXI+VmLEuDc81La/EhoSn1C3EVSnJ3cfU=",
|
||||||
"owner": "BirdeeHub",
|
"owner": "BirdeeHub",
|
||||||
"repo": "nixCats-nvim",
|
"repo": "nixCats-nvim",
|
||||||
"rev": "538fdde784d2909700d97a8ef307783b33a86fb1",
|
"rev": "f69ea013e328841a7def7037ed59788a76be8816",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -73,11 +73,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs_2": {
|
"nixpkgs_2": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1770843696,
|
"lastModified": 1777270315,
|
||||||
"narHash": "sha256-LovWTGDwXhkfCOmbgLVA10bvsi/P8eDDpRudgk68HA8=",
|
"narHash": "sha256-yKB4G6cKsQsWN7M6rZGk6gkJPDNPIzT05y4qzRyCDlI=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "2343bbb58f99267223bc2aac4fc9ea301a155a16",
|
"rev": "6368eda62c9775c38ef7f714b2555a741c20c72d",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -106,11 +106,11 @@
|
|||||||
"plugins-helm-ls-nvim": {
|
"plugins-helm-ls-nvim": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1768584652,
|
"lastModified": 1773934114,
|
||||||
"narHash": "sha256-jnMc87OjURNcqsva0npYgVyUrWc5C6L7yHpNvt9eSmg=",
|
"narHash": "sha256-8trqFsA7nTKSdtkiAL0Sa9bXjh5ONtAqN7XNE/B8ukM=",
|
||||||
"owner": "qvalentin",
|
"owner": "qvalentin",
|
||||||
"repo": "helm-ls.nvim",
|
"repo": "helm-ls.nvim",
|
||||||
"rev": "f0b9a1723890971a6d84890b50dbf5f40974ea1b",
|
"rev": "20df43509b02a3ce3c6b3eee254d6e2bffa9a370",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
@@ -45,13 +45,38 @@
|
|||||||
inherit (nixCats) utils;
|
inherit (nixCats) utils;
|
||||||
luaPath = ./.;
|
luaPath = ./.;
|
||||||
forEachSystem = utils.eachSystem nixpkgs.lib.platforms.all;
|
forEachSystem = utils.eachSystem nixpkgs.lib.platforms.all;
|
||||||
extra_pkg_config = { };
|
extra_pkg_config = {
|
||||||
|
allowUnfreePredicate =
|
||||||
|
pkg:
|
||||||
|
builtins.elem (nixpkgs.lib.getName pkg) [
|
||||||
|
"vim-sandwich"
|
||||||
|
"jupytext.nvim"
|
||||||
|
"eyeliner.nvim"
|
||||||
|
"context_filetype.vim"
|
||||||
|
"editorconfig-vim"
|
||||||
|
"unicode.vim"
|
||||||
|
"quarto-nvim"
|
||||||
|
"vim-openscad"
|
||||||
|
"lsp_lines.nvim"
|
||||||
|
"nvim-highlight-colors"
|
||||||
|
"nvim-lint"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
mkDependencyOverlays = system: [
|
mkDependencyOverlays = system: [
|
||||||
(utils.standardPluginOverlay inputs)
|
(utils.standardPluginOverlay inputs)
|
||||||
(_final: _prev: {
|
(_final: _prev: {
|
||||||
mcp-hub = inputs.mcp-hub.packages.${system}.default;
|
mcp-hub = inputs.mcp-hub.packages.${system}.default;
|
||||||
})
|
})
|
||||||
|
(_: prev: {
|
||||||
|
luajitPackages = prev.luajitPackages.overrideScope (
|
||||||
|
_: lprev: {
|
||||||
|
neotest = lprev.neotest.overrideAttrs (_: {
|
||||||
|
doCheck = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
})
|
||||||
];
|
];
|
||||||
|
|
||||||
categoryDefinitions =
|
categoryDefinitions =
|
||||||
@@ -62,9 +87,11 @@
|
|||||||
{
|
{
|
||||||
lspsAndRuntimeDeps = with pkgs; {
|
lspsAndRuntimeDeps = with pkgs; {
|
||||||
general = [
|
general = [
|
||||||
|
nodejs_24
|
||||||
black
|
black
|
||||||
clang
|
clang
|
||||||
clang-tools
|
clang-tools
|
||||||
|
curl # → plenary-nvim, mcp-hub
|
||||||
delta
|
delta
|
||||||
emmet-language-server
|
emmet-language-server
|
||||||
eslint_d
|
eslint_d
|
||||||
@@ -78,8 +105,8 @@
|
|||||||
mcp-hub
|
mcp-hub
|
||||||
nixd
|
nixd
|
||||||
nixfmt
|
nixfmt
|
||||||
nodePackages.prettier
|
prettier
|
||||||
nodePackages.typescript-language-server
|
typescript-language-server
|
||||||
ormolu
|
ormolu
|
||||||
prettierd
|
prettierd
|
||||||
rust-analyzer
|
rust-analyzer
|
||||||
@@ -88,6 +115,8 @@
|
|||||||
stylelint
|
stylelint
|
||||||
stylua
|
stylua
|
||||||
tree-sitter
|
tree-sitter
|
||||||
|
tailwindcss-language-server
|
||||||
|
typescript-language-server
|
||||||
vscode-langservers-extracted
|
vscode-langservers-extracted
|
||||||
vtsls
|
vtsls
|
||||||
yaml-language-server
|
yaml-language-server
|
||||||
|
|||||||
@@ -1,15 +1,12 @@
|
|||||||
local json_newline = function()
|
local json_newline = function()
|
||||||
local line = vim.api.nvim_get_current_line()
|
local line = vim.api.nvim_get_current_line()
|
||||||
if line == "" then
|
if line == "" then
|
||||||
print("line is empty")
|
|
||||||
return "o"
|
return "o"
|
||||||
elseif string.byte(line, -1) == string.byte(",") then
|
elseif string.byte(line, -1) == string.byte(",") then
|
||||||
return "o"
|
return "o"
|
||||||
elseif string.byte(line, -1) == string.byte("{") then
|
elseif string.byte(line, -1) == string.byte("{") then
|
||||||
print("line ends with '{'")
|
|
||||||
return "o"
|
return "o"
|
||||||
elseif string.byte(line, -1) == string.byte("}") then
|
elseif string.byte(line, -1) == string.byte("}") then
|
||||||
print("line ends with '}'")
|
|
||||||
return "o"
|
return "o"
|
||||||
else
|
else
|
||||||
return "A,<CR>"
|
return "A,<CR>"
|
||||||
|
|||||||
@@ -26,5 +26,4 @@ set lcs=trail:·,tab:→\ ,nbsp:␣ " Whitespace rendering
|
|||||||
set ar " Autoread
|
set ar " Autoread
|
||||||
set spellsuggest+=5 " Limit spell suggestions
|
set spellsuggest+=5 " Limit spell suggestions
|
||||||
set wildignore+=*/node_modules/*,*/tmp/*,*.so,*.swp,*.zip
|
set wildignore+=*/node_modules/*,*/tmp/*,*.so,*.swp,*.zip
|
||||||
" set thesaurus+=./thesaurus/mthesaur.txt " FIXME
|
|
||||||
]])
|
]])
|
||||||
|
|||||||
@@ -9,5 +9,6 @@ vim.filetype.add({
|
|||||||
["%.env.*"] = "dotenv",
|
["%.env.*"] = "dotenv",
|
||||||
["%.pl$"] = "prolog",
|
["%.pl$"] = "prolog",
|
||||||
[".*.containerfile.*"] = "dockerfile",
|
[".*.containerfile.*"] = "dockerfile",
|
||||||
|
["%.hydra$"] = "javascript",
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,60 +1,57 @@
|
|||||||
vim.cmd([[
|
vim.g.mapleader = " "
|
||||||
" Leader keys
|
vim.g.maplocalleader = ";"
|
||||||
let mapleader = " "
|
|
||||||
let maplocalleader = ";"
|
|
||||||
|
|
||||||
" Splits & navigation
|
|
||||||
nm s <c-w> " Split horizontal
|
|
||||||
nm ss :sp<CR><c-w>w| " Split horizontal
|
|
||||||
nm sv :vs<CR><c-w>w| " Split vertical
|
|
||||||
nm sw <c-w>w| " Navigate splits
|
|
||||||
nm sh <c-w>h| "
|
|
||||||
nm sj <c-w>j| "
|
|
||||||
nm sk <c-w>k| "
|
|
||||||
nm sl <c-w>l| "
|
|
||||||
nn sH <c-w>8<| " Resize splits
|
|
||||||
nn sJ <c-w>8-| "
|
|
||||||
nn sK <c-w>8+| "
|
|
||||||
nn sL <c-w>8>| "
|
|
||||||
nn s= <c-w>=| " Equalize splits
|
|
||||||
|
|
||||||
" Open
|
|
||||||
nn sb :Lex<cr>| " File tree
|
|
||||||
nn <leader><leader> :noh<cr> |"
|
|
||||||
nn <leader>t :term<cr>| " Open terminal
|
|
||||||
|
|
||||||
" Remaps
|
|
||||||
ino <nowait> jj <esc>| " Normal now
|
|
||||||
nn <left> <nop>| " Hard mode
|
|
||||||
nn <down> <nop>| " "
|
|
||||||
nn <up> <nop>| " "
|
|
||||||
nn <right> <nop>| " "
|
|
||||||
ino <left> <nop>| " "
|
|
||||||
ino <down> <nop>| " "
|
|
||||||
ino <up> <nop>| " "
|
|
||||||
ino <right> <nop>| " "
|
|
||||||
|
|
||||||
" Search
|
|
||||||
nn <c-_> :noh<cr>| " map 'ctrl + /'
|
|
||||||
|
|
||||||
" Line numbers
|
|
||||||
nn <leader>n :set nu! rnu!<cr>
|
|
||||||
|
|
||||||
" Vim configuration
|
|
||||||
nn <leader>ec :vs $MYVIMRC<cr>
|
|
||||||
nn <leader>so :so %<cr>
|
|
||||||
]])
|
|
||||||
|
|
||||||
local set = vim.keymap.set
|
local set = vim.keymap.set
|
||||||
|
|
||||||
set("n", "<leader>cx", "<cmd>!chmod +x %<CR>", { silent = true, desc = "Run `chmod +x` on current file" })
|
-- splits & navigation
|
||||||
set("n", "yp", "<cmd>let @+ = expand('%r')<CR>:p<CR>", { silent = true, desc = "Yank path" })
|
set("n", "s", "<c-w>", { desc = "window prefix" })
|
||||||
|
set("n", "ss", ":sp<CR><c-w>w", { desc = "split horizontal" })
|
||||||
|
set("n", "sv", ":vs<CR><c-w>w", { desc = "split vertical" })
|
||||||
|
set("n", "sw", "<c-w>w", { desc = "navigate splits" })
|
||||||
|
set("n", "sh", "<c-w>h", { desc = "focus left split" })
|
||||||
|
set("n", "sj", "<c-w>j", { desc = "focus below split" })
|
||||||
|
set("n", "sk", "<c-w>k", { desc = "focus above split" })
|
||||||
|
set("n", "sl", "<c-w>l", { desc = "focus right split" })
|
||||||
|
set("n", "sH", "<c-w>8<", { desc = "shrink split left" })
|
||||||
|
set("n", "sJ", "<c-w>8-", { desc = "shrink split down" })
|
||||||
|
set("n", "sK", "<c-w>8+", { desc = "grow split up" })
|
||||||
|
set("n", "sL", "<c-w>8>", { desc = "grow split right" })
|
||||||
|
set("n", "s=", "<c-w>=", { desc = "equalize splits" })
|
||||||
|
|
||||||
-- Remap native NeoVim comment keymaps
|
-- open
|
||||||
set({ "n", "x" }, "<leader>c", "gc", { remap = true, desc = "Toggle comment" })
|
set("n", "sb", ":Lex<cr>", { desc = "file tree" })
|
||||||
set("n", "<leader>cc", "gcc", { remap = true, desc = "Toggle comment line" })
|
set("n", "<leader><leader>", ":noh<cr>", { desc = "clear highlights" })
|
||||||
set("o", "<leader>c", "gc", { remap = true, desc = "Comment textobject" })
|
set("n", "<leader>t", ":term<cr>", { desc = "open terminal" })
|
||||||
|
|
||||||
-- Move lines
|
-- remaps
|
||||||
set("v", "K", ": '<,'>move '<-2<cr>gv")
|
set("i", "jj", "<esc>", { nowait = true, desc = "exit insert mode" })
|
||||||
set("v", "J", ": '<,'>move '>+1<cr>gv")
|
set("n", "<left>", "<nop>")
|
||||||
|
set("n", "<down>", "<nop>")
|
||||||
|
set("n", "<up>", "<nop>")
|
||||||
|
set("n", "<right>", "<nop>")
|
||||||
|
set("i", "<left>", "<nop>")
|
||||||
|
set("i", "<down>", "<nop>")
|
||||||
|
set("i", "<up>", "<nop>")
|
||||||
|
set("i", "<right>", "<nop>")
|
||||||
|
|
||||||
|
-- search
|
||||||
|
set("n", "<c-_>", ":noh<cr>", { desc = "clear search highlight" })
|
||||||
|
|
||||||
|
-- line numbers
|
||||||
|
set("n", "<leader>n", ":set nu! rnu!<cr>", { desc = "toggle line numbers" })
|
||||||
|
|
||||||
|
-- vim configuration
|
||||||
|
set("n", "<leader>ec", ":vs $MYVIMRC<cr>", { desc = "edit vimrc" })
|
||||||
|
set("n", "<leader>so", ":so %<cr>", { desc = "source current file" })
|
||||||
|
|
||||||
|
set("n", "<leader>cx", "<cmd>!chmod +x %<CR>", { silent = true, desc = "run `chmod +x` on current file" })
|
||||||
|
set("n", "yp", "<cmd>let @+ = expand('%r')<CR>:p<CR>", { silent = true, desc = "yank path" })
|
||||||
|
|
||||||
|
-- remap native NeoVim comment keymaps
|
||||||
|
set({ "n", "x" }, "<leader>c", "gc", { remap = true, desc = "toggle comment" })
|
||||||
|
set("n", "<leader>cc", "gcc", { remap = true, desc = "toggle comment line" })
|
||||||
|
set("o", "<leader>c", "gc", { remap = true, desc = "comment textobject" })
|
||||||
|
|
||||||
|
-- move lines
|
||||||
|
set("v", "K", ": '<,'>move '<-2<cr>gv", { desc = "move selection up" })
|
||||||
|
set("v", "J", ": '<,'>move '>+1<cr>gv", { desc = "move selection down" })
|
||||||
|
|||||||
@@ -13,13 +13,19 @@ local function get_markdown_files(base)
|
|||||||
return items
|
return items
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function source:get_keyword_pattern()
|
||||||
|
return "[%w%./%-]*"
|
||||||
|
end
|
||||||
|
|
||||||
function source:complete(params, callback)
|
function source:complete(params, callback)
|
||||||
local cursor_before_line = params.context.cursor_before_line
|
local cursor_before_line = params.context.cursor_before_line
|
||||||
local cursor_after_line = params.context.cursor_after_line or ""
|
local cursor_after_line = params.context.cursor_after_line or ""
|
||||||
|
|
||||||
local trigger = cursor_before_line:match("%[[^%]]*%]%(([^)]*)$")
|
if not cursor_before_line:match("%[[^%]]*%]%(") then
|
||||||
|
callback({})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
if trigger ~= nil then
|
|
||||||
local items = get_markdown_files(".")
|
local items = get_markdown_files(".")
|
||||||
local next_char = cursor_after_line:sub(1, 1)
|
local next_char = cursor_after_line:sub(1, 1)
|
||||||
|
|
||||||
@@ -32,9 +38,6 @@ function source:complete(params, callback)
|
|||||||
end
|
end
|
||||||
|
|
||||||
callback(items)
|
callback(items)
|
||||||
else
|
|
||||||
callback({})
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function source:get_trigger_characters()
|
function source:get_trigger_characters()
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
require("zk.cmp")
|
require("zk.cmp")
|
||||||
|
require("zk.utils")
|
||||||
|
|
||||||
vim.cmd([[
|
vim.cmd([[
|
||||||
let s:zk_preview_enabled = 0
|
let s:zk_preview_enabled = 0
|
||||||
let s:live_server_job = -1
|
let s:live_server_job = -1
|
||||||
au BufEnter /home/h/.zk/*.md silent exe '!echo "%" > /home/h/.zk/current-zettel.txt'
|
execute 'au BufEnter' g:zk_path . '/*.md' 'silent exe "!echo %" ">" g:zk_path . "/current-zettel.txt"'
|
||||||
function! ToggleZKPreview()
|
function! ToggleZKPreview()
|
||||||
if s:zk_preview_enabled == 1
|
if s:zk_preview_enabled == 1
|
||||||
let s:zk_preview_enabled = 0
|
let s:zk_preview_enabled = 0
|
||||||
@@ -11,10 +12,10 @@ function! ToggleZKPreview()
|
|||||||
au! ZKPreview
|
au! ZKPreview
|
||||||
else
|
else
|
||||||
let s:zk_preview_enabled = 1
|
let s:zk_preview_enabled = 1
|
||||||
let s:live_server_job = jobstart('live-server --watch=/home/h/.zk/current-zettel-content.html --open=current-zettel-content.html --port=8080')
|
let s:live_server_job = jobstart('live-server --watch=' . g:zk_path . '/current-zettel-content.html --open=current-zettel-content.html --port=8080')
|
||||||
augroup ZKPreview
|
augroup ZKPreview
|
||||||
au BufEnter /home/h/.zk/*.md silent exe '!cat "%:r.html" > /home/h/.zk/current-zettel-content.html'
|
execute 'au BufEnter' g:zk_path . '/*.md' 'silent exe "!cat %:r.html" ">" g:zk_path . "/current-zettel-content.html"'
|
||||||
au BufWritePost /home/h/.zk/*.md silent exe '!make && cat "%:r.html" > /home/h/.zk/current-zettel-content.html'
|
execute 'au BufWritePost' g:zk_path . '/*.md' 'silent exe "!make && cat %:r.html" ">" g:zk_path . "/current-zettel-content.html"'
|
||||||
augroup END
|
augroup END
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|||||||
2
dots/.config/nvim/lua/zk/utils.lua
Normal file
2
dots/.config/nvim/lua/zk/utils.lua
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
vim.g.zk_path = os.getenv("ZK_PATH") or (os.getenv("HOME") .. "/.zk")
|
||||||
|
return vim.g.zk_path
|
||||||
@@ -17,7 +17,7 @@ local LOCALHOST_IP = "127.0.0.1"
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
s({ trig = "fn", desc = "Filename" }, { f(TM_FILENAME_BASE) }),
|
s({ trig = "fn", desc = "Filename" }, { f(TM_FILENAME_BASE) }),
|
||||||
s({ trig = "fne", dscr = "Filename (+extension)" }, { f(TM_FILENAME) }),
|
s({ trig = "fne", desc = "Filename (+extension)" }, { f(TM_FILENAME) }),
|
||||||
s({ trig = "hm" }, { t(NAME) }),
|
s({ trig = "hm" }, { t(NAME) }),
|
||||||
s({ trig = "loho" }, { t(LOCALHOST) }),
|
s({ trig = "loho" }, { t(LOCALHOST) }),
|
||||||
s({ trig = "lohoi" }, { t(LOCALHOST_IP) }),
|
s({ trig = "lohoi" }, { t(LOCALHOST_IP) }),
|
||||||
|
|||||||
@@ -5,112 +5,112 @@ local i = ls.insert_node
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
-- Flex
|
-- Flex
|
||||||
s({ trig = "b1", dscr = "Add 'border: 1px <color>;'" }, {
|
s({ trig = "b1", desc = "Add 'border: 1px <color>;'" }, {
|
||||||
t("border: 1px solid "),
|
t("border: 1px solid "),
|
||||||
i(1),
|
i(1),
|
||||||
t(";"),
|
t(";"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
s({ trig = "dfl", dscr = "Add 'display: flex;'" }, {
|
s({ trig = "dfl", desc = "Add 'display: flex;'" }, {
|
||||||
t("display: flex;"),
|
t("display: flex;"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
s({ trig = "flr", dscr = "Add 'flex-direction: row;'" }, {
|
s({ trig = "flr", desc = "Add 'flex-direction: row;'" }, {
|
||||||
t("flex-direction: row;"),
|
t("flex-direction: row;"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
s({ trig = "flc", dscr = "Add 'flex-direction: column;'" }, {
|
s({ trig = "flc", desc = "Add 'flex-direction: column;'" }, {
|
||||||
t("flex-direction: column;"),
|
t("flex-direction: column;"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
s({ trig = "flw", dscr = "Add 'flex-wrap: wrap;'" }, {
|
s({ trig = "flw", desc = "Add 'flex-wrap: wrap;'" }, {
|
||||||
t("flex-wrap: wrap;"),
|
t("flex-wrap: wrap;"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
s({ trig = "dfc", dscr = "Add 'flex-direction: column;'" }, {
|
s({ trig = "dfc", desc = "Add 'flex-direction: column;'" }, {
|
||||||
t("display: flex;"),
|
t("display: flex;"),
|
||||||
t("flex-direction: column;"),
|
t("flex-direction: column;"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
-- Grid
|
-- Grid
|
||||||
s({ trig = "dg", dscr = "Add 'display: grid;'" }, {
|
s({ trig = "dg", desc = "Add 'display: grid;'" }, {
|
||||||
t("display: grid;"),
|
t("display: grid;"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
-- Block
|
-- Block
|
||||||
s({ trig = "db", dscr = "Add 'display: block;'" }, {
|
s({ trig = "db", desc = "Add 'display: block;'" }, {
|
||||||
t("display: block;"),
|
t("display: block;"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
-- None
|
-- None
|
||||||
s({ trig = "dn", dscr = "Add 'display: none;'" }, {
|
s({ trig = "dn", desc = "Add 'display: none;'" }, {
|
||||||
t("display: none;"),
|
t("display: none;"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
-- CSS Variables
|
-- CSS Variables
|
||||||
s({ trig = "v", dscr = "Add CSS variable" }, {
|
s({ trig = "v", desc = "Add CSS variable" }, {
|
||||||
t("var(--"),
|
t("var(--"),
|
||||||
i(1),
|
i(1),
|
||||||
t(")"),
|
t(")"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
-- Margin
|
-- Margin
|
||||||
s({ trig = "m", dscr = "Add 'margin: ;'" }, {
|
s({ trig = "m", desc = "Add 'margin: ;'" }, {
|
||||||
t("margin: "),
|
t("margin: "),
|
||||||
i(1),
|
i(1),
|
||||||
t(";"),
|
t(";"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
s({ trig = "mt", dscr = "Add 'margin-top: ;'" }, {
|
s({ trig = "mt", desc = "Add 'margin-top: ;'" }, {
|
||||||
t("margin-top: "),
|
t("margin-top: "),
|
||||||
i(1),
|
i(1),
|
||||||
t(";"),
|
t(";"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
s({ trig = "mr", dscr = "Add 'margin-right: ;'" }, {
|
s({ trig = "mr", desc = "Add 'margin-right: ;'" }, {
|
||||||
t("margin-right: "),
|
t("margin-right: "),
|
||||||
i(1),
|
i(1),
|
||||||
t(";"),
|
t(";"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
s({ trig = "mb", dscr = "Add 'margin-bottom: ;'" }, {
|
s({ trig = "mb", desc = "Add 'margin-bottom: ;'" }, {
|
||||||
t("margin-bottom: "),
|
t("margin-bottom: "),
|
||||||
i(1),
|
i(1),
|
||||||
t(";"),
|
t(";"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
s({ trig = "ml", dscr = "Add 'margin-left: ;'" }, {
|
s({ trig = "ml", desc = "Add 'margin-left: ;'" }, {
|
||||||
t("margin-left: "),
|
t("margin-left: "),
|
||||||
i(1),
|
i(1),
|
||||||
t(";"),
|
t(";"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
-- Padding
|
-- Padding
|
||||||
s({ trig = "p", dscr = "Add 'padding: ;'" }, {
|
s({ trig = "p", desc = "Add 'padding: ;'" }, {
|
||||||
t("padding: "),
|
t("padding: "),
|
||||||
i(1),
|
i(1),
|
||||||
t(";"),
|
t(";"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
s({ trig = "pt", dscr = "Add 'padding-top: ;'" }, {
|
s({ trig = "pt", desc = "Add 'padding-top: ;'" }, {
|
||||||
t("padding-top: "),
|
t("padding-top: "),
|
||||||
i(1),
|
i(1),
|
||||||
t(";"),
|
t(";"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
s({ trig = "pr", dscr = "Add 'padding-right: ;'" }, {
|
s({ trig = "pr", desc = "Add 'padding-right: ;'" }, {
|
||||||
t("padding-right: "),
|
t("padding-right: "),
|
||||||
i(1),
|
i(1),
|
||||||
t(";"),
|
t(";"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
s({ trig = "pb", dscr = "Add 'padding-bottom: ;'" }, {
|
s({ trig = "pb", desc = "Add 'padding-bottom: ;'" }, {
|
||||||
t("padding-bottom: "),
|
t("padding-bottom: "),
|
||||||
i(1),
|
i(1),
|
||||||
t(";"),
|
t(";"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
s({ trig = "pl", dscr = "Add 'padding-left: ;'" }, {
|
s({ trig = "pl", desc = "Add 'padding-left: ;'" }, {
|
||||||
t("padding-left: "),
|
t("padding-left: "),
|
||||||
i(1),
|
i(1),
|
||||||
t(";"),
|
t(";"),
|
||||||
|
|||||||
@@ -4,19 +4,19 @@ local t = ls.text_node
|
|||||||
local i = ls.insert_node
|
local i = ls.insert_node
|
||||||
|
|
||||||
return {
|
return {
|
||||||
s({ trig = "clg", dscr = "console.log" }, {
|
s({ trig = "clg", desc = "console.log" }, {
|
||||||
t("console.log("),
|
t("console.log("),
|
||||||
i(1),
|
i(1),
|
||||||
t(")"),
|
t(")"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
s({ trig = "Js", dscr = "JSON.stringify" }, {
|
s({ trig = "Js", desc = "JSON.stringify" }, {
|
||||||
t("JSON.stringify("),
|
t("JSON.stringify("),
|
||||||
i(1),
|
i(1),
|
||||||
t(")"),
|
t(")"),
|
||||||
i(0),
|
i(0),
|
||||||
}),
|
}),
|
||||||
s({ trig = "Jsf", dscr = "JSON.stringify (formatted)" }, {
|
s({ trig = "Jsf", desc = "JSON.stringify (formatted)" }, {
|
||||||
t("JSON.stringify("),
|
t("JSON.stringify("),
|
||||||
i(1),
|
i(1),
|
||||||
t(", 0, 2)"),
|
t(", 0, 2)"),
|
||||||
|
|||||||
@@ -915,21 +915,21 @@ end
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
s(
|
s(
|
||||||
{ trig = "^h", regTrig = true, dscr = "Markdown header" },
|
{ trig = "^h", regTrig = true, desc = "Markdown header" },
|
||||||
fmta("# <><>", {
|
fmta("# <><>", {
|
||||||
d(1, get_visual),
|
d(1, get_visual),
|
||||||
i(0),
|
i(0),
|
||||||
})
|
})
|
||||||
),
|
),
|
||||||
s(
|
s(
|
||||||
{ trig = "^sec", regTrig = true, dscr = "Markdown header" },
|
{ trig = "^sec", regTrig = true, desc = "Markdown header" },
|
||||||
fmta("## <><>", {
|
fmta("## <><>", {
|
||||||
d(1, get_visual),
|
d(1, get_visual),
|
||||||
i(0),
|
i(0),
|
||||||
})
|
})
|
||||||
),
|
),
|
||||||
s(
|
s(
|
||||||
{ trig = "^ssec", regTrig = true, dscr = "Markdown header" },
|
{ trig = "^ssec", regTrig = true, desc = "Markdown header" },
|
||||||
fmta("### <><>", {
|
fmta("### <><>", {
|
||||||
d(1, get_visual),
|
d(1, get_visual),
|
||||||
i(0),
|
i(0),
|
||||||
|
|||||||
@@ -1,11 +1,5 @@
|
|||||||
local cmd = vim.cmd
|
|
||||||
local map = vim.keymap.set
|
local map = vim.keymap.set
|
||||||
|
|
||||||
cmd([[
|
|
||||||
source ~/.vim/init/base.vim
|
|
||||||
source ~/.vim/init/mappings.vim
|
|
||||||
]])
|
|
||||||
|
|
||||||
require("keymaps")
|
require("keymaps")
|
||||||
|
|
||||||
map({ "n", "v" }, "<leader>p", '<cmd>call VSCodeNotify("workbench.action.quickOpen")<cr>')
|
map({ "n", "v" }, "<leader>p", '<cmd>call VSCodeNotify("workbench.action.quickOpen")<cr>')
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
set -g status-style bg=colour12,fg=colour0
|
|
||||||
@@ -70,8 +70,6 @@ set -g status-right '#(uptime | cut -f 4-5 -d " " | cut -f 1 -d ",") %a %l:%M:%S
|
|||||||
|
|
||||||
set -g default-terminal "tmux-256color"
|
set -g default-terminal "tmux-256color"
|
||||||
|
|
||||||
set-hook -g after-new-session 'if -F "#{==:#{session_name},ssh}" "source ${XDG_CONFIG_HOME}/tmux/hooks/tmux.ssh.conf" "source ${XDG_CONFIG_HOME}/tmux/hooks/tmux.regular.conf"'
|
|
||||||
|
|
||||||
# Vi copypaste mode
|
# Vi copypaste mode
|
||||||
if-shell "test '\( #{$TMUX_VERSION_MAJOR} -eq 2 -a #{$TMUX_VERSION_MINOR} -ge 4 \)'" 'bind-key -Tcopy-mode-vi v send -X begin-selection; bind-key -Tcopy-mode-vi y send -X copy-selection-and-cancel'
|
if-shell "test '\( #{$TMUX_VERSION_MAJOR} -eq 2 -a #{$TMUX_VERSION_MINOR} -ge 4 \)'" 'bind-key -Tcopy-mode-vi v send -X begin-selection; bind-key -Tcopy-mode-vi y send -X copy-selection-and-cancel'
|
||||||
if-shell '\( #{$TMUX_VERSION_MAJOR} -eq 2 -a #{$TMUX_VERSION_MINOR} -lt 4\) -o #{$TMUX_VERSION_MAJOR} -le 1' 'bind-key -t vi-copy v begin-selection; bind-key -t vi-copy y copy-selection'
|
if-shell '\( #{$TMUX_VERSION_MAJOR} -eq 2 -a #{$TMUX_VERSION_MINOR} -lt 4\) -o #{$TMUX_VERSION_MAJOR} -le 1' 'bind-key -t vi-copy v begin-selection; bind-key -t vi-copy y copy-selection'
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
import sys
|
|
||||||
import json
|
|
||||||
|
|
||||||
SLOTS_FILE = "/home/h/.local/share/task/add_slots"
|
|
||||||
|
|
||||||
def get_slots():
|
|
||||||
try:
|
|
||||||
with open(SLOTS_FILE, "r") as f:
|
|
||||||
return int(f.read().strip())
|
|
||||||
except:
|
|
||||||
return 0
|
|
||||||
|
|
||||||
slots = get_slots()
|
|
||||||
|
|
||||||
if slots <= 0:
|
|
||||||
print(f"Cannot add task: No slots available (0/{slots}).")
|
|
||||||
print("Delete or complete a task first to earn an add slot.")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
with open(SLOTS_FILE, "w") as f:
|
|
||||||
f.write(str(slots - 1))
|
|
||||||
|
|
||||||
print(f"Task added. Slots remaining: {slots - 1}")
|
|
||||||
|
|
||||||
for line in sys.stdin:
|
|
||||||
task = json.loads(line)
|
|
||||||
print(json.dumps(task))
|
|
||||||
sys.exit(0)
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
import sys
|
|
||||||
import json
|
|
||||||
|
|
||||||
SLOTS_FILE = "/home/h/.local/share/task/add_slots"
|
|
||||||
|
|
||||||
def get_slots():
|
|
||||||
try:
|
|
||||||
with open(SLOTS_FILE, "r") as f:
|
|
||||||
return int(f.read().strip())
|
|
||||||
except:
|
|
||||||
return 0
|
|
||||||
|
|
||||||
data = sys.stdin.read().strip().split("\n")
|
|
||||||
if len(data) < 2:
|
|
||||||
for line in data:
|
|
||||||
if line:
|
|
||||||
print(line)
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
old_task = json.loads(data[0])
|
|
||||||
new_task = json.loads(data[1])
|
|
||||||
|
|
||||||
was_pending = old_task.get("status") == "pending"
|
|
||||||
is_not_pending = new_task.get("status") in ("completed", "deleted")
|
|
||||||
|
|
||||||
if was_pending and is_not_pending:
|
|
||||||
slots = get_slots() + 1
|
|
||||||
with open(SLOTS_FILE, "w") as f:
|
|
||||||
f.write(str(slots))
|
|
||||||
print(f"Slot earned! Total slots: {slots}")
|
|
||||||
|
|
||||||
print(json.dumps(new_task))
|
|
||||||
sys.exit(0)
|
|
||||||
128
flake.lock
generated
128
flake.lock
generated
@@ -38,11 +38,11 @@
|
|||||||
"base16-helix": {
|
"base16-helix": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1760703920,
|
"lastModified": 1776754714,
|
||||||
"narHash": "sha256-m82fGUYns4uHd+ZTdoLX2vlHikzwzdu2s2rYM2bNwzw=",
|
"narHash": "sha256-E3OAK27smtATTmX45uoTSRsVD+Y+ZiVVfgM/tjpbtYg=",
|
||||||
"owner": "tinted-theming",
|
"owner": "tinted-theming",
|
||||||
"repo": "base16-helix",
|
"repo": "base16-helix",
|
||||||
"rev": "d646af9b7d14bff08824538164af99d0c521b185",
|
"rev": "4d508123037e7851ad36ebf7d9c48b0e9e1eb581",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -121,11 +121,11 @@
|
|||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"dir": "pkgs/firefox-addons",
|
"dir": "pkgs/firefox-addons",
|
||||||
"lastModified": 1772424169,
|
"lastModified": 1778040175,
|
||||||
"narHash": "sha256-mhv7yclJj+qCagNv0WOuob5yQNV1aTqKcJLfBMUqsVA=",
|
"narHash": "sha256-SSXJp3BMjO2LrW/VLjNdGGcjd3RFEyV4FemYA6OGrYw=",
|
||||||
"owner": "rycee",
|
"owner": "rycee",
|
||||||
"repo": "nur-expressions",
|
"repo": "nur-expressions",
|
||||||
"rev": "701de032cc247a1c309a34f0ed646e824efd7ac6",
|
"rev": "3bd76b0f41e65661866bddcac57ebe83aeadb581",
|
||||||
"type": "gitlab"
|
"type": "gitlab"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -138,11 +138,11 @@
|
|||||||
"firefox-gnome-theme": {
|
"firefox-gnome-theme": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1764873433,
|
"lastModified": 1776136500,
|
||||||
"narHash": "sha256-1XPewtGMi+9wN9Ispoluxunw/RwozuTRVuuQOmxzt+A=",
|
"narHash": "sha256-r0gN2brVWA351zwMV0Flmlcd6SGMvYqFbvC3DfKFM8Y=",
|
||||||
"owner": "rafaelmardojai",
|
"owner": "rafaelmardojai",
|
||||||
"repo": "firefox-gnome-theme",
|
"repo": "firefox-gnome-theme",
|
||||||
"rev": "f7ffd917ac0d253dbd6a3bf3da06888f57c69f92",
|
"rev": "0f8ba203d475587f477e7ae12661bd8459e225b7",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -213,11 +213,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1767609335,
|
"lastModified": 1775087534,
|
||||||
"narHash": "sha256-feveD98mQpptwrAEggBQKJTYbvwwglSbOv53uCfH9PY=",
|
"narHash": "sha256-91qqW8lhL7TLwgQWijoGBbiD4t7/q75KTi8NxjVmSmA=",
|
||||||
"owner": "hercules-ci",
|
"owner": "hercules-ci",
|
||||||
"repo": "flake-parts",
|
"repo": "flake-parts",
|
||||||
"rev": "250481aafeb741edfe23d29195671c19b36b6dca",
|
"rev": "3107b77cd68437b9a76194f0f7f9c55f2329ca5b",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -284,11 +284,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1772024342,
|
"lastModified": 1776796298,
|
||||||
"narHash": "sha256-+eXlIc4/7dE6EcPs9a2DaSY3fTA9AE526hGqkNID3Wg=",
|
"narHash": "sha256-PcRvlWayisPSjd0UcRQbhG8Oqw78AcPE6x872cPRHN8=",
|
||||||
"owner": "cachix",
|
"owner": "cachix",
|
||||||
"repo": "git-hooks.nix",
|
"repo": "git-hooks.nix",
|
||||||
"rev": "6e34e97ed9788b17796ee43ccdbaf871a5c2b476",
|
"rev": "3cfd774b0a530725a077e17354fbdb87ea1c4aad",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -321,20 +321,18 @@
|
|||||||
"gnome-shell": {
|
"gnome-shell": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"host": "gitlab.gnome.org",
|
|
||||||
"lastModified": 1767737596,
|
"lastModified": 1767737596,
|
||||||
"narHash": "sha256-eFujfIUQDgWnSJBablOuG+32hCai192yRdrNHTv0a+s=",
|
"narHash": "sha256-eFujfIUQDgWnSJBablOuG+32hCai192yRdrNHTv0a+s=",
|
||||||
"owner": "GNOME",
|
"owner": "GNOME",
|
||||||
"repo": "gnome-shell",
|
"repo": "gnome-shell",
|
||||||
"rev": "ef02db02bf0ff342734d525b5767814770d85b49",
|
"rev": "ef02db02bf0ff342734d525b5767814770d85b49",
|
||||||
"type": "gitlab"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"host": "gitlab.gnome.org",
|
|
||||||
"owner": "GNOME",
|
"owner": "GNOME",
|
||||||
"ref": "gnome-49",
|
|
||||||
"repo": "gnome-shell",
|
"repo": "gnome-shell",
|
||||||
"type": "gitlab"
|
"rev": "ef02db02bf0ff342734d525b5767814770d85b49",
|
||||||
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"home-manager": {
|
"home-manager": {
|
||||||
@@ -344,11 +342,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1772380461,
|
"lastModified": 1778009629,
|
||||||
"narHash": "sha256-O3ukj3Bb3V0Tiy/4LUfLlBpWypJ9P0JeUgsKl2nmZZY=",
|
"narHash": "sha256-nUoQtf4Zq7DRYJrfv904hjrxjAlWVP6a1pNNFKx3FCg=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"rev": "f140aa04d7d14f8a50ab27f3691b5766b17ae961",
|
"rev": "00ed86e58bb6979a7921859fd1615d19382eac5c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -400,10 +398,10 @@
|
|||||||
"nix-secrets": {
|
"nix-secrets": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1770135527,
|
"lastModified": 1776723456,
|
||||||
"narHash": "sha256-Fup9LiyL6bDID3x+rAB2nP99Xv2o9Is5NkTDbmIy6o0=",
|
"narHash": "sha256-GBbbm05oXYqSZ2EgxQPsNpTKl16wNhvrlUxdmv0FbSU=",
|
||||||
"ref": "main",
|
"ref": "main",
|
||||||
"rev": "521d144f8a8ff9fca8ccf492d7fbdd05d9a5fe37",
|
"rev": "135b681d24af6ee4508bbf7c657982d7be8743d4",
|
||||||
"shallow": true,
|
"shallow": true,
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "ssh://git@github.com/hektor/nix-secrets"
|
"url": "ssh://git@github.com/hektor/nix-secrets"
|
||||||
@@ -417,11 +415,11 @@
|
|||||||
},
|
},
|
||||||
"nixCats": {
|
"nixCats": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1770584904,
|
"lastModified": 1777273601,
|
||||||
"narHash": "sha256-9Zaz8lbKF2W9pwXZEnbiGsicHdBoU+dHt3Wv3mCJoZ8=",
|
"narHash": "sha256-xBUa8Tl9V7IXI+VmLEuDc81La/EhoSn1C3EVSnJ3cfU=",
|
||||||
"owner": "BirdeeHub",
|
"owner": "BirdeeHub",
|
||||||
"repo": "nixCats-nvim",
|
"repo": "nixCats-nvim",
|
||||||
"rev": "538fdde784d2909700d97a8ef307783b33a86fb1",
|
"rev": "f69ea013e328841a7def7037ed59788a76be8816",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -453,11 +451,11 @@
|
|||||||
},
|
},
|
||||||
"nixos-hardware": {
|
"nixos-hardware": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1771969195,
|
"lastModified": 1777917524,
|
||||||
"narHash": "sha256-qwcDBtrRvJbrrnv1lf/pREQi8t2hWZxVAyeMo7/E9sw=",
|
"narHash": "sha256-k+LVe9YaO2BEPB9AaCtTtOMCeGi4dxDo6gt4Un3qoPY=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixos-hardware",
|
"repo": "nixos-hardware",
|
||||||
"rev": "41c6b421bdc301b2624486e11905c9af7b8ec68e",
|
"rev": "df7783100babf59001340a7a874ba3824e441ecb",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -469,11 +467,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1772198003,
|
"lastModified": 1777954456,
|
||||||
"narHash": "sha256-I45esRSssFtJ8p/gLHUZ1OUaaTaVLluNkABkk6arQwE=",
|
"narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "dd9b079222d43e1943b6ebd802f04fd959dc8e61",
|
"rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -511,11 +509,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1767810917,
|
"lastModified": 1777598946,
|
||||||
"narHash": "sha256-ZKqhk772+v/bujjhla9VABwcvz+hB2IaRyeLT6CFnT0=",
|
"narHash": "sha256-X239dAGaU1+gfDj8jKH8GzlqKMcxaVfXOio+uzBOkeE=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "NUR",
|
"repo": "NUR",
|
||||||
"rev": "dead29c804adc928d3a69dfe7f9f12d0eec1f1a4",
|
"rev": "5d55af01c0f86be583931fe99207fc56c14134b3",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -567,11 +565,11 @@
|
|||||||
"plugins-helm-ls-nvim": {
|
"plugins-helm-ls-nvim": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1768584652,
|
"lastModified": 1773934114,
|
||||||
"narHash": "sha256-jnMc87OjURNcqsva0npYgVyUrWc5C6L7yHpNvt9eSmg=",
|
"narHash": "sha256-8trqFsA7nTKSdtkiAL0Sa9bXjh5ONtAqN7XNE/B8ukM=",
|
||||||
"owner": "qvalentin",
|
"owner": "qvalentin",
|
||||||
"repo": "helm-ls.nvim",
|
"repo": "helm-ls.nvim",
|
||||||
"rev": "f0b9a1723890971a6d84890b50dbf5f40974ea1b",
|
"rev": "20df43509b02a3ce3c6b3eee254d6e2bffa9a370",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -667,11 +665,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1772401007,
|
"lastModified": 1777944972,
|
||||||
"narHash": "sha256-YHykQg0h9hrlZGpMcywnaFzQ1Kn/5YNCCOSaaAl6z7Q=",
|
"narHash": "sha256-VfGRo1qTBKOe3s2gOv8LSoA6Fk19PvBlwQ1ECN0Evn8=",
|
||||||
"owner": "Mic92",
|
"owner": "Mic92",
|
||||||
"repo": "sops-nix",
|
"repo": "sops-nix",
|
||||||
"rev": "d8be5ea4cd3bc363492ab5bc6e874ccdc5465fe4",
|
"rev": "c591bf665727040c6cc5cb409079acb22dcce33c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -710,18 +708,17 @@
|
|||||||
],
|
],
|
||||||
"nur": "nur",
|
"nur": "nur",
|
||||||
"systems": "systems_2",
|
"systems": "systems_2",
|
||||||
"tinted-foot": "tinted-foot",
|
|
||||||
"tinted-kitty": "tinted-kitty",
|
"tinted-kitty": "tinted-kitty",
|
||||||
"tinted-schemes": "tinted-schemes",
|
"tinted-schemes": "tinted-schemes",
|
||||||
"tinted-tmux": "tinted-tmux",
|
"tinted-tmux": "tinted-tmux",
|
||||||
"tinted-zed": "tinted-zed"
|
"tinted-zed": "tinted-zed"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1772296853,
|
"lastModified": 1777835090,
|
||||||
"narHash": "sha256-pAtzPsgHRKw/2Kv8HgAjSJg450FDldHPWsP3AKG/Xj0=",
|
"narHash": "sha256-VLH8zPweblCOvpnQXp4fVs7f6Q79YhXF5XFKlOrvIFk=",
|
||||||
"owner": "danth",
|
"owner": "danth",
|
||||||
"repo": "stylix",
|
"repo": "stylix",
|
||||||
"rev": "c4b8e80a1020e09a1f081ad0f98ce804a6e85acf",
|
"rev": "7989a1054b01153212dede6005abfd1576b8328c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -760,23 +757,6 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tinted-foot": {
|
|
||||||
"flake": false,
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1726913040,
|
|
||||||
"narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=",
|
|
||||||
"owner": "tinted-theming",
|
|
||||||
"repo": "tinted-foot",
|
|
||||||
"rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "tinted-theming",
|
|
||||||
"repo": "tinted-foot",
|
|
||||||
"rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tinted-kitty": {
|
"tinted-kitty": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
@@ -796,11 +776,11 @@
|
|||||||
"tinted-schemes": {
|
"tinted-schemes": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1767710407,
|
"lastModified": 1777041405,
|
||||||
"narHash": "sha256-+W1EB79Jl0/gm4JqmO0Nuc5C7hRdp4vfsV/VdzI+des=",
|
"narHash": "sha256-BAGZ7ObFV/9Z61OJZun7ifPyhkuHqNuW1QIhQ8LuzCo=",
|
||||||
"owner": "tinted-theming",
|
"owner": "tinted-theming",
|
||||||
"repo": "schemes",
|
"repo": "schemes",
|
||||||
"rev": "2800e2b8ac90f678d7e4acebe4fa253f602e05b2",
|
"rev": "5f868b3a338b6904c47f3833b9c411be641983a8",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -812,11 +792,11 @@
|
|||||||
"tinted-tmux": {
|
"tinted-tmux": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1767489635,
|
"lastModified": 1777169200,
|
||||||
"narHash": "sha256-e6nnFnWXKBCJjCv4QG4bbcouJ6y3yeT70V9MofL32lU=",
|
"narHash": "sha256-h7dDbIzP5hDr9v97w9PL6jdAgXawmj6krcH+959rqpU=",
|
||||||
"owner": "tinted-theming",
|
"owner": "tinted-theming",
|
||||||
"repo": "tinted-tmux",
|
"repo": "tinted-tmux",
|
||||||
"rev": "3c32729ccae99be44fe8a125d20be06f8d7d8184",
|
"rev": "f798c2dce44ef815bb6b8f05a82135c7942d35ac",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -828,11 +808,11 @@
|
|||||||
"tinted-zed": {
|
"tinted-zed": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1767488740,
|
"lastModified": 1777463218,
|
||||||
"narHash": "sha256-wVOj0qyil8m+ouSsVZcNjl5ZR+1GdOOAooAatQXHbuU=",
|
"narHash": "sha256-Bhkozqtq3BKLqWTlmKm8uAptfX4aRGI8QX3eEL54Vpc=",
|
||||||
"owner": "tinted-theming",
|
"owner": "tinted-theming",
|
||||||
"repo": "base16-zed",
|
"repo": "base16-zed",
|
||||||
"rev": "11abb0b282ad3786a2aae088d3a01c60916f2e40",
|
"rev": "5768d08ed2e7944a26a958868cdb073cb8856dae",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
42
flake.nix
42
flake.nix
@@ -60,8 +60,8 @@
|
|||||||
let
|
let
|
||||||
inherit (self) outputs;
|
inherit (self) outputs;
|
||||||
inherit (inputs.nixpkgs) lib;
|
inherit (inputs.nixpkgs) lib;
|
||||||
utils = import ./utils { inherit lib; };
|
myUtils = import ./utils { inherit lib; };
|
||||||
hostDirNames = utils.dirNames ./hosts;
|
hostDirNames = myUtils.dirNames ./hosts;
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
dotsPath = ./dots;
|
dotsPath = ./dots;
|
||||||
gitHooks = import ./git-hooks.nix {
|
gitHooks = import ./git-hooks.nix {
|
||||||
@@ -70,19 +70,24 @@
|
|||||||
};
|
};
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nix.nixPath = [
|
|
||||||
"nixpkgs=${inputs.nixpkgs}"
|
|
||||||
]; # <https://github.com/nix-community/nixd/blob/main/nixd/docs/configuration.md>
|
|
||||||
nixosConfigurations =
|
nixosConfigurations =
|
||||||
(lib.genAttrs hostDirNames (
|
(lib.genAttrs hostDirNames (
|
||||||
host:
|
host:
|
||||||
nixpkgs.lib.nixosSystem {
|
nixpkgs.lib.nixosSystem {
|
||||||
modules = [
|
modules = [
|
||||||
./hosts/${host}
|
./hosts/${host}
|
||||||
{ nixpkgs.hostPlatform = import ./hosts/${host}/system.nix; }
|
{
|
||||||
|
nixpkgs.hostPlatform = (myUtils.hostMeta ./hosts/${host}).system;
|
||||||
|
host.name = host;
|
||||||
|
}
|
||||||
];
|
];
|
||||||
specialArgs = {
|
specialArgs = {
|
||||||
inherit inputs outputs dotsPath;
|
inherit
|
||||||
|
inputs
|
||||||
|
outputs
|
||||||
|
dotsPath
|
||||||
|
myUtils
|
||||||
|
;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
))
|
))
|
||||||
@@ -97,7 +102,12 @@
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
specialArgs = {
|
specialArgs = {
|
||||||
inherit inputs outputs dotsPath;
|
inherit
|
||||||
|
inputs
|
||||||
|
outputs
|
||||||
|
dotsPath
|
||||||
|
myUtils
|
||||||
|
;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
sd-image-raspberry-pi-aarch64 = nixpkgs.lib.nixosSystem {
|
sd-image-raspberry-pi-aarch64 = nixpkgs.lib.nixosSystem {
|
||||||
@@ -110,7 +120,12 @@
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
specialArgs = {
|
specialArgs = {
|
||||||
inherit inputs outputs dotsPath;
|
inherit
|
||||||
|
inputs
|
||||||
|
outputs
|
||||||
|
dotsPath
|
||||||
|
myUtils
|
||||||
|
;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -123,14 +138,19 @@
|
|||||||
};
|
};
|
||||||
modules = [ ./home/hosts/work ];
|
modules = [ ./home/hosts/work ];
|
||||||
extraSpecialArgs = {
|
extraSpecialArgs = {
|
||||||
inherit inputs outputs dotsPath;
|
inherit
|
||||||
|
inputs
|
||||||
|
outputs
|
||||||
|
dotsPath
|
||||||
|
myUtils
|
||||||
|
;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
apps.${system}.colmena = inputs.colmena.apps.${system}.default;
|
apps.${system}.colmena = inputs.colmena.apps.${system}.default;
|
||||||
|
|
||||||
colmena = import ./deploy/colmena.nix {
|
colmenaHive = import ./deploy/colmena.nix {
|
||||||
inherit
|
inherit
|
||||||
self
|
self
|
||||||
inputs
|
inputs
|
||||||
|
|||||||
@@ -5,54 +5,60 @@
|
|||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
|
||||||
username = "h";
|
|
||||||
in
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
../../modules
|
../../modules
|
||||||
../../modules/ai-tools.nix
|
../../modules/3d
|
||||||
|
../../modules/ai-tools
|
||||||
|
../../modules/anki
|
||||||
../../modules/audio
|
../../modules/audio
|
||||||
|
../../modules/browser
|
||||||
../../modules/cloud
|
../../modules/cloud
|
||||||
../../modules/comms
|
../../modules/comms
|
||||||
../../modules/desktop/niri
|
../../modules/desktop/niri
|
||||||
|
../../modules/devenv
|
||||||
../../modules/direnv
|
../../modules/direnv
|
||||||
../../modules/3d
|
|
||||||
../../modules/git
|
../../modules/git
|
||||||
../../modules/k8s/k9s.nix
|
../../modules/k8s/k9s.nix
|
||||||
../../modules/kitty.nix
|
../../modules/keepassxc
|
||||||
../../modules/music
|
../../modules/music
|
||||||
../../modules/nvim.nix
|
../../modules/nvim
|
||||||
../../modules/pandoc.nix
|
../../modules/pandoc
|
||||||
../../modules/ssh.nix
|
|
||||||
../../modules/taskwarrior.nix
|
|
||||||
../../modules/keepassxc.nix
|
|
||||||
../../modules/anki.nix
|
|
||||||
../../modules/photography
|
../../modules/photography
|
||||||
../../modules/browser
|
../../modules/secrets
|
||||||
../../modules/shell
|
../../modules/shell
|
||||||
|
../../modules/ssh
|
||||||
|
../../modules/taskwarrior
|
||||||
|
../../modules/terminal
|
||||||
|
../../modules/zk
|
||||||
|
../../modules/torrenting
|
||||||
];
|
];
|
||||||
|
|
||||||
home = {
|
home = {
|
||||||
stateVersion = "25.05";
|
stateVersion = "25.05";
|
||||||
inherit username;
|
inherit (config.host) username;
|
||||||
homeDirectory = "/home/${username}";
|
homeDirectory = "/home/${config.host.username}";
|
||||||
};
|
};
|
||||||
|
|
||||||
xdg.userDirs.createDirectories = false;
|
xdg.userDirs.createDirectories = false;
|
||||||
xdg.userDirs.download = "${config.home.homeDirectory}/dl";
|
xdg.userDirs.download = "${config.home.homeDirectory}/dl";
|
||||||
|
|
||||||
ai-tools.opencode.enable = true;
|
modules."3d" = {
|
||||||
|
printing.enable = true;
|
||||||
|
modeling.enable = true;
|
||||||
|
};
|
||||||
|
ai-tools = {
|
||||||
|
claude-code.enable = true;
|
||||||
|
opencode.enable = true;
|
||||||
|
};
|
||||||
browser.primary = "librewolf";
|
browser.primary = "librewolf";
|
||||||
cloud.hetzner.enable = true;
|
cloud.hetzner.enable = true;
|
||||||
comms.signal.enable = true;
|
comms.signal.enable = true;
|
||||||
github.enable = true;
|
git.github.enable = true;
|
||||||
pandoc.enable = true;
|
shell.bash.aliases.lang-js = true;
|
||||||
|
shell.bash.addBinToPath = true;
|
||||||
shell.bash = {
|
torrenting.enable = true;
|
||||||
enable = true;
|
zk.enable = true;
|
||||||
aliases.lang-js = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
programs = {
|
programs = {
|
||||||
home-manager.enable = true;
|
home-manager.enable = true;
|
||||||
|
|||||||
@@ -4,54 +4,55 @@
|
|||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
|
||||||
username = "h";
|
|
||||||
in
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
../../modules
|
../../modules
|
||||||
../../modules/ai-tools.nix
|
../../modules/3d
|
||||||
|
../../modules/ai-tools
|
||||||
|
../../modules/anki
|
||||||
../../modules/audio
|
../../modules/audio
|
||||||
../../modules/anki.nix
|
../../modules/browser
|
||||||
../../modules/cloud
|
../../modules/cloud
|
||||||
../../modules/comms
|
../../modules/comms
|
||||||
../../modules/direnv
|
|
||||||
../../modules/desktop/niri
|
../../modules/desktop/niri
|
||||||
|
../../modules/devenv
|
||||||
|
../../modules/direnv
|
||||||
../../modules/git
|
../../modules/git
|
||||||
../../modules/k8s/k9s.nix
|
../../modules/k8s/k9s.nix
|
||||||
../../modules/kitty.nix
|
../../modules/keepassxc
|
||||||
../../modules/music
|
../../modules/music
|
||||||
../../modules/nfc
|
../../modules/nfc
|
||||||
../../modules/nvim.nix
|
../../modules/nvim
|
||||||
../../modules/pandoc.nix
|
../../modules/pandoc
|
||||||
../../modules/ssh.nix
|
../../modules/secrets
|
||||||
../../modules/taskwarrior.nix
|
|
||||||
../../modules/keepassxc.nix
|
|
||||||
../../modules/browser
|
|
||||||
../../modules/shell
|
../../modules/shell
|
||||||
|
../../modules/ssh
|
||||||
|
../../modules/taskwarrior
|
||||||
|
../../modules/terminal
|
||||||
];
|
];
|
||||||
|
|
||||||
home = {
|
home = {
|
||||||
stateVersion = "25.05";
|
stateVersion = "25.05";
|
||||||
inherit username;
|
inherit (config.host) username;
|
||||||
homeDirectory = "/home/${username}";
|
homeDirectory = "/home/${config.host.username}";
|
||||||
};
|
};
|
||||||
|
|
||||||
xdg.userDirs.createDirectories = false;
|
xdg.userDirs = {
|
||||||
xdg.userDirs.download = "${config.home.homeDirectory}/dl";
|
enable = false;
|
||||||
|
createDirectories = false;
|
||||||
|
};
|
||||||
|
|
||||||
ai-tools.opencode.enable = true;
|
modules."3d".printing.enable = true;
|
||||||
|
ai-tools = {
|
||||||
|
claude-code.enable = true;
|
||||||
|
opencode.enable = true;
|
||||||
|
};
|
||||||
browser.primary = "librewolf";
|
browser.primary = "librewolf";
|
||||||
cloud.hetzner.enable = true;
|
cloud.hetzner.enable = true;
|
||||||
comms.signal.enable = true;
|
comms.signal.enable = true;
|
||||||
github.enable = true;
|
git.github.enable = true;
|
||||||
nfc.proxmark3.enable = true;
|
shell.bash.aliases.lang-js = true;
|
||||||
pandoc.enable = true;
|
shell.bash.addBinToPath = true;
|
||||||
|
|
||||||
shell.bash = {
|
|
||||||
enable = true;
|
|
||||||
aliases.lang-js = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
programs = {
|
programs = {
|
||||||
home-manager.enable = true;
|
home-manager.enable = true;
|
||||||
|
|||||||
@@ -15,10 +15,8 @@ with pkgs;
|
|||||||
ripgrep
|
ripgrep
|
||||||
silver-searcher
|
silver-searcher
|
||||||
sops
|
sops
|
||||||
sshfs
|
|
||||||
tldr
|
tldr
|
||||||
tree
|
tree
|
||||||
unzip
|
unzip
|
||||||
vimPlugins.vim-plug
|
|
||||||
wget
|
wget
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -5,85 +5,57 @@
|
|||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
|
||||||
username = "hektor";
|
|
||||||
in
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
inputs.sops-nix.homeManagerModules.sops
|
inputs.sops-nix.homeManagerModules.sops
|
||||||
../../modules
|
../../modules
|
||||||
../../modules/stylix.nix
|
../../modules/ai-tools
|
||||||
../../modules/ai-tools.nix
|
../../modules/anki
|
||||||
../../modules/anki.nix
|
../../modules/browser
|
||||||
|
../../modules/bruno
|
||||||
../../modules/cloud
|
../../modules/cloud
|
||||||
../../modules/comms
|
../../modules/comms
|
||||||
|
../../modules/database
|
||||||
|
../../modules/dconf
|
||||||
../../modules/desktop/niri
|
../../modules/desktop/niri
|
||||||
../../modules/dconf.nix
|
../../modules/devenv
|
||||||
../../modules/direnv
|
../../modules/direnv
|
||||||
../../modules/docker
|
../../modules/docker
|
||||||
../../modules/git
|
../../modules/git
|
||||||
../../modules/go
|
../../modules/go
|
||||||
|
../../modules/infra
|
||||||
../../modules/k8s
|
../../modules/k8s
|
||||||
../../modules/k8s/k9s.nix
|
../../modules/k8s/k9s.nix
|
||||||
../../modules/keepassxc.nix
|
../../modules/keepassxc
|
||||||
../../modules/kitty.nix
|
|
||||||
../../modules/nvim.nix
|
|
||||||
../../modules/pandoc.nix
|
|
||||||
../../modules/secrets
|
|
||||||
../../modules/browser
|
|
||||||
../../modules/shell
|
|
||||||
../../modules/music
|
../../modules/music
|
||||||
../../modules/nodejs.nix
|
../../modules/nodejs
|
||||||
../../modules/taskwarrior.nix
|
../../modules/nvim
|
||||||
../../modules/bruno.nix
|
../../modules/pandoc
|
||||||
../../modules/pandoc.nix
|
../../modules/secrets
|
||||||
../../modules/vscode.nix
|
../../modules/shell
|
||||||
|
../../modules/stylix
|
||||||
|
../../modules/taskwarrior
|
||||||
|
../../modules/ticketing
|
||||||
|
../../modules/terminal
|
||||||
|
../../modules/vscode
|
||||||
];
|
];
|
||||||
|
|
||||||
sops = {
|
sops.age.keyFile = "${config.home.homeDirectory}/.config/sops/age/keys.txt";
|
||||||
age.keyFile = "${config.home.homeDirectory}/.config/sops/age/keys.txt";
|
|
||||||
defaultSopsFile = "${inputs.nix-secrets}/secrets.yaml";
|
|
||||||
|
|
||||||
secrets = {
|
|
||||||
taskwarrior_sync_server_url = { };
|
|
||||||
taskwarrior_sync_server_client_id = { };
|
|
||||||
taskwarrior_sync_encryption_secret = { };
|
|
||||||
anki_sync_user = { };
|
|
||||||
anki_sync_key = { };
|
|
||||||
opencode_api_key = { };
|
|
||||||
};
|
|
||||||
|
|
||||||
templates = {
|
|
||||||
"taskrc.d/sync" = {
|
|
||||||
content = ''
|
|
||||||
sync.server.url=${config.sops.placeholder.taskwarrior_sync_server_url}
|
|
||||||
sync.server.client_id=${config.sops.placeholder.taskwarrior_sync_server_client_id}
|
|
||||||
sync.encryption_secret=${config.sops.placeholder.taskwarrior_sync_encryption_secret}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
"opencode/auth.json" = {
|
|
||||||
path = "${config.home.homeDirectory}/.local/share/opencode/auth.json";
|
|
||||||
content = ''
|
|
||||||
{
|
|
||||||
"zai-coding-plan": {
|
|
||||||
"type": "api",
|
|
||||||
"key": "${config.sops.placeholder.opencode_api_key}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
nixpkgs.config.allowUnfree = true;
|
nixpkgs.config.allowUnfree = true;
|
||||||
|
|
||||||
xdg.systemDirs.config = [ "/etc/xdg" ];
|
xdg = {
|
||||||
|
systemDirs.config = [ "/etc/xdg" ];
|
||||||
|
userDirs = {
|
||||||
|
createDirectories = false;
|
||||||
|
download = "${config.home.homeDirectory}/dl";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
home = {
|
home = {
|
||||||
stateVersion = "25.05";
|
stateVersion = "25.05";
|
||||||
inherit username;
|
username = "hektor";
|
||||||
homeDirectory = "/home/${username}";
|
homeDirectory = "/home/${config.home.username}";
|
||||||
};
|
};
|
||||||
|
|
||||||
targets.genericLinux.nixGL = {
|
targets.genericLinux.nixGL = {
|
||||||
@@ -98,18 +70,17 @@ in
|
|||||||
comms.teams.enable = true;
|
comms.teams.enable = true;
|
||||||
ai-tools = {
|
ai-tools = {
|
||||||
claude-code.enable = true;
|
claude-code.enable = true;
|
||||||
|
tirith.enable = true;
|
||||||
opencode.enable = true;
|
opencode.enable = true;
|
||||||
};
|
};
|
||||||
github.enable = true;
|
database = {
|
||||||
gitlab.enable = true;
|
mssql.enable = true;
|
||||||
pandoc.enable = true;
|
postgresql.enable = true;
|
||||||
secrets = {
|
redis.enable = true;
|
||||||
enable = true;
|
|
||||||
vault.enable = true;
|
|
||||||
};
|
};
|
||||||
|
git.github.enable = true;
|
||||||
shell.bash.enable = true;
|
git.gitlab.enable = true;
|
||||||
starship.enable = true;
|
secrets.vault.enable = true;
|
||||||
|
|
||||||
programs = {
|
programs = {
|
||||||
gh.enable = true;
|
gh.enable = true;
|
||||||
|
|||||||
@@ -1,11 +1,32 @@
|
|||||||
{ pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules."3d";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.modules."3d" = {
|
||||||
|
printing.enable = lib.mkEnableOption "3D printing tools";
|
||||||
|
modeling.enable = lib.mkEnableOption "3D modeling tools";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkMerge [
|
||||||
|
(lib.mkIf cfg.printing.enable {
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
bambu-studio
|
bambu-studio
|
||||||
|
orca-slicer
|
||||||
|
];
|
||||||
|
})
|
||||||
|
(lib.mkIf cfg.modeling.enable {
|
||||||
|
home.packages = with pkgs; [
|
||||||
blender
|
blender
|
||||||
openscad-lsp
|
openscad-lsp
|
||||||
openscad-unstable
|
openscad-unstable
|
||||||
orca-slicer
|
];
|
||||||
|
})
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,89 +0,0 @@
|
|||||||
{
|
|
||||||
lib,
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
let
|
|
||||||
cfg = config.ai-tools;
|
|
||||||
rtk-version = "0.18.1";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
options.ai-tools = {
|
|
||||||
claude-code.enable = lib.mkEnableOption "claude code with rtk and ccline";
|
|
||||||
opencode.enable = lib.mkEnableOption "opencode";
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkMerge [
|
|
||||||
(lib.mkIf cfg.claude-code.enable {
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
claude-code
|
|
||||||
(pkgs.stdenv.mkDerivation {
|
|
||||||
name = "ccline";
|
|
||||||
src = pkgs.fetchurl {
|
|
||||||
url = "https://github.com/Haleclipse/CCometixLine/releases/download/v1.0.8/ccline-linux-x64.tar.gz";
|
|
||||||
hash = "sha256-Joe3Dd6uSMGi66QT6xr2oY/Tz8rA5RuKa6ckBVJIzI0=";
|
|
||||||
};
|
|
||||||
|
|
||||||
unpackPhase = ''
|
|
||||||
tar xzf $src
|
|
||||||
'';
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out/bin
|
|
||||||
cp ccline $out/bin/
|
|
||||||
chmod +x $out/bin/ccline
|
|
||||||
'';
|
|
||||||
|
|
||||||
meta = with pkgs.lib; {
|
|
||||||
description = "CCometixLine Linux x64 CLI (Claude Code statusline)";
|
|
||||||
homepage = "https://github.com/Haleclipse/CCometixLine";
|
|
||||||
license = licenses.mit;
|
|
||||||
platforms = [ "x86_64-linux" ];
|
|
||||||
};
|
|
||||||
})
|
|
||||||
(pkgs.stdenv.mkDerivation {
|
|
||||||
name = "rtk-${rtk-version}";
|
|
||||||
version = rtk-version;
|
|
||||||
src = pkgs.fetchurl {
|
|
||||||
url = "https://github.com/rtk-ai/rtk/releases/download/v${rtk-version}/rtk-x86_64-unknown-linux-gnu.tar.gz";
|
|
||||||
hash = "sha256-XoTia5K8b00OzcKYCufwx8ApkAS31DxUCpGSU0jFs2Q=";
|
|
||||||
};
|
|
||||||
|
|
||||||
unpackPhase = ''
|
|
||||||
tar xzf $src
|
|
||||||
'';
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out/bin
|
|
||||||
cp rtk $out/bin/
|
|
||||||
chmod +x $out/bin/rtk
|
|
||||||
'';
|
|
||||||
|
|
||||||
meta = with pkgs.lib; {
|
|
||||||
description = "RTK - AI coding tool enhancer";
|
|
||||||
homepage = "https://www.rtk-ai.app";
|
|
||||||
license = licenses.mit;
|
|
||||||
platforms = [ "x86_64-linux" ];
|
|
||||||
};
|
|
||||||
})
|
|
||||||
mcp-nixos
|
|
||||||
];
|
|
||||||
})
|
|
||||||
(lib.mkIf cfg.opencode.enable {
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
opencode
|
|
||||||
];
|
|
||||||
home.file.".config/opencode/opencode.json".text = builtins.toJSON {
|
|
||||||
"$schema" = "https://opencode.ai/config.json";
|
|
||||||
permission = {
|
|
||||||
external_directory = {
|
|
||||||
"/run/secrets/" = "deny";
|
|
||||||
"~/.config/sops/age/keys.txt" = "deny";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
plugin = [ "@mohak34/opencode-notifier@latest" ];
|
|
||||||
};
|
|
||||||
})
|
|
||||||
];
|
|
||||||
}
|
|
||||||
60
home/modules/ai-tools/claude-code.nix
Normal file
60
home/modules/ai-tools/claude-code.nix
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.ai-tools.claude-code;
|
||||||
|
rtk-version = "0.18.1";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ai-tools.claude-code.enable = lib.mkEnableOption "claude code with rtk and ccline";
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
programs.claude-code.enable = true;
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
(stdenv.mkDerivation {
|
||||||
|
name = "ccline";
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://github.com/Haleclipse/CCometixLine/releases/download/v1.0.8/ccline-linux-x64.tar.gz";
|
||||||
|
hash = "sha256-Joe3Dd6uSMGi66QT6xr2oY/Tz8rA5RuKa6ckBVJIzI0=";
|
||||||
|
};
|
||||||
|
unpackPhase = "tar xzf $src";
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
cp ccline $out/bin/
|
||||||
|
chmod +x $out/bin/ccline
|
||||||
|
'';
|
||||||
|
meta = {
|
||||||
|
description = "CCometixLine Linux x64 CLI (Claude Code statusline)";
|
||||||
|
homepage = "https://github.com/Haleclipse/CCometixLine";
|
||||||
|
license = lib.licenses.mit;
|
||||||
|
platforms = [ "x86_64-linux" ];
|
||||||
|
};
|
||||||
|
})
|
||||||
|
(stdenv.mkDerivation {
|
||||||
|
name = "rtk-${rtk-version}";
|
||||||
|
version = rtk-version;
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://github.com/rtk-ai/rtk/releases/download/v${rtk-version}/rtk-x86_64-unknown-linux-gnu.tar.gz";
|
||||||
|
hash = "sha256-XoTia5K8b00OzcKYCufwx8ApkAS31DxUCpGSU0jFs2Q=";
|
||||||
|
};
|
||||||
|
unpackPhase = "tar xzf $src";
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
cp rtk $out/bin/
|
||||||
|
chmod +x $out/bin/rtk
|
||||||
|
'';
|
||||||
|
meta = {
|
||||||
|
description = "RTK - AI coding tool enhancer";
|
||||||
|
homepage = "https://www.rtk-ai.app";
|
||||||
|
license = lib.licenses.mit;
|
||||||
|
platforms = [ "x86_64-linux" ];
|
||||||
|
};
|
||||||
|
})
|
||||||
|
mcp-nixos
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
8
home/modules/ai-tools/default.nix
Normal file
8
home/modules/ai-tools/default.nix
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./claude-code.nix
|
||||||
|
./opencode.nix
|
||||||
|
./skills.nix
|
||||||
|
./tirith.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
40
home/modules/ai-tools/opencode.nix
Normal file
40
home/modules/ai-tools/opencode.nix
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.ai-tools.opencode;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ai-tools.opencode = {
|
||||||
|
enable = lib.mkEnableOption "opencode";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
home.packages = [ pkgs.opencode ];
|
||||||
|
|
||||||
|
home.file.".config/opencode/opencode.json".text = builtins.toJSON {
|
||||||
|
"$schema" = "https://opencode.ai/config.json";
|
||||||
|
permission = {
|
||||||
|
external_directory = {
|
||||||
|
"/run/secrets/" = "deny";
|
||||||
|
"~/.config/sops/age/keys.txt" = "deny";
|
||||||
|
"~/.ssh/id_rsa" = "deny";
|
||||||
|
"~/.ssh/id_ed25519" = "deny";
|
||||||
|
"~/.ssh/id_ecdsa" = "deny";
|
||||||
|
"~/.ssh/id_dsa" = "deny";
|
||||||
|
"/etc/ssh/ssh_host_rsa_key" = "deny";
|
||||||
|
"/etc/ssh/ssh_host_ed25519_key" = "deny";
|
||||||
|
"/etc/ssh/ssh_host_ecdsa_key" = "deny";
|
||||||
|
"/etc/ssh/ssh_host_dsa_key" = "deny";
|
||||||
|
};
|
||||||
|
command = {
|
||||||
|
sops = "deny";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
plugin = [ "@mohak34/opencode-notifier@latest" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
49
home/modules/ai-tools/skills.nix
Normal file
49
home/modules/ai-tools/skills.nix
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.ai-tools.claude-code;
|
||||||
|
|
||||||
|
skillType = lib.types.submodule {
|
||||||
|
options = {
|
||||||
|
owner = lib.mkOption { type = lib.types.str; };
|
||||||
|
repo = lib.mkOption { type = lib.types.str; };
|
||||||
|
rev = lib.mkOption { type = lib.types.str; };
|
||||||
|
hash = lib.mkOption { type = lib.types.str; };
|
||||||
|
skill = lib.mkOption { type = lib.types.str; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
fetchSkill =
|
||||||
|
skill:
|
||||||
|
let
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
inherit (skill)
|
||||||
|
owner
|
||||||
|
repo
|
||||||
|
rev
|
||||||
|
hash
|
||||||
|
;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
name = ".claude/skills/${skill.skill}";
|
||||||
|
value = {
|
||||||
|
source = "${src}/${skill.skill}";
|
||||||
|
recursive = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ai-tools.claude-code.skills = lib.mkOption {
|
||||||
|
type = lib.types.listOf skillType;
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
home.file = builtins.listToAttrs (map fetchSkill cfg.skills);
|
||||||
|
};
|
||||||
|
}
|
||||||
190
home/modules/ai-tools/tirith-check.py
Executable file
190
home/modules/ai-tools/tirith-check.py
Executable file
@@ -0,0 +1,190 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Claude Code PreToolUse hook — runs tirith check on Bash tool calls.
|
||||||
|
|
||||||
|
Reads JSON from stdin (Claude Code hook protocol), extracts the command,
|
||||||
|
and delegates to `tirith check --json` for security analysis.
|
||||||
|
|
||||||
|
Exit codes:
|
||||||
|
0 — hook completed successfully (decision in stdout JSON)
|
||||||
|
Non-zero — hook error (fail-closed by default; set TIRITH_FAIL_OPEN=1 for fail-open)
|
||||||
|
|
||||||
|
Output (stdout, only for deny):
|
||||||
|
{
|
||||||
|
"hookSpecificOutput": {
|
||||||
|
"hookEventName": "PreToolUse",
|
||||||
|
"permissionDecision": "deny",
|
||||||
|
"permissionDecisionReason": "..."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Environment:
|
||||||
|
TIRITH_BIN — path to tirith binary (default: "tirith")
|
||||||
|
TIRITH_HOOK_WARN_ACTION — "deny" (default) or "allow"
|
||||||
|
"""
|
||||||
|
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def get(data, *keys):
|
||||||
|
"""Return the first matching key from data (supports dual-case fields)."""
|
||||||
|
for k in keys:
|
||||||
|
if k in data:
|
||||||
|
return data[k]
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def deny(reason):
|
||||||
|
"""Print a deny decision using hookSpecificOutput and exit 0."""
|
||||||
|
print(
|
||||||
|
json.dumps(
|
||||||
|
{
|
||||||
|
"hookSpecificOutput": {
|
||||||
|
"hookEventName": "PreToolUse",
|
||||||
|
"permissionDecision": "deny",
|
||||||
|
"permissionDecisionReason": reason,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
|
||||||
|
def fail_action():
|
||||||
|
"""Return the fail action: deny (default, fail-closed) or allow (fail-open via env)."""
|
||||||
|
return "allow" if os.environ.get("TIRITH_FAIL_OPEN") == "1" else "deny"
|
||||||
|
|
||||||
|
|
||||||
|
def fail_closed(reason):
|
||||||
|
"""Deny or allow based on TIRITH_FAIL_OPEN, for error/missing-binary paths."""
|
||||||
|
action = fail_action()
|
||||||
|
if action == "deny":
|
||||||
|
deny(reason)
|
||||||
|
else:
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
try:
|
||||||
|
raw = sys.stdin.read()
|
||||||
|
if not raw.strip():
|
||||||
|
# Empty input — cannot determine command, fail-closed
|
||||||
|
fail_closed("tirith: empty hook input — blocked for safety")
|
||||||
|
return
|
||||||
|
data = json.loads(raw)
|
||||||
|
except (json.JSONDecodeError, OSError):
|
||||||
|
fail_closed("tirith: failed to parse hook input — blocked for safety")
|
||||||
|
return
|
||||||
|
|
||||||
|
if not isinstance(data, dict):
|
||||||
|
fail_closed("tirith: invalid hook input format — blocked for safety")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Dual-case field extraction (camelCase and snake_case)
|
||||||
|
event = get(data, "hook_event_name", "hookEventName")
|
||||||
|
tool = get(data, "tool_name", "toolName")
|
||||||
|
tool_input = get(data, "tool_input", "toolInput") or {}
|
||||||
|
|
||||||
|
# Only intercept PreToolUse + Bash
|
||||||
|
if event != "PreToolUse" or tool != "Bash":
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
if not isinstance(tool_input, dict):
|
||||||
|
fail_closed("tirith: invalid tool_input format — blocked for safety")
|
||||||
|
return
|
||||||
|
|
||||||
|
command = tool_input.get("command")
|
||||||
|
if not isinstance(command, str) or not command.strip():
|
||||||
|
fail_closed("tirith: no command found in hook input — blocked for safety")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Locate tirith binary
|
||||||
|
tirith_bin = os.environ.get("TIRITH_BIN") or shutil.which("tirith") or "tirith"
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = subprocess.run(
|
||||||
|
[
|
||||||
|
tirith_bin,
|
||||||
|
"check",
|
||||||
|
"--json",
|
||||||
|
"--non-interactive",
|
||||||
|
"--shell",
|
||||||
|
"posix",
|
||||||
|
"--",
|
||||||
|
command,
|
||||||
|
],
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
timeout=10,
|
||||||
|
)
|
||||||
|
except FileNotFoundError:
|
||||||
|
fail_closed(f"tirith: {tirith_bin} not found — install tirith or set TIRITH_FAIL_OPEN=1")
|
||||||
|
return
|
||||||
|
except subprocess.TimeoutExpired:
|
||||||
|
fail_closed("tirith: check timed out — blocked for safety")
|
||||||
|
return
|
||||||
|
except OSError as e:
|
||||||
|
fail_closed(f"tirith: OS error running check — {e}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Unexpected exit code — fail-closed
|
||||||
|
if result.returncode not in (0, 1, 2):
|
||||||
|
fail_closed(f"tirith: unexpected exit code {result.returncode} — blocked for safety")
|
||||||
|
return
|
||||||
|
if result.returncode != 0 and not result.stdout.strip():
|
||||||
|
fail_closed("tirith: check returned non-zero with no output — blocked for safety")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Exit 0 = clean, allow
|
||||||
|
if result.returncode == 0:
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
# Exit 2 = warn — check TIRITH_HOOK_WARN_ACTION
|
||||||
|
if result.returncode == 2:
|
||||||
|
warn_action = os.environ.get("TIRITH_HOOK_WARN_ACTION", "deny").lower()
|
||||||
|
if warn_action == "allow":
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
# Exit 1 = block, Exit 2 + deny = block
|
||||||
|
# Build reason from tirith JSON output
|
||||||
|
reason = "Tirith security check failed"
|
||||||
|
if result.stdout.strip():
|
||||||
|
try:
|
||||||
|
verdict = json.loads(result.stdout)
|
||||||
|
findings = verdict.get("findings", [])
|
||||||
|
if findings:
|
||||||
|
parts = []
|
||||||
|
for f in findings:
|
||||||
|
title = f.get("title", f.get("rule_id", "unknown"))
|
||||||
|
severity = f.get("severity", "")
|
||||||
|
parts.append(f"[{severity}] {title}" if severity else title)
|
||||||
|
reason = "Tirith: " + "; ".join(parts)
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
reason = result.stdout.strip()[:500]
|
||||||
|
|
||||||
|
deny(reason)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
try:
|
||||||
|
main()
|
||||||
|
except Exception:
|
||||||
|
# Fail-closed on unexpected errors (respects TIRITH_FAIL_OPEN)
|
||||||
|
if os.environ.get("TIRITH_FAIL_OPEN") == "1":
|
||||||
|
sys.exit(0)
|
||||||
|
# Deny — print structured output so Claude Code shows a message
|
||||||
|
print(
|
||||||
|
json.dumps(
|
||||||
|
{
|
||||||
|
"hookSpecificOutput": {
|
||||||
|
"hookEventName": "PreToolUse",
|
||||||
|
"permissionDecision": "deny",
|
||||||
|
"permissionDecisionReason": "tirith: unexpected hook error — blocked for safety",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
sys.exit(0)
|
||||||
30
home/modules/ai-tools/tirith.nix
Normal file
30
home/modules/ai-tools/tirith.nix
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.ai-tools.tirith;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ai-tools.tirith = {
|
||||||
|
enable = lib.mkEnableOption "tirith shell security guard";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkMerge [
|
||||||
|
(lib.mkIf cfg.enable {
|
||||||
|
home.packages = [ pkgs.tirith ];
|
||||||
|
})
|
||||||
|
(lib.mkIf (cfg.enable && config.ai-tools.claude-code.enable) {
|
||||||
|
home.file.".claude/hooks/tirith-check.py" = {
|
||||||
|
source = ./tirith-check.py;
|
||||||
|
executable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
home.activation.tirith-claude-code = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
|
||||||
|
${pkgs.tirith}/bin/tirith setup claude-code --with-mcp --scope user --force 2>/dev/null || true
|
||||||
|
'';
|
||||||
|
})
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
osConfig ? null,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
hmSopsAvailable = config ? sops && config.sops ? secrets;
|
|
||||||
osSopsAvailable = osConfig != null && osConfig ? sops && osConfig.sops ? secrets;
|
|
||||||
sopsAvailable = hmSopsAvailable || osSopsAvailable;
|
|
||||||
|
|
||||||
sopsSecrets = if hmSopsAvailable then config.sops.secrets else osConfig.sops.secrets;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
warnings = lib.optional (
|
|
||||||
!sopsAvailable && config.programs.anki.enable
|
|
||||||
) "anki is enabled but sops secrets are not available. anki sync will not be configured.";
|
|
||||||
|
|
||||||
programs.anki = {
|
|
||||||
enable = true;
|
|
||||||
package = config.nixgl.wrap pkgs.anki;
|
|
||||||
addons = with pkgs.ankiAddons; [
|
|
||||||
anki-connect
|
|
||||||
puppy-reinforcement
|
|
||||||
review-heatmap
|
|
||||||
];
|
|
||||||
sync = lib.mkIf sopsAvailable {
|
|
||||||
usernameFile = "${sopsSecrets."anki_sync_user".path}";
|
|
||||||
keyFile = "${sopsSecrets."anki_sync_key".path}";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
41
home/modules/anki/default.nix
Normal file
41
home/modules/anki/default.nix
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
myUtils,
|
||||||
|
osConfig ? null,
|
||||||
|
inputs ? null,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
sops = myUtils.sopsAvailability config osConfig;
|
||||||
|
standalone = osConfig == null;
|
||||||
|
in
|
||||||
|
lib.optionalAttrs standalone {
|
||||||
|
sops.secrets = myUtils.mkSopsSecrets "${toString inputs.nix-secrets}/secrets" null {
|
||||||
|
anki = [
|
||||||
|
"sync-user"
|
||||||
|
"sync-key"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// {
|
||||||
|
warnings = lib.optional (
|
||||||
|
!sops.available && config.programs.anki.enable
|
||||||
|
) "anki is enabled but sops secrets are not available. anki sync will not be configured.";
|
||||||
|
|
||||||
|
programs.anki = {
|
||||||
|
enable = true;
|
||||||
|
package = config.nixgl.wrap pkgs.anki;
|
||||||
|
addons = with pkgs.ankiAddons; [
|
||||||
|
anki-connect
|
||||||
|
puppy-reinforcement
|
||||||
|
review-heatmap
|
||||||
|
];
|
||||||
|
profiles."User 1".sync = lib.mkIf sops.available {
|
||||||
|
usernameFile = "${sops.secrets."anki/sync-user".path}";
|
||||||
|
keyFile = "${sops.secrets."anki/sync-key".path}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
{ pkgs, ... }:
|
{ osConfig, pkgs, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
home.packages = with pkgs; [ pulsemixer ];
|
home.packages = with pkgs; [ pulsemixer ];
|
||||||
|
|
||||||
|
services.mpris-proxy.enable = osConfig.hardware.bluetooth.enable or false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
{ lib, ... }:
|
{ config, lib, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
options.browser = {
|
options.browser = {
|
||||||
@@ -23,6 +23,8 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
config.home.sessionVariables.BROWSER = config.browser.primary;
|
||||||
|
|
||||||
imports = [
|
imports = [
|
||||||
./firefox.nix
|
./firefox.nix
|
||||||
./librewolf.nix
|
./librewolf.nix
|
||||||
|
|||||||
7
home/modules/clipboard/default.nix
Normal file
7
home/modules/clipboard/default.nix
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{ pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
wl-clipboard
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -14,8 +14,7 @@ in
|
|||||||
warnings =
|
warnings =
|
||||||
lib.optional (!isNixOS)
|
lib.optional (!isNixOS)
|
||||||
"hcloud module requires NixOS host configuration. This module will not work with standalone home-manager.";
|
"hcloud module requires NixOS host configuration. This module will not work with standalone home-manager.";
|
||||||
home = {
|
|
||||||
packages = with pkgs; [ hcloud ];
|
home.packages = with pkgs; [ hcloud ];
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
26
home/modules/database/default.nix
Normal file
26
home/modules/database/default.nix
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
{
|
||||||
|
options.database = {
|
||||||
|
mssql.enable = lib.mkEnableOption "MSSQL";
|
||||||
|
postgresql.enable = lib.mkEnableOption "PostgreSQL";
|
||||||
|
redis.enable = lib.mkEnableOption "Redis";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkMerge [
|
||||||
|
(lib.mkIf config.database.mssql.enable {
|
||||||
|
home.packages = with pkgs; [ (config.nixgl.wrap dbeaver-bin) ];
|
||||||
|
})
|
||||||
|
(lib.mkIf config.database.postgresql.enable {
|
||||||
|
home.packages = with pkgs; [ (config.nixgl.wrap pgadmin4-desktopmode) ];
|
||||||
|
})
|
||||||
|
(lib.mkIf config.database.postgresql.enable {
|
||||||
|
home.packages = with pkgs; [ redis ];
|
||||||
|
})
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
let
|
let
|
||||||
terminal = "kitty";
|
terminal = "kitty";
|
||||||
browser = config.browser.primary;
|
browser = config.browser.primary;
|
||||||
|
font = "${config.stylix.fonts.monospace.name} ${toString config.stylix.fonts.sizes.applications}";
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
dconf.settings = {
|
dconf.settings = {
|
||||||
@@ -40,9 +41,9 @@ in
|
|||||||
clock-show-weekday = true;
|
clock-show-weekday = true;
|
||||||
color-scheme = "prefer-dark";
|
color-scheme = "prefer-dark";
|
||||||
enable-hot-corners = false;
|
enable-hot-corners = false;
|
||||||
font-name = "Iosevka Term SS08 12";
|
# font-name = font;
|
||||||
locate-pointer = true;
|
locate-pointer = true;
|
||||||
monospace-font-name = "Iosevka Term SS08 12";
|
monospace-font-name = font;
|
||||||
};
|
};
|
||||||
|
|
||||||
"org/gnome/desktop/wm/keybindings" = {
|
"org/gnome/desktop/wm/keybindings" = {
|
||||||
@@ -1,13 +1,24 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
{
|
{
|
||||||
options.nixgl.wrap = lib.mkOption {
|
options = {
|
||||||
|
host.username = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = config.home.username;
|
||||||
|
};
|
||||||
|
|
||||||
|
nixgl.wrap = lib.mkOption {
|
||||||
type = lib.types.functionTo lib.types.package;
|
type = lib.types.functionTo lib.types.package;
|
||||||
default = if config.lib ? nixGL then config.lib.nixGL.wrap else lib.id;
|
default = if config.lib ? nixGL then config.lib.nixGL.wrap else lib.id;
|
||||||
readOnly = true;
|
readOnly = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
options.wrapApp = lib.mkOption {
|
wrapApp = lib.mkOption {
|
||||||
type = lib.types.raw;
|
type = lib.types.raw;
|
||||||
default =
|
default =
|
||||||
pkg: flags:
|
pkg: flags:
|
||||||
@@ -22,4 +33,5 @@
|
|||||||
pkg;
|
pkg;
|
||||||
readOnly = true;
|
readOnly = true;
|
||||||
};
|
};
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
|
../../clipboard
|
||||||
../../fuzzel
|
../../fuzzel
|
||||||
../../mako
|
../../mako
|
||||||
../../shikane
|
../../shikane
|
||||||
@@ -12,7 +13,6 @@
|
|||||||
file.".config/niri/config.kdl".source = ./config.kdl;
|
file.".config/niri/config.kdl".source = ./config.kdl;
|
||||||
packages = with pkgs; [
|
packages = with pkgs; [
|
||||||
brightnessctl
|
brightnessctl
|
||||||
wl-clipboard
|
|
||||||
wlsunset
|
wlsunset
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|||||||
4
home/modules/devenv/default.nix
Normal file
4
home/modules/devenv/default.nix
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
home.packages = [ pkgs.devenv ];
|
||||||
|
}
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
{ pkgs, ... }:
|
{ pkgs, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
config = {
|
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
dive
|
dive
|
||||||
];
|
];
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
}:
|
}:
|
||||||
|
|
||||||
{
|
{
|
||||||
options = {
|
options.git = {
|
||||||
github.enable = lib.mkEnableOption "Github CLI";
|
github.enable = lib.mkEnableOption "Github CLI";
|
||||||
gitlab.enable = lib.mkEnableOption "Gitlab CLI";
|
gitlab.enable = lib.mkEnableOption "Gitlab CLI";
|
||||||
};
|
};
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
".gitignore".source = dotsPath + "/.gitignore";
|
".gitignore".source = dotsPath + "/.gitignore";
|
||||||
};
|
};
|
||||||
|
|
||||||
programs.gh.enable = config.github.enable;
|
programs.gh.enable = config.git.github.enable;
|
||||||
home.packages = lib.optionals config.gitlab.enable [ pkgs.glab ];
|
home.packages = lib.optionals config.git.gitlab.enable [ pkgs.glab ];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,7 @@
|
|||||||
|
{ pkgs, ... }:
|
||||||
{
|
{
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
options.go = {
|
|
||||||
enable = lib.mkEnableOption "go language";
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf config.go.enable {
|
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
go
|
go
|
||||||
gopls
|
gopls
|
||||||
];
|
];
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
10
home/modules/infra/default.nix
Normal file
10
home/modules/infra/default.nix
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{ pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
config = {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
opentofu
|
||||||
|
upbound
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -18,6 +18,10 @@
|
|||||||
enableAlias = true;
|
enableAlias = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
home.shellAliases = {
|
||||||
|
k = "kubectl";
|
||||||
|
};
|
||||||
|
|
||||||
imports = [
|
imports = [
|
||||||
./helm.nix
|
./helm.nix
|
||||||
./k9s.nix
|
./k9s.nix
|
||||||
|
|||||||
@@ -1,21 +1,6 @@
|
|||||||
|
{ pkgs, ... }:
|
||||||
{
|
{
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
cfg = config.nfc.proxmark3;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
options.nfc.proxmark3 = {
|
|
||||||
enable = lib.mkEnableOption "proxmark3 (iceman fork)";
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf cfg.enable {
|
|
||||||
home.packages = [
|
home.packages = [
|
||||||
(pkgs.proxmark3.override { withGeneric = true; })
|
(pkgs.proxmark3.override { withGeneric = true; })
|
||||||
];
|
];
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
options.nodejs = {
|
|
||||||
enable = lib.mkEnableOption "nodejs (and related packages)";
|
|
||||||
package = lib.mkOption {
|
|
||||||
type = lib.types.package;
|
|
||||||
default = pkgs.nodejs_24;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf config.nodejs.enable {
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
config.nodejs.package
|
|
||||||
pnpm
|
|
||||||
yarn
|
|
||||||
biome
|
|
||||||
tsx
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
23
home/modules/nodejs/default.nix
Normal file
23
home/modules/nodejs/default.nix
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
{
|
||||||
|
options.nodejs.package = lib.mkOption {
|
||||||
|
type = lib.types.package;
|
||||||
|
default = pkgs.nodejs_24;
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
config.nodejs.package
|
||||||
|
pnpm
|
||||||
|
yarn
|
||||||
|
biome
|
||||||
|
tsx
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
{ pkgs, inputs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
config = {
|
|
||||||
home.packages = [
|
|
||||||
inputs.nvim.packages.${pkgs.stdenv.hostPlatform.system}.nvim
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
7
home/modules/nvim/default.nix
Normal file
7
home/modules/nvim/default.nix
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{ pkgs, inputs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home.packages = [
|
||||||
|
inputs.nvim.packages.${pkgs.stdenv.hostPlatform.system}.nvim
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
options.pandoc = {
|
|
||||||
enable = lib.mkEnableOption "pandoc";
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf config.pandoc.enable {
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
haskellPackages.pandoc-crossref
|
|
||||||
pandoc
|
|
||||||
texliveSmall
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
8
home/modules/pandoc/default.nix
Normal file
8
home/modules/pandoc/default.nix
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
haskellPackages.pandoc-crossref
|
||||||
|
pandoc
|
||||||
|
texliveSmall
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -1,20 +1,13 @@
|
|||||||
{
|
{
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
pkgs,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
{
|
{
|
||||||
options.secrets = {
|
|
||||||
enable = lib.mkEnableOption "secrets";
|
|
||||||
};
|
|
||||||
|
|
||||||
imports = [ ./vault.nix ];
|
imports = [ ./vault.nix ];
|
||||||
|
|
||||||
config = lib.mkIf config.secrets.enable {
|
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
sops
|
|
||||||
age
|
age
|
||||||
|
age-plugin-yubikey # TODO: only needed when using Yubikey
|
||||||
|
sops
|
||||||
];
|
];
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,38 +9,32 @@ let
|
|||||||
inherit (config.home) username;
|
inherit (config.home) username;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
options.shell.bash = {
|
imports = [ ./utils.nix ];
|
||||||
enable = lib.mkEnableOption "bash configuration";
|
|
||||||
|
|
||||||
|
options.shell.bash = {
|
||||||
aliases = {
|
aliases = {
|
||||||
all = lib.mkOption {
|
all = lib.mkOption {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
default = true;
|
default = true;
|
||||||
description = "Enable common aliases";
|
|
||||||
};
|
};
|
||||||
lang-js = lib.mkOption {
|
lang-js = lib.mkOption {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
default = false;
|
default = false;
|
||||||
description = "Enable JavaScript/Node.js aliases";
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
addBinToPath = lib.mkOption {
|
addBinToPath = lib.mkOption {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
default = true;
|
default = false;
|
||||||
description = "Add dots .bin directory to PATH";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extraInit = lib.mkOption {
|
extraInit = lib.mkOption {
|
||||||
type = lib.types.lines;
|
type = lib.types.lines;
|
||||||
default = "";
|
default = "";
|
||||||
description = "Additional bash initialization";
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = lib.mkIf cfg.enable {
|
config = {
|
||||||
shell-utils.enable = lib.mkDefault true;
|
|
||||||
|
|
||||||
programs.bash = {
|
programs.bash = {
|
||||||
enable = true;
|
enable = true;
|
||||||
enableCompletion = true;
|
enableCompletion = true;
|
||||||
|
|||||||
@@ -3,6 +3,6 @@
|
|||||||
./bash.nix
|
./bash.nix
|
||||||
./utils.nix
|
./utils.nix
|
||||||
./prompt.nix
|
./prompt.nix
|
||||||
../tmux.nix
|
../tmux
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,3 @@
|
|||||||
{
|
{
|
||||||
config,
|
programs.starship.enable = true;
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
options.starship = {
|
|
||||||
enable = lib.mkEnableOption "starship prompt";
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf config.starship.enable {
|
|
||||||
programs.starship = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,9 @@
|
|||||||
{
|
{
|
||||||
config,
|
|
||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
{
|
{
|
||||||
options.shell-utils = {
|
|
||||||
enable = lib.mkEnableOption "shell utilities";
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf config.shell-utils.enable {
|
|
||||||
programs.fzf = {
|
programs.fzf = {
|
||||||
enable = true;
|
enable = true;
|
||||||
enableBashIntegration = lib.mkDefault true;
|
enableBashIntegration = lib.mkDefault true;
|
||||||
@@ -22,5 +16,4 @@
|
|||||||
entr
|
entr
|
||||||
parallel
|
parallel
|
||||||
];
|
];
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
{
|
|
||||||
outputs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
let
|
|
||||||
nixosConfigs = builtins.attrNames outputs.nixosConfigurations;
|
|
||||||
homeConfigs = map (n: lib.last (lib.splitString "@" n)) (
|
|
||||||
builtins.attrNames outputs.homeConfigurations
|
|
||||||
);
|
|
||||||
allHosts = lib.unique (homeConfigs ++ nixosConfigs);
|
|
||||||
hostsWithKeys = lib.filter (
|
|
||||||
hostname: builtins.pathExists ../../hosts/${hostname}/ssh_host.pub
|
|
||||||
) allHosts;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
programs.ssh = {
|
|
||||||
enable = true;
|
|
||||||
enableDefaultConfig = false;
|
|
||||||
|
|
||||||
matchBlocks =
|
|
||||||
lib.genAttrs hostsWithKeys (
|
|
||||||
hostname:
|
|
||||||
let
|
|
||||||
hostConfig = outputs.nixosConfigurations.${hostname}.config;
|
|
||||||
inherit (hostConfig.ssh) publicHostname username;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
host = hostname;
|
|
||||||
user = username;
|
|
||||||
}
|
|
||||||
// lib.optionalAttrs (publicHostname != "") {
|
|
||||||
hostname = publicHostname;
|
|
||||||
}
|
|
||||||
)
|
|
||||||
// {
|
|
||||||
"*" = {
|
|
||||||
addKeysToAgent = "yes";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
41
home/modules/ssh/default.nix
Normal file
41
home/modules/ssh/default.nix
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
myUtils,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
hostDir = ../../hosts;
|
||||||
|
hostNames = myUtils.dirNames hostDir;
|
||||||
|
hostsWithKeys = lib.filter (
|
||||||
|
hostname: builtins.pathExists (hostDir + "/${hostname}/ssh_host.pub")
|
||||||
|
) hostNames;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.packages = with pkgs; [ sshfs ];
|
||||||
|
|
||||||
|
programs.ssh = {
|
||||||
|
enable = true;
|
||||||
|
enableDefaultConfig = false;
|
||||||
|
|
||||||
|
matchBlocks =
|
||||||
|
lib.genAttrs hostsWithKeys (
|
||||||
|
hostname:
|
||||||
|
let
|
||||||
|
meta = myUtils.hostMeta (hostDir + "/${hostname}");
|
||||||
|
in
|
||||||
|
{
|
||||||
|
host = hostname;
|
||||||
|
user = meta.deployment.targetUser;
|
||||||
|
}
|
||||||
|
// lib.optionalAttrs (meta.deployment.targetHost != "") {
|
||||||
|
hostname = meta.deployment.targetHost;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
// {
|
||||||
|
"*" = {
|
||||||
|
addKeysToAgent = "yes";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
inputs,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
theme = import ../../modules/stylix/theme.nix { inherit pkgs; };
|
|
||||||
in
|
|
||||||
{
|
|
||||||
imports = [ inputs.stylix.homeModules.stylix ];
|
|
||||||
|
|
||||||
stylix = {
|
|
||||||
enable = true;
|
|
||||||
inherit (theme)
|
|
||||||
polarity
|
|
||||||
base16Scheme
|
|
||||||
override
|
|
||||||
image
|
|
||||||
;
|
|
||||||
fonts = {
|
|
||||||
monospace = theme.monospaceFont;
|
|
||||||
serif = config.stylix.fonts.monospace;
|
|
||||||
sansSerif = config.stylix.fonts.monospace;
|
|
||||||
emoji = config.stylix.fonts.monospace;
|
|
||||||
};
|
|
||||||
targets = {
|
|
||||||
firefox = {
|
|
||||||
profileNames = [ "default" ];
|
|
||||||
colorTheme.enable = true;
|
|
||||||
};
|
|
||||||
librewolf = {
|
|
||||||
profileNames = [ "default" ];
|
|
||||||
colorTheme.enable = true;
|
|
||||||
};
|
|
||||||
gnome.enable = false;
|
|
||||||
gtk.enable = false;
|
|
||||||
kitty = {
|
|
||||||
variant256Colors = true;
|
|
||||||
};
|
|
||||||
nixvim.enable = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
30
home/modules/stylix/default.nix
Normal file
30
home/modules/stylix/default.nix
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
inputs,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
theme = import ../../../modules/stylix/theme.nix { inherit pkgs; };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [ inputs.stylix.homeModules.stylix ];
|
||||||
|
|
||||||
|
stylix = {
|
||||||
|
enable = true;
|
||||||
|
inherit (theme)
|
||||||
|
polarity
|
||||||
|
base16Scheme
|
||||||
|
override
|
||||||
|
image
|
||||||
|
;
|
||||||
|
fonts = {
|
||||||
|
monospace = theme.monospaceFont;
|
||||||
|
serif = config.stylix.fonts.monospace;
|
||||||
|
sansSerif = config.stylix.fonts.monospace;
|
||||||
|
emoji = config.stylix.fonts.monospace;
|
||||||
|
};
|
||||||
|
targets = import ../../../modules/stylix/targets.nix;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -3,20 +3,39 @@
|
|||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
dotsPath,
|
dotsPath,
|
||||||
|
myUtils,
|
||||||
osConfig ? null,
|
osConfig ? null,
|
||||||
|
inputs ? null,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
hmSopsAvailable = config ? sops && config.sops ? templates;
|
sops = myUtils.sopsAvailability config osConfig;
|
||||||
osSopsAvailable = osConfig != null && osConfig ? sops && osConfig.sops ? templates;
|
standalone = osConfig == null;
|
||||||
sopsAvailable = hmSopsAvailable || osSopsAvailable;
|
|
||||||
|
|
||||||
sopsTemplates = if hmSopsAvailable then config.sops.templates else osConfig.sops.templates;
|
|
||||||
in
|
in
|
||||||
{
|
lib.optionalAttrs standalone {
|
||||||
|
sops = {
|
||||||
|
secrets = myUtils.mkSopsSecrets "${toString inputs.nix-secrets}/secrets" null {
|
||||||
|
taskwarrior = [
|
||||||
|
"sync-server-url"
|
||||||
|
"sync-server-client-id"
|
||||||
|
"sync-encryption-secret"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
templates."taskrc.d/sync" = {
|
||||||
|
content = ''
|
||||||
|
sync.server.url=${config.sops.placeholder."taskwarrior/sync-server-url"}
|
||||||
|
sync.server.client_id=${config.sops.placeholder."taskwarrior/sync-server-client-id"}
|
||||||
|
sync.encryption_secret=${config.sops.placeholder."taskwarrior/sync-encryption-secret"}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// {
|
||||||
|
|
||||||
warnings =
|
warnings =
|
||||||
lib.optional (!sopsAvailable && config.programs.taskwarrior.enable)
|
lib.optional (!sops.available && config.programs.taskwarrior.enable)
|
||||||
"taskwarrior is enabled, but sops templates are not available. taskwarrior sync will not be configured.";
|
"taskwarrior is enabled, but sops templates are not available. taskwarrior sync will not be configured.";
|
||||||
|
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
@@ -27,7 +46,7 @@ in
|
|||||||
|
|
||||||
home.file = {
|
home.file = {
|
||||||
".config/task/taskrc" = {
|
".config/task/taskrc" = {
|
||||||
force = true; # overwrite when present
|
force = true;
|
||||||
source = dotsPath + "/.config/task/taskrc";
|
source = dotsPath + "/.config/task/taskrc";
|
||||||
};
|
};
|
||||||
".config/task/taskrc.d/aliases".source = dotsPath + "/.config/task/taskrc.d/aliases";
|
".config/task/taskrc.d/aliases".source = dotsPath + "/.config/task/taskrc.d/aliases";
|
||||||
@@ -39,14 +58,6 @@ in
|
|||||||
".local/share/task/hooks/on-exit.sync.py" = {
|
".local/share/task/hooks/on-exit.sync.py" = {
|
||||||
source = dotsPath + "/.local/share/task/hooks/on-exit.sync.py";
|
source = dotsPath + "/.local/share/task/hooks/on-exit.sync.py";
|
||||||
};
|
};
|
||||||
".local/share/task/hooks/on-add.limit.py" = {
|
|
||||||
source = dotsPath + "/.local/share/task/hooks/on-add.limit.py";
|
|
||||||
executable = true;
|
|
||||||
};
|
|
||||||
".local/share/task/hooks/on-modify.limit.py" = {
|
|
||||||
source = dotsPath + "/.local/share/task/hooks/on-modify.limit.py";
|
|
||||||
executable = true;
|
|
||||||
};
|
|
||||||
".local/share/task/scripts/sync-and-notify.sh" = {
|
".local/share/task/scripts/sync-and-notify.sh" = {
|
||||||
source = dotsPath + "/.local/share/task/scripts/sync-and-notify.sh";
|
source = dotsPath + "/.local/share/task/scripts/sync-and-notify.sh";
|
||||||
executable = true;
|
executable = true;
|
||||||
@@ -59,9 +70,10 @@ in
|
|||||||
colorTheme = "dark-256";
|
colorTheme = "dark-256";
|
||||||
config = {
|
config = {
|
||||||
recurrence = "off";
|
recurrence = "off";
|
||||||
|
reserved.lines = 3; # without this I would have to scroll up 3 lines
|
||||||
};
|
};
|
||||||
extraConfig = lib.optionalString sopsAvailable ''
|
extraConfig = lib.optionalString sops.available ''
|
||||||
include ${sopsTemplates."taskrc.d/sync".path}
|
include ${sops.templates."taskrc.d/sync".path}
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
7
home/modules/ticketing/default.nix
Normal file
7
home/modules/ticketing/default.nix
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{ pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
jira-cli-go
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -11,9 +11,5 @@
|
|||||||
enable = true;
|
enable = true;
|
||||||
extraConfig = builtins.readFile (dotsPath + "/.config/tmux/tmux.conf");
|
extraConfig = builtins.readFile (dotsPath + "/.config/tmux/tmux.conf");
|
||||||
};
|
};
|
||||||
|
|
||||||
home.file = {
|
|
||||||
".config/tmux/hooks/tmux.ssh.conf".source = dotsPath + "/.config/tmux/hooks/tmux.ssh.conf";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
21
home/modules/torrenting/default.nix
Normal file
21
home/modules/torrenting/default.nix
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.torrenting;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.torrenting = {
|
||||||
|
enable = lib.mkEnableOption "transmission torrent client";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
transmission_4
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -2,6 +2,6 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
config = {
|
config = {
|
||||||
home.packages = [ (config.nixgl.wrap (config.wrapApp pkgs.vscode "--disable-gpu-sandbox")) ];
|
home.packages = [ (config.nixgl.wrap (config.wrapApp pkgs.vscode "--no-sandbox")) ];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -1,68 +1,11 @@
|
|||||||
{
|
{
|
||||||
lib,
|
imports = [
|
||||||
...
|
./settings.nix
|
||||||
}:
|
./style.nix
|
||||||
|
];
|
||||||
|
|
||||||
{
|
|
||||||
programs.waybar = {
|
programs.waybar = {
|
||||||
enable = true;
|
enable = true;
|
||||||
settings = [
|
systemd.enable = true;
|
||||||
{
|
|
||||||
height = 16;
|
|
||||||
spacing = 4;
|
|
||||||
modules-left = [ "niri/workspaces" ];
|
|
||||||
modules-right = [
|
|
||||||
"pulseaudio"
|
|
||||||
"memory"
|
|
||||||
"cpu"
|
|
||||||
"network"
|
|
||||||
"clock"
|
|
||||||
"battery"
|
|
||||||
];
|
|
||||||
clock = {
|
|
||||||
format = "W{:%V %d %b %H:%M}";
|
|
||||||
tooltip-format = "{calendar}";
|
|
||||||
format-alt = "{:%Y-%m-%d %H:%M:%S}";
|
|
||||||
};
|
|
||||||
battery = {
|
|
||||||
bat = "BAT0";
|
|
||||||
adapter = "ADP1";
|
|
||||||
interval = 5;
|
|
||||||
full-at = 99;
|
|
||||||
states = {
|
|
||||||
good = 80;
|
|
||||||
warning = 20;
|
|
||||||
critical = 10;
|
|
||||||
};
|
|
||||||
format = "{capacity}%--";
|
|
||||||
format-charging = "{capacity}%++";
|
|
||||||
format-plugged = "{capacity}%";
|
|
||||||
format-alt = "{time} {power}W";
|
|
||||||
};
|
|
||||||
pulseaudio = {
|
|
||||||
format = "VOL {volume}%";
|
|
||||||
format-muted = "muted";
|
|
||||||
on-click = "pavucontrol";
|
|
||||||
};
|
|
||||||
memory = {
|
|
||||||
interval = 2;
|
|
||||||
format = "RAM {percentage}%";
|
|
||||||
format-alt = "RAM {used:0.1f}G/{total:0.1f}G";
|
|
||||||
};
|
|
||||||
cpu = {
|
|
||||||
interval = 2;
|
|
||||||
format = "CPU {usage}%";
|
|
||||||
format-alt = "CPU {avg_frequency}GHz";
|
|
||||||
};
|
|
||||||
network = {
|
|
||||||
interval = 5;
|
|
||||||
format-wifi = "{ifname} {ipaddr} {essid}";
|
|
||||||
format-ethernet = "{ifname} {ipaddr}";
|
|
||||||
format-disconnected = "{ifname} disconnected";
|
|
||||||
tooltip-format = "{ifname}: {ipaddr}/{cidr}";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
style = lib.readFile ./style.css;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
59
home/modules/waybar/settings.nix
Normal file
59
home/modules/waybar/settings.nix
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
{
|
||||||
|
programs.waybar.settings = [
|
||||||
|
{
|
||||||
|
height = 16;
|
||||||
|
spacing = 4;
|
||||||
|
modules-left = [ "niri/workspaces" ];
|
||||||
|
modules-right = [
|
||||||
|
"pulseaudio"
|
||||||
|
"memory"
|
||||||
|
"cpu"
|
||||||
|
"network"
|
||||||
|
"clock"
|
||||||
|
"battery"
|
||||||
|
];
|
||||||
|
clock = {
|
||||||
|
format = "W{:%V %d %b %H:%M}";
|
||||||
|
tooltip-format = "{calendar}";
|
||||||
|
format-alt = "{:%Y-%m-%d %H:%M:%S}";
|
||||||
|
};
|
||||||
|
battery = {
|
||||||
|
bat = "BAT0";
|
||||||
|
adapter = "ADP1";
|
||||||
|
interval = 5;
|
||||||
|
full-at = 99;
|
||||||
|
states = {
|
||||||
|
good = 80;
|
||||||
|
warning = 20;
|
||||||
|
critical = 10;
|
||||||
|
};
|
||||||
|
format = "{capacity}%--";
|
||||||
|
format-charging = "{capacity}%++";
|
||||||
|
format-plugged = "{capacity}%";
|
||||||
|
format-alt = "{time} {power}W";
|
||||||
|
};
|
||||||
|
pulseaudio = {
|
||||||
|
format = "VOL {volume}%";
|
||||||
|
format-muted = "muted";
|
||||||
|
on-click = "pavucontrol";
|
||||||
|
};
|
||||||
|
memory = {
|
||||||
|
interval = 2;
|
||||||
|
format = "RAM {percentage}%";
|
||||||
|
format-alt = "RAM {used:0.1f}G/{total:0.1f}G";
|
||||||
|
};
|
||||||
|
cpu = {
|
||||||
|
interval = 2;
|
||||||
|
format = "CPU {usage}%";
|
||||||
|
format-alt = "CPU {avg_frequency}GHz";
|
||||||
|
};
|
||||||
|
network = {
|
||||||
|
interval = 5;
|
||||||
|
format-wifi = "{ifname} {ipaddr} {essid}";
|
||||||
|
format-ethernet = "{ifname} {ipaddr}";
|
||||||
|
format-disconnected = "{ifname} disconnected";
|
||||||
|
tooltip-format = "{ifname}: {ipaddr}/{cidr}";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
5
home/modules/waybar/style.nix
Normal file
5
home/modules/waybar/style.nix
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{ lib, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
programs.waybar.style = lib.readFile ./style.css;
|
||||||
|
}
|
||||||
45
home/modules/zk/default.nix
Normal file
45
home/modules/zk/default.nix
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.zk;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.zk = {
|
||||||
|
enable = lib.mkEnableOption "zettelkasten";
|
||||||
|
path = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = config.home.homeDirectory + "/.zk";
|
||||||
|
description = "Path to the zettelkasten directory";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
home = {
|
||||||
|
sessionVariables.ZK_PATH = cfg.path;
|
||||||
|
packages = [
|
||||||
|
(pkgs.writeShellApplication {
|
||||||
|
name = "zk";
|
||||||
|
runtimeInputs = with pkgs; [ tmux ];
|
||||||
|
text = builtins.readFile ./scripts/zk.sh;
|
||||||
|
})
|
||||||
|
|
||||||
|
(pkgs.writeShellApplication {
|
||||||
|
name = "save-zk";
|
||||||
|
runtimeInputs = with pkgs; [ git ];
|
||||||
|
text = builtins.readFile ./scripts/save-zk.sh;
|
||||||
|
})
|
||||||
|
|
||||||
|
(pkgs.writeShellApplication {
|
||||||
|
name = "setup-zk";
|
||||||
|
runtimeInputs = with pkgs; [ gh ];
|
||||||
|
text = builtins.readFile ./scripts/setup-zk.sh;
|
||||||
|
})
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
2
home/modules/zk/scripts/save-zk.sh
Normal file
2
home/modules/zk/scripts/save-zk.sh
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
cd "$ZK_PATH" || { echo "No zettelkasten directory found"; exit 1; }
|
||||||
|
git add . && git commit -m "Update" && git push
|
||||||
13
home/modules/zk/scripts/setup-zk.sh
Normal file
13
home/modules/zk/scripts/setup-zk.sh
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
if [ ! -d "$ZK_PATH" ]; then
|
||||||
|
echo "[zk] Setting up zettelkasten"
|
||||||
|
gh repo clone zk "$ZK_PATH"
|
||||||
|
else
|
||||||
|
echo "[zk] Zettelkasten already set up."
|
||||||
|
fi
|
||||||
|
|
||||||
|
read -p "Would you like open your zettelkasten? [y/N] " -n 1 -r
|
||||||
|
echo
|
||||||
|
|
||||||
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
$EDITOR "$ZK_PATH"
|
||||||
|
fi
|
||||||
14
dots/.bin/zk → home/modules/zk/scripts/zk.sh
Executable file → Normal file
14
dots/.bin/zk → home/modules/zk/scripts/zk.sh
Executable file → Normal file
@@ -1,8 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
current_zettel_path="$(cat "$ZK_PATH/current-zettel.txt")"
|
||||||
|
|
||||||
current_zettel_path="$ZK_PATH/$(cat "$ZK_PATH/current-zettel.txt")"
|
if [ -n "${TMUX:-}" ]; then
|
||||||
|
|
||||||
if [ "$TERM_PROGRAM" = tmux ]; then
|
|
||||||
cd "$ZK_PATH" && $EDITOR "$current_zettel_path"
|
cd "$ZK_PATH" && $EDITOR "$current_zettel_path"
|
||||||
else
|
else
|
||||||
echo 'Not in tmux'
|
echo 'Not in tmux'
|
||||||
@@ -12,13 +10,9 @@ else
|
|||||||
read -r -p 'Enter your choice: ' choice
|
read -r -p 'Enter your choice: ' choice
|
||||||
case $choice in
|
case $choice in
|
||||||
1)
|
1)
|
||||||
# Check if a tmux session is running with a window named zk
|
if tmux has-session -t zk 2>/dev/null; then
|
||||||
if tmux list-windows -F '#{window_name}' | grep -q zk; then
|
tmux attach -t zk
|
||||||
# Attach to the session containing the 'zk' window
|
|
||||||
session="$(tmux list-windows -F '#{window_name} #{session_name}' | grep zk | head -n 1 | awk '{ print $2 }')"
|
|
||||||
tmux attach -t "$session"
|
|
||||||
else
|
else
|
||||||
# Create session with a window named 'zk' and start nvim
|
|
||||||
tmux new-session -s zk -n zk -d
|
tmux new-session -s zk -n zk -d
|
||||||
tmux send-keys -t zk:zk "cd $ZK_PATH && $EDITOR $current_zettel_path" Enter
|
tmux send-keys -t zk:zk "cd $ZK_PATH && $EDITOR $current_zettel_path" Enter
|
||||||
tmux attach -t zk
|
tmux attach -t zk
|
||||||
@@ -7,61 +7,60 @@
|
|||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
username = "h";
|
|
||||||
hostName = "andromache";
|
|
||||||
wolInterfaces = import ./wol-interfaces.nix;
|
wolInterfaces = import ./wol-interfaces.nix;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
inputs.disko.nixosModules.disko
|
inputs.disko.nixosModules.disko
|
||||||
../../modules/common
|
|
||||||
./hard.nix
|
./hard.nix
|
||||||
|
./host.nix
|
||||||
inputs.nixos-hardware.nixosModules.common-cpu-intel
|
inputs.nixos-hardware.nixosModules.common-cpu-intel
|
||||||
inputs.nixos-hardware.nixosModules.common-pc
|
inputs.nixos-hardware.nixosModules.common-pc
|
||||||
inputs.nixos-hardware.nixosModules.common-pc-ssd
|
inputs.nixos-hardware.nixosModules.common-pc-ssd
|
||||||
inputs.sops-nix.nixosModules.sops
|
../../modules/common
|
||||||
../../modules/boot/bootloader.nix
|
../../modules/boot/bootloader.nix
|
||||||
(import ../../modules/disko/zfs-encrypted-root.nix {
|
(import ../../modules/disko/zfs-encrypted-root.nix {
|
||||||
inherit lib config;
|
inherit lib config;
|
||||||
device = "/dev/nvme1n1";
|
device = "/dev/nvme1n1";
|
||||||
})
|
})
|
||||||
../../modules/desktops/niri
|
../../modules/ai-tools
|
||||||
|
../../modules/anki
|
||||||
|
../../modules/audio
|
||||||
../../modules/backups
|
../../modules/backups
|
||||||
../../modules/bluetooth
|
../../modules/bluetooth
|
||||||
../../modules/gaming
|
../../modules/desktops/niri
|
||||||
../../modules/keyboard
|
../../modules/docker
|
||||||
(import ../../modules/networking { inherit hostName; })
|
../../modules/firewall
|
||||||
../../modules/users
|
|
||||||
../../modules/audio
|
|
||||||
../../modules/localization
|
|
||||||
../../modules/fonts
|
../../modules/fonts
|
||||||
../../modules/ssh/hardened-openssh.nix
|
../../modules/gaming
|
||||||
|
../../modules/git
|
||||||
|
../../modules/hcloud
|
||||||
|
../../modules/keyboard
|
||||||
|
../../modules/localization
|
||||||
|
../../modules/networking
|
||||||
|
../../modules/nvidia
|
||||||
|
../../modules/secrets
|
||||||
|
../../modules/ssh
|
||||||
../../modules/storage
|
../../modules/storage
|
||||||
../../modules/stylix
|
../../modules/stylix
|
||||||
(import ../../modules/secrets { inherit lib inputs config; })
|
|
||||||
../../modules/docker
|
|
||||||
../../modules/syncthing
|
../../modules/syncthing
|
||||||
../../modules/nvidia
|
../../modules/tailscale
|
||||||
|
../../modules/taskwarrior
|
||||||
|
../../modules/users
|
||||||
|
../../modules/wol
|
||||||
|
../../modules/yubikey
|
||||||
];
|
];
|
||||||
|
|
||||||
home-manager.users.${username} = import ../../home/hosts/andromache {
|
home-manager.users.${config.host.username} = import ../../home/hosts/${config.host.name};
|
||||||
inherit
|
|
||||||
inputs
|
|
||||||
config
|
|
||||||
pkgs
|
|
||||||
lib
|
|
||||||
;
|
|
||||||
};
|
|
||||||
|
|
||||||
networking.hostName = hostName;
|
secrets.nixSigningKey.enable = true;
|
||||||
|
|
||||||
ssh.username = username;
|
restic-backup.enable = true;
|
||||||
ssh.authorizedHosts = [ "astyanax" ];
|
tailscale.enable = true;
|
||||||
|
|
||||||
secrets.username = username;
|
docker.enable = true;
|
||||||
docker.user = username;
|
|
||||||
|
|
||||||
nix.settings.secret-key-files = [ config.sops.secrets.nix_signing_key_andromache.path ];
|
hcloud.enable = true;
|
||||||
|
|
||||||
disko.devices = {
|
disko.devices = {
|
||||||
disk.data = {
|
disk.data = {
|
||||||
@@ -91,29 +90,38 @@ in
|
|||||||
inputs.colmena.packages.${pkgs.stdenv.hostPlatform.system}.colmena
|
inputs.colmena.packages.${pkgs.stdenv.hostPlatform.system}.colmena
|
||||||
];
|
];
|
||||||
|
|
||||||
services = {
|
my.yubikey = {
|
||||||
locate = {
|
enable = false;
|
||||||
|
keys = [
|
||||||
|
{
|
||||||
|
handle = "<KeyHandle1>";
|
||||||
|
userKey = "<UserKey1>";
|
||||||
|
coseType = "<CoseType1>";
|
||||||
|
options = "<Options1>";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
handle = "<KeyHandle2>";
|
||||||
|
userKey = "<UserKey2>";
|
||||||
|
coseType = "<CoseType2>";
|
||||||
|
options = "<Options2>";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.locate = {
|
||||||
enable = true;
|
enable = true;
|
||||||
package = pkgs.plocate;
|
package = pkgs.plocate;
|
||||||
};
|
};
|
||||||
|
|
||||||
openssh = {
|
networking.hostId = "80eef97e";
|
||||||
|
|
||||||
|
wol = {
|
||||||
enable = true;
|
enable = true;
|
||||||
harden = true;
|
interfaces.eno1 = { inherit (wolInterfaces.eno1) macAddress; };
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
networking = {
|
|
||||||
# TODO: generate unique hostId on actual host with: head -c 8 /etc/machine-id
|
|
||||||
hostId = "80eef97e";
|
|
||||||
interfaces = {
|
|
||||||
eno1 = {
|
|
||||||
wakeOnLan.enable = true;
|
|
||||||
inherit (wolInterfaces.eno1) macAddress;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
firewall = {
|
firewall = {
|
||||||
allowedUDPPorts = [ 9 ];
|
enable = true;
|
||||||
};
|
allowedTCPPorts = [ 22 ];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
7
hosts/andromache/host.nix
Normal file
7
hosts/andromache/host.nix
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
host = {
|
||||||
|
username = "h";
|
||||||
|
highRam = true;
|
||||||
|
admin = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user