Commits: 9
Setup a devenv flake
new file mode 100644
index 0000000..c5d670d
--- /dev/null
+++ b/.envrc
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+
+if ! has nix_direnv_version || ! nix_direnv_version 3.1.0; then
+ source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.1.0/direnvrc" "sha256-yMJ2OVMzrFaDPn7q8nCBZFRYpL/f0RcHzhmw/i6btJM="
+fi
+
+export DEVENV_IN_DIRENV_SHELL=true
+
+watch_file flake.nix
+watch_file flake.lock
+if ! use flake . --no-pure-eval; then
+ echo "devenv could not be built. The devenv environment was not loaded. Make the necessary changes to devenv.nix and hit enter to try again." >&2
+finew file mode 100644
index 0000000..69d93e1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+.direnv
+.devenvnew file mode 100644
index 0000000..7d5ec13
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,850 @@
+{
+ "nodes": {
+ "cachix": {
+ "inputs": {
+ "devenv": [
+ "devenv"
+ ],
+ "flake-compat": [
+ "devenv",
+ "flake-compat"
+ ],
+ "git-hooks": [
+ "devenv",
+ "git-hooks"
+ ],
+ "nixpkgs": [
+ "devenv",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1767714506,
+ "narHash": "sha256-WaTs0t1CxhgxbIuvQ97OFhDTVUGd1HA+KzLZUZBhe0s=",
+ "owner": "cachix",
+ "repo": "cachix",
+ "rev": "894c649f0daaa38bbcfb21de64be47dfa7cd0ec9",
+ "type": "github"
+ },
+ "original": {
+ "owner": "cachix",
+ "ref": "latest",
+ "repo": "cachix",
+ "type": "github"
+ }
+ },
+ "cachix_2": {
+ "inputs": {
+ "devenv": [
+ "devenv",
+ "crate2nix"
+ ],
+ "flake-compat": [
+ "devenv",
+ "crate2nix"
+ ],
+ "git-hooks": "git-hooks",
+ "nixpkgs": "nixpkgs"
+ },
+ "locked": {
+ "lastModified": 1767714506,
+ "narHash": "sha256-WaTs0t1CxhgxbIuvQ97OFhDTVUGd1HA+KzLZUZBhe0s=",
+ "owner": "cachix",
+ "repo": "cachix",
+ "rev": "894c649f0daaa38bbcfb21de64be47dfa7cd0ec9",
+ "type": "github"
+ },
+ "original": {
+ "owner": "cachix",
+ "ref": "latest",
+ "repo": "cachix",
+ "type": "github"
+ }
+ },
+ "cachix_3": {
+ "inputs": {
+ "devenv": [
+ "devenv",
+ "crate2nix",
+ "crate2nix_stable"
+ ],
+ "flake-compat": [
+ "devenv",
+ "crate2nix",
+ "crate2nix_stable"
+ ],
+ "git-hooks": "git-hooks_2",
+ "nixpkgs": "nixpkgs_2"
+ },
+ "locked": {
+ "lastModified": 1767714506,
+ "narHash": "sha256-WaTs0t1CxhgxbIuvQ97OFhDTVUGd1HA+KzLZUZBhe0s=",
+ "owner": "cachix",
+ "repo": "cachix",
+ "rev": "894c649f0daaa38bbcfb21de64be47dfa7cd0ec9",
+ "type": "github"
+ },
+ "original": {
+ "owner": "cachix",
+ "ref": "latest",
+ "repo": "cachix",
+ "type": "github"
+ }
+ },
+ "crate2nix": {
+ "inputs": {
+ "cachix": "cachix_2",
+ "crate2nix_stable": "crate2nix_stable",
+ "devshell": "devshell_2",
+ "flake-compat": "flake-compat_2",
+ "flake-parts": "flake-parts_2",
+ "nix-test-runner": "nix-test-runner_2",
+ "nixpkgs": [
+ "devenv",
+ "nixpkgs"
+ ],
+ "pre-commit-hooks": "pre-commit-hooks_2"
+ },
+ "locked": {
+ "lastModified": 1772186516,
+ "narHash": "sha256-8s28pzmQ6TOIUzznwFibtW1CMieMUl1rYJIxoQYor58=",
+ "owner": "rossng",
+ "repo": "crate2nix",
+ "rev": "ba5dd398e31ee422fbe021767eb83b0650303a6e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "rossng",
+ "repo": "crate2nix",
+ "rev": "ba5dd398e31ee422fbe021767eb83b0650303a6e",
+ "type": "github"
+ }
+ },
+ "crate2nix_stable": {
+ "inputs": {
+ "cachix": "cachix_3",
+ "crate2nix_stable": [
+ "devenv",
+ "crate2nix",
+ "crate2nix_stable"
+ ],
+ "devshell": "devshell",
+ "flake-compat": "flake-compat",
+ "flake-parts": "flake-parts",
+ "nix-test-runner": "nix-test-runner",
+ "nixpkgs": "nixpkgs_3",
+ "pre-commit-hooks": "pre-commit-hooks"
+ },
+ "locked": {
+ "lastModified": 1769627083,
+ "narHash": "sha256-SUuruvw1/moNzCZosHaa60QMTL+L9huWdsCBN6XZIic=",
+ "owner": "nix-community",
+ "repo": "crate2nix",
+ "rev": "7c33e664668faecf7655fa53861d7a80c9e464a2",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "ref": "0.15.0",
+ "repo": "crate2nix",
+ "type": "github"
+ }
+ },
+ "devenv": {
+ "inputs": {
+ "cachix": "cachix",
+ "crate2nix": "crate2nix",
+ "flake-compat": "flake-compat_3",
+ "flake-parts": "flake-parts_3",
+ "git-hooks": "git-hooks_3",
+ "nix": "nix",
+ "nixd": "nixd",
+ "nixpkgs": [
+ "nixpkgs"
+ ],
+ "rust-overlay": "rust-overlay"
+ },
+ "locked": {
+ "lastModified": 1775848233,
+ "narHash": "sha256-+V6K66AsFCxD0PmKOASSSFUdEjmAtIwX4XlQ+2JBrmk=",
+ "owner": "cachix",
+ "repo": "devenv",
+ "rev": "cf4f57c61f5dc9d58300bdf18102d9cf5b4f29ea",
+ "type": "github"
+ },
+ "original": {
+ "owner": "cachix",
+ "repo": "devenv",
+ "type": "github"
+ }
+ },
+ "devshell": {
+ "inputs": {
+ "nixpkgs": [
+ "devenv",
+ "crate2nix",
+ "crate2nix_stable",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1768818222,
+ "narHash": "sha256-460jc0+CZfyaO8+w8JNtlClB2n4ui1RbHfPTLkpwhU8=",
+ "owner": "numtide",
+ "repo": "devshell",
+ "rev": "255a2b1725a20d060f566e4755dbf571bbbb5f76",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "devshell",
+ "type": "github"
+ }
+ },
+ "devshell_2": {
+ "inputs": {
+ "nixpkgs": [
+ "devenv",
+ "crate2nix",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1768818222,
+ "narHash": "sha256-460jc0+CZfyaO8+w8JNtlClB2n4ui1RbHfPTLkpwhU8=",
+ "owner": "numtide",
+ "repo": "devshell",
+ "rev": "255a2b1725a20d060f566e4755dbf571bbbb5f76",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "devshell",
+ "type": "github"
+ }
+ },
+ "flake-compat": {
+ "locked": {
+ "lastModified": 1733328505,
+ "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
+ "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
+ "revCount": 69,
+ "type": "tarball",
+ "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.1.0/01948eb7-9cba-704f-bbf3-3fa956735b52/source.tar.gz"
+ },
+ "original": {
+ "type": "tarball",
+ "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"
+ }
+ },
+ "flake-compat_2": {
+ "locked": {
+ "lastModified": 1733328505,
+ "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
+ "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
+ "revCount": 69,
+ "type": "tarball",
+ "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.1.0/01948eb7-9cba-704f-bbf3-3fa956735b52/source.tar.gz"
+ },
+ "original": {
+ "type": "tarball",
+ "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"
+ }
+ },
+ "flake-compat_3": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1767039857,
+ "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
+ "owner": "edolstra",
+ "repo": "flake-compat",
+ "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
+ "type": "github"
+ },
+ "original": {
+ "owner": "edolstra",
+ "repo": "flake-compat",
+ "type": "github"
+ }
+ },
+ "flake-parts": {
+ "inputs": {
+ "nixpkgs-lib": [
+ "devenv",
+ "crate2nix",
+ "crate2nix_stable",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1768135262,
+ "narHash": "sha256-PVvu7OqHBGWN16zSi6tEmPwwHQ4rLPU9Plvs8/1TUBY=",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "rev": "80daad04eddbbf5a4d883996a73f3f542fa437ac",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "type": "github"
+ }
+ },
+ "flake-parts_2": {
+ "inputs": {
+ "nixpkgs-lib": [
+ "devenv",
+ "crate2nix",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1768135262,
+ "narHash": "sha256-PVvu7OqHBGWN16zSi6tEmPwwHQ4rLPU9Plvs8/1TUBY=",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "rev": "80daad04eddbbf5a4d883996a73f3f542fa437ac",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "type": "github"
+ }
+ },
+ "flake-parts_3": {
+ "inputs": {
+ "nixpkgs-lib": [
+ "devenv",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1772408722,
+ "narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "type": "github"
+ }
+ },
+ "git-hooks": {
+ "inputs": {
+ "flake-compat": [
+ "devenv",
+ "crate2nix",
+ "cachix",
+ "flake-compat"
+ ],
+ "gitignore": "gitignore",
+ "nixpkgs": [
+ "devenv",
+ "crate2nix",
+ "cachix",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1765404074,
+ "narHash": "sha256-+ZDU2d+vzWkEJiqprvV5PR26DVFN2vgddwG5SnPZcUM=",
+ "owner": "cachix",
+ "repo": "git-hooks.nix",
+ "rev": "2d6f58930fbcd82f6f9fd59fb6d13e37684ca529",
+ "type": "github"
+ },
+ "original": {
+ "owner": "cachix",
+ "repo": "git-hooks.nix",
+ "type": "github"
+ }
+ },
+ "git-hooks_2": {
+ "inputs": {
+ "flake-compat": [
+ "devenv",
+ "crate2nix",
+ "crate2nix_stable",
+ "cachix",
+ "flake-compat"
+ ],
+ "gitignore": "gitignore_2",
+ "nixpkgs": [
+ "devenv",
+ "crate2nix",
+ "crate2nix_stable",
+ "cachix",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1765404074,
+ "narHash": "sha256-+ZDU2d+vzWkEJiqprvV5PR26DVFN2vgddwG5SnPZcUM=",
+ "owner": "cachix",
+ "repo": "git-hooks.nix",
+ "rev": "2d6f58930fbcd82f6f9fd59fb6d13e37684ca529",
+ "type": "github"
+ },
+ "original": {
+ "owner": "cachix",
+ "repo": "git-hooks.nix",
+ "type": "github"
+ }
+ },
+ "git-hooks_3": {
+ "inputs": {
+ "flake-compat": [
+ "devenv",
+ "flake-compat"
+ ],
+ "gitignore": "gitignore_5",
+ "nixpkgs": [
+ "devenv",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1772893680,
+ "narHash": "sha256-JDqZMgxUTCq85ObSaFw0HhE+lvdOre1lx9iI6vYyOEs=",
+ "owner": "cachix",
+ "repo": "git-hooks.nix",
+ "rev": "8baab586afc9c9b57645a734c820e4ac0a604af9",
+ "type": "github"
+ },
+ "original": {
+ "owner": "cachix",
+ "repo": "git-hooks.nix",
+ "type": "github"
+ }
+ },
+ "gitignore": {
+ "inputs": {
+ "nixpkgs": [
+ "devenv",
+ "crate2nix",
+ "cachix",
+ "git-hooks",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1709087332,
+ "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "type": "github"
+ }
+ },
+ "gitignore_2": {
+ "inputs": {
+ "nixpkgs": [
+ "devenv",
+ "crate2nix",
+ "crate2nix_stable",
+ "cachix",
+ "git-hooks",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1709087332,
+ "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "type": "github"
+ }
+ },
+ "gitignore_3": {
+ "inputs": {
+ "nixpkgs": [
+ "devenv",
+ "crate2nix",
+ "crate2nix_stable",
+ "pre-commit-hooks",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1709087332,
+ "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "type": "github"
+ }
+ },
+ "gitignore_4": {
+ "inputs": {
+ "nixpkgs": [
+ "devenv",
+ "crate2nix",
+ "pre-commit-hooks",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1709087332,
+ "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "type": "github"
+ }
+ },
+ "gitignore_5": {
+ "inputs": {
+ "nixpkgs": [
+ "devenv",
+ "git-hooks",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1709087332,
+ "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "type": "github"
+ }
+ },
+ "nix": {
+ "inputs": {
+ "flake-compat": [
+ "devenv",
+ "flake-compat"
+ ],
+ "flake-parts": [
+ "devenv",
+ "flake-parts"
+ ],
+ "git-hooks-nix": [
+ "devenv",
+ "git-hooks"
+ ],
+ "nixpkgs": [
+ "devenv",
+ "nixpkgs"
+ ],
+ "nixpkgs-23-11": [
+ "devenv"
+ ],
+ "nixpkgs-regression": [
+ "devenv"
+ ]
+ },
+ "locked": {
+ "lastModified": 1775657489,
+ "narHash": "sha256-v1KwZrIMGpteHPwxXvbapc7o3iduhU61phPUfyrnjM8=",
+ "owner": "cachix",
+ "repo": "nix",
+ "rev": "5c0da4397902105a84611c6d49e9d39a618ca025",
+ "type": "github"
+ },
+ "original": {
+ "owner": "cachix",
+ "ref": "devenv-2.34",
+ "repo": "nix",
+ "type": "github"
+ }
+ },
+ "nix-test-runner": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1588761593,
+ "narHash": "sha256-FKJykltAN/g3eIceJl4SfDnnyuH2jHImhMrXS2KvGIs=",
+ "owner": "stoeffel",
+ "repo": "nix-test-runner",
+ "rev": "c45d45b11ecef3eb9d834c3b6304c05c49b06ca2",
+ "type": "github"
+ },
+ "original": {
+ "owner": "stoeffel",
+ "repo": "nix-test-runner",
+ "type": "github"
+ }
+ },
+ "nix-test-runner_2": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1588761593,
+ "narHash": "sha256-FKJykltAN/g3eIceJl4SfDnnyuH2jHImhMrXS2KvGIs=",
+ "owner": "stoeffel",
+ "repo": "nix-test-runner",
+ "rev": "c45d45b11ecef3eb9d834c3b6304c05c49b06ca2",
+ "type": "github"
+ },
+ "original": {
+ "owner": "stoeffel",
+ "repo": "nix-test-runner",
+ "type": "github"
+ }
+ },
+ "nixd": {
+ "inputs": {
+ "flake-parts": [
+ "devenv",
+ "flake-parts"
+ ],
+ "nixpkgs": [
+ "devenv",
+ "nixpkgs"
+ ],
+ "treefmt-nix": "treefmt-nix"
+ },
+ "locked": {
+ "lastModified": 1773634079,
+ "narHash": "sha256-49qb4QNMv77VOeEux+sMd0uBhPvvHgVc0r938Bulvbo=",
+ "owner": "nix-community",
+ "repo": "nixd",
+ "rev": "8ecf93d4d93745e05ea53534e8b94f5e9506e6bd",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "repo": "nixd",
+ "type": "github"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1765186076,
+ "narHash": "sha256-hM20uyap1a0M9d344I692r+ik4gTMyj60cQWO+hAYP8=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "addf7cf5f383a3101ecfba091b98d0a1263dc9b8",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs-src": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1773840656,
+ "narHash": "sha256-9tpvMGFteZnd3gRQZFlRCohVpqooygFuy9yjuyRL2C0=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "9cf7092bdd603554bd8b63c216e8943cf9b12512",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixpkgs-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_2": {
+ "locked": {
+ "lastModified": 1765186076,
+ "narHash": "sha256-hM20uyap1a0M9d344I692r+ik4gTMyj60cQWO+hAYP8=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "addf7cf5f383a3101ecfba091b98d0a1263dc9b8",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_3": {
+ "locked": {
+ "lastModified": 1769433173,
+ "narHash": "sha256-Gf1dFYgD344WZ3q0LPlRoWaNdNQq8kSBDLEWulRQSEs=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "13b0f9e6ac78abbbb736c635d87845c4f4bee51b",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixpkgs-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_4": {
+ "inputs": {
+ "nixpkgs-src": "nixpkgs-src"
+ },
+ "locked": {
+ "lastModified": 1774287239,
+ "narHash": "sha256-W3krsWcDwYuA3gPWsFA24YAXxOFUL6iIlT6IknAoNSE=",
+ "owner": "cachix",
+ "repo": "devenv-nixpkgs",
+ "rev": "fa7125ea7f1ae5430010a6e071f68375a39bd24c",
+ "type": "github"
+ },
+ "original": {
+ "owner": "cachix",
+ "ref": "rolling",
+ "repo": "devenv-nixpkgs",
+ "type": "github"
+ }
+ },
+ "pre-commit-hooks": {
+ "inputs": {
+ "flake-compat": [
+ "devenv",
+ "crate2nix",
+ "crate2nix_stable",
+ "flake-compat"
+ ],
+ "gitignore": "gitignore_3",
+ "nixpkgs": [
+ "devenv",
+ "crate2nix",
+ "crate2nix_stable",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1769069492,
+ "narHash": "sha256-Efs3VUPelRduf3PpfPP2ovEB4CXT7vHf8W+xc49RL/U=",
+ "owner": "cachix",
+ "repo": "pre-commit-hooks.nix",
+ "rev": "a1ef738813b15cf8ec759bdff5761b027e3e1d23",
+ "type": "github"
+ },
+ "original": {
+ "owner": "cachix",
+ "repo": "pre-commit-hooks.nix",
+ "type": "github"
+ }
+ },
+ "pre-commit-hooks_2": {
+ "inputs": {
+ "flake-compat": [
+ "devenv",
+ "crate2nix",
+ "flake-compat"
+ ],
+ "gitignore": "gitignore_4",
+ "nixpkgs": [
+ "devenv",
+ "crate2nix",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1769069492,
+ "narHash": "sha256-Efs3VUPelRduf3PpfPP2ovEB4CXT7vHf8W+xc49RL/U=",
+ "owner": "cachix",
+ "repo": "pre-commit-hooks.nix",
+ "rev": "a1ef738813b15cf8ec759bdff5761b027e3e1d23",
+ "type": "github"
+ },
+ "original": {
+ "owner": "cachix",
+ "repo": "pre-commit-hooks.nix",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "devenv": "devenv",
+ "nixpkgs": "nixpkgs_4",
+ "systems": "systems"
+ }
+ },
+ "rust-overlay": {
+ "inputs": {
+ "nixpkgs": [
+ "devenv",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1773630837,
+ "narHash": "sha256-zJhgAGnbVKeBMJOb9ctZm4BGS/Rnrz+5lfSXTVah4HQ=",
+ "owner": "oxalica",
+ "repo": "rust-overlay",
+ "rev": "f600ea449c7b5bb596fa1cf21c871cc5b9e31316",
+ "type": "github"
+ },
+ "original": {
+ "owner": "oxalica",
+ "repo": "rust-overlay",
+ "type": "github"
+ }
+ },
+ "systems": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "treefmt-nix": {
+ "inputs": {
+ "nixpkgs": [
+ "devenv",
+ "nixd",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1772660329,
+ "narHash": "sha256-IjU1FxYqm+VDe5qIOxoW+pISBlGvVApRjiw/Y/ttJzY=",
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "rev": "3710e0e1218041bbad640352a0440114b1e10428",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "type": "github"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}new file mode 100644
index 0000000..f90aba3
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,42 @@
+{
+ inputs = {
+ nixpkgs.url = "github:cachix/devenv-nixpkgs/rolling";
+ systems.url = "github:nix-systems/default";
+ devenv.url = "github:cachix/devenv";
+ devenv.inputs.nixpkgs.follows = "nixpkgs";
+ };
+
+ nixConfig = {
+ extra-trusted-public-keys = "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw=";
+ extra-substituters = "https://devenv.cachix.org";
+ };
+
+ outputs = { self, nixpkgs, devenv, systems, ... } @ inputs:
+ let
+ forEachSystem = nixpkgs.lib.genAttrs (import systems);
+ in
+ {
+ devShells = forEachSystem
+ (system:
+ let
+ pkgs = nixpkgs.legacyPackages.${system};
+ in
+ {
+ default = devenv.lib.mkShell {
+ inherit inputs pkgs;
+ modules = [
+ {
+ # https://devenv.sh/reference/options/
+ packages = [ pkgs.hello ];
+
+ enterShell = ''
+ hello
+ '';
+
+ processes.hello.exec = "hello";
+ }
+ ];
+ };
+ });
+ };
+}Write some requirements and thoughts in a spec file
new file mode 100644
index 0000000..9a9a14c
--- /dev/null
+++ b/spec/BASIC.md
@@ -0,0 +1,37 @@
+# Basic
+
+This program generates a devlog for tad-lispy.com
+
+
+## Get all projects
+
+We need a mapping from `project-name` to `path`. This should sit in `projects.yaml`
+
+The listing of all paths with names guessed from path can be obtained like this:
+
+``` nushell
+glob ~/Projects/**/.git
+| path dirname
+| each { |p| { name: ($p | path basename), path: $p } }
+| transpose --as-record -r
+| save --force all-projects.yaml
+```
+
+
+## Get days
+
+I want a list with `start` and `end` timestamps. It should support `--since` and `--until`. Until should by default be 4 A.M. today. Since will be supplied based on the last entry in the devlog (details tbd). First day should be from `since`, i.e. it probably won't be a full day, but a fraction.
+
+An arbitrary date with a given time can be obtained with the following:
+
+``` nu
+("04:00" | date from-human) - 1day
+```
+
+So maybe I can just loop until I reach the time before `since`, emit the last fraction and break?
+
+## Generate the drafts
+
+For each day run `git log` in each project. If there is any output, dump it to `devlog/<date>/<project-name>.md`. So each file should contain a log from a single project that was developed on a given day. The project name should be listed in a front-matter (under `extra.projects`), so they can be linked to project page. Each commit should start with an `h2` followed by the message body and a complete diff.
+
+ - What about new projects that are not listed yet?Implement a days command to get a list of records
Given a date since and an optional day start, it produces a list of
records with start and end of each day.
new file mode 100755
index 0000000..2710393
--- /dev/null
+++ b/devlog.nu
@@ -0,0 +1,17 @@
+def days [
+ since: datetime,
+ --day-start: string = "04:00"
+] {
+ let until = $day_start | date from-human
+ # TODO: Allow setting --until: datetime and be smart about day-start - the last day might be a fraction!
+
+ 0..
+ | each { |n| $n * 1day }
+ | each { |duration| $until - $duration }
+ | each { |start| {
+ start: ([$start $since] | math max),
+ end: ($start + 1day)
+ } }
+ | take while { |day| $day.start < $day.end }
+}
+index f90aba3..b6bf848 100644
--- a/flake.nix
+++ b/flake.nix
@@ -27,13 +27,7 @@
= modules = [
= {
= # https://devenv.sh/reference/options/
- packages = [ pkgs.hello ];
-
- enterShell = ''
- hello
- '';
-
- processes.hello.exec = "hello";
+ packages = [ pkgs.nushell ];
= }
= ];
= };Make the script runnable with main function
So it can be executed without sourcing it first, like this
nu devlog.nu 2026-03-21index 2710393..ba04ac8 100755
--- a/devlog.nu
+++ b/devlog.nu
@@ -15,3 +15,6 @@ def days [
= | take while { |day| $day.start < $day.end }
=}
=
+def main [since: datetime] {
+ days $since
+}Expose the days subcommand, add a shebang
Now the script can be run as
./devlog days 2026-03-20index ba04ac8..2dd0fd5 100755
--- a/devlog.nu
+++ b/devlog.nu
@@ -1,4 +1,6 @@
-def days [
+#!/usr/bin/env nu
+
+def "main days" [
= since: datetime,
= --day-start: string = "04:00"
=] {
@@ -15,6 +17,7 @@ def days [
= | take while { |day| $day.start < $day.end }
=}
=
-def main [since: datetime] {
- days $since
+def main [] {
+ print "Not implemented yet"
+ exit 1
=}Write a spec about unlisted projects
index 9a9a14c..34979e9 100644
--- a/spec/BASIC.md
+++ b/spec/BASIC.md
@@ -34,4 +34,11 @@ So maybe I can just loop until I reach the time before `since`, emit the last fr
=
=For each day run `git log` in each project. If there is any output, dump it to `devlog/<date>/<project-name>.md`. So each file should contain a log from a single project that was developed on a given day. The project name should be listed in a front-matter (under `extra.projects`), so they can be linked to project page. Each commit should start with an `h2` followed by the message body and a complete diff.
=
- - What about new projects that are not listed yet?
+
+## Unlisted projects
+
+What about new projects that are not listed yet?
+
+If some work was done on such a project, there should be a warning about it.
+
+If a project is then added to the list, running the command again should not override existing drafts, but create new files for the newly listed projects.Write a command to list all projects
It produces a large name -> path record.
index 2dd0fd5..1f501f1 100755
--- a/devlog.nu
+++ b/devlog.nu
@@ -17,6 +17,17 @@ def "main days" [
= | take while { |day| $day.start < $day.end }
=}
=
+def "main projects" [
+ path: path
+] {
+ $path
+ | path join "**/.git"
+ | glob $in
+ | path dirname
+ | each { |p| { name: ($p | path basename), path: $p } }
+ | transpose --as-record -r
+}
+
=def main [] {
= print "Not implemented yet"
= exit 1Implement the project log sub-command
It parses the output from git log, including a unified diff and
extracts a Nushell table with subject, body and diff columns. The
diff is split by file.
index 1f501f1..632e9d5 100755
--- a/devlog.nu
+++ b/devlog.nu
@@ -28,7 +28,26 @@ def "main projects" [
= | transpose --as-record -r
=}
=
-def main [] {
+def "main project log" [
+ path: path,
+ since: datetime,
+ until: datetime,
+] {
+ let log_format = "<--- commit --->%n%s%n<--- part --->%b%n<--- part --->"
+ cd $path
+ git log --since $since --until $until --unified --format=$"($log_format)"
+ | split row "<--- commit --->"
+ | skip 1 # First is empty
+ | split column "<--- part --->"
+ | rename "subject" "body" "diff"
+ | update "diff" { | row | $row.diff | split row --regex "diff --git .+" | skip 1 }
+}
+
+def main [
+ since: datetime,
+ --path: path = "~/Projects",
+ --day-start: string = "04:00"
+] {
= print "Not implemented yet"
= exit 1
=}WIP: Implement formatting project log as Markdown
There is some issue with diffs containing binary data. I will need to investigate when I have fresh mind.
index 632e9d5..a87f7bf 100755
--- a/devlog.nu
+++ b/devlog.nu
@@ -35,7 +35,14 @@ def "main project log" [
=] {
= let log_format = "<--- commit --->%n%s%n<--- part --->%b%n<--- part --->"
= cd $path
- git log --since $since --until $until --unified --format=$"($log_format)"
+
+ # Debugging:
+ # print $env.PWD
+ # let git_command = $'git log --since ($since | format date %+) --until ($until | format date %+) --unified --format="($log_format)"'
+ # print $git_command
+
+ # TODO: Handle binary stream somehow coming from Erna's log
+ git log --since=($since | format date %+) --until=($until | format date %+) --patch --format=($log_format)
= | split row "<--- commit --->"
= | skip 1 # First is empty
= | split column "<--- part --->"
@@ -43,11 +50,38 @@ def "main project log" [
= | update "diff" { | row | $row.diff | split row --regex "diff --git .+" | skip 1 }
=}
=
+def "format commit" [] {
+ [
+ $"## ($in.subject | str trim)"
+ ""
+ ($in.body | str trim)
+ ""
+ ($in.diff | each { |diff| format diff } | str join "\n\n" )
+ ] | str join "\n"
+}
+
+def "format diff" [] {
+ $"``` diff\n($in | str trim)\n```"
+}
+
+def "format log" [
+ title: string
+] {
+ [
+ $"# ($title)"
+ $""
+ $"Commits: ($in | length)"
+ $""
+ ($in | each { | commit | format commit } | str join "\n\n")
+ ] | str join "\n"
+}
+
=def main [
= since: datetime,
= --path: path = "~/Projects",
= --day-start: string = "04:00"
=] {
- print "Not implemented yet"
- exit 1
+ # TODO: Handle multiple projects and write the markdown file
+ main project log $path $since (date now)
+ | format log "Test"
=}