2025-12-29 19:01:37 +01:00
|
|
|
# m3ta-nixpkgs Knowledge Base
|
2025-12-27 10:16:52 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
**Generated:** 2025-12-30
|
|
|
|
|
**Commit:** c5e1610
|
2025-12-29 19:01:37 +01:00
|
|
|
**Branch:** master
|
|
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
## OVERVIEW
|
2025-12-29 19:01:37 +01:00
|
|
|
|
|
|
|
|
Personal Nix flake: custom packages, overlays, NixOS/Home Manager modules, dev shells. Flakes-only (no channels).
|
|
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
## STRUCTURE
|
2025-12-29 19:01:37 +01:00
|
|
|
|
|
|
|
|
```
|
|
|
|
|
.
|
|
|
|
|
├── flake.nix # Entry: packages, overlays, modules, shells, lib
|
|
|
|
|
├── pkgs/ # Custom packages (one dir each, callPackage registry)
|
|
|
|
|
├── modules/
|
|
|
|
|
│ ├── nixos/ # System modules (ports.nix)
|
|
|
|
|
│ └── home-manager/ # User modules by category (cli/, coding/, ports.nix)
|
|
|
|
|
├── lib/ # Shared utilities (ports.nix)
|
|
|
|
|
├── shells/ # Dev environments (default, python, devops)
|
|
|
|
|
├── overlays/mods/ # Package modifications (n8n version bump)
|
|
|
|
|
├── templates/ # Boilerplate for new packages/modules
|
|
|
|
|
└── examples/ # Usage examples
|
|
|
|
|
```
|
|
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
## WHERE TO LOOK
|
2025-12-29 19:01:37 +01:00
|
|
|
|
|
|
|
|
| Task | Location | Notes |
|
|
|
|
|
|------|----------|-------|
|
|
|
|
|
| Add package | `pkgs/<name>/default.nix` | Register in `pkgs/default.nix` |
|
|
|
|
|
| Add NixOS module | `modules/nixos/<name>.nix` | Import in `modules/nixos/default.nix` |
|
|
|
|
|
| Add HM module | `modules/home-manager/<category>/` | Category: cli, coding, or root |
|
|
|
|
|
| Override nixpkgs pkg | `overlays/mods/<name>.nix` | Import in `overlays/mods/default.nix` |
|
|
|
|
|
| Add dev shell | `shells/<name>.nix` | Register in `shells/default.nix` |
|
|
|
|
|
| Use port management | `config.m3ta.ports.get "service"` | Host-specific via `hostOverrides` |
|
|
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
## CONVENTIONS
|
2025-12-29 19:01:37 +01:00
|
|
|
|
2025-12-30 15:13:42 +01:00
|
|
|
**Formatter**: `nix fmt` before commit (alejandra)
|
2025-12-29 19:01:37 +01:00
|
|
|
|
|
|
|
|
**Naming**:
|
|
|
|
|
- Packages: `lowercase-hyphen` (e.g., `hyprpaper-random`)
|
|
|
|
|
- Variables: `camelCase` (e.g., `portHelpers`)
|
|
|
|
|
- Module options: `m3ta.*` namespace
|
|
|
|
|
|
|
|
|
|
**Imports**: Multi-line, trailing commas:
|
|
|
|
|
```nix
|
|
|
|
|
{
|
|
|
|
|
lib,
|
|
|
|
|
stdenv,
|
|
|
|
|
fetchFromGitHub,
|
|
|
|
|
}:
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Modules**: Standard pattern:
|
|
|
|
|
```nix
|
|
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
|
with lib; let
|
|
|
|
|
cfg = config.m3ta.myModule;
|
|
|
|
|
in {
|
|
|
|
|
options.m3ta.myModule = {
|
|
|
|
|
enable = mkEnableOption "description";
|
|
|
|
|
};
|
|
|
|
|
config = mkIf cfg.enable { ... };
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Meta**: Always include all fields:
|
|
|
|
|
```nix
|
|
|
|
|
meta = with lib; {
|
|
|
|
|
description = "...";
|
|
|
|
|
homepage = "...";
|
|
|
|
|
license = licenses.mit;
|
|
|
|
|
platforms = platforms.linux;
|
|
|
|
|
mainProgram = "...";
|
|
|
|
|
};
|
|
|
|
|
```
|
|
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
## PACKAGE PATTERNS
|
2025-12-29 19:01:37 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
**Rust**: `rustPlatform.buildRustPackage rec { cargoLock.lockFile = src + "/Cargo.lock"; }`
|
2025-12-29 19:01:37 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
**Shell**: `writeShellScriptBin "name" ''script''` or `mkDerivation` with custom `installPhase`
|
2025-12-29 19:01:37 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
**AppImage**: `appimageTools.wrapType2 { ... }`
|
2025-12-29 19:01:37 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
**Custom fetcher**: `fetchFromGitea { domain = "code.m3ta.dev"; owner = "m3tam3re"; ... }`
|
2025-12-29 19:01:37 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
## MODULE PATTERNS
|
2025-12-29 19:01:37 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
**Simple**: `options.cli.name = { enable = mkEnableOption "..."; }; config = mkIf cfg.enable { ... };`
|
2025-12-29 19:01:37 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
**Multiple**: `config = mkMerge [ (mkIf cfg.x.enable { ... }) (mkIf cfg.y.enable { ... }) ];`
|
2025-12-29 19:01:37 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
**Shared lib**: `portsLib = import ../../lib/ports.nix { inherit lib; }; portHelpers = portsLib.mkPortHelpers { ... };`
|
2025-12-29 19:01:37 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
## PORT MANAGEMENT
|
2025-12-29 19:01:37 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
Central port management: `config.m3ta.ports.get "service"` with host-specific via `hostOverrides`
|
2025-12-29 19:01:37 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
Generated: `/etc/m3ta/ports.json` (NixOS), `~/.config/m3ta/ports.json` (HM)
|
2025-12-29 19:01:37 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
## COMMANDS
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
nix flake check # Validate flake
|
2025-12-30 15:13:42 +01:00
|
|
|
nix fmt # Format (alejandra)
|
2025-12-30 15:02:58 +01:00
|
|
|
nix build .#<pkg> # Build package
|
|
|
|
|
nix flake show # List outputs
|
|
|
|
|
nix develop # Enter dev shell
|
|
|
|
|
nix develop .#python # Python shell
|
|
|
|
|
nix develop .#devops # DevOps shell
|
2025-12-29 19:01:37 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
# In dev shell only:
|
|
|
|
|
statix check . # Lint
|
|
|
|
|
deadnix . # Find dead code
|
|
|
|
|
```
|
2025-12-29 19:01:37 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
## ANTI-PATTERNS
|
2025-12-29 19:01:37 +01:00
|
|
|
|
|
|
|
|
| Don't | Do Instead |
|
|
|
|
|
|-------|------------|
|
|
|
|
|
| `lib.fakeHash` in commits | Get real hash: `nix build`, copy from error |
|
|
|
|
|
| Flat module files | Organize by category (`cli/`, `coding/`) |
|
|
|
|
|
| Hardcode ports | Use `m3ta.ports` module |
|
|
|
|
|
| Skip meta fields | Include all: description, homepage, license, platforms, mainProgram |
|
|
|
|
|
| `with pkgs;` in modules | Explicit `pkgs.package` or `with pkgs; [ ... ]` in lists only |
|
2025-12-27 10:16:52 +01:00
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
## COMMIT FORMAT
|
2025-12-29 19:01:37 +01:00
|
|
|
|
|
|
|
|
```
|
|
|
|
|
type: brief description
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Types: `feat`, `fix`, `docs`, `style`, `refactor`, `chore`
|
|
|
|
|
|
2025-12-30 15:02:58 +01:00
|
|
|
## NOTES
|
2025-12-29 19:01:37 +01:00
|
|
|
|
|
|
|
|
- **Hash fetching**: Use `lib.fakeHash` initially, build to get real hash
|
|
|
|
|
- **HM modules**: Category subdirs (`cli/`, `coding/`) have own `default.nix` aggregators
|
|
|
|
|
- **Ports module**: Different for NixOS vs HM (HM adds `generateEnvVars` option)
|
|
|
|
|
- **Overlays**: `modifications` overlay uses `{prev}:` pattern, not `{final, prev}:`
|
|
|
|
|
- **Dev shell tools**: `statix`, `deadnix` only available inside `nix develop`
|
2026-01-05 12:05:39 +01:00
|
|
|
|
|
|
|
|
## Landing the Plane (Session Completion)
|
|
|
|
|
|
|
|
|
|
**When ending a work session**, you MUST complete ALL steps below. Work is NOT complete until `git push` succeeds.
|
|
|
|
|
|
|
|
|
|
**MANDATORY WORKFLOW:**
|
|
|
|
|
|
|
|
|
|
1. **File issues for remaining work** - Create issues for anything that needs follow-up
|
|
|
|
|
2. **Run quality gates** (if code changed) - Tests, linters, builds
|
|
|
|
|
3. **Update issue status** - Close finished work, update in-progress items
|
|
|
|
|
4. **PUSH TO REMOTE** - This is MANDATORY:
|
|
|
|
|
```bash
|
|
|
|
|
git pull --rebase
|
|
|
|
|
bd sync
|
|
|
|
|
git push
|
|
|
|
|
git status # MUST show "up to date with origin"
|
|
|
|
|
```
|
|
|
|
|
5. **Clean up** - Clear stashes, prune remote branches
|
|
|
|
|
6. **Verify** - All changes committed AND pushed
|
|
|
|
|
7. **Hand off** - Provide context for next session
|
|
|
|
|
|
|
|
|
|
**CRITICAL RULES:**
|
|
|
|
|
- Work is NOT complete until `git push` succeeds
|
|
|
|
|
- NEVER stop before pushing - that leaves work stranded locally
|
|
|
|
|
- NEVER say "ready to push when you are" - YOU must push
|
|
|
|
|
- If push fails, resolve and retry until it succeeds
|