[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-vercel-labs-zig":3,"mdc--muv4eb-key":30,"related-repo-vercel-labs-zig":2245,"related-org-vercel-labs-zig":2308},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":19,"repoUrl":20,"updatedAt":21,"license":22,"forks":23,"topics":24,"repo":25,"sourceUrl":28,"mdContent":29},"zig","debug Zig 0.16 compilation errors","Zig 0.16 idioms for Native SDK code, indexed by compile error. Load when `zig build` fails on std APIs with errors like \"struct 'fs' has no member named 'cwd'\", \"struct 'array_list.Aligned(u8,null)' has no member named 'init'\", \"struct 'std' has no member named 'io'\", \"no member named 'GeneralPurposeAllocator'\", \"no member named 'getEnvMap'\", or \"invalid format string\" - the signature of code written for Zig 0.15 or earlier. Covers main(std.process.Init), std.Io file IO and writers, ArrayList, process spawning, environment, clocks and sleep, sockets, custom formatting, and build.zig module shapes, each as this SDK writes them.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"vercel-labs","Vercel Labs","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fvercel-labs.png",[12,16],{"name":13,"slug":14,"type":15},"Engineering","engineering","tag",{"name":17,"slug":18,"type":15},"Debugging","debugging",6016,"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fnative","2026-07-17T06:08:45.630143",null,244,[],{"repoUrl":20,"stars":19,"forks":23,"topics":26,"description":27},[],"Toolkit for building native desktop apps","https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fnative\u002Ftree\u002FHEAD\u002Fskill-data\u002Fzig","---\nname: zig\ndescription: Zig 0.16 idioms for Native SDK code, indexed by compile error. Load when `zig build` fails on std APIs with errors like \"struct 'fs' has no member named 'cwd'\", \"struct 'array_list.Aligned(u8,null)' has no member named 'init'\", \"struct 'std' has no member named 'io'\", \"no member named 'GeneralPurposeAllocator'\", \"no member named 'getEnvMap'\", or \"invalid format string\" - the signature of code written for Zig 0.15 or earlier. Covers main(std.process.Init), std.Io file IO and writers, ArrayList, process spawning, environment, clocks and sleep, sockets, custom formatting, and build.zig module shapes, each as this SDK writes them.\n---\n\n# Zig 0.16 for Native SDK code\n\nThe Native SDK requires Zig 0.16.0 (`minimum_zig_version` in `build.zig.zon`; the CLI pins the same version and offers a checksum-verified download into `~\u002F.native\u002Ftoolchains\u002F` when the `zig` on PATH does not match). Training data and older guides teach Zig 0.15 idioms, and 0.16 moved everything that touches the outside world — files, stdout, clocks, sleeping, process spawning, sockets — behind an explicit `std.Io` value, while containers became allocator-per-call. Each section below is headed by the exact compile error the old idiom produces, so search this file by error text.\n\nTwo rules resolve most failures:\n\n- Operations on the outside world take a `std.Io` first (or right after the receiver). Get one from `init.io` in `main(init: std.process.Init)`, from `std.testing.io` in tests, or from `std.Io.Threaded` in code with no `Init` to thread through.\n- Containers are unmanaged: initialize with `.empty` and pass the allocator to every mutating call.\n\nIn a UiApp, `update` never sees an `Io` — persistence, subprocesses, HTTP, clocks, and timers go through the typed effects channel (`fx.readFile`, `fx.spawn`, `fx.fetch`, `fx.wallMs`, `fx.startTimer`; see `native skills get native-ui`). Raw `std.Io` belongs in `main`, tests, and standalone tools. And because Zig analyzes lazily, a 0.15-ism can hide in code only one build path references: run BOTH `zig build` and `zig build test` before calling a change done.\n\n## error: struct 'heap' has no member named 'GeneralPurposeAllocator' — allocators come from `main(init: std.process.Init)`\n\nZig 0.15 and earlier:\n\n```zig\npub fn main() !void {\n    var gpa = std.heap.GeneralPurposeAllocator(.{}){};\n    defer _ = gpa.deinit();\n    const allocator = gpa.allocator();\n}\n```\n\nZig 0.16: `main` takes `std.process.Init`, which carries the process-wide allocators, the `Io`, the environment, and the args — nothing to construct or deinit:\n\n```zig\npub fn main(init: std.process.Init) !void {\n    const gpa = init.gpa;                       \u002F\u002F general purpose, leak-checked in Debug\n    const arena = init.arena.allocator();       \u002F\u002F process-lifetime arena, freed on exit\n    const io = init.io;                         \u002F\u002F the Io every std call below wants\n    const args = try init.minimal.args.toSlice(arena);\n    if (init.environ_map.get(\"HOME\")) |home| { ... }\n}\n```\n\nThe CLI's own entry point is the live reference: `tools\u002Fnative-sdk\u002Fmain.zig`. Generated apps already have this shape — `main(init: std.process.Init)` passes `init` through to `runner.runWithOptions(app, options, init)` and `init.io` to the markup hot-reload watcher (see any `examples\u002F*\u002Fsrc\u002Fmain.zig`). `std.heap.page_allocator` still exists for allocations that live for the whole process. Library code that cannot take an `Init` builds its own `Io`: `var threaded = std.Io.Threaded.init(allocator, .{});` then `threaded.io()` (`src\u002Fplatform\u002Fmacos\u002Froot.zig`).\n\n## error: struct 'fs' has no member named 'cwd' — file IO moved to `std.Io.Dir`\n\n`std.fs.cwd()`, `std.fs.File`, and `std.fs.selfExePath` are gone (`std.fs` retains only `path` helpers and deprecated aliases). The directory handle is `std.Io.Dir`, and every operation takes `io` right after the receiver:\n\n```zig\nconst cwd = std.Io.Dir.cwd();\nconst content = try cwd.readFileAlloc(io, \"app.zon\", allocator, .limited(1024 * 1024));\ndefer allocator.free(content);\ntry cwd.writeFile(io, .{ .sub_path = \"out.txt\", .data = bytes });\nvar file = try cwd.openFile(io, path, .{});\ndefer file.close(io);\ntry cwd.deleteTree(io, \"zig-out\u002Ftmp\");\n```\n\nNote the `readFileAlloc` argument order (`io`, path, allocator, limit) and the size limit as `std.Io.Limit` — `.limited(n)` or `.unlimited`. Live references: `tools\u002Fnative-sdk\u002Fskills.zig` (readFileAlloc), `src\u002Ftooling\u002Fmanifest.zig` (openFile), `src\u002Ftooling\u002Fcef.zig` tests (writeFile with `std.testing.io`). Path buffers size with `std.Io.Dir.max_path_bytes`. For the executable's own path, `std.fs.selfExePath(&buf)` became `std.process.executablePath(io, &buf)`, returning the length (`tools\u002Fnative-sdk\u002Fskills.zig`).\n\n## error: struct 'std' has no member named 'io' — writers are `std.Io.Writer`, stdout is `std.Io.File.stdout()`\n\n`std.io.getStdOut().writer()` and `std.io.fixedBufferStream` are gone. Stdout takes `io` plus a caller-owned buffer, and the printable interface lives one field deep:\n\n```zig\nvar stdout_buffer: [4096]u8 = undefined;\nvar stdout_writer = std.Io.File.stdout().writer(io, &stdout_buffer);\nconst stdout = &stdout_writer.interface;\ndefer stdout.flush() catch {};\ntry stdout.print(\"{s}\\n\", .{message});\n```\n\nForgetting `flush()` means no output — the buffer is yours. `std.debug.print` is unchanged and needs no `io`; prefer it for diagnostics. The `fixedBufferStream` replacement is a fixed writer over a stack buffer, and the written bytes come back from `buffered()`:\n\n```zig\nvar buf: [256]u8 = undefined;\nvar writer = std.Io.Writer.fixed(&buf);\ntry writer.print(\"n={d}\", .{42});\nconst written = writer.buffered();\n```\n\nFor building a string of unknown size, use an allocating writer instead of an ArrayList writer: `var w = std.Io.Writer.Allocating.init(allocator); defer w.deinit();` then print through `w.writer` (`src\u002Fautomation\u002Fserver.zig`). One-shot formatting still has `std.fmt.bufPrint` and `std.fmt.allocPrint`, unchanged. Functions that accept a writer take `*std.Io.Writer`, not `anytype` (`tools\u002Fnative-sdk\u002Fskills.zig`; fixed-writer reference: `src\u002Ftooling\u002Fdoctor.zig`).\n\n## error: struct 'array_list.Aligned(u8,null)' has no member named 'init' — ArrayList is unmanaged\n\n`std.ArrayList(T).init(allocator)` is gone; the list no longer stores its allocator. Initialize with `.empty` and pass the allocator to every call that can allocate or free:\n\n```zig\nvar list: std.ArrayList(u8) = .empty;\ndefer list.deinit(allocator);\ntry list.append(allocator, 'a');\ntry list.appendSlice(allocator, \"bc\");\nconst owned = try list.toOwnedSlice(allocator);\n```\n\nThis is everywhere in the SDK — `src\u002Ftooling\u002Ftemplates.zig` builds every generated file this way, `tools\u002Fnative-sdk\u002Fskills.zig` collects skills this way. Passing a managed-style call (`list.append('a')`) fails with \"member function expected 2 argument(s), found 1\". `std.StringHashMap`\u002F`std.AutoHashMap` still have managed `.init(allocator)` forms; only explicitly `Unmanaged` maps take `.empty` (`tools\u002Fnative-sdk\u002Fmarkup_lsp.zig`).\n\n## error: invalid format string 's' for type — enums print with `{t}`, format methods with `{f}`\n\n`{s}` is for strings only. Enums and tagged unions print their tag name with `{t}` (equivalent to `@tagName`, which also still works):\n\n```zig\nstd.debug.print(\"native {t}: `zig build` step failed (exit code {d})\\n\", .{ verb, code });\n```\n\n(`src\u002Ftooling\u002Fverbs.zig`.) Custom format methods changed shape twice over: the old four-parameter signature no longer compiles (`error: struct 'fmt' has no member named 'FormatOptions'`), and `{}` no longer calls a `format` method at all — it prints the default field dump silently. Declare the 0.16 signature and print with `{f}`:\n\n```zig\npub fn format(self: Point, writer: *std.Io.Writer) std.Io.Writer.Error!void {\n    try writer.print(\"({d},{d})\", .{ self.x, self.y });\n}\n\u002F\u002F call site\ntry writer.print(\"{f}\\n\", .{point});\n```\n\n## error: struct 'time' has no member named 'sleep' \u002F 'milliTimestamp' — clocks live on Io\n\n`std.time` keeps only the unit constants (`ns_per_ms`, `ms_per_s`, ...) and epoch helpers. Sleeping and reading clocks take `io` and typed durations:\n\n```zig\ntry std.Io.sleep(io, std.Io.Duration.fromMilliseconds(50), .awake);\nconst now_ns: i128 = std.Io.Timestamp.now(io, .real).nanoseconds;\n```\n\n(`src\u002Fruntime\u002Fautomation_liveness_tests.zig`, `src\u002Fautomation\u002Fserver.zig`.) In app code, do not reach for either: `native_sdk.nowMs()` \u002F `native_sdk.monotonicMs()` are the facade, `fx.wallMs()` is the journaled read inside `update`, and `model.clock` is the testable seam — the native-ui skill's Time section owns that pattern.\n\n## error: struct 'process.Child' has no member named 'init' — spawning is `std.process.spawn(io, ...)`\n\nThe two-step `Child.init` + `child.spawn()` collapsed into one call, and lifecycle methods take `io`:\n\n```zig\nvar child = try std.process.spawn(io, .{\n    .argv = &.{ \"npm\", \"run\", \"build\" },\n    .stdin = .ignore,\n    .stdout = .inherit,\n    .stderr = .inherit,\n});\nconst term = try child.wait(io);   \u002F\u002F child.kill(io) to stop it\n```\n\n(`src\u002Ftooling\u002Fverbs.zig`, `src\u002Ftooling\u002Fdev.zig` — the latter also shows passing a custom environment via `.environ_map`.) Inside a UiApp, spawn through the effects channel (`fx.spawn`) instead — it is bounded, journaled, and delivers exit\u002Foutput as Msgs.\n\n## error: struct 'process' has no member named 'getEnvMap' \u002F 'argsAlloc' — environment and args come from Init\n\n`std.process.getEnvMap`, `argsAlloc`, and `argsWithAllocator` are gone. `main` already has both: `init.environ_map` (a `*std.process.Environ.Map`) and `init.minimal.args.toSlice(allocator)` (`tools\u002Fnative-sdk\u002Fmain.zig`). Building an environment from scratch — for a child process, or in tests — is `var env = std.process.Environ.Map.init(allocator); defer env.deinit(); try env.put(\"KEY\", \"value\");` (`src\u002Ftooling\u002Fdev.zig`).\n\n## error: struct 'mem' has no member named 'trimRight' \u002F 'trimLeft' — renamed `trimEnd` \u002F `trimStart`\n\nThe directional trims renamed to match the JS\u002Fstring convention; arguments are unchanged:\n\n```zig\nconst line = std.mem.trimEnd(u8, raw, \"\\r\\n\");     \u002F\u002F was trimRight\nconst body = std.mem.trimStart(u8, line, \" \\t\");   \u002F\u002F was trimLeft\nconst both = std.mem.trim(u8, text, \" \");          \u002F\u002F unchanged\n```\n\n## error: struct 'std' has no member named 'net' — sockets live on `std.Io.net`\n\n`std.net.Address` became `std.Io.net.IpAddress`, and connect\u002Flisten take `io`: `std.Io.net.IpAddress.resolve(io, host, port)`, then `IpAddress.connect(&address, io, .{ .mode = .stream, .protocol = .tcp })`; stream readers\u002Fwriters follow the buffered-writer shape (`std.Io.net.Stream.writer(stream, io, &buffer)` then `.interface`). Live reference: `src\u002Ftooling\u002Fdev.zig` (`waitUntilReady`\u002F`httpReady`). App-level HTTP belongs in `fx.fetch`, not hand-rolled sockets.\n\n## error: no field named 'root_source_file' in struct 'Build.ExecutableOptions' — build.zig artifacts take modules\n\nZero-config apps have no `build.zig` — the CLI owns the build graph, so this only appears in apps that ejected or scaffolded `--full`. Artifacts take a module, and the module owns root source, target, and optimize:\n\n```zig\nconst exe = b.addExecutable(.{\n    .name = \"app\",\n    .root_module = b.createModule(.{\n        .root_source_file = b.path(\"src\u002Fmain.zig\"),\n        .target = target,\n        .optimize = optimize,\n    }),\n});\nconst tests = b.addTest(.{ .root_module = app_mod });\n```\n\nThe generated ejected `build.zig` is the reference shape (`native eject`, emitted by `src\u002Ftooling\u002Ftemplates.zig`); the SDK's own `build.zig` uses the same pattern throughout.\n\n## Reading files and streams incrementally\n\n`file.reader()` with no arguments is gone. A reader takes `io` and a buffer, and the stream interface lives on `.interface`:\n\n```zig\nvar read_buffer: [4096]u8 = undefined;\nvar reader = file.reader(io, &read_buffer);\nconst bytes = try reader.interface.allocRemaining(allocator, .limited(1024 * 1024));\nconst line = try reader.interface.takeDelimiterExclusive('\\n');\n```\n\n(`src\u002Ftooling\u002Fmanifest.zig` for allocRemaining, `src\u002Ftooling\u002Ftoolchain.zig` for line reading from stdin.) For whole-file reads, prefer `readFileAlloc` above.\n\n## Tests: the Io is `std.testing.io`\n\nTests never construct an `Io` — `std.testing.io` is the canonical one, next to `std.testing.allocator`:\n\n```zig\ntest \"reads the manifest\" {\n    var tmp = std.testing.tmpDir(.{});\n    defer tmp.cleanup();\n    try tmp.dir.writeFile(std.testing.io, .{ .sub_path = \"app.zon\", .data = source });\n    const content = try tmp.dir.readFileAlloc(std.testing.io, \"app.zon\", std.testing.allocator, .limited(4096));\n    defer std.testing.allocator.free(content);\n}\n```\n\n(`src\u002Ftooling\u002Fcef.zig` and `src\u002Ftooling\u002Fmanifest.zig` tests.) Model\u002FMsg\u002Fupdate tests need no `Io` at all — the markup-view testing pattern in the native-ui skill is pure.\n\n## Unchanged — do not \"migrate\" these\n\n`std.fmt.bufPrint` \u002F `allocPrint` \u002F `parseInt` \u002F `parseFloat`, `std.mem.*`, `std.debug.print`, `std.heap.page_allocator`, `std.time.ns_per_*` and `ms_per_*` constants, `@embedFile`, `std.testing.expect*`, and managed `std.StringHashMap` \u002F `std.AutoHashMap` all work as before. If code using only these fails, the problem is elsewhere.\n",{"data":31,"body":32},{"name":4,"description":6},{"type":33,"children":34},"root",[35,44,90,95,164,261,273,278,335,362,426,522,534,591,654,759,779,804,851,895,934,1006,1012,1030,1077,1150,1170,1196,1210,1253,1299,1305,1338,1361,1417,1429,1456,1519,1552,1558,1633,1652,1657,1688,1700,1783,1789,1810,1890,1924,1930,1954,1993,2019,2030,2055,2117,2141,2147,2239],{"type":36,"tag":37,"props":38,"children":40},"element","h1",{"id":39},"zig-016-for-native-sdk-code",[41],{"type":42,"value":43},"text","Zig 0.16 for Native SDK code",{"type":36,"tag":45,"props":46,"children":47},"p",{},[48,50,57,59,65,67,73,75,80,82,88],{"type":42,"value":49},"The Native SDK requires Zig 0.16.0 (",{"type":36,"tag":51,"props":52,"children":54},"code",{"className":53},[],[55],{"type":42,"value":56},"minimum_zig_version",{"type":42,"value":58}," in ",{"type":36,"tag":51,"props":60,"children":62},{"className":61},[],[63],{"type":42,"value":64},"build.zig.zon",{"type":42,"value":66},"; the CLI pins the same version and offers a checksum-verified download into ",{"type":36,"tag":51,"props":68,"children":70},{"className":69},[],[71],{"type":42,"value":72},"~\u002F.native\u002Ftoolchains\u002F",{"type":42,"value":74}," when the ",{"type":36,"tag":51,"props":76,"children":78},{"className":77},[],[79],{"type":42,"value":4},{"type":42,"value":81}," on PATH does not match). Training data and older guides teach Zig 0.15 idioms, and 0.16 moved everything that touches the outside world — files, stdout, clocks, sleeping, process spawning, sockets — behind an explicit ",{"type":36,"tag":51,"props":83,"children":85},{"className":84},[],[86],{"type":42,"value":87},"std.Io",{"type":42,"value":89}," value, while containers became allocator-per-call. Each section below is headed by the exact compile error the old idiom produces, so search this file by error text.",{"type":36,"tag":45,"props":91,"children":92},{},[93],{"type":42,"value":94},"Two rules resolve most failures:",{"type":36,"tag":96,"props":97,"children":98},"ul",{},[99,151],{"type":36,"tag":100,"props":101,"children":102},"li",{},[103,105,110,112,118,119,125,127,133,135,141,143,149],{"type":42,"value":104},"Operations on the outside world take a ",{"type":36,"tag":51,"props":106,"children":108},{"className":107},[],[109],{"type":42,"value":87},{"type":42,"value":111}," first (or right after the receiver). Get one from ",{"type":36,"tag":51,"props":113,"children":115},{"className":114},[],[116],{"type":42,"value":117},"init.io",{"type":42,"value":58},{"type":36,"tag":51,"props":120,"children":122},{"className":121},[],[123],{"type":42,"value":124},"main(init: std.process.Init)",{"type":42,"value":126},", from ",{"type":36,"tag":51,"props":128,"children":130},{"className":129},[],[131],{"type":42,"value":132},"std.testing.io",{"type":42,"value":134}," in tests, or from ",{"type":36,"tag":51,"props":136,"children":138},{"className":137},[],[139],{"type":42,"value":140},"std.Io.Threaded",{"type":42,"value":142}," in code with no ",{"type":36,"tag":51,"props":144,"children":146},{"className":145},[],[147],{"type":42,"value":148},"Init",{"type":42,"value":150}," to thread through.",{"type":36,"tag":100,"props":152,"children":153},{},[154,156,162],{"type":42,"value":155},"Containers are unmanaged: initialize with ",{"type":36,"tag":51,"props":157,"children":159},{"className":158},[],[160],{"type":42,"value":161},".empty",{"type":42,"value":163}," and pass the allocator to every mutating call.",{"type":36,"tag":45,"props":165,"children":166},{},[167,169,175,177,183,185,191,193,199,200,206,207,213,214,220,222,228,230,235,237,243,245,251,253,259],{"type":42,"value":168},"In a UiApp, ",{"type":36,"tag":51,"props":170,"children":172},{"className":171},[],[173],{"type":42,"value":174},"update",{"type":42,"value":176}," never sees an ",{"type":36,"tag":51,"props":178,"children":180},{"className":179},[],[181],{"type":42,"value":182},"Io",{"type":42,"value":184}," — persistence, subprocesses, HTTP, clocks, and timers go through the typed effects channel (",{"type":36,"tag":51,"props":186,"children":188},{"className":187},[],[189],{"type":42,"value":190},"fx.readFile",{"type":42,"value":192},", ",{"type":36,"tag":51,"props":194,"children":196},{"className":195},[],[197],{"type":42,"value":198},"fx.spawn",{"type":42,"value":192},{"type":36,"tag":51,"props":201,"children":203},{"className":202},[],[204],{"type":42,"value":205},"fx.fetch",{"type":42,"value":192},{"type":36,"tag":51,"props":208,"children":210},{"className":209},[],[211],{"type":42,"value":212},"fx.wallMs",{"type":42,"value":192},{"type":36,"tag":51,"props":215,"children":217},{"className":216},[],[218],{"type":42,"value":219},"fx.startTimer",{"type":42,"value":221},"; see ",{"type":36,"tag":51,"props":223,"children":225},{"className":224},[],[226],{"type":42,"value":227},"native skills get native-ui",{"type":42,"value":229},"). Raw ",{"type":36,"tag":51,"props":231,"children":233},{"className":232},[],[234],{"type":42,"value":87},{"type":42,"value":236}," belongs in ",{"type":36,"tag":51,"props":238,"children":240},{"className":239},[],[241],{"type":42,"value":242},"main",{"type":42,"value":244},", tests, and standalone tools. And because Zig analyzes lazily, a 0.15-ism can hide in code only one build path references: run BOTH ",{"type":36,"tag":51,"props":246,"children":248},{"className":247},[],[249],{"type":42,"value":250},"zig build",{"type":42,"value":252}," and ",{"type":36,"tag":51,"props":254,"children":256},{"className":255},[],[257],{"type":42,"value":258},"zig build test",{"type":42,"value":260}," before calling a change done.",{"type":36,"tag":262,"props":263,"children":265},"h2",{"id":264},"error-struct-heap-has-no-member-named-generalpurposeallocator-allocators-come-from-maininit-stdprocessinit",[266,268],{"type":42,"value":267},"error: struct 'heap' has no member named 'GeneralPurposeAllocator' — allocators come from ",{"type":36,"tag":51,"props":269,"children":271},{"className":270},[],[272],{"type":42,"value":124},{"type":36,"tag":45,"props":274,"children":275},{},[276],{"type":42,"value":277},"Zig 0.15 and earlier:",{"type":36,"tag":279,"props":280,"children":284},"pre",{"className":281,"code":282,"language":4,"meta":283,"style":283},"language-zig shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pub fn main() !void {\n    var gpa = std.heap.GeneralPurposeAllocator(.{}){};\n    defer _ = gpa.deinit();\n    const allocator = gpa.allocator();\n}\n","",[285],{"type":36,"tag":51,"props":286,"children":287},{"__ignoreMap":283},[288,299,308,317,326],{"type":36,"tag":289,"props":290,"children":293},"span",{"class":291,"line":292},"line",1,[294],{"type":36,"tag":289,"props":295,"children":296},{},[297],{"type":42,"value":298},"pub fn main() !void {\n",{"type":36,"tag":289,"props":300,"children":302},{"class":291,"line":301},2,[303],{"type":36,"tag":289,"props":304,"children":305},{},[306],{"type":42,"value":307},"    var gpa = std.heap.GeneralPurposeAllocator(.{}){};\n",{"type":36,"tag":289,"props":309,"children":311},{"class":291,"line":310},3,[312],{"type":36,"tag":289,"props":313,"children":314},{},[315],{"type":42,"value":316},"    defer _ = gpa.deinit();\n",{"type":36,"tag":289,"props":318,"children":320},{"class":291,"line":319},4,[321],{"type":36,"tag":289,"props":322,"children":323},{},[324],{"type":42,"value":325},"    const allocator = gpa.allocator();\n",{"type":36,"tag":289,"props":327,"children":329},{"class":291,"line":328},5,[330],{"type":36,"tag":289,"props":331,"children":332},{},[333],{"type":42,"value":334},"}\n",{"type":36,"tag":45,"props":336,"children":337},{},[338,340,345,347,353,355,360],{"type":42,"value":339},"Zig 0.16: ",{"type":36,"tag":51,"props":341,"children":343},{"className":342},[],[344],{"type":42,"value":242},{"type":42,"value":346}," takes ",{"type":36,"tag":51,"props":348,"children":350},{"className":349},[],[351],{"type":42,"value":352},"std.process.Init",{"type":42,"value":354},", which carries the process-wide allocators, the ",{"type":36,"tag":51,"props":356,"children":358},{"className":357},[],[359],{"type":42,"value":182},{"type":42,"value":361},", the environment, and the args — nothing to construct or deinit:",{"type":36,"tag":279,"props":363,"children":365},{"className":281,"code":364,"language":4,"meta":283,"style":283},"pub fn main(init: std.process.Init) !void {\n    const gpa = init.gpa;                       \u002F\u002F general purpose, leak-checked in Debug\n    const arena = init.arena.allocator();       \u002F\u002F process-lifetime arena, freed on exit\n    const io = init.io;                         \u002F\u002F the Io every std call below wants\n    const args = try init.minimal.args.toSlice(arena);\n    if (init.environ_map.get(\"HOME\")) |home| { ... }\n}\n",[366],{"type":36,"tag":51,"props":367,"children":368},{"__ignoreMap":283},[369,377,385,393,401,409,418],{"type":36,"tag":289,"props":370,"children":371},{"class":291,"line":292},[372],{"type":36,"tag":289,"props":373,"children":374},{},[375],{"type":42,"value":376},"pub fn main(init: std.process.Init) !void {\n",{"type":36,"tag":289,"props":378,"children":379},{"class":291,"line":301},[380],{"type":36,"tag":289,"props":381,"children":382},{},[383],{"type":42,"value":384},"    const gpa = init.gpa;                       \u002F\u002F general purpose, leak-checked in Debug\n",{"type":36,"tag":289,"props":386,"children":387},{"class":291,"line":310},[388],{"type":36,"tag":289,"props":389,"children":390},{},[391],{"type":42,"value":392},"    const arena = init.arena.allocator();       \u002F\u002F process-lifetime arena, freed on exit\n",{"type":36,"tag":289,"props":394,"children":395},{"class":291,"line":319},[396],{"type":36,"tag":289,"props":397,"children":398},{},[399],{"type":42,"value":400},"    const io = init.io;                         \u002F\u002F the Io every std call below wants\n",{"type":36,"tag":289,"props":402,"children":403},{"class":291,"line":328},[404],{"type":36,"tag":289,"props":405,"children":406},{},[407],{"type":42,"value":408},"    const args = try init.minimal.args.toSlice(arena);\n",{"type":36,"tag":289,"props":410,"children":412},{"class":291,"line":411},6,[413],{"type":36,"tag":289,"props":414,"children":415},{},[416],{"type":42,"value":417},"    if (init.environ_map.get(\"HOME\")) |home| { ... }\n",{"type":36,"tag":289,"props":419,"children":421},{"class":291,"line":420},7,[422],{"type":36,"tag":289,"props":423,"children":424},{},[425],{"type":42,"value":334},{"type":36,"tag":45,"props":427,"children":428},{},[429,431,437,439,444,446,452,454,460,461,466,468,474,476,482,484,489,491,496,498,504,506,512,514,520],{"type":42,"value":430},"The CLI's own entry point is the live reference: ",{"type":36,"tag":51,"props":432,"children":434},{"className":433},[],[435],{"type":42,"value":436},"tools\u002Fnative-sdk\u002Fmain.zig",{"type":42,"value":438},". Generated apps already have this shape — ",{"type":36,"tag":51,"props":440,"children":442},{"className":441},[],[443],{"type":42,"value":124},{"type":42,"value":445}," passes ",{"type":36,"tag":51,"props":447,"children":449},{"className":448},[],[450],{"type":42,"value":451},"init",{"type":42,"value":453}," through to ",{"type":36,"tag":51,"props":455,"children":457},{"className":456},[],[458],{"type":42,"value":459},"runner.runWithOptions(app, options, init)",{"type":42,"value":252},{"type":36,"tag":51,"props":462,"children":464},{"className":463},[],[465],{"type":42,"value":117},{"type":42,"value":467}," to the markup hot-reload watcher (see any ",{"type":36,"tag":51,"props":469,"children":471},{"className":470},[],[472],{"type":42,"value":473},"examples\u002F*\u002Fsrc\u002Fmain.zig",{"type":42,"value":475},"). ",{"type":36,"tag":51,"props":477,"children":479},{"className":478},[],[480],{"type":42,"value":481},"std.heap.page_allocator",{"type":42,"value":483}," still exists for allocations that live for the whole process. Library code that cannot take an ",{"type":36,"tag":51,"props":485,"children":487},{"className":486},[],[488],{"type":42,"value":148},{"type":42,"value":490}," builds its own ",{"type":36,"tag":51,"props":492,"children":494},{"className":493},[],[495],{"type":42,"value":182},{"type":42,"value":497},": ",{"type":36,"tag":51,"props":499,"children":501},{"className":500},[],[502],{"type":42,"value":503},"var threaded = std.Io.Threaded.init(allocator, .{});",{"type":42,"value":505}," then ",{"type":36,"tag":51,"props":507,"children":509},{"className":508},[],[510],{"type":42,"value":511},"threaded.io()",{"type":42,"value":513}," (",{"type":36,"tag":51,"props":515,"children":517},{"className":516},[],[518],{"type":42,"value":519},"src\u002Fplatform\u002Fmacos\u002Froot.zig",{"type":42,"value":521},").",{"type":36,"tag":262,"props":523,"children":525},{"id":524},"error-struct-fs-has-no-member-named-cwd-file-io-moved-to-stdiodir",[526,528],{"type":42,"value":527},"error: struct 'fs' has no member named 'cwd' — file IO moved to ",{"type":36,"tag":51,"props":529,"children":531},{"className":530},[],[532],{"type":42,"value":533},"std.Io.Dir",{"type":36,"tag":45,"props":535,"children":536},{},[537,543,544,550,552,558,560,566,568,574,576,581,583,589],{"type":36,"tag":51,"props":538,"children":540},{"className":539},[],[541],{"type":42,"value":542},"std.fs.cwd()",{"type":42,"value":192},{"type":36,"tag":51,"props":545,"children":547},{"className":546},[],[548],{"type":42,"value":549},"std.fs.File",{"type":42,"value":551},", and ",{"type":36,"tag":51,"props":553,"children":555},{"className":554},[],[556],{"type":42,"value":557},"std.fs.selfExePath",{"type":42,"value":559}," are gone (",{"type":36,"tag":51,"props":561,"children":563},{"className":562},[],[564],{"type":42,"value":565},"std.fs",{"type":42,"value":567}," retains only ",{"type":36,"tag":51,"props":569,"children":571},{"className":570},[],[572],{"type":42,"value":573},"path",{"type":42,"value":575}," helpers and deprecated aliases). The directory handle is ",{"type":36,"tag":51,"props":577,"children":579},{"className":578},[],[580],{"type":42,"value":533},{"type":42,"value":582},", and every operation takes ",{"type":36,"tag":51,"props":584,"children":586},{"className":585},[],[587],{"type":42,"value":588},"io",{"type":42,"value":590}," right after the receiver:",{"type":36,"tag":279,"props":592,"children":594},{"className":281,"code":593,"language":4,"meta":283,"style":283},"const cwd = std.Io.Dir.cwd();\nconst content = try cwd.readFileAlloc(io, \"app.zon\", allocator, .limited(1024 * 1024));\ndefer allocator.free(content);\ntry cwd.writeFile(io, .{ .sub_path = \"out.txt\", .data = bytes });\nvar file = try cwd.openFile(io, path, .{});\ndefer file.close(io);\ntry cwd.deleteTree(io, \"zig-out\u002Ftmp\");\n",[595],{"type":36,"tag":51,"props":596,"children":597},{"__ignoreMap":283},[598,606,614,622,630,638,646],{"type":36,"tag":289,"props":599,"children":600},{"class":291,"line":292},[601],{"type":36,"tag":289,"props":602,"children":603},{},[604],{"type":42,"value":605},"const cwd = std.Io.Dir.cwd();\n",{"type":36,"tag":289,"props":607,"children":608},{"class":291,"line":301},[609],{"type":36,"tag":289,"props":610,"children":611},{},[612],{"type":42,"value":613},"const content = try cwd.readFileAlloc(io, \"app.zon\", allocator, .limited(1024 * 1024));\n",{"type":36,"tag":289,"props":615,"children":616},{"class":291,"line":310},[617],{"type":36,"tag":289,"props":618,"children":619},{},[620],{"type":42,"value":621},"defer allocator.free(content);\n",{"type":36,"tag":289,"props":623,"children":624},{"class":291,"line":319},[625],{"type":36,"tag":289,"props":626,"children":627},{},[628],{"type":42,"value":629},"try cwd.writeFile(io, .{ .sub_path = \"out.txt\", .data = bytes });\n",{"type":36,"tag":289,"props":631,"children":632},{"class":291,"line":328},[633],{"type":36,"tag":289,"props":634,"children":635},{},[636],{"type":42,"value":637},"var file = try cwd.openFile(io, path, .{});\n",{"type":36,"tag":289,"props":639,"children":640},{"class":291,"line":411},[641],{"type":36,"tag":289,"props":642,"children":643},{},[644],{"type":42,"value":645},"defer file.close(io);\n",{"type":36,"tag":289,"props":647,"children":648},{"class":291,"line":420},[649],{"type":36,"tag":289,"props":650,"children":651},{},[652],{"type":42,"value":653},"try cwd.deleteTree(io, \"zig-out\u002Ftmp\");\n",{"type":36,"tag":45,"props":655,"children":656},{},[657,659,665,667,672,674,680,682,688,690,696,698,704,706,712,714,720,722,727,729,735,737,743,745,751,753,758],{"type":42,"value":658},"Note the ",{"type":36,"tag":51,"props":660,"children":662},{"className":661},[],[663],{"type":42,"value":664},"readFileAlloc",{"type":42,"value":666}," argument order (",{"type":36,"tag":51,"props":668,"children":670},{"className":669},[],[671],{"type":42,"value":588},{"type":42,"value":673},", path, allocator, limit) and the size limit as ",{"type":36,"tag":51,"props":675,"children":677},{"className":676},[],[678],{"type":42,"value":679},"std.Io.Limit",{"type":42,"value":681}," — ",{"type":36,"tag":51,"props":683,"children":685},{"className":684},[],[686],{"type":42,"value":687},".limited(n)",{"type":42,"value":689}," or ",{"type":36,"tag":51,"props":691,"children":693},{"className":692},[],[694],{"type":42,"value":695},".unlimited",{"type":42,"value":697},". Live references: ",{"type":36,"tag":51,"props":699,"children":701},{"className":700},[],[702],{"type":42,"value":703},"tools\u002Fnative-sdk\u002Fskills.zig",{"type":42,"value":705}," (readFileAlloc), ",{"type":36,"tag":51,"props":707,"children":709},{"className":708},[],[710],{"type":42,"value":711},"src\u002Ftooling\u002Fmanifest.zig",{"type":42,"value":713}," (openFile), ",{"type":36,"tag":51,"props":715,"children":717},{"className":716},[],[718],{"type":42,"value":719},"src\u002Ftooling\u002Fcef.zig",{"type":42,"value":721}," tests (writeFile with ",{"type":36,"tag":51,"props":723,"children":725},{"className":724},[],[726],{"type":42,"value":132},{"type":42,"value":728},"). Path buffers size with ",{"type":36,"tag":51,"props":730,"children":732},{"className":731},[],[733],{"type":42,"value":734},"std.Io.Dir.max_path_bytes",{"type":42,"value":736},". For the executable's own path, ",{"type":36,"tag":51,"props":738,"children":740},{"className":739},[],[741],{"type":42,"value":742},"std.fs.selfExePath(&buf)",{"type":42,"value":744}," became ",{"type":36,"tag":51,"props":746,"children":748},{"className":747},[],[749],{"type":42,"value":750},"std.process.executablePath(io, &buf)",{"type":42,"value":752},", returning the length (",{"type":36,"tag":51,"props":754,"children":756},{"className":755},[],[757],{"type":42,"value":703},{"type":42,"value":521},{"type":36,"tag":262,"props":760,"children":762},{"id":761},"error-struct-std-has-no-member-named-io-writers-are-stdiowriter-stdout-is-stdiofilestdout",[763,765,771,773],{"type":42,"value":764},"error: struct 'std' has no member named 'io' — writers are ",{"type":36,"tag":51,"props":766,"children":768},{"className":767},[],[769],{"type":42,"value":770},"std.Io.Writer",{"type":42,"value":772},", stdout is ",{"type":36,"tag":51,"props":774,"children":776},{"className":775},[],[777],{"type":42,"value":778},"std.Io.File.stdout()",{"type":36,"tag":45,"props":780,"children":781},{},[782,788,789,795,797,802],{"type":36,"tag":51,"props":783,"children":785},{"className":784},[],[786],{"type":42,"value":787},"std.io.getStdOut().writer()",{"type":42,"value":252},{"type":36,"tag":51,"props":790,"children":792},{"className":791},[],[793],{"type":42,"value":794},"std.io.fixedBufferStream",{"type":42,"value":796}," are gone. Stdout takes ",{"type":36,"tag":51,"props":798,"children":800},{"className":799},[],[801],{"type":42,"value":588},{"type":42,"value":803}," plus a caller-owned buffer, and the printable interface lives one field deep:",{"type":36,"tag":279,"props":805,"children":807},{"className":281,"code":806,"language":4,"meta":283,"style":283},"var stdout_buffer: [4096]u8 = undefined;\nvar stdout_writer = std.Io.File.stdout().writer(io, &stdout_buffer);\nconst stdout = &stdout_writer.interface;\ndefer stdout.flush() catch {};\ntry stdout.print(\"{s}\\n\", .{message});\n",[808],{"type":36,"tag":51,"props":809,"children":810},{"__ignoreMap":283},[811,819,827,835,843],{"type":36,"tag":289,"props":812,"children":813},{"class":291,"line":292},[814],{"type":36,"tag":289,"props":815,"children":816},{},[817],{"type":42,"value":818},"var stdout_buffer: [4096]u8 = undefined;\n",{"type":36,"tag":289,"props":820,"children":821},{"class":291,"line":301},[822],{"type":36,"tag":289,"props":823,"children":824},{},[825],{"type":42,"value":826},"var stdout_writer = std.Io.File.stdout().writer(io, &stdout_buffer);\n",{"type":36,"tag":289,"props":828,"children":829},{"class":291,"line":310},[830],{"type":36,"tag":289,"props":831,"children":832},{},[833],{"type":42,"value":834},"const stdout = &stdout_writer.interface;\n",{"type":36,"tag":289,"props":836,"children":837},{"class":291,"line":319},[838],{"type":36,"tag":289,"props":839,"children":840},{},[841],{"type":42,"value":842},"defer stdout.flush() catch {};\n",{"type":36,"tag":289,"props":844,"children":845},{"class":291,"line":328},[846],{"type":36,"tag":289,"props":847,"children":848},{},[849],{"type":42,"value":850},"try stdout.print(\"{s}\\n\", .{message});\n",{"type":36,"tag":45,"props":852,"children":853},{},[854,856,862,864,870,872,877,879,885,887,893],{"type":42,"value":855},"Forgetting ",{"type":36,"tag":51,"props":857,"children":859},{"className":858},[],[860],{"type":42,"value":861},"flush()",{"type":42,"value":863}," means no output — the buffer is yours. ",{"type":36,"tag":51,"props":865,"children":867},{"className":866},[],[868],{"type":42,"value":869},"std.debug.print",{"type":42,"value":871}," is unchanged and needs no ",{"type":36,"tag":51,"props":873,"children":875},{"className":874},[],[876],{"type":42,"value":588},{"type":42,"value":878},"; prefer it for diagnostics. The ",{"type":36,"tag":51,"props":880,"children":882},{"className":881},[],[883],{"type":42,"value":884},"fixedBufferStream",{"type":42,"value":886}," replacement is a fixed writer over a stack buffer, and the written bytes come back from ",{"type":36,"tag":51,"props":888,"children":890},{"className":889},[],[891],{"type":42,"value":892},"buffered()",{"type":42,"value":894},":",{"type":36,"tag":279,"props":896,"children":898},{"className":281,"code":897,"language":4,"meta":283,"style":283},"var buf: [256]u8 = undefined;\nvar writer = std.Io.Writer.fixed(&buf);\ntry writer.print(\"n={d}\", .{42});\nconst written = writer.buffered();\n",[899],{"type":36,"tag":51,"props":900,"children":901},{"__ignoreMap":283},[902,910,918,926],{"type":36,"tag":289,"props":903,"children":904},{"class":291,"line":292},[905],{"type":36,"tag":289,"props":906,"children":907},{},[908],{"type":42,"value":909},"var buf: [256]u8 = undefined;\n",{"type":36,"tag":289,"props":911,"children":912},{"class":291,"line":301},[913],{"type":36,"tag":289,"props":914,"children":915},{},[916],{"type":42,"value":917},"var writer = std.Io.Writer.fixed(&buf);\n",{"type":36,"tag":289,"props":919,"children":920},{"class":291,"line":310},[921],{"type":36,"tag":289,"props":922,"children":923},{},[924],{"type":42,"value":925},"try writer.print(\"n={d}\", .{42});\n",{"type":36,"tag":289,"props":927,"children":928},{"class":291,"line":319},[929],{"type":36,"tag":289,"props":930,"children":931},{},[932],{"type":42,"value":933},"const written = writer.buffered();\n",{"type":36,"tag":45,"props":935,"children":936},{},[937,939,945,947,953,954,960,962,968,969,975,977,983,985,991,992,997,999,1005],{"type":42,"value":938},"For building a string of unknown size, use an allocating writer instead of an ArrayList writer: ",{"type":36,"tag":51,"props":940,"children":942},{"className":941},[],[943],{"type":42,"value":944},"var w = std.Io.Writer.Allocating.init(allocator); defer w.deinit();",{"type":42,"value":946}," then print through ",{"type":36,"tag":51,"props":948,"children":950},{"className":949},[],[951],{"type":42,"value":952},"w.writer",{"type":42,"value":513},{"type":36,"tag":51,"props":955,"children":957},{"className":956},[],[958],{"type":42,"value":959},"src\u002Fautomation\u002Fserver.zig",{"type":42,"value":961},"). One-shot formatting still has ",{"type":36,"tag":51,"props":963,"children":965},{"className":964},[],[966],{"type":42,"value":967},"std.fmt.bufPrint",{"type":42,"value":252},{"type":36,"tag":51,"props":970,"children":972},{"className":971},[],[973],{"type":42,"value":974},"std.fmt.allocPrint",{"type":42,"value":976},", unchanged. Functions that accept a writer take ",{"type":36,"tag":51,"props":978,"children":980},{"className":979},[],[981],{"type":42,"value":982},"*std.Io.Writer",{"type":42,"value":984},", not ",{"type":36,"tag":51,"props":986,"children":988},{"className":987},[],[989],{"type":42,"value":990},"anytype",{"type":42,"value":513},{"type":36,"tag":51,"props":993,"children":995},{"className":994},[],[996],{"type":42,"value":703},{"type":42,"value":998},"; fixed-writer reference: ",{"type":36,"tag":51,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":42,"value":1004},"src\u002Ftooling\u002Fdoctor.zig",{"type":42,"value":521},{"type":36,"tag":262,"props":1007,"children":1009},{"id":1008},"error-struct-array_listalignedu8null-has-no-member-named-init-arraylist-is-unmanaged",[1010],{"type":42,"value":1011},"error: struct 'array_list.Aligned(u8,null)' has no member named 'init' — ArrayList is unmanaged",{"type":36,"tag":45,"props":1013,"children":1014},{},[1015,1021,1023,1028],{"type":36,"tag":51,"props":1016,"children":1018},{"className":1017},[],[1019],{"type":42,"value":1020},"std.ArrayList(T).init(allocator)",{"type":42,"value":1022}," is gone; the list no longer stores its allocator. Initialize with ",{"type":36,"tag":51,"props":1024,"children":1026},{"className":1025},[],[1027],{"type":42,"value":161},{"type":42,"value":1029}," and pass the allocator to every call that can allocate or free:",{"type":36,"tag":279,"props":1031,"children":1033},{"className":281,"code":1032,"language":4,"meta":283,"style":283},"var list: std.ArrayList(u8) = .empty;\ndefer list.deinit(allocator);\ntry list.append(allocator, 'a');\ntry list.appendSlice(allocator, \"bc\");\nconst owned = try list.toOwnedSlice(allocator);\n",[1034],{"type":36,"tag":51,"props":1035,"children":1036},{"__ignoreMap":283},[1037,1045,1053,1061,1069],{"type":36,"tag":289,"props":1038,"children":1039},{"class":291,"line":292},[1040],{"type":36,"tag":289,"props":1041,"children":1042},{},[1043],{"type":42,"value":1044},"var list: std.ArrayList(u8) = .empty;\n",{"type":36,"tag":289,"props":1046,"children":1047},{"class":291,"line":301},[1048],{"type":36,"tag":289,"props":1049,"children":1050},{},[1051],{"type":42,"value":1052},"defer list.deinit(allocator);\n",{"type":36,"tag":289,"props":1054,"children":1055},{"class":291,"line":310},[1056],{"type":36,"tag":289,"props":1057,"children":1058},{},[1059],{"type":42,"value":1060},"try list.append(allocator, 'a');\n",{"type":36,"tag":289,"props":1062,"children":1063},{"class":291,"line":319},[1064],{"type":36,"tag":289,"props":1065,"children":1066},{},[1067],{"type":42,"value":1068},"try list.appendSlice(allocator, \"bc\");\n",{"type":36,"tag":289,"props":1070,"children":1071},{"class":291,"line":328},[1072],{"type":36,"tag":289,"props":1073,"children":1074},{},[1075],{"type":42,"value":1076},"const owned = try list.toOwnedSlice(allocator);\n",{"type":36,"tag":45,"props":1078,"children":1079},{},[1080,1082,1088,1090,1095,1097,1103,1105,1111,1113,1119,1121,1127,1129,1135,1137,1142,1143,1149],{"type":42,"value":1081},"This is everywhere in the SDK — ",{"type":36,"tag":51,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":42,"value":1087},"src\u002Ftooling\u002Ftemplates.zig",{"type":42,"value":1089}," builds every generated file this way, ",{"type":36,"tag":51,"props":1091,"children":1093},{"className":1092},[],[1094],{"type":42,"value":703},{"type":42,"value":1096}," collects skills this way. Passing a managed-style call (",{"type":36,"tag":51,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":42,"value":1102},"list.append('a')",{"type":42,"value":1104},") fails with \"member function expected 2 argument(s), found 1\". ",{"type":36,"tag":51,"props":1106,"children":1108},{"className":1107},[],[1109],{"type":42,"value":1110},"std.StringHashMap",{"type":42,"value":1112},"\u002F",{"type":36,"tag":51,"props":1114,"children":1116},{"className":1115},[],[1117],{"type":42,"value":1118},"std.AutoHashMap",{"type":42,"value":1120}," still have managed ",{"type":36,"tag":51,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":42,"value":1126},".init(allocator)",{"type":42,"value":1128}," forms; only explicitly ",{"type":36,"tag":51,"props":1130,"children":1132},{"className":1131},[],[1133],{"type":42,"value":1134},"Unmanaged",{"type":42,"value":1136}," maps take ",{"type":36,"tag":51,"props":1138,"children":1140},{"className":1139},[],[1141],{"type":42,"value":161},{"type":42,"value":513},{"type":36,"tag":51,"props":1144,"children":1146},{"className":1145},[],[1147],{"type":42,"value":1148},"tools\u002Fnative-sdk\u002Fmarkup_lsp.zig",{"type":42,"value":521},{"type":36,"tag":262,"props":1151,"children":1153},{"id":1152},"error-invalid-format-string-s-for-type-enums-print-with-t-format-methods-with-f",[1154,1156,1162,1164],{"type":42,"value":1155},"error: invalid format string 's' for type — enums print with ",{"type":36,"tag":51,"props":1157,"children":1159},{"className":1158},[],[1160],{"type":42,"value":1161},"{t}",{"type":42,"value":1163},", format methods with ",{"type":36,"tag":51,"props":1165,"children":1167},{"className":1166},[],[1168],{"type":42,"value":1169},"{f}",{"type":36,"tag":45,"props":1171,"children":1172},{},[1173,1179,1181,1186,1188,1194],{"type":36,"tag":51,"props":1174,"children":1176},{"className":1175},[],[1177],{"type":42,"value":1178},"{s}",{"type":42,"value":1180}," is for strings only. Enums and tagged unions print their tag name with ",{"type":36,"tag":51,"props":1182,"children":1184},{"className":1183},[],[1185],{"type":42,"value":1161},{"type":42,"value":1187}," (equivalent to ",{"type":36,"tag":51,"props":1189,"children":1191},{"className":1190},[],[1192],{"type":42,"value":1193},"@tagName",{"type":42,"value":1195},", which also still works):",{"type":36,"tag":279,"props":1197,"children":1199},{"className":281,"code":1198,"language":4,"meta":283,"style":283},"std.debug.print(\"native {t}: `zig build` step failed (exit code {d})\\n\", .{ verb, code });\n",[1200],{"type":36,"tag":51,"props":1201,"children":1202},{"__ignoreMap":283},[1203],{"type":36,"tag":289,"props":1204,"children":1205},{"class":291,"line":292},[1206],{"type":36,"tag":289,"props":1207,"children":1208},{},[1209],{"type":42,"value":1198},{"type":36,"tag":45,"props":1211,"children":1212},{},[1213,1215,1221,1223,1229,1231,1237,1239,1245,1247,1252],{"type":42,"value":1214},"(",{"type":36,"tag":51,"props":1216,"children":1218},{"className":1217},[],[1219],{"type":42,"value":1220},"src\u002Ftooling\u002Fverbs.zig",{"type":42,"value":1222},".) Custom format methods changed shape twice over: the old four-parameter signature no longer compiles (",{"type":36,"tag":51,"props":1224,"children":1226},{"className":1225},[],[1227],{"type":42,"value":1228},"error: struct 'fmt' has no member named 'FormatOptions'",{"type":42,"value":1230},"), and ",{"type":36,"tag":51,"props":1232,"children":1234},{"className":1233},[],[1235],{"type":42,"value":1236},"{}",{"type":42,"value":1238}," no longer calls a ",{"type":36,"tag":51,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":42,"value":1244},"format",{"type":42,"value":1246}," method at all — it prints the default field dump silently. Declare the 0.16 signature and print with ",{"type":36,"tag":51,"props":1248,"children":1250},{"className":1249},[],[1251],{"type":42,"value":1169},{"type":42,"value":894},{"type":36,"tag":279,"props":1254,"children":1256},{"className":281,"code":1255,"language":4,"meta":283,"style":283},"pub fn format(self: Point, writer: *std.Io.Writer) std.Io.Writer.Error!void {\n    try writer.print(\"({d},{d})\", .{ self.x, self.y });\n}\n\u002F\u002F call site\ntry writer.print(\"{f}\\n\", .{point});\n",[1257],{"type":36,"tag":51,"props":1258,"children":1259},{"__ignoreMap":283},[1260,1268,1276,1283,1291],{"type":36,"tag":289,"props":1261,"children":1262},{"class":291,"line":292},[1263],{"type":36,"tag":289,"props":1264,"children":1265},{},[1266],{"type":42,"value":1267},"pub fn format(self: Point, writer: *std.Io.Writer) std.Io.Writer.Error!void {\n",{"type":36,"tag":289,"props":1269,"children":1270},{"class":291,"line":301},[1271],{"type":36,"tag":289,"props":1272,"children":1273},{},[1274],{"type":42,"value":1275},"    try writer.print(\"({d},{d})\", .{ self.x, self.y });\n",{"type":36,"tag":289,"props":1277,"children":1278},{"class":291,"line":310},[1279],{"type":36,"tag":289,"props":1280,"children":1281},{},[1282],{"type":42,"value":334},{"type":36,"tag":289,"props":1284,"children":1285},{"class":291,"line":319},[1286],{"type":36,"tag":289,"props":1287,"children":1288},{},[1289],{"type":42,"value":1290},"\u002F\u002F call site\n",{"type":36,"tag":289,"props":1292,"children":1293},{"class":291,"line":328},[1294],{"type":36,"tag":289,"props":1295,"children":1296},{},[1297],{"type":42,"value":1298},"try writer.print(\"{f}\\n\", .{point});\n",{"type":36,"tag":262,"props":1300,"children":1302},{"id":1301},"error-struct-time-has-no-member-named-sleep-millitimestamp-clocks-live-on-io",[1303],{"type":42,"value":1304},"error: struct 'time' has no member named 'sleep' \u002F 'milliTimestamp' — clocks live on Io",{"type":36,"tag":45,"props":1306,"children":1307},{},[1308,1314,1316,1322,1323,1329,1331,1336],{"type":36,"tag":51,"props":1309,"children":1311},{"className":1310},[],[1312],{"type":42,"value":1313},"std.time",{"type":42,"value":1315}," keeps only the unit constants (",{"type":36,"tag":51,"props":1317,"children":1319},{"className":1318},[],[1320],{"type":42,"value":1321},"ns_per_ms",{"type":42,"value":192},{"type":36,"tag":51,"props":1324,"children":1326},{"className":1325},[],[1327],{"type":42,"value":1328},"ms_per_s",{"type":42,"value":1330},", ...) and epoch helpers. Sleeping and reading clocks take ",{"type":36,"tag":51,"props":1332,"children":1334},{"className":1333},[],[1335],{"type":42,"value":588},{"type":42,"value":1337}," and typed durations:",{"type":36,"tag":279,"props":1339,"children":1341},{"className":281,"code":1340,"language":4,"meta":283,"style":283},"try std.Io.sleep(io, std.Io.Duration.fromMilliseconds(50), .awake);\nconst now_ns: i128 = std.Io.Timestamp.now(io, .real).nanoseconds;\n",[1342],{"type":36,"tag":51,"props":1343,"children":1344},{"__ignoreMap":283},[1345,1353],{"type":36,"tag":289,"props":1346,"children":1347},{"class":291,"line":292},[1348],{"type":36,"tag":289,"props":1349,"children":1350},{},[1351],{"type":42,"value":1352},"try std.Io.sleep(io, std.Io.Duration.fromMilliseconds(50), .awake);\n",{"type":36,"tag":289,"props":1354,"children":1355},{"class":291,"line":301},[1356],{"type":36,"tag":289,"props":1357,"children":1358},{},[1359],{"type":42,"value":1360},"const now_ns: i128 = std.Io.Timestamp.now(io, .real).nanoseconds;\n",{"type":36,"tag":45,"props":1362,"children":1363},{},[1364,1365,1371,1372,1377,1379,1385,1387,1393,1395,1401,1403,1408,1409,1415],{"type":42,"value":1214},{"type":36,"tag":51,"props":1366,"children":1368},{"className":1367},[],[1369],{"type":42,"value":1370},"src\u002Fruntime\u002Fautomation_liveness_tests.zig",{"type":42,"value":192},{"type":36,"tag":51,"props":1373,"children":1375},{"className":1374},[],[1376],{"type":42,"value":959},{"type":42,"value":1378},".) In app code, do not reach for either: ",{"type":36,"tag":51,"props":1380,"children":1382},{"className":1381},[],[1383],{"type":42,"value":1384},"native_sdk.nowMs()",{"type":42,"value":1386}," \u002F ",{"type":36,"tag":51,"props":1388,"children":1390},{"className":1389},[],[1391],{"type":42,"value":1392},"native_sdk.monotonicMs()",{"type":42,"value":1394}," are the facade, ",{"type":36,"tag":51,"props":1396,"children":1398},{"className":1397},[],[1399],{"type":42,"value":1400},"fx.wallMs()",{"type":42,"value":1402}," is the journaled read inside ",{"type":36,"tag":51,"props":1404,"children":1406},{"className":1405},[],[1407],{"type":42,"value":174},{"type":42,"value":551},{"type":36,"tag":51,"props":1410,"children":1412},{"className":1411},[],[1413],{"type":42,"value":1414},"model.clock",{"type":42,"value":1416}," is the testable seam — the native-ui skill's Time section owns that pattern.",{"type":36,"tag":262,"props":1418,"children":1420},{"id":1419},"error-struct-processchild-has-no-member-named-init-spawning-is-stdprocessspawnio",[1421,1423],{"type":42,"value":1422},"error: struct 'process.Child' has no member named 'init' — spawning is ",{"type":36,"tag":51,"props":1424,"children":1426},{"className":1425},[],[1427],{"type":42,"value":1428},"std.process.spawn(io, ...)",{"type":36,"tag":45,"props":1430,"children":1431},{},[1432,1434,1440,1442,1448,1450,1455],{"type":42,"value":1433},"The two-step ",{"type":36,"tag":51,"props":1435,"children":1437},{"className":1436},[],[1438],{"type":42,"value":1439},"Child.init",{"type":42,"value":1441}," + ",{"type":36,"tag":51,"props":1443,"children":1445},{"className":1444},[],[1446],{"type":42,"value":1447},"child.spawn()",{"type":42,"value":1449}," collapsed into one call, and lifecycle methods take ",{"type":36,"tag":51,"props":1451,"children":1453},{"className":1452},[],[1454],{"type":42,"value":588},{"type":42,"value":894},{"type":36,"tag":279,"props":1457,"children":1459},{"className":281,"code":1458,"language":4,"meta":283,"style":283},"var child = try std.process.spawn(io, .{\n    .argv = &.{ \"npm\", \"run\", \"build\" },\n    .stdin = .ignore,\n    .stdout = .inherit,\n    .stderr = .inherit,\n});\nconst term = try child.wait(io);   \u002F\u002F child.kill(io) to stop it\n",[1460],{"type":36,"tag":51,"props":1461,"children":1462},{"__ignoreMap":283},[1463,1471,1479,1487,1495,1503,1511],{"type":36,"tag":289,"props":1464,"children":1465},{"class":291,"line":292},[1466],{"type":36,"tag":289,"props":1467,"children":1468},{},[1469],{"type":42,"value":1470},"var child = try std.process.spawn(io, .{\n",{"type":36,"tag":289,"props":1472,"children":1473},{"class":291,"line":301},[1474],{"type":36,"tag":289,"props":1475,"children":1476},{},[1477],{"type":42,"value":1478},"    .argv = &.{ \"npm\", \"run\", \"build\" },\n",{"type":36,"tag":289,"props":1480,"children":1481},{"class":291,"line":310},[1482],{"type":36,"tag":289,"props":1483,"children":1484},{},[1485],{"type":42,"value":1486},"    .stdin = .ignore,\n",{"type":36,"tag":289,"props":1488,"children":1489},{"class":291,"line":319},[1490],{"type":36,"tag":289,"props":1491,"children":1492},{},[1493],{"type":42,"value":1494},"    .stdout = .inherit,\n",{"type":36,"tag":289,"props":1496,"children":1497},{"class":291,"line":328},[1498],{"type":36,"tag":289,"props":1499,"children":1500},{},[1501],{"type":42,"value":1502},"    .stderr = .inherit,\n",{"type":36,"tag":289,"props":1504,"children":1505},{"class":291,"line":411},[1506],{"type":36,"tag":289,"props":1507,"children":1508},{},[1509],{"type":42,"value":1510},"});\n",{"type":36,"tag":289,"props":1512,"children":1513},{"class":291,"line":420},[1514],{"type":36,"tag":289,"props":1515,"children":1516},{},[1517],{"type":42,"value":1518},"const term = try child.wait(io);   \u002F\u002F child.kill(io) to stop it\n",{"type":36,"tag":45,"props":1520,"children":1521},{},[1522,1523,1528,1529,1535,1537,1543,1545,1550],{"type":42,"value":1214},{"type":36,"tag":51,"props":1524,"children":1526},{"className":1525},[],[1527],{"type":42,"value":1220},{"type":42,"value":192},{"type":36,"tag":51,"props":1530,"children":1532},{"className":1531},[],[1533],{"type":42,"value":1534},"src\u002Ftooling\u002Fdev.zig",{"type":42,"value":1536}," — the latter also shows passing a custom environment via ",{"type":36,"tag":51,"props":1538,"children":1540},{"className":1539},[],[1541],{"type":42,"value":1542},".environ_map",{"type":42,"value":1544},".) Inside a UiApp, spawn through the effects channel (",{"type":36,"tag":51,"props":1546,"children":1548},{"className":1547},[],[1549],{"type":42,"value":198},{"type":42,"value":1551},") instead — it is bounded, journaled, and delivers exit\u002Foutput as Msgs.",{"type":36,"tag":262,"props":1553,"children":1555},{"id":1554},"error-struct-process-has-no-member-named-getenvmap-argsalloc-environment-and-args-come-from-init",[1556],{"type":42,"value":1557},"error: struct 'process' has no member named 'getEnvMap' \u002F 'argsAlloc' — environment and args come from Init",{"type":36,"tag":45,"props":1559,"children":1560},{},[1561,1567,1568,1574,1575,1581,1583,1588,1590,1596,1598,1604,1606,1612,1613,1618,1620,1626,1627,1632],{"type":36,"tag":51,"props":1562,"children":1564},{"className":1563},[],[1565],{"type":42,"value":1566},"std.process.getEnvMap",{"type":42,"value":192},{"type":36,"tag":51,"props":1569,"children":1571},{"className":1570},[],[1572],{"type":42,"value":1573},"argsAlloc",{"type":42,"value":551},{"type":36,"tag":51,"props":1576,"children":1578},{"className":1577},[],[1579],{"type":42,"value":1580},"argsWithAllocator",{"type":42,"value":1582}," are gone. ",{"type":36,"tag":51,"props":1584,"children":1586},{"className":1585},[],[1587],{"type":42,"value":242},{"type":42,"value":1589}," already has both: ",{"type":36,"tag":51,"props":1591,"children":1593},{"className":1592},[],[1594],{"type":42,"value":1595},"init.environ_map",{"type":42,"value":1597}," (a ",{"type":36,"tag":51,"props":1599,"children":1601},{"className":1600},[],[1602],{"type":42,"value":1603},"*std.process.Environ.Map",{"type":42,"value":1605},") and ",{"type":36,"tag":51,"props":1607,"children":1609},{"className":1608},[],[1610],{"type":42,"value":1611},"init.minimal.args.toSlice(allocator)",{"type":42,"value":513},{"type":36,"tag":51,"props":1614,"children":1616},{"className":1615},[],[1617],{"type":42,"value":436},{"type":42,"value":1619},"). Building an environment from scratch — for a child process, or in tests — is ",{"type":36,"tag":51,"props":1621,"children":1623},{"className":1622},[],[1624],{"type":42,"value":1625},"var env = std.process.Environ.Map.init(allocator); defer env.deinit(); try env.put(\"KEY\", \"value\");",{"type":42,"value":513},{"type":36,"tag":51,"props":1628,"children":1630},{"className":1629},[],[1631],{"type":42,"value":1534},{"type":42,"value":521},{"type":36,"tag":262,"props":1634,"children":1636},{"id":1635},"error-struct-mem-has-no-member-named-trimright-trimleft-renamed-trimend-trimstart",[1637,1639,1645,1646],{"type":42,"value":1638},"error: struct 'mem' has no member named 'trimRight' \u002F 'trimLeft' — renamed ",{"type":36,"tag":51,"props":1640,"children":1642},{"className":1641},[],[1643],{"type":42,"value":1644},"trimEnd",{"type":42,"value":1386},{"type":36,"tag":51,"props":1647,"children":1649},{"className":1648},[],[1650],{"type":42,"value":1651},"trimStart",{"type":36,"tag":45,"props":1653,"children":1654},{},[1655],{"type":42,"value":1656},"The directional trims renamed to match the JS\u002Fstring convention; arguments are unchanged:",{"type":36,"tag":279,"props":1658,"children":1660},{"className":281,"code":1659,"language":4,"meta":283,"style":283},"const line = std.mem.trimEnd(u8, raw, \"\\r\\n\");     \u002F\u002F was trimRight\nconst body = std.mem.trimStart(u8, line, \" \\t\");   \u002F\u002F was trimLeft\nconst both = std.mem.trim(u8, text, \" \");          \u002F\u002F unchanged\n",[1661],{"type":36,"tag":51,"props":1662,"children":1663},{"__ignoreMap":283},[1664,1672,1680],{"type":36,"tag":289,"props":1665,"children":1666},{"class":291,"line":292},[1667],{"type":36,"tag":289,"props":1668,"children":1669},{},[1670],{"type":42,"value":1671},"const line = std.mem.trimEnd(u8, raw, \"\\r\\n\");     \u002F\u002F was trimRight\n",{"type":36,"tag":289,"props":1673,"children":1674},{"class":291,"line":301},[1675],{"type":36,"tag":289,"props":1676,"children":1677},{},[1678],{"type":42,"value":1679},"const body = std.mem.trimStart(u8, line, \" \\t\");   \u002F\u002F was trimLeft\n",{"type":36,"tag":289,"props":1681,"children":1682},{"class":291,"line":310},[1683],{"type":36,"tag":289,"props":1684,"children":1685},{},[1686],{"type":42,"value":1687},"const both = std.mem.trim(u8, text, \" \");          \u002F\u002F unchanged\n",{"type":36,"tag":262,"props":1689,"children":1691},{"id":1690},"error-struct-std-has-no-member-named-net-sockets-live-on-stdionet",[1692,1694],{"type":42,"value":1693},"error: struct 'std' has no member named 'net' — sockets live on ",{"type":36,"tag":51,"props":1695,"children":1697},{"className":1696},[],[1698],{"type":42,"value":1699},"std.Io.net",{"type":36,"tag":45,"props":1701,"children":1702},{},[1703,1709,1710,1716,1718,1723,1724,1730,1732,1738,1740,1746,1747,1753,1755,1760,1761,1767,1768,1774,1776,1781],{"type":36,"tag":51,"props":1704,"children":1706},{"className":1705},[],[1707],{"type":42,"value":1708},"std.net.Address",{"type":42,"value":744},{"type":36,"tag":51,"props":1711,"children":1713},{"className":1712},[],[1714],{"type":42,"value":1715},"std.Io.net.IpAddress",{"type":42,"value":1717},", and connect\u002Flisten take ",{"type":36,"tag":51,"props":1719,"children":1721},{"className":1720},[],[1722],{"type":42,"value":588},{"type":42,"value":497},{"type":36,"tag":51,"props":1725,"children":1727},{"className":1726},[],[1728],{"type":42,"value":1729},"std.Io.net.IpAddress.resolve(io, host, port)",{"type":42,"value":1731},", then ",{"type":36,"tag":51,"props":1733,"children":1735},{"className":1734},[],[1736],{"type":42,"value":1737},"IpAddress.connect(&address, io, .{ .mode = .stream, .protocol = .tcp })",{"type":42,"value":1739},"; stream readers\u002Fwriters follow the buffered-writer shape (",{"type":36,"tag":51,"props":1741,"children":1743},{"className":1742},[],[1744],{"type":42,"value":1745},"std.Io.net.Stream.writer(stream, io, &buffer)",{"type":42,"value":505},{"type":36,"tag":51,"props":1748,"children":1750},{"className":1749},[],[1751],{"type":42,"value":1752},".interface",{"type":42,"value":1754},"). Live reference: ",{"type":36,"tag":51,"props":1756,"children":1758},{"className":1757},[],[1759],{"type":42,"value":1534},{"type":42,"value":513},{"type":36,"tag":51,"props":1762,"children":1764},{"className":1763},[],[1765],{"type":42,"value":1766},"waitUntilReady",{"type":42,"value":1112},{"type":36,"tag":51,"props":1769,"children":1771},{"className":1770},[],[1772],{"type":42,"value":1773},"httpReady",{"type":42,"value":1775},"). App-level HTTP belongs in ",{"type":36,"tag":51,"props":1777,"children":1779},{"className":1778},[],[1780],{"type":42,"value":205},{"type":42,"value":1782},", not hand-rolled sockets.",{"type":36,"tag":262,"props":1784,"children":1786},{"id":1785},"error-no-field-named-root_source_file-in-struct-buildexecutableoptions-buildzig-artifacts-take-modules",[1787],{"type":42,"value":1788},"error: no field named 'root_source_file' in struct 'Build.ExecutableOptions' — build.zig artifacts take modules",{"type":36,"tag":45,"props":1790,"children":1791},{},[1792,1794,1800,1802,1808],{"type":42,"value":1793},"Zero-config apps have no ",{"type":36,"tag":51,"props":1795,"children":1797},{"className":1796},[],[1798],{"type":42,"value":1799},"build.zig",{"type":42,"value":1801}," — the CLI owns the build graph, so this only appears in apps that ejected or scaffolded ",{"type":36,"tag":51,"props":1803,"children":1805},{"className":1804},[],[1806],{"type":42,"value":1807},"--full",{"type":42,"value":1809},". Artifacts take a module, and the module owns root source, target, and optimize:",{"type":36,"tag":279,"props":1811,"children":1813},{"className":281,"code":1812,"language":4,"meta":283,"style":283},"const exe = b.addExecutable(.{\n    .name = \"app\",\n    .root_module = b.createModule(.{\n        .root_source_file = b.path(\"src\u002Fmain.zig\"),\n        .target = target,\n        .optimize = optimize,\n    }),\n});\nconst tests = b.addTest(.{ .root_module = app_mod });\n",[1814],{"type":36,"tag":51,"props":1815,"children":1816},{"__ignoreMap":283},[1817,1825,1833,1841,1849,1857,1865,1873,1881],{"type":36,"tag":289,"props":1818,"children":1819},{"class":291,"line":292},[1820],{"type":36,"tag":289,"props":1821,"children":1822},{},[1823],{"type":42,"value":1824},"const exe = b.addExecutable(.{\n",{"type":36,"tag":289,"props":1826,"children":1827},{"class":291,"line":301},[1828],{"type":36,"tag":289,"props":1829,"children":1830},{},[1831],{"type":42,"value":1832},"    .name = \"app\",\n",{"type":36,"tag":289,"props":1834,"children":1835},{"class":291,"line":310},[1836],{"type":36,"tag":289,"props":1837,"children":1838},{},[1839],{"type":42,"value":1840},"    .root_module = b.createModule(.{\n",{"type":36,"tag":289,"props":1842,"children":1843},{"class":291,"line":319},[1844],{"type":36,"tag":289,"props":1845,"children":1846},{},[1847],{"type":42,"value":1848},"        .root_source_file = b.path(\"src\u002Fmain.zig\"),\n",{"type":36,"tag":289,"props":1850,"children":1851},{"class":291,"line":328},[1852],{"type":36,"tag":289,"props":1853,"children":1854},{},[1855],{"type":42,"value":1856},"        .target = target,\n",{"type":36,"tag":289,"props":1858,"children":1859},{"class":291,"line":411},[1860],{"type":36,"tag":289,"props":1861,"children":1862},{},[1863],{"type":42,"value":1864},"        .optimize = optimize,\n",{"type":36,"tag":289,"props":1866,"children":1867},{"class":291,"line":420},[1868],{"type":36,"tag":289,"props":1869,"children":1870},{},[1871],{"type":42,"value":1872},"    }),\n",{"type":36,"tag":289,"props":1874,"children":1876},{"class":291,"line":1875},8,[1877],{"type":36,"tag":289,"props":1878,"children":1879},{},[1880],{"type":42,"value":1510},{"type":36,"tag":289,"props":1882,"children":1884},{"class":291,"line":1883},9,[1885],{"type":36,"tag":289,"props":1886,"children":1887},{},[1888],{"type":42,"value":1889},"const tests = b.addTest(.{ .root_module = app_mod });\n",{"type":36,"tag":45,"props":1891,"children":1892},{},[1893,1895,1900,1902,1908,1910,1915,1917,1922],{"type":42,"value":1894},"The generated ejected ",{"type":36,"tag":51,"props":1896,"children":1898},{"className":1897},[],[1899],{"type":42,"value":1799},{"type":42,"value":1901}," is the reference shape (",{"type":36,"tag":51,"props":1903,"children":1905},{"className":1904},[],[1906],{"type":42,"value":1907},"native eject",{"type":42,"value":1909},", emitted by ",{"type":36,"tag":51,"props":1911,"children":1913},{"className":1912},[],[1914],{"type":42,"value":1087},{"type":42,"value":1916},"); the SDK's own ",{"type":36,"tag":51,"props":1918,"children":1920},{"className":1919},[],[1921],{"type":42,"value":1799},{"type":42,"value":1923}," uses the same pattern throughout.",{"type":36,"tag":262,"props":1925,"children":1927},{"id":1926},"reading-files-and-streams-incrementally",[1928],{"type":42,"value":1929},"Reading files and streams incrementally",{"type":36,"tag":45,"props":1931,"children":1932},{},[1933,1939,1941,1946,1948,1953],{"type":36,"tag":51,"props":1934,"children":1936},{"className":1935},[],[1937],{"type":42,"value":1938},"file.reader()",{"type":42,"value":1940}," with no arguments is gone. A reader takes ",{"type":36,"tag":51,"props":1942,"children":1944},{"className":1943},[],[1945],{"type":42,"value":588},{"type":42,"value":1947}," and a buffer, and the stream interface lives on ",{"type":36,"tag":51,"props":1949,"children":1951},{"className":1950},[],[1952],{"type":42,"value":1752},{"type":42,"value":894},{"type":36,"tag":279,"props":1955,"children":1957},{"className":281,"code":1956,"language":4,"meta":283,"style":283},"var read_buffer: [4096]u8 = undefined;\nvar reader = file.reader(io, &read_buffer);\nconst bytes = try reader.interface.allocRemaining(allocator, .limited(1024 * 1024));\nconst line = try reader.interface.takeDelimiterExclusive('\\n');\n",[1958],{"type":36,"tag":51,"props":1959,"children":1960},{"__ignoreMap":283},[1961,1969,1977,1985],{"type":36,"tag":289,"props":1962,"children":1963},{"class":291,"line":292},[1964],{"type":36,"tag":289,"props":1965,"children":1966},{},[1967],{"type":42,"value":1968},"var read_buffer: [4096]u8 = undefined;\n",{"type":36,"tag":289,"props":1970,"children":1971},{"class":291,"line":301},[1972],{"type":36,"tag":289,"props":1973,"children":1974},{},[1975],{"type":42,"value":1976},"var reader = file.reader(io, &read_buffer);\n",{"type":36,"tag":289,"props":1978,"children":1979},{"class":291,"line":310},[1980],{"type":36,"tag":289,"props":1981,"children":1982},{},[1983],{"type":42,"value":1984},"const bytes = try reader.interface.allocRemaining(allocator, .limited(1024 * 1024));\n",{"type":36,"tag":289,"props":1986,"children":1987},{"class":291,"line":319},[1988],{"type":36,"tag":289,"props":1989,"children":1990},{},[1991],{"type":42,"value":1992},"const line = try reader.interface.takeDelimiterExclusive('\\n');\n",{"type":36,"tag":45,"props":1994,"children":1995},{},[1996,1997,2002,2004,2010,2012,2017],{"type":42,"value":1214},{"type":36,"tag":51,"props":1998,"children":2000},{"className":1999},[],[2001],{"type":42,"value":711},{"type":42,"value":2003}," for allocRemaining, ",{"type":36,"tag":51,"props":2005,"children":2007},{"className":2006},[],[2008],{"type":42,"value":2009},"src\u002Ftooling\u002Ftoolchain.zig",{"type":42,"value":2011}," for line reading from stdin.) For whole-file reads, prefer ",{"type":36,"tag":51,"props":2013,"children":2015},{"className":2014},[],[2016],{"type":42,"value":664},{"type":42,"value":2018}," above.",{"type":36,"tag":262,"props":2020,"children":2022},{"id":2021},"tests-the-io-is-stdtestingio",[2023,2025],{"type":42,"value":2024},"Tests: the Io is ",{"type":36,"tag":51,"props":2026,"children":2028},{"className":2027},[],[2029],{"type":42,"value":132},{"type":36,"tag":45,"props":2031,"children":2032},{},[2033,2035,2040,2041,2046,2048,2054],{"type":42,"value":2034},"Tests never construct an ",{"type":36,"tag":51,"props":2036,"children":2038},{"className":2037},[],[2039],{"type":42,"value":182},{"type":42,"value":681},{"type":36,"tag":51,"props":2042,"children":2044},{"className":2043},[],[2045],{"type":42,"value":132},{"type":42,"value":2047}," is the canonical one, next to ",{"type":36,"tag":51,"props":2049,"children":2051},{"className":2050},[],[2052],{"type":42,"value":2053},"std.testing.allocator",{"type":42,"value":894},{"type":36,"tag":279,"props":2056,"children":2058},{"className":281,"code":2057,"language":4,"meta":283,"style":283},"test \"reads the manifest\" {\n    var tmp = std.testing.tmpDir(.{});\n    defer tmp.cleanup();\n    try tmp.dir.writeFile(std.testing.io, .{ .sub_path = \"app.zon\", .data = source });\n    const content = try tmp.dir.readFileAlloc(std.testing.io, \"app.zon\", std.testing.allocator, .limited(4096));\n    defer std.testing.allocator.free(content);\n}\n",[2059],{"type":36,"tag":51,"props":2060,"children":2061},{"__ignoreMap":283},[2062,2070,2078,2086,2094,2102,2110],{"type":36,"tag":289,"props":2063,"children":2064},{"class":291,"line":292},[2065],{"type":36,"tag":289,"props":2066,"children":2067},{},[2068],{"type":42,"value":2069},"test \"reads the manifest\" {\n",{"type":36,"tag":289,"props":2071,"children":2072},{"class":291,"line":301},[2073],{"type":36,"tag":289,"props":2074,"children":2075},{},[2076],{"type":42,"value":2077},"    var tmp = std.testing.tmpDir(.{});\n",{"type":36,"tag":289,"props":2079,"children":2080},{"class":291,"line":310},[2081],{"type":36,"tag":289,"props":2082,"children":2083},{},[2084],{"type":42,"value":2085},"    defer tmp.cleanup();\n",{"type":36,"tag":289,"props":2087,"children":2088},{"class":291,"line":319},[2089],{"type":36,"tag":289,"props":2090,"children":2091},{},[2092],{"type":42,"value":2093},"    try tmp.dir.writeFile(std.testing.io, .{ .sub_path = \"app.zon\", .data = source });\n",{"type":36,"tag":289,"props":2095,"children":2096},{"class":291,"line":328},[2097],{"type":36,"tag":289,"props":2098,"children":2099},{},[2100],{"type":42,"value":2101},"    const content = try tmp.dir.readFileAlloc(std.testing.io, \"app.zon\", std.testing.allocator, .limited(4096));\n",{"type":36,"tag":289,"props":2103,"children":2104},{"class":291,"line":411},[2105],{"type":36,"tag":289,"props":2106,"children":2107},{},[2108],{"type":42,"value":2109},"    defer std.testing.allocator.free(content);\n",{"type":36,"tag":289,"props":2111,"children":2112},{"class":291,"line":420},[2113],{"type":36,"tag":289,"props":2114,"children":2115},{},[2116],{"type":42,"value":334},{"type":36,"tag":45,"props":2118,"children":2119},{},[2120,2121,2126,2127,2132,2134,2139],{"type":42,"value":1214},{"type":36,"tag":51,"props":2122,"children":2124},{"className":2123},[],[2125],{"type":42,"value":719},{"type":42,"value":252},{"type":36,"tag":51,"props":2128,"children":2130},{"className":2129},[],[2131],{"type":42,"value":711},{"type":42,"value":2133}," tests.) Model\u002FMsg\u002Fupdate tests need no ",{"type":36,"tag":51,"props":2135,"children":2137},{"className":2136},[],[2138],{"type":42,"value":182},{"type":42,"value":2140}," at all — the markup-view testing pattern in the native-ui skill is pure.",{"type":36,"tag":262,"props":2142,"children":2144},{"id":2143},"unchanged-do-not-migrate-these",[2145],{"type":42,"value":2146},"Unchanged — do not \"migrate\" these",{"type":36,"tag":45,"props":2148,"children":2149},{},[2150,2155,2156,2162,2163,2169,2170,2176,2177,2183,2184,2189,2190,2195,2196,2202,2203,2209,2211,2217,2218,2224,2226,2231,2232,2237],{"type":36,"tag":51,"props":2151,"children":2153},{"className":2152},[],[2154],{"type":42,"value":967},{"type":42,"value":1386},{"type":36,"tag":51,"props":2157,"children":2159},{"className":2158},[],[2160],{"type":42,"value":2161},"allocPrint",{"type":42,"value":1386},{"type":36,"tag":51,"props":2164,"children":2166},{"className":2165},[],[2167],{"type":42,"value":2168},"parseInt",{"type":42,"value":1386},{"type":36,"tag":51,"props":2171,"children":2173},{"className":2172},[],[2174],{"type":42,"value":2175},"parseFloat",{"type":42,"value":192},{"type":36,"tag":51,"props":2178,"children":2180},{"className":2179},[],[2181],{"type":42,"value":2182},"std.mem.*",{"type":42,"value":192},{"type":36,"tag":51,"props":2185,"children":2187},{"className":2186},[],[2188],{"type":42,"value":869},{"type":42,"value":192},{"type":36,"tag":51,"props":2191,"children":2193},{"className":2192},[],[2194],{"type":42,"value":481},{"type":42,"value":192},{"type":36,"tag":51,"props":2197,"children":2199},{"className":2198},[],[2200],{"type":42,"value":2201},"std.time.ns_per_*",{"type":42,"value":252},{"type":36,"tag":51,"props":2204,"children":2206},{"className":2205},[],[2207],{"type":42,"value":2208},"ms_per_*",{"type":42,"value":2210}," constants, ",{"type":36,"tag":51,"props":2212,"children":2214},{"className":2213},[],[2215],{"type":42,"value":2216},"@embedFile",{"type":42,"value":192},{"type":36,"tag":51,"props":2219,"children":2221},{"className":2220},[],[2222],{"type":42,"value":2223},"std.testing.expect*",{"type":42,"value":2225},", and managed ",{"type":36,"tag":51,"props":2227,"children":2229},{"className":2228},[],[2230],{"type":42,"value":1110},{"type":42,"value":1386},{"type":36,"tag":51,"props":2233,"children":2235},{"className":2234},[],[2236],{"type":42,"value":1118},{"type":42,"value":2238}," all work as before. If code using only these fails, the problem is elsewhere.",{"type":36,"tag":2240,"props":2241,"children":2242},"style",{},[2243],{"type":42,"value":2244},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2246,"total":328},[2247,2262,2277,2292,2303],{"slug":2248,"name":2248,"fn":2249,"description":2250,"org":2251,"tags":2252,"stars":19,"repoUrl":20,"updatedAt":2261},"automation","automate and verify Native SDK applications","Automation and verification guide for running Native SDK apps. Use when the user asks to test a running app, inspect runtime state, list windows, wait for readiness, drive widgets, take deterministic screenshots, send bridge commands, debug why automation is not connected, create smoke tests, or verify a Native SDK example in a GUI-capable session.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2253,2255,2258],{"name":2254,"slug":2248,"type":15},"Automation",{"name":2256,"slug":2257,"type":15},"Mobile","mobile",{"name":2259,"slug":2260,"type":15},"Testing","testing","2026-07-20T05:57:16.544049",{"slug":2263,"name":2263,"fn":2264,"description":2265,"org":2266,"tags":2267,"stars":19,"repoUrl":20,"updatedAt":2276},"native-sdk","develop native desktop applications with Zig","Discovery skill for the Native SDK, the complete toolkit for building native desktop applications - views are declarative Native markup (.native), logic is plain Zig, and the toolkit's own engine renders every pixel, with WebView surfaces as the optional web-content path. Use when the user asks what the Native SDK is, how to build a Native SDK app, author native UI, scaffold an app, configure app.zon, add bridge commands, embed web content, package an app, test a running app, or automate a Native SDK app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2268,2271,2274],{"name":2269,"slug":2270,"type":15},"Desktop","desktop",{"name":2272,"slug":2273,"type":15},"SDK","sdk",{"name":2275,"slug":4,"type":15},"Zig","2026-07-17T06:08:49.453123",{"slug":2278,"name":2278,"fn":2279,"description":2280,"org":2281,"tags":2282,"stars":19,"repoUrl":20,"updatedAt":2291},"native-ui","build native user interfaces with Zig","Authoring guide for native-rendered Native SDK apps - declarative Native markup (.native) views plus Zig logic on the UiApp loop. Use when building or modifying native UI (widgets, layout, bindings, messages), writing .native files, wiring Model\u002FMsg\u002Fupdate, testing markup views, or verifying a native app through the automation harness.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2283,2284,2287,2290],{"name":2269,"slug":2270,"type":15},{"name":2285,"slug":2286,"type":15},"Native","native",{"name":2288,"slug":2289,"type":15},"UI Components","ui-components",{"name":2275,"slug":4,"type":15},"2026-07-26T05:49:56.17769",{"slug":2293,"name":2293,"fn":2294,"description":2295,"org":2296,"tags":2297,"stars":19,"repoUrl":20,"updatedAt":2302},"ts-core","author TypeScript application cores","Authoring guide for TypeScript app cores - Model, Msg, update, and the pure functions they call, written in the closed app-core subset and compiled ahead-of-time to arena-backed Zig by the @native-sdk\u002Fcore transpiler. Use when writing or modifying a src\u002Fcore.ts app core, fixing subset checker errors (NS1001-NS1060), or deciding how to express state, messages, text (bytes and the byte-text string methods), text input, continuous controls (sliders, scroll), effects (Cmd), subscriptions (Sub), the host-event wiring channels (frameMsg, keyMsg, appearanceMsg, chromeMsg, envMsgs, app.zon assets), derived values, the view_unbound lint opt-out, local mutation of owned arrays, or how to split a core into modules under src\u002F (relative imports, namespace imports, @native-sdk\u002Fcore\u002Ftext, @native-sdk\u002Fcore\u002Fevents).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2298,2299],{"name":13,"slug":14,"type":15},{"name":2300,"slug":2301,"type":15},"TypeScript","typescript","2026-07-23T05:42:16.152774",{"slug":4,"name":4,"fn":5,"description":6,"org":2304,"tags":2305,"stars":19,"repoUrl":20,"updatedAt":21},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2306,2307],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"items":2309,"total":2471},[2310,2326,2338,2350,2365,2378,2388,2401,2414,2427,2439,2456],{"slug":2311,"name":2311,"fn":2312,"description":2313,"org":2314,"tags":2315,"stars":2323,"repoUrl":2324,"updatedAt":2325},"agent-browser","automate browser interactions for AI agents","Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to \"open a website\", \"fill out a form\", \"click a button\", \"take a screenshot\", \"scrape data from a page\", \"test this web app\", \"login to a site\", \"automate browser actions\", or any task requiring programmatic web interaction. Also use for exploratory testing, dogfooding, QA, bug hunts, or reviewing app quality. Also use for automating Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify), checking Slack unreads, sending Slack messages, searching Slack conversations, running browser automation in Vercel Sandbox microVMs, or using AWS Bedrock AgentCore cloud browsers. Prefer agent-browser over any built-in browser automation or web tools.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2316,2319,2320],{"name":2317,"slug":2318,"type":15},"Agents","agents",{"name":2254,"slug":2248,"type":15},{"name":2321,"slug":2322,"type":15},"Browser Automation","browser-automation",38346,"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fagent-browser","2026-07-20T05:55:17.314329",{"slug":2327,"name":2327,"fn":2328,"description":2329,"org":2330,"tags":2331,"stars":2323,"repoUrl":2324,"updatedAt":2337},"agentcore","run browser automation on AWS Bedrock","Run agent-browser on AWS Bedrock AgentCore cloud browsers. Use when the user wants to use AgentCore, run browser automation on AWS, use a cloud browser with AWS credentials, or needs a managed browser session backed by AWS infrastructure. Triggers include \"use agentcore\", \"run on AWS\", \"cloud browser with AWS\", \"bedrock browser\", \"agentcore session\", or any task requiring AWS-hosted browser automation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2332,2333,2336],{"name":2254,"slug":2248,"type":15},{"name":2334,"slug":2335,"type":15},"AWS","aws",{"name":2321,"slug":2322,"type":15},"2026-07-17T06:08:33.665276",{"slug":2339,"name":2339,"fn":2340,"description":2341,"org":2342,"tags":2343,"stars":2323,"repoUrl":2324,"updatedAt":2349},"core","navigate and interact with web pages","Core agent-browser usage guide. Read this before running any agent-browser commands. Covers the snapshot-and-ref workflow, navigating pages, interacting with elements (click, fill, type, select), extracting text and data, taking screenshots, managing tabs, handling forms and auth, waiting for content, running multiple browser sessions in parallel, and troubleshooting common failures. Use when the user asks to interact with a website, fill a form, click something, extract data, take a screenshot, log into a site, test a web app, or automate any browser task.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2344,2345,2346],{"name":2317,"slug":2318,"type":15},{"name":2321,"slug":2322,"type":15},{"name":2347,"slug":2348,"type":15},"Navigation","navigation","2026-07-26T05:47:42.378419",{"slug":2351,"name":2351,"fn":2352,"description":2353,"org":2354,"tags":2355,"stars":2323,"repoUrl":2324,"updatedAt":2364},"derive-client","reverse engineer internal APIs from browser traffic","Reverse-engineer a website's internal API by recording browser traffic into a HAR file, then generate a standalone client or CLI that calls the endpoints directly, with no browser needed after the first recording. Use when asked to \"derive a client\", \"build a CLI for \u003Csite>\", \"reverse engineer this site's API\", \"record network requests\", \"turn this site into an API\", or when the same site will be automated repeatedly and direct HTTP calls would beat driving the browser every time.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2356,2359,2360,2361],{"name":2357,"slug":2358,"type":15},"API Development","api-development",{"name":2254,"slug":2248,"type":15},{"name":2321,"slug":2322,"type":15},{"name":2362,"slug":2363,"type":15},"Web Scraping","web-scraping","2026-07-20T06:24:11.928835",{"slug":2366,"name":2366,"fn":2367,"description":2368,"org":2369,"tags":2370,"stars":2323,"repoUrl":2324,"updatedAt":2377},"dogfood","perform exploratory testing on web applications","Systematically explore and test a web application to find bugs, UX issues, and other problems. Use when asked to \"dogfood\", \"QA\", \"exploratory test\", \"find issues\", \"bug hunt\", \"test this app\u002Fsite\u002Fplatform\", or review the quality of a web application. Produces a structured report with full reproduction evidence -- step-by-step screenshots, repro videos, and detailed repro steps for every issue -- so findings can be handed directly to the responsible teams.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2371,2372,2373,2376],{"name":2321,"slug":2322,"type":15},{"name":17,"slug":18,"type":15},{"name":2374,"slug":2375,"type":15},"QA","qa",{"name":2259,"slug":2260,"type":15},"2026-07-17T06:07:41.421482",{"slug":2379,"name":2379,"fn":2380,"description":2381,"org":2382,"tags":2383,"stars":2323,"repoUrl":2324,"updatedAt":2387},"electron","automate Electron desktop applications","Automate Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify, etc.) using agent-browser via Chrome DevTools Protocol. Use when the user needs to interact with an Electron app, automate a desktop app, connect to a running app, control a native app, or test an Electron application. Triggers include \"automate Slack app\", \"control VS Code\", \"interact with Discord app\", \"test this Electron app\", \"connect to desktop app\", or any task requiring automation of a native Electron application.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2384,2385,2386],{"name":2317,"slug":2318,"type":15},{"name":2321,"slug":2322,"type":15},{"name":2269,"slug":2270,"type":15},"2026-07-17T06:08:28.007783",{"slug":2389,"name":2389,"fn":2390,"description":2391,"org":2392,"tags":2393,"stars":2323,"repoUrl":2324,"updatedAt":2400},"slack","interact with Slack workspaces","Interact with Slack workspaces using browser automation. Use when the user needs to check unread channels, navigate Slack, send messages, extract data, find information, search conversations, or automate any Slack task. Triggers include \"check my Slack\", \"what channels have unreads\", \"send a message to\", \"search Slack for\", \"extract from Slack\", \"find who said\", or any task requiring programmatic Slack interaction.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2394,2395,2398],{"name":2321,"slug":2322,"type":15},{"name":2396,"slug":2397,"type":15},"Messaging","messaging",{"name":2399,"slug":2389,"type":15},"Slack","2026-07-17T06:08:27.679015",{"slug":2402,"name":2402,"fn":2403,"description":2404,"org":2405,"tags":2406,"stars":2323,"repoUrl":2324,"updatedAt":2413},"vercel-sandbox","run browser automation in Vercel Sandbox","Run agent-browser + Chrome inside Vercel Sandbox microVMs for browser automation from any Vercel-deployed app. Use when the user needs browser automation in a Vercel app (Next.js, SvelteKit, Nuxt, Remix, Astro, etc.), wants to run headless Chrome without binary size limits, needs persistent browser sessions across commands, or wants ephemeral isolated browser environments. Triggers include \"Vercel Sandbox browser\", \"microVM Chrome\", \"agent-browser in sandbox\", \"browser automation on Vercel\", or any task requiring Chrome in a Vercel Sandbox.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2407,2408,2409,2410],{"name":2254,"slug":2248,"type":15},{"name":2321,"slug":2322,"type":15},{"name":2259,"slug":2260,"type":15},{"name":2411,"slug":2412,"type":15},"Vercel","vercel","2026-07-17T06:08:28.349899",{"slug":2415,"name":2415,"fn":2416,"description":2417,"org":2418,"tags":2419,"stars":2424,"repoUrl":2425,"updatedAt":2426},"deploy-to-vercel","deploy applications to Vercel","Deploy applications and websites to Vercel. Use when the user requests deployment actions like \"deploy my app\", \"deploy and give me the link\", \"push this live\", or \"create a preview deployment\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2420,2423],{"name":2421,"slug":2422,"type":15},"Deployment","deployment",{"name":2411,"slug":2412,"type":15},28993,"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fagent-skills","2026-07-17T06:08:41.18374",{"slug":2428,"name":2428,"fn":2429,"description":2430,"org":2431,"tags":2432,"stars":2424,"repoUrl":2425,"updatedAt":2438},"vercel-cli-with-tokens","manage Vercel projects via CLI","Deploy and manage projects on Vercel using token-based authentication. Use when working with Vercel CLI using access tokens rather than interactive login — e.g. \"deploy to vercel\", \"set up vercel\", \"add environment variables to vercel\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2433,2436,2437],{"name":2434,"slug":2435,"type":15},"CLI","cli",{"name":2421,"slug":2422,"type":15},{"name":2411,"slug":2412,"type":15},"2026-07-17T06:08:41.84179",{"slug":2440,"name":2440,"fn":2441,"description":2442,"org":2443,"tags":2444,"stars":2424,"repoUrl":2425,"updatedAt":2455},"vercel-composition-patterns","implement scalable React composition patterns","React composition patterns that scale. Use when refactoring components with boolean prop proliferation, building flexible component libraries, or designing reusable APIs. Triggers on tasks involving compound components, render props, context providers, or component architecture. Includes React 19 API changes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2445,2448,2451,2454],{"name":2446,"slug":2447,"type":15},"Best Practices","best-practices",{"name":2449,"slug":2450,"type":15},"Frontend","frontend",{"name":2452,"slug":2453,"type":15},"React","react",{"name":2288,"slug":2289,"type":15},"2026-07-17T06:05:40.576913",{"slug":2457,"name":2457,"fn":2458,"description":2459,"org":2460,"tags":2461,"stars":2424,"repoUrl":2425,"updatedAt":2470},"vercel-optimize","optimize Vercel project performance and costs","Use for Vercel cost and performance optimization on deployed projects, especially Next.js, SvelteKit, Nuxt, and limited Astro apps. Collect Vercel metrics, usage, project config, and code scan results first; investigate only metric-backed candidates; produce ranked recommendations grounded in verified files and version-aware Vercel\u002Fframework docs. Trigger for Vercel bill reduction, slow or expensive routes, caching opportunities, Function Invocations, Build Minutes, Fast Data Transfer, Core Web Vitals, Bot Management, Fluid compute, or cost breakdown requests.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2462,2465,2466,2469],{"name":2463,"slug":2464,"type":15},"Cost Optimization","cost-optimization",{"name":2421,"slug":2422,"type":15},{"name":2467,"slug":2468,"type":15},"Performance","performance",{"name":2411,"slug":2412,"type":15},"2026-07-17T06:04:08.327515",100]