[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81863":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":13,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":26,"readmeContent":27,"aiSummary":28,"trendingCount":15,"starSnapshotCount":15,"syncStatus":14,"lastSyncTime":29,"discoverSource":30},81863,"tack","manic-systems\u002Ftack","manic-systems","flake-like toml nix pins, lazily fetched and transformed","",null,"Rust",35,1,2,0,5,9,12,15,56.6,"Other",false,"main",true,[],"2026-06-12 04:01:35","# tack\n\nflake-like toml nix pins, lazily fetched and transformed\n\nmaintains `pins.toml` (what you want), `pins.lock.json` (what's fetched),\nand a vendored `default.nix` resolver to consume locked inputs without\nnix's flake machinery — all tucked into `.\u002F.tack\u002F` so your repo root\nstays clean.\n\n## layout\n\n`tack init` creates `.\u002F.tack\u002F` (override with `$TACK_DIR`) containing:\n\n- `pins.toml` inputs and shorturl schemes, hand-editable\n- `pins.lock.json` resolved inputs, written by `tack update`, read by nix\n- `default.nix` the resolver; `import .\u002F.tack` gives a name -> input attrset\n\n```nix\nlet inputs = import .\u002F.tack;\nin inputs.nixpkgs.legacyPackages.x86_64-linux.hello\n```\n\nor from a flake:\n\n```nix\noutputs = { self }:\n  let inputs = import .\u002F.tack; in {\n    packages.x86_64-linux.default =\n      inputs.nixpkgs.legacyPackages.x86_64-linux.hello;\n  };\n```\n\ntack keeps `default.nix` in sync with the running binary while a\n`tack-managed` comment is present at its top; delete that line to fork\nthe resolver.\n\nlegacy `.\u002Finputs.nix` at repo root is detected and preserved as-is.\n\n## commands\n\n```\ntack init [--force]\ntack update [names...] [--accept]    fetch latest, rewrite lock\ntack look [names...] [--verbose|-v]  report pins with newer upstream revs\ntack add \u003Cname> \u003Curl> [--fetch|--fixed [--unpack tarball|file]]\n                      [--dir \u003Cd>] [--submodules] [--follows c=p]...\ntack rm \u003Cname>\ntack alias \u003Cname> \u003Ctemplate>         define a shorturl scheme\ntack alias --rm \u003Cname>               remove one\ntack dedup                           report inputs reachable from multiple pins\n```\n\n`tack dedup` reports inputs reachable from more than one of your pins, whether\ndirect or transitive, and recurses through the pins of your pins indefinitely.\nits output is two sub-blocks of ready-to-paste `[all_follow]` rules. the first\nblock refers to existing top-level pins, the subsequent one refers to inputs tack\nwill synthesise on the next `tack update`. targets with multiple aliases collapse\ninto a single array entry.\n\n## pin types\n\n- `flake` (default) — evaluate the input's `flake.nix`, expose its outputs\n- `fetch` — source tree only, no flake eval. legacy `flake = false`\n- `fixed` — hash-locked download; won't drift, `tack update` refuses to\n  silently relock (use `--accept` if you want to)\n\n```toml\n[inputs.release]\nurl = \"https:\u002F\u002Fexample.com\u002Frelease-1.2.3.tar.gz\"\ntype = \"fixed\"\n# unpack = \"tarball\" | \"file\"   # auto-detected from the URL\n```\n\n## url schemes\n\n- `github:owner\u002Frepo[\u002Fref]` tarball via codeload\n- `git+https:\u002F\u002F...` \u002F `git+ssh:\u002F\u002F...` any git remote; `?ref=\u003Cbranch>` \u002F\n  `?rev=\u003Csha>` to pin, `submodules = true` to recurse\n- `https:\u002F\u002F...` \u002F `http:\u002F\u002F...` raw tarball, where the format is inferred\n  from the extension (e.g. `.tar`, `.tar.gz`\u002F`.tgz`, `.tar.xz`\u002F`.txz`).\n\n## shorturls\n\n`scheme:rest` expands by substituting `rest` into the template `{path}`\n\n```toml\n[shorturls]\ngh = \"github:{path}\"\n\n[inputs.coolproject]\nurl = \"gh:owner\u002Fcoolproject\"\n```\n\n## follows\n\npoint a pin's input at one of your top-level pins instead of its own lock\n\n```toml\n[inputs.foo]\nurl = \"gh:owner\u002Ffoo\"\nfollows = { nixpkgs = \"nixpkgs\" }   # foo's nixpkgs -> your nixpkgs pin\n```\n\n`all_follow` applies a rule to every pin that has a matching input. two value\nshapes are accepted:\n\n```toml\n[all_follow]\n# alias -> target. every input named fenix follows your top-level fenix pin\nfenix = \"fenix\"\n\n# target -> [aliases]. the key is the canonical target, and the key plus every\n# array member alias to it. one row covers many aliases of the same target\nnixpkgs = [\"nixpkgs-stable\", \"nixpkgs-unstable\"]\n\n[inputs.bar]\nurl = \"gh:owner\u002Fbar\"\nexclude_follow = [\"nixpkgs\"]   # ...except bar's\n```\n\nwhen a target named in `[all_follow]` isn't itself a top-level `[inputs]` pin,\n`tack update` synthesises a lock entry for it by walking every top-level\nflake.lock, collecting the observed revs of the aliased name, and writing the\nfreshest by `lastModified` into pins.lock.json. the resolver then treats the\nsynthetic entry as a default flake, or as a bare source tree when its repo has\nno `flake.nix`. this lets you dedup transitive inputs (e.g. `crane`) without declaring\nthem as top-level pins you don't actually consume.\n\n## build\n\n```\nnix develop   # rust toolchain + openssl\u002Flibgit2\nnix build     # the binary\n```\n\n## license\n\nEUPL-1.2. see [LICENSE](LICENSE)\n","tack 是一个用于管理 Nix 包依赖的工具，它使用 TOML 格式的配置文件来定义和锁定依赖项。项目的核心功能包括懒加载和转换依赖包、维护 `pins.toml` 和 `pins.lock.json` 文件以分别记录期望状态与实际获取到的状态，并提供一个自动更新的 `default.nix` 作为解析器，使得用户可以不通过 Nix 的 flake 功能直接消费锁定后的输入。tack 支持多种类型的 pin（如 flake, fetch, fixed）以及自定义 URL 短链方案，适合需要精细控制 Nix 依赖但又希望简化配置流程的开发者或团队使用。","2026-06-11 04:06:59","CREATED_QUERY"]