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
↓ nina-4c4db6e4.tar.gzatlas at this save
files changed3 files
src/commands.zig+1 −1src/exec.zig+31 −7src/main.zig+11 −0src/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 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 {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" };