[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7EWFYF44TFPHT1KB8HMW4Z1":3,"skill-same:01M7EWFYF44TFPHT1KB8HMW4Z1":45},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":26,"repositoryHtmlUrl":27,"repositoryHomepageUrl":6,"ownerHtmlUrl":28,"ownerBlogUrl":29,"ownerDescription":6,"updatedAt":30,"install":31,"resources":44},"01M7EWFYF44TFPHT1KB8HMW4Z1","ams-zig-pro",null,"TanNhatCMS\u002Fjarvis","TanNhatCMS","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F113796420?v=4","01M753MV17KG5CD3152G3WQEQY","KietNT","01M7EKEDYVYQ6PWVJJMZ911VMX",0,"MIT","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Fams-zig-pro\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: zig-pro\ndescription: Idiomatic Zig: explicit allocators, comptime, error unions, and no-hidden-control-flow philosophy. Use when writing, reviewing, or structuring Zig programs.\ncategory: development\n---\n\n# Zig Pro\n\n## Overview\n\nZig's philosophy — **no hidden control flow, no hidden allocations, explicit everything** — makes\nit a superb systems language for those willing to be explicit. Professional Zig means embracing\nthat explicitness: allocators passed as parameters, errors as values in the type system,\n`comptime` for principled metaprogramming, and defer-based cleanup as a way of life.\n\nThe through-line: if something happens, you can see it in the code. That's the whole point.\n\n## When to use\n\n- Writing or reviewing Zig code for idiom and correctness.\n- Designing APIs around allocators and error sets.\n- Using comptime for generics and metaprogramming.\n- Structuring Zig projects (build.zig, modules, packages).\n- Debugging memory, allocator, or error-handling issues.\n\n## Core concepts\n\n- **Allocators are parameters, not globals.** Functions that allocate take an\n  `std.mem.Allocator`. This makes allocation visible, testable (use a `FixedBufferAllocator` or\n  testing allocator that detects leaks in tests), and flexible (arena for request-scoped work,\n  GPA for long-lived). Never hide allocation.\n- **Errors are values.** Error unions (`!T` = `T` or error) with `try`\u002F`catch`; error sets inferred\n  or declared explicitly for public APIs. `try` propagates with zero hidden machinery. Handle\n  errors where you have context; propagate where you don't.\n- **Defer + errdefer for cleanup.** `defer` runs at scope exit; `errdefer` runs only on error\n  return — the precise tool for \"free this if we fail partway.\" Together they replace RAII with\n  visible, local reasoning.\n- **Comptime is principled metaprogramming.** Generics via `comptime` parameters, type introspection\n  via `@typeInfo`, and compile-time code generation — all type-checked, all visible. Prefer it over\n  runtime polymorphism for performance-critical generic code.\n- **Slices, arrays, and sentinels.** Zig distinguishes `[N]T`, `[]T`, `[]const u8`, and\n  sentinel-terminated slices (`[:0]u8` for C interop). Know which you have; the type tells you the\n  lifetime and mutability story.\n- **Testing is built in.** `test` blocks colocated with code, `std.testing` with the\n  leak-detecting allocator — `std.testing.allocator` fails tests on leaks. Run `zig build test`\n  in CI; memory correctness is tested, not hoped for.\n\n## Practical workflow\n\n1. **Scaffold with the build system.** `zig init`; `build.zig` declares executables, tests, and\n   options; modules for namespacing. Pin the Zig version — the language still evolves.\n2. **Choose allocators deliberately.** Arena per request\u002Fframe for batch work (free once);\n   GPA (`std.heap.GeneralPurposeAllocator`) with leak checking in dev\u002Ftests; fixed buffers for\n   no-alloc hot paths. Pass the allocator down; document who frees.\n3. **Write error sets explicitly on public APIs.** `error{OutOfMemory, InvalidFormat}` in the\n   signature tells callers exactly what can go wrong — better than inferred sets leaking\n   implementation details.\n4. **Structure for testability.** Pure functions on slices; I\u002FO at the edges; `test` blocks next\n   to the code they cover, using `std.testing.allocator` so leaks fail the test.\n5. **Use comptime where it earns its keep.** Generic containers\u002Falgorithms, compile-time lookup\n   tables, and type-driven APIs. Keep comptime code readable — it's still code someone maintains.\n6. **Interop with C carefully.** `@cImport` for headers; sentinel slices for C strings; be explicit\n   about ownership across the boundary (who frees what, in which allocator).\n\nIdiomatic snippets:\n\n```zig\nconst std = @import(\"std\");\n\n\u002F\u002F Allocator in, error union out, errdefer for partial-failure cleanup\nfn readAll(allocator: std.mem.Allocator, path: []const u8) ![]u8 {\n    const file = try std.fs.cwd().openFile(path, .{});\n    defer file.close();\n    const stat = try file.stat();\n    const buf = try allocator.alloc(u8, stat.size);\n    errdefer allocator.free(buf);\n    _ = try file.readAll(buf);\n    return buf; \u002F\u002F caller owns buf, frees with the same allocator\n}\n\n\u002F\u002F Test with leak detection\ntest \"readAll roundtrip\" {\n    const allocator = std.testing.allocator;\n    const data = try readAll(allocator, \"testdata\u002Fhello.txt\");\n    defer allocator.free(data);\n    try std.testing.expectEqualStrings(\"hello\\n\", data);\n}\n```\n\n## Common pitfalls\n\n- **Hiding the allocator.** Stashing a global allocator to avoid threading it through — defeats\n  testability and the language's core promise. Pass it explicitly.\n- **Leaking on error paths.** Allocating three things and returning early on the third failure\n  without freeing the first two. `errdefer` exists precisely for this — use it at each step.\n- **Ignoring error sets in public APIs.** Inferred error sets on exported functions leak internal\n  errors to callers and break API stability. Declare them.\n- **Comptime overuse.** Turning simple runtime logic into comptime puzzles hurts compile times\n  and readability. Comptime for generics and tables; runtime for the rest.\n- **Slice lifetime confusion.** Returning a slice into a stack buffer or a freed arena — the\n  compiler won't save you here. Document lifetimes; prefer owned returns with clear ownership.\n- **Fighting the \"no hidden control flow\" rule.** Trying to build exception-like or\n  GC-like abstractions on top. Work with the language: explicit errors, explicit allocators,\n  explicit cleanup.\n- **Version drift.** Zig's rapid evolution means code written for 0.11 may not compile on 0.13.\n  Pin versions in CI and read release notes on upgrade.\n","# Zig Pro\n\n## Overview\n\nZig's philosophy — **no hidden control flow, no hidden allocations, explicit everything** — makes\nit a superb systems language for those willing to be explicit. Professional Zig means embracing\nthat explicitness: allocators passed as parameters, errors as values in the type system,\n`comptime` for principled metaprogramming, and defer-based cleanup as a way of life.\n\nThe through-line: if something happens, you can see it in the code. That's the whole point.\n\n## When to use\n\n- Writing or reviewing Zig code for idiom and correctness.\n- Designing APIs around allocators and error sets.\n- Using comptime for generics and metaprogramming.\n- Structuring Zig projects (build.zig, modules, packages).\n- Debugging memory, allocator, or error-handling issues.\n\n## Core concepts\n\n- **Allocators are parameters, not globals.** Functions that allocate take an\n  `std.mem.Allocator`. This makes allocation visible, testable (use a `FixedBufferAllocator` or\n  testing allocator that detects leaks in tests), and flexible (arena for request-scoped work,\n  GPA for long-lived). Never hide allocation.\n- **Errors are values.** Error unions (`!T` = `T` or error) with `try`\u002F`catch`; error sets inferred\n  or declared explicitly for public APIs. `try` propagates with zero hidden machinery. Handle\n  errors where you have context; propagate where you don't.\n- **Defer + errdefer for cleanup.** `defer` runs at scope exit; `errdefer` runs only on error\n  return — the precise tool for \"free this if we fail partway.\" Together they replace RAII with\n  visible, local reasoning.\n- **Comptime is principled metaprogramming.** Generics via `comptime` parameters, type introspection\n  via `@typeInfo`, and compile-time code generation — all type-checked, all visible. Prefer it over\n  runtime polymorphism for performance-critical generic code.\n- **Slices, arrays, and sentinels.** Zig distinguishes `[N]T`, `[]T`, `[]const u8`, and\n  sentinel-terminated slices (`[:0]u8` for C interop). Know which you have; the type tells you the\n  lifetime and mutability story.\n- **Testing is built in.** `test` blocks colocated with code, `std.testing` with the\n  leak-detecting allocator — `std.testing.allocator` fails tests on leaks. Run `zig build test`\n  in CI; memory correctness is tested, not hoped for.\n\n## Practical workflow\n\n1. **Scaffold with the build system.** `zig init`; `build.zig` declares executables, tests, and\n   options; modules for namespacing. Pin the Zig version — the language still evolves.\n2. **Choose allocators deliberately.** Arena per request\u002Fframe for batch work (free once);\n   GPA (`std.heap.GeneralPurposeAllocator`) with leak checking in dev\u002Ftests; fixed buffers for\n   no-alloc hot paths. Pass the allocator down; document who frees.\n3. **Write error sets explicitly on public APIs.** `error{OutOfMemory, InvalidFormat}` in the\n   signature tells callers exactly what can go wrong — better than inferred sets leaking\n   implementation details.\n4. **Structure for testability.** Pure functions on slices; I\u002FO at the edges; `test` blocks next\n   to the code they cover, using `std.testing.allocator` so leaks fail the test.\n5. **Use comptime where it earns its keep.** Generic containers\u002Falgorithms, compile-time lookup\n   tables, and type-driven APIs. Keep comptime code readable — it's still code someone maintains.\n6. **Interop with C carefully.** `@cImport` for headers; sentinel slices for C strings; be explicit\n   about ownership across the boundary (who frees what, in which allocator).\n\nIdiomatic snippets:\n\n```zig\nconst std = @import(\"std\");\n\n\u002F\u002F Allocator in, error union out, errdefer for partial-failure cleanup\nfn readAll(allocator: std.mem.Allocator, path: []const u8) ![]u8 {\n    const file = try std.fs.cwd().openFile(path, .{});\n    defer file.close();\n    const stat = try file.stat();\n    const buf = try allocator.alloc(u8, stat.size);\n    errdefer allocator.free(buf);\n    _ = try file.readAll(buf);\n    return buf; \u002F\u002F caller owns buf, frees with the same allocator\n}\n\n\u002F\u002F Test with leak detection\ntest \"readAll roundtrip\" {\n    const allocator = std.testing.allocator;\n    const data = try readAll(allocator, \"testdata\u002Fhello.txt\");\n    defer allocator.free(data);\n    try std.testing.expectEqualStrings(\"hello\\n\", data);\n}\n```\n\n## Common pitfalls\n\n- **Hiding the allocator.** Stashing a global allocator to avoid threading it through — defeats\n  testability and the language's core promise. Pass it explicitly.\n- **Leaking on error paths.** Allocating three things and returning early on the third failure\n  without freeing the first two. `errdefer` exists precisely for this — use it at each step.\n- **Ignoring error sets in public APIs.** Inferred error sets on exported functions leak internal\n  errors to callers and break API stability. Declare them.\n- **Comptime overuse.** Turning simple runtime logic into comptime puzzles hurts compile times\n  and readability. Comptime for generics and tables; runtime for the rest.\n- **Slice lifetime confusion.** Returning a slice into a stack buffer or a freed arena — the\n  compiler won't save you here. Document lifetimes; prefer owned returns with clear ownership.\n- **Fighting the \"no hidden control flow\" rule.** Trying to build exception-like or\n  GC-like abstractions on top. Work with the language: explicit errors, explicit allocators,\n  explicit cleanup.\n- **Version drift.** Zig's rapid evolution means code written for 0.11 may not compile on 0.13.\n  Pin versions in CI and read release notes on upgrade.\n",{},"main","af388a77c2fe5e0b4fd879cca4300a0ffa9a6579","skills\u002Fams-zig-pro",1,"https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis","https:\u002F\u002Fgithub.com\u002FTanNhatCMS","https:\u002F\u002Fmrkiet.name.vn","2026-11-07 14:23:08",{"source":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add TanNhatCMS\u002Fjarvis --skill ams-zig-pro",{"tool":37,"command":38},"bunx","bunx skills add TanNhatCMS\u002Fjarvis --skill ams-zig-pro",{"tool":40,"command":41},"pnpm","pnpm dlx skills add TanNhatCMS\u002Fjarvis --skill ams-zig-pro","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Fams-zig-pro\u002FSKILL.md",true,[],[46,53,61,68,75,82],{"skillNo":47,"name":48,"nameZh":6,"description":49,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":50,"categories":51,"keywords":52,"publishedAt":18},"01M7EWYJR0J8DARY7E59Z6Y9MV","web-scrape","Turn web pages into LLM-ready markdown via the Firecrawl API (renders JS, anti-bot handling). Use when browser_open\u002Ffetch fails on JS-heavy pages, or when you need clean markdown\u002Fstructured extraction from a site. Requires FIRECRAWL_API_KEY.","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Fweb-scrape\u002FSKILL.md",[],[],{"skillNo":54,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":57,"sourceHtmlUrl":58,"categories":59,"keywords":60,"publishedAt":18},"01M7EWYBN5P6F2AJG3FR24T9BP","design-taste-frontend","tasteskill v2, the anti-slop frontend skill. Art direction for websites, distilled from a study of 247 curated gallery sites (One Page Love, Awwwards Sites of the Day). Deals researched directions (idea, composition, type, palette, photographs, section blueprints) from a library, enforces a strict no-slop house style with a real-browser inspector, and runs a look-and-fix loop on screenshots. Use this whenever you build, design, redesign, restyle, polish or review a landing page, marketing site, portfolio, product page, one-pager, hero or any public-facing web page, in any stack (HTML\u002FCSS, React, Next.js, Vue, Svelte, Astro, Tailwind) — also when the user says a page looks generic, templated, \"AI-made\", sloppy, or asks to make it look designed, premium, award-level or less like every other site. Not for dashboards or app screens.","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Ftaste-design\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Ftaste-design\u002FSKILL.md",[],[],{"skillNo":62,"name":63,"nameZh":6,"description":64,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":67,"publishedAt":18},"01M7EWY8FQFNQ2GB7NZZWGSSDX","test-driven-development","Use when implementing any feature or bugfix, before writing implementation code","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Fsuperpowers-tdd\u002FSKILL.md",[],[],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":74,"publishedAt":18},"01M7EWY5SHBFRH1HDHVWM9K7TV","systematic-debugging","Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Fsuperpowers-debugging\u002FSKILL.md",[],[],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":18},"01M7EWY3NM0Z0JAKS7HDZ24K66","requesting-code-review","Use when completing tasks, implementing major features, or before merging to verify work meets requirements","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Fsuperpowers-code-review\u002FSKILL.md",[],[],{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":18},"01M7EWY0WRMWX4M9ZFY0WKC593","brainstorming","You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).","https:\u002F\u002Fgithub.com\u002FTanNhatCMS\u002Fjarvis\u002Fblob\u002Fmain\u002Fskills\u002Fsuperpowers-brainstorming\u002FSKILL.md",[],[]]