4c4db6e43144

develop: thread ctx.passthrough into nix develop argv

time
2026-07-02 00:55 UTC · 3 months ago
machine
koh2
agent
claude-sonnet-5
session
nina passthrough flag audit
parent
67f764ba93c7
3 files src/commands.zig+1 −1src/exec.zig+31 −7src/main.zig+11 −0
src/commands.zig+1 −1
@@ -939,7 +939,7 @@939939     else940940         null;941941     output.developStart(&.{});942-    _ = try exec.nixDevelopPs1(ctx.io, &ctx.machine, ctx.gpa, run_cmd, ctx.environ);942+    _ = try exec.nixDevelopPs1(ctx.io, &ctx.machine, ctx.gpa, run_cmd, ctx.environ, ctx.passthrough);943943     output.developDone();944944 }945945 

view file

src/exec.zig+31 −7
@@ -1128,18 +1128,31 @@11281128     return streamEnv(io, machine, gpa, &.{ "nix", "shell", ref }, base_env, ps1);11291129 }11301130 1131-pub fn nixDevelop(io: std.Io, machine: *const types.Machine, gpa: std.mem.Allocator, run_cmd: ?[]const u8) !u8 {1131+pub fn nixDevelop(io: std.Io, machine: *const types.Machine, gpa: std.mem.Allocator, run_cmd: ?[]const u8, extra_flags: []const []const u8) !u8 {11321132     if (run_cmd) |cmd| {11331133         // sh -c so a multi-word command isn't treated as a single executable name.1134-        return stream(io, machine, gpa, &.{ "nix", "develop", "--command", "sh", "-c", cmd });1134+        var argv: std.ArrayList([]const u8) = .empty;1135+        defer argv.deinit(gpa);1136+        try argv.appendSlice(gpa, &.{ "nix", "develop", "--command", "sh", "-c", cmd });1137+        try argv.appendSlice(gpa, extra_flags);1138+        return stream(io, machine, gpa, argv.items);11351139     }1136-    return stream(io, machine, gpa, &.{ "nix", "develop" });1140+    var argv: std.ArrayList([]const u8) = .empty;1141+    defer argv.deinit(gpa);1142+    try argv.append(gpa, "nix");1143+    try argv.append(gpa, "develop");1144+    try argv.appendSlice(gpa, extra_flags);1145+    return stream(io, machine, gpa, argv.items);11371146 }11381147 1139-pub fn nixDevelopPs1(io: std.Io, machine: *const types.Machine, gpa: std.mem.Allocator, run_cmd: ?[]const u8, base_env: *const std.process.Environ.Map) !u8 {1148+pub fn nixDevelopPs1(io: std.Io, machine: *const types.Machine, gpa: std.mem.Allocator, run_cmd: ?[]const u8, base_env: *const std.process.Environ.Map, extra_flags: []const []const u8) !u8 {11401149     if (run_cmd) |cmd| {11411150         // sh -c so a multi-word command isn't treated as a single executable name.1142-        return stream(io, machine, gpa, &.{ "nix", "develop", "--command", "sh", "-c", cmd });1151+        var argv: std.ArrayList([]const u8) = .empty;1152+        defer argv.deinit(gpa);1153+        try argv.appendSlice(gpa, &.{ "nix", "develop", "--command", "sh", "-c", cmd });1154+        try argv.appendSlice(gpa, extra_flags);1155+        return stream(io, machine, gpa, argv.items);11431156     }11441157     if (machine.local) {11451158         const rc_path = try createInteractiveShellRc(gpa, io);@@ -1147,9 +1160,20 @@11471160             std.Io.Dir.deleteFile(.cwd(), io, rc_path) catch {};11481161             gpa.free(rc_path);11491162         }1150-        return streamEnv(io, machine, gpa, &.{ "nix", "develop", "--command", "bash", "--rcfile", rc_path, "-i" }, base_env, "(nina: dev) -> ");1163+        var argv: std.ArrayList([]const u8) = .empty;1164+        defer argv.deinit(gpa);1165+        try argv.append(gpa, "nix");1166+        try argv.append(gpa, "develop");1167+        try argv.appendSlice(gpa, extra_flags);1168+        try argv.appendSlice(gpa, &.{ "--command", "bash", "--rcfile", rc_path, "-i" });1169+        return streamEnv(io, machine, gpa, argv.items, base_env, "(nina: dev) -> ");11511170     }1152-    return streamEnv(io, machine, gpa, &.{ "nix", "develop" }, base_env, "(nina: dev) -> ");1171+    var argv: std.ArrayList([]const u8) = .empty;1172+    defer argv.deinit(gpa);1173+    try argv.append(gpa, "nix");1174+    try argv.append(gpa, "develop");1175+    try argv.appendSlice(gpa, extra_flags);1176+    return streamEnv(io, machine, gpa, argv.items, base_env, "(nina: dev) -> ");11531177 }11541178 11551179 pub fn nixRepl(io: std.Io, machine: *const types.Machine, gpa: std.mem.Allocator) !u8 {

view file

src/main.zig+11 −0
@@ -406,6 +406,17 @@406406     try std.testing.expectEqualStrings("--print-build-logs", args.passthrough[0]);407407 }408408 409+test "parse args forwards develop --show-trace" {410+    const gpa = std.testing.allocator;411+    const argv = [_][:0]const u8{ "nina", "develop", "--show-trace" };412+    const args = try parseArgs(gpa, &argv);413+    defer gpa.free(args.rest);414+    defer gpa.free(args.passthrough);415+    try std.testing.expectEqualStrings("develop", args.command);416+    try std.testing.expectEqual(@as(usize, 1), args.passthrough.len);417+    try std.testing.expectEqualStrings("--show-trace", args.passthrough[0]);418+}419+409420 test "parse subcommand" {410421     const gpa = std.testing.allocator;411422     const argv = [_][:0]const u8{ "nina", "service", "list" };

view file