Compare commits

...

2 Commits

Author SHA1 Message Date
unexplrd 6763181b94 Update README.md 2026-04-28 15:47:17 +03:00
unexplrd 4aee7480c7 Refactor flake.nix, add Package suffix to cli package args 2026-04-28 15:47:06 +03:00
4 changed files with 45 additions and 37 deletions
+21 -11
View File
@@ -19,8 +19,16 @@ For each supported system, the flake exports:
Current `default` points to the `t3code-desktop`.
There are also `desktop` and `server` shorthands available for `apps` and `packages`.
## Usage
Inspect the flake surface:
```bash
nix flake show --all-systems
```
Build the desktop package:
```bash
@@ -53,24 +61,26 @@ Both packages can be overridden to add AI agent CLIs to the runtime `PATH`:
- `withClaudeCode` adds `github:numtide/llm-agents.nix#claude-code`
- `withOpencode` adds `github:numtide/llm-agents.nix#opencode`
Agent CLIs can be overridden as well using `codexPackage`, `claudeCodePackage` and `opencodePackage` respectively.
These overrides wrap the finished package in a small `postBuild` layer, so changing the agent flags does not rebuild the full T3 Code package.
In a Nix expression, use the same package override directly:
In a Nix expression, use the same package override directly (using `perSystem` from [`github:numtide/blueprint`](https://github.com/numtide/blueprint)):
```nix
self.packages.${system}.t3code-desktop.override {
withCodex = true;
withClaudeCode = true;
withOpencode = true;
{perSystem, pkgs, ...}: {
home.packages = [
(perSystem.t3code.desktop.override {
withCodex = true;
claudeCodePackage = pkgs.claude-code-bin;
withClaudeCode = true;
opencodePackage = perSystem.foobar.my-awesome-opencode-fork;
withOpencode = true;
})
];
}
```
Inspect the flake surface:
```bash
nix flake show --all-systems
```
## Layout
```text
+6 -8
View File
@@ -32,17 +32,15 @@
packages = forAllSystems (
system: let
pkgs = import nixpkgs {inherit system;};
src = t3code;
codexPackage = llm-agents.packages.${system}.codex;
claudeCodePackage = llm-agents.packages.${system}."claude-code";
opencodePackage = llm-agents.packages.${system}.opencode;
t3code-desktop = pkgs.callPackage ./packages/t3code-desktop {
src = t3code;
codex = llm-agents.packages.${system}.codex;
claudeCode = llm-agents.packages.${system}."claude-code";
opencode = llm-agents.packages.${system}.opencode;
inherit src codexPackage claudeCodePackage opencodePackage;
};
t3code-server = pkgs.callPackage ./packages/t3code-server {
src = t3code;
codex = llm-agents.packages.${system}.codex;
claudeCode = llm-agents.packages.${system}."claude-code";
opencode = llm-agents.packages.${system}.opencode;
inherit src codexPackage claudeCodePackage opencodePackage;
};
in {
inherit t3code-desktop t3code-server;
+9 -9
View File
@@ -5,8 +5,8 @@
stdenv,
symlinkJoin,
bun,
codex ? null,
claudeCode ? null,
codexPackage ? null,
claudeCodePackage ? null,
electron_40,
gcc,
git,
@@ -14,7 +14,7 @@
makeWrapper,
node-gyp,
nodejs,
opencode ? null,
opencodePackage ? null,
pkg-config,
python3,
writableTmpDirAsHomeHook,
@@ -198,14 +198,14 @@
});
withAgentPath = withCodex || withClaudeCode || withOpencode;
agentPath = lib.makeBinPath (
lib.optionals withCodex [codex]
++ lib.optionals withClaudeCode [claudeCode]
++ lib.optionals withOpencode [opencode]
lib.optionals withCodex [codexPackage]
++ lib.optionals withClaudeCode [claudeCodePackage]
++ lib.optionals withOpencode [opencodePackage]
);
in
assert lib.assertMsg (!withCodex || codex != null) "withCodex requires a codex package";
assert lib.assertMsg (!withClaudeCode || claudeCode != null) "withClaudeCode requires a claudeCode package";
assert lib.assertMsg (!withOpencode || opencode != null) "withOpencode requires an opencode package";
assert lib.assertMsg (!withCodex || codexPackage != null) "withCodex requires a codex package";
assert lib.assertMsg (!withClaudeCode || claudeCodePackage != null) "withClaudeCode requires a claudeCode package";
assert lib.assertMsg (!withOpencode || opencodePackage != null) "withOpencode requires an opencode package";
if withAgentPath
then
symlinkJoin {
+9 -9
View File
@@ -4,12 +4,12 @@
stdenv,
symlinkJoin,
bun,
codex ? null,
claudeCode ? null,
codexPackage ? null,
claudeCodePackage ? null,
makeBinaryWrapper,
node-gyp,
nodejs,
opencode ? null,
opencodePackage ? null,
python3,
writableTmpDirAsHomeHook,
withClaudeCode ? false,
@@ -129,14 +129,14 @@
});
withAgentPath = withCodex || withClaudeCode || withOpencode;
agentPath = lib.makeBinPath (
lib.optionals withCodex [codex]
++ lib.optionals withClaudeCode [claudeCode]
++ lib.optionals withOpencode [opencode]
lib.optionals withCodex [codexPackage]
++ lib.optionals withClaudeCode [claudeCodePackage]
++ lib.optionals withOpencode [opencodePackage]
);
in
assert lib.assertMsg (!withCodex || codex != null) "withCodex requires a codex package";
assert lib.assertMsg (!withClaudeCode || claudeCode != null) "withClaudeCode requires a claudeCode package";
assert lib.assertMsg (!withOpencode || opencode != null) "withOpencode requires an opencode package";
assert lib.assertMsg (!withCodex || codexPackage != null) "withCodex requires a codex package";
assert lib.assertMsg (!withClaudeCode || claudeCodePackage != null) "withClaudeCode requires a claudeCode package";
assert lib.assertMsg (!withOpencode || opencodePackage != null) "withOpencode requires an opencode package";
if withAgentPath
then
symlinkJoin {