pinwheel: Add ct for side threads in Claude Code sessions
Install ct from its flake, with its config, a tmux menu on prefix T and a user service for the web UI. Also keep Claude Code transcripts for ten years instead of 30 days, since threads are meant to be revisited.
This commit is contained in:
3 files changed
+77
No files matched your search
Generated
+22
@@ -56,6 +56,27 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"ct": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1793028894,
|
||||||
|
"narHash": "sha256-V0LaVoOrYJIaXO57+0U/i+X8lmLpVNHMuyzT/Uv5YuE=",
|
||||||
|
"ref": "main",
|
||||||
|
"rev": "277bab546659c448c4a90fa10d553d1ed83864ef",
|
||||||
|
"revCount": 3,
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:///home/alex/code/own/ct"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"ref": "main",
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:///home/alex/code/own/ct"
|
||||||
|
}
|
||||||
|
},
|
||||||
"dagbok": {
|
"dagbok": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
@@ -915,6 +936,7 @@
|
|||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"agenix": "agenix",
|
"agenix": "agenix",
|
||||||
|
"ct": "ct",
|
||||||
"dagbok": "dagbok",
|
"dagbok": "dagbok",
|
||||||
"disko": "disko",
|
"disko": "disko",
|
||||||
"emacs-overlay": "emacs-overlay",
|
"emacs-overlay": "emacs-overlay",
|
||||||
|
|||||||
@@ -116,6 +116,12 @@
|
|||||||
# url = "git+file:///home/alex/code/own/dagbok?ref=main";
|
# url = "git+file:///home/alex/code/own/dagbok?ref=main";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ct = {
|
||||||
|
url = "git+file:///home/alex/code/own/ct?ref=main";
|
||||||
|
# url = "git+ssh://gitea@git.ppp.pm:1122/alex/ct.git?ref=main";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs =
|
outputs =
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
inputs,
|
||||||
pkgs,
|
pkgs,
|
||||||
lib,
|
lib,
|
||||||
config,
|
config,
|
||||||
@@ -7,6 +8,25 @@
|
|||||||
let
|
let
|
||||||
enabled = config.mod.ai.enable;
|
enabled = config.mod.ai.enable;
|
||||||
|
|
||||||
|
ct = inputs.ct.packages.${pkgs.stdenv.hostPlatform.system}.default;
|
||||||
|
|
||||||
|
ctConfig = builtins.toJSON {
|
||||||
|
addr = "127.0.0.1:7777";
|
||||||
|
open = "split";
|
||||||
|
defaultProfile = "personal";
|
||||||
|
profiles = {
|
||||||
|
work = {
|
||||||
|
configDir = "/home/alex/.claude-work";
|
||||||
|
tmuxSession = "w";
|
||||||
|
paths = [ "/home/alex/code/work" ];
|
||||||
|
};
|
||||||
|
personal = {
|
||||||
|
configDir = "/home/alex/.claude-personal";
|
||||||
|
tmuxSession = "p";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
# Shared statusline: show the logged-in account email.
|
# Shared statusline: show the logged-in account email.
|
||||||
statusLine = {
|
statusLine = {
|
||||||
type = "command";
|
type = "command";
|
||||||
@@ -27,6 +47,7 @@ let
|
|||||||
inherit statusLine;
|
inherit statusLine;
|
||||||
theme = "dark";
|
theme = "dark";
|
||||||
editorMode = "vim";
|
editorMode = "vim";
|
||||||
|
cleanupPeriodDays = 3650;
|
||||||
attribution = {
|
attribution = {
|
||||||
commit = "";
|
commit = "";
|
||||||
pr = "";
|
pr = "";
|
||||||
@@ -57,6 +78,7 @@ in
|
|||||||
home-manager.users.alex = {
|
home-manager.users.alex = {
|
||||||
home.packages = [
|
home.packages = [
|
||||||
pkgs.claude-code
|
pkgs.claude-code
|
||||||
|
ct
|
||||||
];
|
];
|
||||||
|
|
||||||
programs.zsh.shellAliases = {
|
programs.zsh.shellAliases = {
|
||||||
@@ -67,6 +89,33 @@ in
|
|||||||
|
|
||||||
home.file.".claude-work/settings.json".text = settings;
|
home.file.".claude-work/settings.json".text = settings;
|
||||||
home.file.".claude-personal/settings.json".text = settings;
|
home.file.".claude-personal/settings.json".text = settings;
|
||||||
|
|
||||||
|
xdg.configFile."ct/config.json".text = ctConfig;
|
||||||
|
|
||||||
|
programs.tmux.extraConfig = lib.mkAfter ''
|
||||||
|
bind-key T display-menu -T "ct" \
|
||||||
|
"New thread (full context)" t 'display-popup -EE -w 80 -h 10 -T " new thread " "ct thread --pane #{pane_id}"' \
|
||||||
|
"New thread (pick turns)" p 'display-popup -EE -w 90% -h 90% -T " pick turns " "ct thread --pick --pane #{pane_id}"' \
|
||||||
|
"" \
|
||||||
|
"Browse threads" b 'display-popup -EE -w 90% -h 90% -T " threads " "ct --pane #{pane_id}"' \
|
||||||
|
"Open in browser" w 'run-shell -b "ct web --pane #{pane_id}"'
|
||||||
|
'';
|
||||||
|
|
||||||
|
systemd.user.services.ct-web = {
|
||||||
|
Unit = {
|
||||||
|
Description = "ct web UI";
|
||||||
|
};
|
||||||
|
Service = {
|
||||||
|
Type = "simple";
|
||||||
|
ExecStart = "${lib.getExe ct} serve";
|
||||||
|
Environment = "TMUX_TMPDIR=%t";
|
||||||
|
Restart = "on-failure";
|
||||||
|
RestartSec = 5;
|
||||||
|
};
|
||||||
|
Install = {
|
||||||
|
WantedBy = [ "default.target" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user