Compare commits
4 Commits
383f4ef56f
...
0d81b0e5e9
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d81b0e5e9 | ||
|
|
0ea8b8d2eb | ||
|
|
06b430e067 | ||
|
|
b1eb50a350 |
73
.beads/.gitignore
vendored
Normal file
73
.beads/.gitignore
vendored
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
# Dolt database (managed by Dolt, not git)
|
||||||
|
dolt/
|
||||||
|
embeddeddolt/
|
||||||
|
|
||||||
|
# Runtime files
|
||||||
|
bd.sock
|
||||||
|
bd.sock.startlock
|
||||||
|
sync-state.json
|
||||||
|
last-touched
|
||||||
|
.exclusive-lock
|
||||||
|
|
||||||
|
# Daemon runtime (lock, log, pid)
|
||||||
|
daemon.*
|
||||||
|
|
||||||
|
# Interactions log (runtime, not versioned)
|
||||||
|
interactions.jsonl
|
||||||
|
|
||||||
|
# Push state (runtime, per-machine)
|
||||||
|
push-state.json
|
||||||
|
|
||||||
|
# Lock files (various runtime locks)
|
||||||
|
*.lock
|
||||||
|
|
||||||
|
# Credential key (encryption key for federation peer auth — never commit)
|
||||||
|
.beads-credential-key
|
||||||
|
|
||||||
|
# Local version tracking (prevents upgrade notification spam after git ops)
|
||||||
|
.local_version
|
||||||
|
|
||||||
|
# Worktree redirect file (contains relative path to main repo's .beads/)
|
||||||
|
# Must not be committed as paths would be wrong in other clones
|
||||||
|
redirect
|
||||||
|
|
||||||
|
# Sync state (local-only, per-machine)
|
||||||
|
# These files are machine-specific and should not be shared across clones
|
||||||
|
.sync.lock
|
||||||
|
export-state/
|
||||||
|
export-state.json
|
||||||
|
|
||||||
|
# Ephemeral store (SQLite - wisps/molecules, intentionally not versioned)
|
||||||
|
ephemeral.sqlite3
|
||||||
|
ephemeral.sqlite3-journal
|
||||||
|
ephemeral.sqlite3-wal
|
||||||
|
ephemeral.sqlite3-shm
|
||||||
|
|
||||||
|
# Dolt server management (auto-started by bd)
|
||||||
|
dolt-server.pid
|
||||||
|
dolt-server.log
|
||||||
|
dolt-server.lock
|
||||||
|
dolt-server.port
|
||||||
|
dolt-server.activity
|
||||||
|
|
||||||
|
# Corrupt backup directories (created by bd doctor --fix recovery)
|
||||||
|
*.corrupt.backup/
|
||||||
|
|
||||||
|
# Backup data (auto-exported JSONL, local-only)
|
||||||
|
backup/
|
||||||
|
|
||||||
|
# Per-project environment file (Dolt connection config, GH#2520)
|
||||||
|
.env
|
||||||
|
|
||||||
|
# Legacy files (from pre-Dolt versions)
|
||||||
|
*.db
|
||||||
|
*.db?*
|
||||||
|
*.db-journal
|
||||||
|
*.db-wal
|
||||||
|
*.db-shm
|
||||||
|
db.sqlite
|
||||||
|
bd.db
|
||||||
|
# NOTE: Do NOT add negation patterns here.
|
||||||
|
# They would override fork protection in .git/info/exclude.
|
||||||
|
# Config files (metadata.json, config.yaml) are tracked by git by default
|
||||||
|
# since no pattern above ignores them.
|
||||||
81
.beads/README.md
Normal file
81
.beads/README.md
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
# Beads - AI-Native Issue Tracking
|
||||||
|
|
||||||
|
Welcome to Beads! This repository uses **Beads** for issue tracking - a modern, AI-native tool designed to live directly in your codebase alongside your code.
|
||||||
|
|
||||||
|
## What is Beads?
|
||||||
|
|
||||||
|
Beads is issue tracking that lives in your repo, making it perfect for AI coding agents and developers who want their issues close to their code. No web UI required - everything works through the CLI and integrates seamlessly with git.
|
||||||
|
|
||||||
|
**Learn more:** [github.com/steveyegge/beads](https://github.com/steveyegge/beads)
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
### Essential Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create new issues
|
||||||
|
bd create "Add user authentication"
|
||||||
|
|
||||||
|
# View all issues
|
||||||
|
bd list
|
||||||
|
|
||||||
|
# View issue details
|
||||||
|
bd show <issue-id>
|
||||||
|
|
||||||
|
# Update issue status
|
||||||
|
bd update <issue-id> --claim
|
||||||
|
bd update <issue-id> --status done
|
||||||
|
|
||||||
|
# Sync with Dolt remote
|
||||||
|
bd dolt push
|
||||||
|
```
|
||||||
|
|
||||||
|
### Working with Issues
|
||||||
|
|
||||||
|
Issues in Beads are:
|
||||||
|
- **Git-native**: Stored in Dolt database with version control and branching
|
||||||
|
- **AI-friendly**: CLI-first design works perfectly with AI coding agents
|
||||||
|
- **Branch-aware**: Issues can follow your branch workflow
|
||||||
|
- **Always in sync**: Auto-syncs with your commits
|
||||||
|
|
||||||
|
## Why Beads?
|
||||||
|
|
||||||
|
✨ **AI-Native Design**
|
||||||
|
- Built specifically for AI-assisted development workflows
|
||||||
|
- CLI-first interface works seamlessly with AI coding agents
|
||||||
|
- No context switching to web UIs
|
||||||
|
|
||||||
|
🚀 **Developer Focused**
|
||||||
|
- Issues live in your repo, right next to your code
|
||||||
|
- Works offline, syncs when you push
|
||||||
|
- Fast, lightweight, and stays out of your way
|
||||||
|
|
||||||
|
🔧 **Git Integration**
|
||||||
|
- Automatic sync with git commits
|
||||||
|
- Branch-aware issue tracking
|
||||||
|
- Dolt-native three-way merge resolution
|
||||||
|
|
||||||
|
## Get Started with Beads
|
||||||
|
|
||||||
|
Try Beads in your own projects:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install Beads
|
||||||
|
curl -sSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash
|
||||||
|
|
||||||
|
# Initialize in your repo
|
||||||
|
bd init
|
||||||
|
|
||||||
|
# Create your first issue
|
||||||
|
bd create "Try out Beads"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Learn More
|
||||||
|
|
||||||
|
- **Documentation**: [github.com/steveyegge/beads/docs](https://github.com/steveyegge/beads/tree/main/docs)
|
||||||
|
- **Quick Start Guide**: Run `bd quickstart`
|
||||||
|
- **Examples**: [github.com/steveyegge/beads/examples](https://github.com/steveyegge/beads/tree/main/examples)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Beads: Issue tracking that moves at the speed of thought* ⚡
|
||||||
56
.beads/config.yaml
Normal file
56
.beads/config.yaml
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# Beads Configuration File
|
||||||
|
# This file configures default behavior for all bd commands in this repository
|
||||||
|
# All settings can also be set via environment variables (BD_* prefix)
|
||||||
|
# or overridden with command-line flags
|
||||||
|
|
||||||
|
# Issue prefix for this repository (used by bd init)
|
||||||
|
# If not set, bd init will auto-detect from directory name
|
||||||
|
# Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc.
|
||||||
|
# issue-prefix: ""
|
||||||
|
|
||||||
|
# Use no-db mode: JSONL-only, no Dolt database
|
||||||
|
# When true, bd will use .beads/issues.jsonl as the source of truth
|
||||||
|
# no-db: false
|
||||||
|
|
||||||
|
# Enable JSON output by default
|
||||||
|
# json: false
|
||||||
|
|
||||||
|
# Feedback title formatting for mutating commands (create/update/close/dep/edit)
|
||||||
|
# 0 = hide titles, N > 0 = truncate to N characters
|
||||||
|
# output:
|
||||||
|
# title-length: 255
|
||||||
|
|
||||||
|
# Default actor for audit trails (overridden by BEADS_ACTOR or --actor)
|
||||||
|
# actor: ""
|
||||||
|
|
||||||
|
# Export events (audit trail) to .beads/events.jsonl on each flush/sync
|
||||||
|
# When enabled, new events are appended incrementally using a high-water mark.
|
||||||
|
# Use 'bd export --events' to trigger manually regardless of this setting.
|
||||||
|
# events-export: false
|
||||||
|
|
||||||
|
# Multi-repo configuration (experimental - bd-307)
|
||||||
|
# Allows hydrating from multiple repositories and routing writes to the correct database
|
||||||
|
# repos:
|
||||||
|
# primary: "." # Primary repo (where this database lives)
|
||||||
|
# additional: # Additional repos to hydrate from (read-only)
|
||||||
|
# - ~/beads-planning # Personal planning repo
|
||||||
|
# - ~/work-planning # Work planning repo
|
||||||
|
|
||||||
|
# JSONL backup (periodic export for off-machine recovery)
|
||||||
|
# Auto-enabled when a git remote exists. Override explicitly:
|
||||||
|
# backup:
|
||||||
|
# enabled: false # Disable auto-backup entirely
|
||||||
|
# interval: 15m # Minimum time between auto-exports
|
||||||
|
# git-push: false # Disable git push (export locally only)
|
||||||
|
# git-repo: "" # Separate git repo for backups (default: project repo)
|
||||||
|
|
||||||
|
# Integration settings (access with 'bd config get/set')
|
||||||
|
# These are stored in the database, not in this file:
|
||||||
|
# - jira.url
|
||||||
|
# - jira.project
|
||||||
|
# - linear.url
|
||||||
|
# - linear.api-key
|
||||||
|
# - github.org
|
||||||
|
# - github.repo
|
||||||
|
|
||||||
|
sync.remote: "git+ssh://gitea@code.m3ta.dev/m3tam3re/nixos-config.git"
|
||||||
24
.beads/hooks/post-checkout
Executable file
24
.beads/hooks/post-checkout
Executable file
@@ -0,0 +1,24 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
# --- BEGIN BEADS INTEGRATION v1.0.2 ---
|
||||||
|
# This section is managed by beads. Do not remove these markers.
|
||||||
|
if command -v bd >/dev/null 2>&1; then
|
||||||
|
export BD_GIT_HOOK=1
|
||||||
|
_bd_timeout=${BEADS_HOOK_TIMEOUT:-300}
|
||||||
|
if command -v timeout >/dev/null 2>&1; then
|
||||||
|
timeout "$_bd_timeout" bd hooks run post-checkout "$@"
|
||||||
|
_bd_exit=$?
|
||||||
|
if [ $_bd_exit -eq 124 ]; then
|
||||||
|
echo >&2 "beads: hook 'post-checkout' timed out after ${_bd_timeout}s — continuing without beads"
|
||||||
|
_bd_exit=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
bd hooks run post-checkout "$@"
|
||||||
|
_bd_exit=$?
|
||||||
|
fi
|
||||||
|
if [ $_bd_exit -eq 3 ]; then
|
||||||
|
echo >&2 "beads: database not initialized — skipping hook 'post-checkout'"
|
||||||
|
_bd_exit=0
|
||||||
|
fi
|
||||||
|
if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
|
||||||
|
fi
|
||||||
|
# --- END BEADS INTEGRATION v1.0.2 ---
|
||||||
24
.beads/hooks/post-merge
Executable file
24
.beads/hooks/post-merge
Executable file
@@ -0,0 +1,24 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
# --- BEGIN BEADS INTEGRATION v1.0.2 ---
|
||||||
|
# This section is managed by beads. Do not remove these markers.
|
||||||
|
if command -v bd >/dev/null 2>&1; then
|
||||||
|
export BD_GIT_HOOK=1
|
||||||
|
_bd_timeout=${BEADS_HOOK_TIMEOUT:-300}
|
||||||
|
if command -v timeout >/dev/null 2>&1; then
|
||||||
|
timeout "$_bd_timeout" bd hooks run post-merge "$@"
|
||||||
|
_bd_exit=$?
|
||||||
|
if [ $_bd_exit -eq 124 ]; then
|
||||||
|
echo >&2 "beads: hook 'post-merge' timed out after ${_bd_timeout}s — continuing without beads"
|
||||||
|
_bd_exit=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
bd hooks run post-merge "$@"
|
||||||
|
_bd_exit=$?
|
||||||
|
fi
|
||||||
|
if [ $_bd_exit -eq 3 ]; then
|
||||||
|
echo >&2 "beads: database not initialized — skipping hook 'post-merge'"
|
||||||
|
_bd_exit=0
|
||||||
|
fi
|
||||||
|
if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
|
||||||
|
fi
|
||||||
|
# --- END BEADS INTEGRATION v1.0.2 ---
|
||||||
24
.beads/hooks/pre-commit
Executable file
24
.beads/hooks/pre-commit
Executable file
@@ -0,0 +1,24 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
# --- BEGIN BEADS INTEGRATION v1.0.2 ---
|
||||||
|
# This section is managed by beads. Do not remove these markers.
|
||||||
|
if command -v bd >/dev/null 2>&1; then
|
||||||
|
export BD_GIT_HOOK=1
|
||||||
|
_bd_timeout=${BEADS_HOOK_TIMEOUT:-300}
|
||||||
|
if command -v timeout >/dev/null 2>&1; then
|
||||||
|
timeout "$_bd_timeout" bd hooks run pre-commit "$@"
|
||||||
|
_bd_exit=$?
|
||||||
|
if [ $_bd_exit -eq 124 ]; then
|
||||||
|
echo >&2 "beads: hook 'pre-commit' timed out after ${_bd_timeout}s — continuing without beads"
|
||||||
|
_bd_exit=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
bd hooks run pre-commit "$@"
|
||||||
|
_bd_exit=$?
|
||||||
|
fi
|
||||||
|
if [ $_bd_exit -eq 3 ]; then
|
||||||
|
echo >&2 "beads: database not initialized — skipping hook 'pre-commit'"
|
||||||
|
_bd_exit=0
|
||||||
|
fi
|
||||||
|
if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
|
||||||
|
fi
|
||||||
|
# --- END BEADS INTEGRATION v1.0.2 ---
|
||||||
24
.beads/hooks/pre-push
Executable file
24
.beads/hooks/pre-push
Executable file
@@ -0,0 +1,24 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
# --- BEGIN BEADS INTEGRATION v1.0.2 ---
|
||||||
|
# This section is managed by beads. Do not remove these markers.
|
||||||
|
if command -v bd >/dev/null 2>&1; then
|
||||||
|
export BD_GIT_HOOK=1
|
||||||
|
_bd_timeout=${BEADS_HOOK_TIMEOUT:-300}
|
||||||
|
if command -v timeout >/dev/null 2>&1; then
|
||||||
|
timeout "$_bd_timeout" bd hooks run pre-push "$@"
|
||||||
|
_bd_exit=$?
|
||||||
|
if [ $_bd_exit -eq 124 ]; then
|
||||||
|
echo >&2 "beads: hook 'pre-push' timed out after ${_bd_timeout}s — continuing without beads"
|
||||||
|
_bd_exit=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
bd hooks run pre-push "$@"
|
||||||
|
_bd_exit=$?
|
||||||
|
fi
|
||||||
|
if [ $_bd_exit -eq 3 ]; then
|
||||||
|
echo >&2 "beads: database not initialized — skipping hook 'pre-push'"
|
||||||
|
_bd_exit=0
|
||||||
|
fi
|
||||||
|
if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
|
||||||
|
fi
|
||||||
|
# --- END BEADS INTEGRATION v1.0.2 ---
|
||||||
24
.beads/hooks/prepare-commit-msg
Executable file
24
.beads/hooks/prepare-commit-msg
Executable file
@@ -0,0 +1,24 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
# --- BEGIN BEADS INTEGRATION v1.0.2 ---
|
||||||
|
# This section is managed by beads. Do not remove these markers.
|
||||||
|
if command -v bd >/dev/null 2>&1; then
|
||||||
|
export BD_GIT_HOOK=1
|
||||||
|
_bd_timeout=${BEADS_HOOK_TIMEOUT:-300}
|
||||||
|
if command -v timeout >/dev/null 2>&1; then
|
||||||
|
timeout "$_bd_timeout" bd hooks run prepare-commit-msg "$@"
|
||||||
|
_bd_exit=$?
|
||||||
|
if [ $_bd_exit -eq 124 ]; then
|
||||||
|
echo >&2 "beads: hook 'prepare-commit-msg' timed out after ${_bd_timeout}s — continuing without beads"
|
||||||
|
_bd_exit=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
bd hooks run prepare-commit-msg "$@"
|
||||||
|
_bd_exit=$?
|
||||||
|
fi
|
||||||
|
if [ $_bd_exit -eq 3 ]; then
|
||||||
|
echo >&2 "beads: database not initialized — skipping hook 'prepare-commit-msg'"
|
||||||
|
_bd_exit=0
|
||||||
|
fi
|
||||||
|
if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
|
||||||
|
fi
|
||||||
|
# --- END BEADS INTEGRATION v1.0.2 ---
|
||||||
7
.beads/metadata.json
Normal file
7
.beads/metadata.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"database": "dolt",
|
||||||
|
"backend": "dolt",
|
||||||
|
"dolt_mode": "embedded",
|
||||||
|
"dolt_database": "home_profile_restructuring",
|
||||||
|
"project_id": "664fc7e3-94eb-4874-aab6-e47835abe9d8"
|
||||||
|
}
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -37,3 +37,4 @@ opencode.json
|
|||||||
.td-root
|
.td-root
|
||||||
.cache
|
.cache
|
||||||
.pi*
|
.pi*
|
||||||
|
.worktrees/
|
||||||
|
|||||||
727
docs/plans/2026-04-26-home-profile-restructuring.md
Normal file
727
docs/plans/2026-04-26-home-profile-restructuring.md
Normal file
@@ -0,0 +1,727 @@
|
|||||||
|
# Home Profile Restructuring Implementation Plan
|
||||||
|
|
||||||
|
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||||
|
|
||||||
|
**Goal:** Restructure nixos-config/home/ from host-based to profile-based organization with clear separation between base, coding, profiles, desktop, and server layers.
|
||||||
|
|
||||||
|
**Architecture:** Three-layer model: Base (always loaded) → Coding (profile-independent) → Profiles/Context (freely combinable with constraints). Desktop and Server contexts are mutually exclusive.
|
||||||
|
|
||||||
|
**Tech Stack:** NixOS, Home Manager, Nix flakes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## File Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
home/
|
||||||
|
├── base/ # IMMER geladen
|
||||||
|
│ ├── default.nix
|
||||||
|
│ ├── shell/
|
||||||
|
│ │ ├── default.nix
|
||||||
|
│ │ ├── nushell.nix # PRIMARY Shell
|
||||||
|
│ │ └── starship.nix
|
||||||
|
│ ├── cli-tools/
|
||||||
|
│ │ ├── default.nix
|
||||||
|
│ │ ├── fzf.nix
|
||||||
|
│ │ ├── zellij.nix
|
||||||
|
│ │ ├── nitch.nix
|
||||||
|
│ │ └── television.nix
|
||||||
|
│ └── secrets/
|
||||||
|
│ └── secrets.nix
|
||||||
|
│
|
||||||
|
├── coding/ # Profil-unabhängig
|
||||||
|
│ ├── default.nix
|
||||||
|
│ ├── editor/
|
||||||
|
│ │ ├── default.nix
|
||||||
|
│ │ └── neovim.nix # Basis NeoVim (aus nixpkgs referenziert)
|
||||||
|
│ ├── lsp/
|
||||||
|
│ │ ├── default.nix
|
||||||
|
│ │ └── servers.nix
|
||||||
|
│ ├── git/
|
||||||
|
│ │ └── git.nix
|
||||||
|
│ └── agents/
|
||||||
|
│ └── agents.nix # Agent-System (aus nixpkgs referenziert)
|
||||||
|
│
|
||||||
|
├── profiles/ # FREI KOMBINIERBAR
|
||||||
|
│ ├── gaming/
|
||||||
|
│ │ ├── default.nix
|
||||||
|
│ │ ├── steam.nix
|
||||||
|
│ │ └── gamescope.nix
|
||||||
|
│ │
|
||||||
|
│ └── media/
|
||||||
|
│ ├── default.nix
|
||||||
|
│ ├── obs.nix
|
||||||
|
│ ├── ffmpeg.nix
|
||||||
|
│ ├── yt-dlp.nix
|
||||||
|
│ ├── kdenlive.nix
|
||||||
|
│ └── handbrake.nix
|
||||||
|
│
|
||||||
|
├── desktop/ # NUR wenn context=desktop
|
||||||
|
│ ├── default.nix
|
||||||
|
│ ├── wm/
|
||||||
|
│ │ ├── default.nix
|
||||||
|
│ │ ├── hyprland.nix
|
||||||
|
│ │ ├── wayland.nix
|
||||||
|
│ │ └── rofi.nix
|
||||||
|
│ ├── apps/
|
||||||
|
│ │ ├── default.nix
|
||||||
|
│ │ ├── obsidian.nix
|
||||||
|
│ │ ├── office.nix
|
||||||
|
│ │ ├── webapps.nix
|
||||||
|
│ │ └── crypto.nix
|
||||||
|
│ └── theme/
|
||||||
|
│ ├── default.nix
|
||||||
|
│ ├── fonts.nix
|
||||||
|
│ ├── theme.nix
|
||||||
|
│ └── wallpapers.nix
|
||||||
|
│
|
||||||
|
└── server/
|
||||||
|
└── default.nix
|
||||||
|
```
|
||||||
|
|
||||||
|
**Key Integration Points:**
|
||||||
|
|
||||||
|
| Component | Source | Notes |
|
||||||
|
|-----------|--------|-------|
|
||||||
|
| NeoVim Config | `inputs.m3ta-nixpkgs.pkgs.neovim-config` | Custom package in nixpkgs |
|
||||||
|
| OpenCode Desktop | `inputs.m3ta-nixpkgs.pkgs.opencode-desktop` | Custom package |
|
||||||
|
| Agent-System | `inputs.m3ta-nixpkgs.homeModules.coding.agents` | OpenCode, Claude Code, Pi |
|
||||||
|
| Zed Editor | `inputs.m3ta-nixpkgs.homeModules.coding.editors` | Desktop-only via Zed Remote |
|
||||||
|
| Editor Module | `inputs.m3ta-nixpkgs.homeModules.coding.editors` | NeoVim (base) + Zed (desktop) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 1: Create New Structure
|
||||||
|
|
||||||
|
### Task 1: Create Directory Structure
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
|
||||||
|
- Create: `home/base/default.nix`
|
||||||
|
- Create: `home/base/shell/default.nix`
|
||||||
|
- Create: `home/base/shell/nushell.nix`
|
||||||
|
- Create: `home/base/shell/starship.nix`
|
||||||
|
- Create: `home/base/cli-tools/default.nix`
|
||||||
|
- Create: `home/base/cli-tools/fzf.nix`
|
||||||
|
- Create: `home/base/cli-tools/zellij.nix`
|
||||||
|
- Create: `home/base/cli-tools/nitch.nix`
|
||||||
|
- Create: `home/base/cli-tools/television.nix`
|
||||||
|
- Create: `home/base/secrets/secrets.nix`
|
||||||
|
- Create: `home/coding/default.nix`
|
||||||
|
- Create: `home/coding/editor/default.nix`
|
||||||
|
- Create: `home/coding/editor/neovim.nix`
|
||||||
|
- Create: `home/coding/lsp/default.nix`
|
||||||
|
- Create: `home/coding/lsp/servers.nix`
|
||||||
|
- Create: `home/coding/git/git.nix`
|
||||||
|
- Create: `home/coding/agents/agents.nix`
|
||||||
|
- Create: `home/profiles/gaming/default.nix`
|
||||||
|
- Create: `home/profiles/gaming/steam.nix`
|
||||||
|
- Create: `home/profiles/gaming/gamescope.nix`
|
||||||
|
- Create: `home/profiles/media/default.nix`
|
||||||
|
- Create: `home/profiles/media/obs.nix`
|
||||||
|
- Create: `home/profiles/media/ffmpeg.nix`
|
||||||
|
- Create: `home/profiles/media/yt-dlp.nix`
|
||||||
|
- Create: `home/profiles/media/kdenlive.nix`
|
||||||
|
- Create: `home/profiles/media/handbrake.nix`
|
||||||
|
- Create: `home/desktop/default.nix`
|
||||||
|
- Create: `home/desktop/wm/default.nix`
|
||||||
|
- Create: `home/desktop/wm/hyprland.nix`
|
||||||
|
- Create: `home/desktop/wm/wayland.nix`
|
||||||
|
- Create: `home/desktop/wm/rofi.nix`
|
||||||
|
- Create: `home/desktop/apps/default.nix`
|
||||||
|
- Create: `home/desktop/apps/obsidian.nix`
|
||||||
|
- Create: `home/desktop/apps/office.nix`
|
||||||
|
- Create: `home/desktop/apps/webapps.nix`
|
||||||
|
- Create: `home/desktop/apps/crypto.nix`
|
||||||
|
- Create: `home/desktop/theme/default.nix`
|
||||||
|
- Create: `home/desktop/theme/fonts.nix`
|
||||||
|
- Create: `home/desktop/theme/theme.nix`
|
||||||
|
- Create: `home/desktop/theme/wallpapers.nix`
|
||||||
|
- Create: `home/server/default.nix`
|
||||||
|
- Modify: `home/default.nix` (Hauptaggregator)
|
||||||
|
|
||||||
|
- [ ] **Step 1: Create home/base/default.nix**
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# home/base/default.nix
|
||||||
|
# Basis-Konfiguration: Shell + CLI-Tools + Secrets
|
||||||
|
# Wird IMMER geladen (kein enable-Flag)
|
||||||
|
|
||||||
|
{ inputs, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./shell
|
||||||
|
./cli-tools
|
||||||
|
./secrets
|
||||||
|
];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 2: Create home/base/shell/default.nix**
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# home/base/shell/default.nix
|
||||||
|
{ inputs, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./nushell.nix
|
||||||
|
./starship.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 3: Create home/base/shell/nushell.nix**
|
||||||
|
|
||||||
|
Migrated from: `home/features/cli/nushell.nix`
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# home/base/shell/nushell.nix
|
||||||
|
# Primary shell - Nushell
|
||||||
|
{ lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
programs.nushell = {
|
||||||
|
enable = true;
|
||||||
|
configFile = ...;
|
||||||
|
};
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
nushell
|
||||||
|
];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 4: Create home/base/shell/starship.nix**
|
||||||
|
|
||||||
|
Migrated from: `home/features/cli/starship.nix`
|
||||||
|
|
||||||
|
- [ ] **Step 5: Create home/base/cli-tools/default.nix**
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# home/base/cli-tools/default.nix
|
||||||
|
{ ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./fzf.nix
|
||||||
|
./zellij.nix
|
||||||
|
./nitch.nix
|
||||||
|
./television.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 6: Create CLI tool modules**
|
||||||
|
|
||||||
|
Migrate from `home/features/cli/`:
|
||||||
|
- `fzf.nix` → `home/base/cli-tools/fzf.nix`
|
||||||
|
- `zellij.nix` → `home/base/cli-tools/zellij.nix`
|
||||||
|
- `nitch.nix` → `home/base/cli-tools/nitch.nix`
|
||||||
|
- `television.nix` → `home/base/cli-tools/television.nix`
|
||||||
|
|
||||||
|
- [ ] **Step 7: Create home/base/secrets/secrets.nix**
|
||||||
|
|
||||||
|
Migrated from: `home/features/cli/secrets.nix`
|
||||||
|
|
||||||
|
- [ ] **Step 8: Create home/coding/default.nix**
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# home/coding/default.nix
|
||||||
|
# Coding-Konfiguration: Editor + LSP + Git + Agents
|
||||||
|
# Wird geladen wenn coding Profil aktiviert
|
||||||
|
|
||||||
|
{ inputs, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./editor
|
||||||
|
./lsp
|
||||||
|
./git
|
||||||
|
./agents
|
||||||
|
];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 9: Create home/coding/editor/default.nix**
|
||||||
|
|
||||||
|
References: `inputs.m3ta-nixpkgs.homeModules.coding.editors`
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# home/coding/editor/default.nix
|
||||||
|
{ inputs, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
# Importiert NeoVim (immer) + Zed (desktop)
|
||||||
|
imports = [
|
||||||
|
inputs.m3ta-nixpkgs.homeModules.coding.editors
|
||||||
|
];
|
||||||
|
|
||||||
|
# NeoVim Config Package
|
||||||
|
home.packages = [ inputs.m3ta-nixpkgs.packages.${pkgs.system}.neovim-config ];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 10: Create home/coding/lsp/default.nix + servers.nix**
|
||||||
|
|
||||||
|
Migrate LSP configuration from existing setup
|
||||||
|
|
||||||
|
- [ ] **Step 11: Create home/coding/git/git.nix**
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# home/coding/git/git.nix
|
||||||
|
{ lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
programs.git = {
|
||||||
|
enable = true;
|
||||||
|
# Git configuration
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 12: Create home/coding/agents/agents.nix**
|
||||||
|
|
||||||
|
References: `inputs.m3ta-nixpkgs.homeModules.coding.agents`
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# home/coding/agents/agents.nix
|
||||||
|
{ inputs, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
inputs.m3ta-nixpkgs.homeModules.coding.agents
|
||||||
|
];
|
||||||
|
|
||||||
|
# Agent-Konfiguration
|
||||||
|
coding.agents.opencode = {
|
||||||
|
enable = true;
|
||||||
|
agentsInput = inputs.agents;
|
||||||
|
# modelOverrides...
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 13: Create home/profiles/gaming/default.nix**
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# home/profiles/gaming/default.nix
|
||||||
|
# Gaming Profile - frei kombinierbar
|
||||||
|
|
||||||
|
{ lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./steam.nix
|
||||||
|
./gamescope.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 14: Create gaming profile modules**
|
||||||
|
|
||||||
|
- `steam.nix` - Steam + Steam Deck Tools
|
||||||
|
- `gamescope.nix` - Gamescope Session
|
||||||
|
|
||||||
|
- [ ] **Step 15: Create home/profiles/media/default.nix**
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# home/profiles/media/default.nix
|
||||||
|
# Media Profile - Content Creation / Streaming
|
||||||
|
|
||||||
|
{ lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./obs.nix
|
||||||
|
./ffmpeg.nix
|
||||||
|
./yt-dlp.nix
|
||||||
|
./kdenlive.nix
|
||||||
|
./handbrake.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 16: Create media profile modules**
|
||||||
|
|
||||||
|
Migrate from `home/features/desktop/media.nix`:
|
||||||
|
- `obs.nix` - OBS Studio
|
||||||
|
- `ffmpeg.nix` - FFmpeg + Tools
|
||||||
|
- `yt-dlp.nix` - YouTube Downloader
|
||||||
|
- `kdenlive.nix` - Kdenlive Video Editor
|
||||||
|
- `handbrake.nix` - HandBrake
|
||||||
|
|
||||||
|
- [ ] **Step 17: Create home/desktop/default.nix**
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# home/desktop/default.nix
|
||||||
|
# Desktop-Konfiguration - nur wenn context=desktop
|
||||||
|
|
||||||
|
{ lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
# Zed Remote: Server-Zugriff via SSH
|
||||||
|
programs.zed-editor = {
|
||||||
|
enable = true;
|
||||||
|
# Remote Connections Config
|
||||||
|
};
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
./wm
|
||||||
|
./apps
|
||||||
|
./theme
|
||||||
|
];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 18: Create home/desktop/wm modules**
|
||||||
|
|
||||||
|
Migrate from `home/features/desktop/`:
|
||||||
|
- `hyprland.nix` → `home/desktop/wm/hyprland.nix`
|
||||||
|
- `wayland.nix` → `home/desktop/wm/wayland.nix`
|
||||||
|
- `rofi.nix` → `home/desktop/wm/rofi.nix`
|
||||||
|
|
||||||
|
- [ ] **Step 19: Create home/desktop/apps modules**
|
||||||
|
|
||||||
|
Migrate from `home/features/desktop/`:
|
||||||
|
- `obsidian.nix` → `home/desktop/apps/obsidian.nix`
|
||||||
|
- `office.nix` → `home/desktop/apps/office.nix`
|
||||||
|
- `webapps.nix` → `home/desktop/apps/webapps.nix`
|
||||||
|
- `crypto.nix` → `home/desktop/apps/crypto.nix`
|
||||||
|
|
||||||
|
- [ ] **Step 20: Create home/desktop/theme modules**
|
||||||
|
|
||||||
|
Migrate from `home/features/desktop/`:
|
||||||
|
- `fonts.nix` → `home/desktop/theme/fonts.nix`
|
||||||
|
- `theme.nix` → `home/desktop/theme/theme.nix`
|
||||||
|
- `wallpapers.nix` → `home/desktop/theme/wallpapers.nix`
|
||||||
|
|
||||||
|
- [ ] **Step 21: Create home/server/default.nix**
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# home/server/default.nix
|
||||||
|
# Server-Konfiguration - nur wenn context=server
|
||||||
|
# Minimal da primär via Zed Remote gearbeitet wird
|
||||||
|
|
||||||
|
{ lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
# Server-spezifische Konfiguration falls nötig
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 22: Commit Phase 1**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add home/
|
||||||
|
git commit -m "feat(home): create new directory structure
|
||||||
|
|
||||||
|
- Add base/ with shell, cli-tools, secrets
|
||||||
|
- Add coding/ with editor, lsp, git, agents
|
||||||
|
- Add profiles/ with gaming, media
|
||||||
|
- Add desktop/ with wm, apps, theme
|
||||||
|
- Add server/ minimal config
|
||||||
|
- Reference m3ta-nixpkgs modules where appropriate"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 2: Create Profile System with Constraints
|
||||||
|
|
||||||
|
### Task 2: Implement Profile Loader with Mutual Exclusion
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
|
||||||
|
- Create: `home/lib/default.nix` (Profile loading utilities)
|
||||||
|
- Modify: `flake.nix` (Host-spezifische Home-Config)
|
||||||
|
- Modify: `hosts/common/users/home.nix`
|
||||||
|
|
||||||
|
- [ ] **Step 1: Create home/lib/default.nix**
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# home/lib/default.nix
|
||||||
|
# Profile loading utilities
|
||||||
|
|
||||||
|
{ lib }:
|
||||||
|
|
||||||
|
{
|
||||||
|
# Generiert Home-Manager Konfiguration basierend auf Profilen
|
||||||
|
mkHomeConfig = {
|
||||||
|
profiles ? [],
|
||||||
|
context ? null, # "desktop" | "server" | null
|
||||||
|
}: let
|
||||||
|
inherit (lib) optionalAttrs mkIf;
|
||||||
|
|
||||||
|
# Profile die immer geladen werden
|
||||||
|
baseModules = [ ./base ];
|
||||||
|
|
||||||
|
# Profile die optional geladen werden
|
||||||
|
profileModules = optionalAttrs (builtins.elem "coding" profiles) [ ./coding ];
|
||||||
|
|
||||||
|
# Context-spezifische Module
|
||||||
|
contextModules = {
|
||||||
|
desktop = [ ./desktop ];
|
||||||
|
server = [ ./server ];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Profile-spezifische Module
|
||||||
|
profileSpecific = {
|
||||||
|
gaming = [ ./profiles/gaming ];
|
||||||
|
media = [ ./profiles/media ];
|
||||||
|
};
|
||||||
|
|
||||||
|
in {
|
||||||
|
imports = baseModules ++ profileModules
|
||||||
|
++ (contextModules.${context} or [])
|
||||||
|
++ (builtins.map (p: ./profiles.${p})
|
||||||
|
(builtins.filter (p: builtins.hasAttr p profileSpecific) profiles));
|
||||||
|
};
|
||||||
|
|
||||||
|
# Assertion: desktop und server schließen sich aus
|
||||||
|
mutualExclusiveContexts = builtins.hasAttr "desktop" && builtins.hasAttr "server";
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 2: Update flake.nix for m3-ares (Desktop)**
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# hosts/m3-ares/ (Desktop Beispiel)
|
||||||
|
{ inputs, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
# Home-Manager für m3tam3re auf m3-ares
|
||||||
|
home-manager.users.m3tam3re = { config, ... }: {
|
||||||
|
# NEU: Profile-System
|
||||||
|
m3ta.profiles = [ "coding" "gaming" "media" ]; # Freie Kombination
|
||||||
|
m3ta.context = "desktop"; # Schließt "server" aus
|
||||||
|
|
||||||
|
# Alternativ: Legacy-Kompatibilität
|
||||||
|
# imports = [ ./home ];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 3: Update flake.nix for m3-atlas (Server)**
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# hosts/m3-atlas/ (Server Beispiel)
|
||||||
|
{ inputs, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home-manager.users.m3tam3re = { config, ... }: {
|
||||||
|
m3ta.profiles = [ "coding" ]; # Nur Coding auf Server
|
||||||
|
m3ta.context = "server"; # Schließt "desktop" aus
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 4: Add assertions in flake.nix**
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# Validation: Context constraints
|
||||||
|
assertion = hostConfig.m3ta.context != "desktop" || hostConfig.m3ta.context != "server"
|
||||||
|
|| (hostConfig.m3ta.context == null); # Mutually exclusive
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 5: Commit Phase 2**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add flake.nix hosts/
|
||||||
|
git commit -m "feat: implement profile system with constraints
|
||||||
|
|
||||||
|
- Add home/lib for profile loading utilities
|
||||||
|
- Add m3ta.profiles option (list of profiles)
|
||||||
|
- Add m3ta.context option (desktop|server|null)
|
||||||
|
- Add mutual exclusion assertion
|
||||||
|
- Update m3-ares and m3-atlas as examples"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 3: Migrate Existing Configuration
|
||||||
|
|
||||||
|
### Task 3: Migrate home/features to new Structure
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
|
||||||
|
- Modify: Multiple files in `home/features/` (move content, update paths)
|
||||||
|
|
||||||
|
- [ ] **Step 1: Map existing features to new structure**
|
||||||
|
|
||||||
|
| Old Location | New Location | Notes |
|
||||||
|
|--------------|--------------|-------|
|
||||||
|
| `home/features/cli/nushell.nix` | `home/base/shell/nushell.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/cli/starship.nix` | `home/base/shell/starship.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/cli/fzf.nix` | `home/base/cli-tools/fzf.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/cli/zellij.nix` | `home/base/cli-tools/zellij.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/cli/nitch.nix` | `home/base/cli-tools/nitch.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/cli/television.nix` | `home/base/cli-tools/television.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/cli/secrets.nix` | `home/base/secrets/secrets.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/coding/opencode.nix` | Reference via `m3ta-nixpkgs` | Update import |
|
||||||
|
| `home/features/coding/pi.nix` | Reference via `m3ta-nixpkgs` | Update import |
|
||||||
|
| `home/features/desktop/hyprland.nix` | `home/desktop/wm/hyprland.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/desktop/wayland.nix` | `home/desktop/wm/wayland.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/desktop/rofi.nix` | `home/desktop/wm/rofi.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/desktop/obsidian.nix` | `home/desktop/apps/obsidian.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/desktop/office.nix` | `home/desktop/apps/office.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/desktop/webapps.nix` | `home/desktop/apps/webapps.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/desktop/crypto.nix` | `home/desktop/apps/crypto.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/desktop/fonts.nix` | `home/desktop/theme/fonts.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/desktop/theme.nix` | `home/desktop/theme/theme.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/desktop/wallpapers.nix` | `home/desktop/theme/wallpapers.nix` | ✓ Done in Task 1 |
|
||||||
|
| `home/features/desktop/media.nix` | `home/profiles/media/*.nix` | Split into modules |
|
||||||
|
| `home/features/desktop/gaming.nix` | `home/profiles/gaming/*.nix` | Split into modules |
|
||||||
|
|
||||||
|
- [ ] **Step 2: Archive old structure**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# After migration, archive old features/
|
||||||
|
git mv home/features home/features.old
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 3: Verify all configurations are imported**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check that all features are accessible in new structure
|
||||||
|
nix flake check
|
||||||
|
home-manager dry-activate
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 4: Commit Phase 3**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add -A
|
||||||
|
git commit -m "chore: migrate features to profile structure
|
||||||
|
|
||||||
|
- Move all cli features to base/shell and base/cli-tools
|
||||||
|
- Move desktop features to desktop/* subdirectories
|
||||||
|
- Split media into individual profile modules
|
||||||
|
- Split gaming into individual profile modules
|
||||||
|
- Archive old features/ directory"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 4: Test and Validate
|
||||||
|
|
||||||
|
### Task 4: Test Profile Combinations
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
|
||||||
|
- Test: Manual testing on m3-ares (Desktop)
|
||||||
|
- Test: Manual testing on m3-atlas (Server)
|
||||||
|
|
||||||
|
- [ ] **Step 1: Test m3-ares (Desktop with all profiles)**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build and test on m3-ares
|
||||||
|
nixos-rebuild dry-build --flake .#m3-ares
|
||||||
|
home-manager dry-activate --flake .#m3tam3re@m3-ares
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected: Loads base + coding + desktop + gaming + media
|
||||||
|
|
||||||
|
- [ ] **Step 2: Test m3-atlas (Server with coding only)**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build and test on m3-atlas
|
||||||
|
nixos-rebuild dry-build --flake .#m3-atlas
|
||||||
|
home-manager dry-activate --flake .#m3tam3re@m3-atlas
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected: Loads base + coding + server (no desktop modules)
|
||||||
|
|
||||||
|
- [ ] **Step 3: Test assertion (should fail)**
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# This SHOULD fail - desktop and server together
|
||||||
|
m3ta.context = "desktop";
|
||||||
|
m3ta.profiles = [ "coding" ];
|
||||||
|
# Nix should throw assertion error
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 4: Commit Phase 4**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git commit -m "test: validate profile combinations on all hosts
|
||||||
|
|
||||||
|
- m3-ares: base + coding + desktop + gaming + media ✓
|
||||||
|
- m3-atlas: base + coding + server ✓
|
||||||
|
- Constraint assertion working ✓"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 5: Cleanup
|
||||||
|
|
||||||
|
### Task 5: Remove Old Structure
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
|
||||||
|
- Delete: `home/features.old/` (after verification)
|
||||||
|
|
||||||
|
- [ ] **Step 1: Verify no broken imports**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Search for any references to old paths
|
||||||
|
grep -r "home/features" --include="*.nix"
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected: No results
|
||||||
|
|
||||||
|
- [ ] **Step 2: Delete old directory**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git rm -rf home/features.old
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 3: Final format and check**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix fmt
|
||||||
|
nix flake check
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 4: Final commit**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git commit -m "chore: remove old features directory
|
||||||
|
|
||||||
|
Cleanup complete. New structure:
|
||||||
|
- home/base/ (always loaded)
|
||||||
|
- home/coding/ (profile-independent)
|
||||||
|
- home/profiles/ (gaming, media)
|
||||||
|
- home/desktop/ (context=desktop)
|
||||||
|
- home/server/ (context=server)"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
| Phase | Tasks | Description |
|
||||||
|
|-------|-------|-------------|
|
||||||
|
| 1 | 1 | Create new directory structure |
|
||||||
|
| 2 | 2 | Implement profile system with constraints |
|
||||||
|
| 3 | 3 | Migrate existing features |
|
||||||
|
| 4 | 4 | Test profile combinations |
|
||||||
|
| 5 | 5 | Remove old structure |
|
||||||
|
|
||||||
|
**Total:** 5 tasks, ~22 steps
|
||||||
|
|
||||||
|
**Expected Duration:** 2-4 hours (depending on migration complexity)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Migration Notes
|
||||||
|
|
||||||
|
1. **NeoVim Config**: Already in nixpkgs, reference via `inputs.m3ta-nixpkgs.packages.neovim-config`
|
||||||
|
|
||||||
|
2. **Agent-System**: Already in nixpkgs, reference via `inputs.m3ta-nixpkgs.homeModules.coding.agents`
|
||||||
|
|
||||||
|
3. **Zed Remote**: Desktop-only feature, works via SSH. No server-side installation needed.
|
||||||
|
|
||||||
|
4. **Fish Shell**: Removed from base (Nushell is primary). Can be added as optional profile if needed.
|
||||||
|
|
||||||
|
5. **Feature Flags**: Old `features.*.enable` options → New profile lists `m3ta.profiles = [ "gaming" "media" ]`
|
||||||
17
flake.lock
generated
17
flake.lock
generated
@@ -969,6 +969,7 @@
|
|||||||
"skills-anthropic": "skills-anthropic",
|
"skills-anthropic": "skills-anthropic",
|
||||||
"skills-basecamp": "skills-basecamp",
|
"skills-basecamp": "skills-basecamp",
|
||||||
"skills-kestra": "skills-kestra",
|
"skills-kestra": "skills-kestra",
|
||||||
|
"skills-superpowers": "skills-superpowers",
|
||||||
"skills-vercel": "skills-vercel"
|
"skills-vercel": "skills-vercel"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1040,6 +1041,22 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"skills-superpowers": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1776996157,
|
||||||
|
"narHash": "sha256-0WupTacT1jIwVBloj1i0RF7wIllVtP8eMPRl7VrXdbE=",
|
||||||
|
"owner": "obra",
|
||||||
|
"repo": "superpowers",
|
||||||
|
"rev": "6efe32c9e2dd002d0c394e861e0529675d1ab32e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "obra",
|
||||||
|
"repo": "superpowers",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"skills-vercel": {
|
"skills-vercel": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
|
|||||||
@@ -61,6 +61,10 @@
|
|||||||
url = "github:kestra-io/agent-skills";
|
url = "github:kestra-io/agent-skills";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
skills-superpowers = {
|
||||||
|
url = "github:obra/superpowers";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
skills-vercel = {
|
skills-vercel = {
|
||||||
url = "github:vercel-labs/skills";
|
url = "github:vercel-labs/skills";
|
||||||
flake = false;
|
flake = false;
|
||||||
|
|||||||
144
home/base/cli-tools/bat.nix
Normal file
144
home/base/cli-tools/bat.nix
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
# Bat — cat replacement with nix-colors syntax highlighting theme.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.base.cliTools.bat;
|
||||||
|
palette = config.colorScheme.palette;
|
||||||
|
in {
|
||||||
|
options.base.cliTools.bat.enable = mkEnableOption "enable bat with nix-colors theme";
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
programs.bat = {
|
||||||
|
enable = true;
|
||||||
|
config = {theme = "universal";};
|
||||||
|
themes = {
|
||||||
|
universal = {
|
||||||
|
src = pkgs.writeText "universal.tmTheme" ''
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>Universal (nix-colors)</string>
|
||||||
|
<key>settings</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>settings</key>
|
||||||
|
<dict>
|
||||||
|
<key>background</key>
|
||||||
|
<string>#${palette.base00}</string>
|
||||||
|
<key>foreground</key>
|
||||||
|
<string>#${palette.base05}</string>
|
||||||
|
<key>caret</key>
|
||||||
|
<string>#${palette.base05}</string>
|
||||||
|
<key>selection</key>
|
||||||
|
<string>#${palette.base02}</string>
|
||||||
|
<key>selectionForeground</key>
|
||||||
|
<string>#${palette.base05}</string>
|
||||||
|
<key>lineHighlight</key>
|
||||||
|
<string>#${palette.base01}</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>Comment</string>
|
||||||
|
<key>scope</key>
|
||||||
|
<string>comment</string>
|
||||||
|
<key>settings</key>
|
||||||
|
<dict>
|
||||||
|
<key>foreground</key>
|
||||||
|
<string>#${palette.base03}</string>
|
||||||
|
<key>fontStyle</key>
|
||||||
|
<string>italic</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>String</string>
|
||||||
|
<key>scope</key>
|
||||||
|
<string>string</string>
|
||||||
|
<key>settings</key>
|
||||||
|
<dict>
|
||||||
|
<key>foreground</key>
|
||||||
|
<string>#${palette.base0A}</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>Number</string>
|
||||||
|
<key>scope</key>
|
||||||
|
<string>constant.numeric</string>
|
||||||
|
<key>settings</key>
|
||||||
|
<dict>
|
||||||
|
<key>foreground</key>
|
||||||
|
<string>#${palette.base0E}</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>Keyword</string>
|
||||||
|
<key>scope</key>
|
||||||
|
<string>keyword</string>
|
||||||
|
<key>settings</key>
|
||||||
|
<dict>
|
||||||
|
<key>foreground</key>
|
||||||
|
<string>#${palette.base08}</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>Function</string>
|
||||||
|
<key>scope</key>
|
||||||
|
<string>entity.name.function</string>
|
||||||
|
<key>settings</key>
|
||||||
|
<dict>
|
||||||
|
<key>foreground</key>
|
||||||
|
<string>#${palette.base0B}</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>Type</string>
|
||||||
|
<key>scope</key>
|
||||||
|
<string>entity.name.type, storage.type</string>
|
||||||
|
<key>settings</key>
|
||||||
|
<dict>
|
||||||
|
<key>foreground</key>
|
||||||
|
<string>#${palette.base0D}</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>Variable</string>
|
||||||
|
<key>scope</key>
|
||||||
|
<string>variable</string>
|
||||||
|
<key>settings</key>
|
||||||
|
<dict>
|
||||||
|
<key>foreground</key>
|
||||||
|
<string>#${palette.base05}</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>Constant</string>
|
||||||
|
<key>scope</key>
|
||||||
|
<string>constant</string>
|
||||||
|
<key>settings</key>
|
||||||
|
<dict>
|
||||||
|
<key>foreground</key>
|
||||||
|
<string>#${palette.base0E}</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
20
home/base/cli-tools/carapace.nix
Normal file
20
home/base/cli-tools/carapace.nix
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Carapace — multi-shell completion engine with Fish, Nushell, and Bash integration.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.base.cliTools.carapace;
|
||||||
|
in {
|
||||||
|
options.base.cliTools.carapace.enable = mkEnableOption "enable carapace completion engine";
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
programs.carapace = {
|
||||||
|
enable = true;
|
||||||
|
enableFishIntegration = true;
|
||||||
|
enableNushellIntegration = true;
|
||||||
|
enableBashIntegration = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
17
home/base/cli-tools/default.nix
Normal file
17
home/base/cli-tools/default.nix
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# CLI tools aggregator — imports all base command-line utilities.
|
||||||
|
{...}: {
|
||||||
|
imports = [
|
||||||
|
./bat.nix
|
||||||
|
./carapace.nix
|
||||||
|
./direnv.nix
|
||||||
|
./eza.nix
|
||||||
|
./fzf.nix
|
||||||
|
./lf.nix
|
||||||
|
./nitch.nix
|
||||||
|
./packages.nix
|
||||||
|
./television.nix
|
||||||
|
./zellij.nix
|
||||||
|
./zellij-ps.nix
|
||||||
|
./zoxide.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
19
home/base/cli-tools/direnv.nix
Normal file
19
home/base/cli-tools/direnv.nix
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Direnv — automatic environment loading with nix-direnv integration.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.base.cliTools.direnv;
|
||||||
|
in {
|
||||||
|
options.base.cliTools.direnv.enable = mkEnableOption "enable direnv with nix-direnv";
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
programs.direnv = {
|
||||||
|
enable = true;
|
||||||
|
enableNushellIntegration = true;
|
||||||
|
nix-direnv.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
20
home/base/cli-tools/eza.nix
Normal file
20
home/base/cli-tools/eza.nix
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Eza — modern ls replacement with icons, git status, and long format by default.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.base.cliTools.eza;
|
||||||
|
in {
|
||||||
|
options.base.cliTools.eza.enable = mkEnableOption "enable eza modern ls replacement";
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
programs.eza = {
|
||||||
|
enable = true;
|
||||||
|
enableFishIntegration = true;
|
||||||
|
enableBashIntegration = true;
|
||||||
|
extraOptions = ["-l" "--icons" "--git" "-a"];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
40
home/base/cli-tools/fzf.nix
Normal file
40
home/base/cli-tools/fzf.nix
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# Fuzzy finder with nix-colors palette and Wayland clipboard integration.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.base.cliTools.fzf;
|
||||||
|
in {
|
||||||
|
options.base.cliTools.fzf.enable = mkEnableOption "enable fuzzy finder";
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
programs.fzf = {
|
||||||
|
enable = true;
|
||||||
|
enableFishIntegration = true;
|
||||||
|
colors = {
|
||||||
|
"fg" = "#${config.colorScheme.palette.base05}";
|
||||||
|
"bg" = "#${config.colorScheme.palette.base00}";
|
||||||
|
"hl" = "#${config.colorScheme.palette.base0E}";
|
||||||
|
"fg+" = "#${config.colorScheme.palette.base05}";
|
||||||
|
"bg+" = "#${config.colorScheme.palette.base02}";
|
||||||
|
"hl+" = "#${config.colorScheme.palette.base0E}";
|
||||||
|
"info" = "#${config.colorScheme.palette.base09}";
|
||||||
|
"prompt" = "#${config.colorScheme.palette.base0B}";
|
||||||
|
"pointer" = "#${config.colorScheme.palette.base08}";
|
||||||
|
"marker" = "#${config.colorScheme.palette.base08}";
|
||||||
|
"spinner" = "#${config.colorScheme.palette.base09}";
|
||||||
|
"header" = "#${config.colorScheme.palette.base03}";
|
||||||
|
};
|
||||||
|
defaultOptions = [
|
||||||
|
"--preview='bat --color=always -n {}'"
|
||||||
|
"--bind 'ctrl-/:toggle-preview'"
|
||||||
|
"--header 'Press CTRL-Y to copy command into clipboard'"
|
||||||
|
"--bind 'ctrl-y:execute-silent(echo -n {2..} | wl-copy)+abort'"
|
||||||
|
];
|
||||||
|
defaultCommand = "fd --type f --exclude .git --follow --hidden";
|
||||||
|
changeDirWidgetCommand = "fd --type d --exclude .git --follow --hidden";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
27
home/base/cli-tools/lf.nix
Normal file
27
home/base/cli-tools/lf.nix
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Lf — terminal file manager with bat preview and Dracula theme.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.base.cliTools.lf;
|
||||||
|
in {
|
||||||
|
options.base.cliTools.lf.enable = mkEnableOption "enable lf terminal file manager";
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
home.packages = [pkgs.lf];
|
||||||
|
|
||||||
|
programs.lf = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
preview = true;
|
||||||
|
drawbox = true;
|
||||||
|
hidden = true;
|
||||||
|
icons = true;
|
||||||
|
previewer = "bat";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
16
home/base/cli-tools/nitch.nix
Normal file
16
home/base/cli-tools/nitch.nix
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Nitch — minimal system information display tool.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.base.cliTools.nitch;
|
||||||
|
in {
|
||||||
|
options.base.cliTools.nitch.enable = mkEnableOption "enable nitch";
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
home.packages = [pkgs.nitch];
|
||||||
|
};
|
||||||
|
}
|
||||||
51
home/base/cli-tools/packages.nix
Normal file
51
home/base/cli-tools/packages.nix
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
# Essential CLI packages — core utilities always available on every host.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.base.cliTools.essentials;
|
||||||
|
in {
|
||||||
|
options.base.cliTools.essentials.enable = mkEnableOption "enable essential CLI packages";
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# Core utilities
|
||||||
|
coreutils
|
||||||
|
fd
|
||||||
|
htop
|
||||||
|
jq
|
||||||
|
ripgrep
|
||||||
|
|
||||||
|
# Dev tools
|
||||||
|
devenv
|
||||||
|
gcc
|
||||||
|
go
|
||||||
|
httpie
|
||||||
|
just
|
||||||
|
lazygit
|
||||||
|
nix-index
|
||||||
|
nix-update
|
||||||
|
progress
|
||||||
|
sqlite
|
||||||
|
sqlite-vec
|
||||||
|
tldr
|
||||||
|
|
||||||
|
# AI tools
|
||||||
|
comma
|
||||||
|
fabric-ai
|
||||||
|
llm
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
basecamp
|
||||||
|
hyprpaper-random
|
||||||
|
libnotify
|
||||||
|
trash-cli
|
||||||
|
unzip
|
||||||
|
yazi
|
||||||
|
zip
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
59
home/base/cli-tools/television.nix
Normal file
59
home/base/cli-tools/television.nix
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
# Television — fuzzy finder with custom channels for tldr, git-diff, and git-log.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.base.cliTools.television;
|
||||||
|
in {
|
||||||
|
options.base.cliTools.television.enable = mkEnableOption "enable television";
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
programs.television = {
|
||||||
|
enable = true;
|
||||||
|
channels = {
|
||||||
|
tldr = {
|
||||||
|
metadata = {
|
||||||
|
description = "Browse TLDR pages";
|
||||||
|
name = "tldr";
|
||||||
|
requirements = ["tldr"];
|
||||||
|
};
|
||||||
|
preview = {
|
||||||
|
command = "tldr '{}'";
|
||||||
|
};
|
||||||
|
source = {
|
||||||
|
command = "tldr --list";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
git-diff = {
|
||||||
|
metadata = {
|
||||||
|
description = "A channel to select files from git diff commands";
|
||||||
|
name = "git-diff";
|
||||||
|
requirements = ["git"];
|
||||||
|
};
|
||||||
|
preview = {
|
||||||
|
command = "git diff HEAD --color=always -- '{}'";
|
||||||
|
};
|
||||||
|
source = {
|
||||||
|
command = "git diff --name-only HEAD";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
git-log = {
|
||||||
|
metadata = {
|
||||||
|
description = "A channel to select from git log entries";
|
||||||
|
name = "git-log";
|
||||||
|
requirements = ["git"];
|
||||||
|
};
|
||||||
|
preview = {
|
||||||
|
command = "git show -p --stat --pretty=fuller --color=always '{0}'";
|
||||||
|
};
|
||||||
|
source = {
|
||||||
|
command = "git log --oneline --date=short --pretty=\"format:%h %s %an %cd\" \"$@\"";
|
||||||
|
output = "{split: :0}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
27
home/base/cli-tools/zellij-ps.nix
Normal file
27
home/base/cli-tools/zellij-ps.nix
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Zellij-ps — project-aware Zellij session manager from m3ta-nixpkgs.
|
||||||
|
# Delegates to the cli.zellij-ps module provided by inputs.m3ta-nixpkgs.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.base.cliTools.zellijPs;
|
||||||
|
in {
|
||||||
|
options.base.cliTools.zellijPs = {
|
||||||
|
enable = mkEnableOption "enable zellij-ps project session manager";
|
||||||
|
|
||||||
|
projectFolders = mkOption {
|
||||||
|
type = types.listOf types.path;
|
||||||
|
description = "Project root folders scanned by zellij-ps.";
|
||||||
|
default = ["${config.home.homeDirectory}/p"];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
cli.zellij-ps = {
|
||||||
|
enable = true;
|
||||||
|
projectFolders = cfg.projectFolders;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
33
home/base/cli-tools/zellij.nix
Normal file
33
home/base/cli-tools/zellij.nix
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# Zellij terminal multiplexer with nix-colors theming.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.base.cliTools.zellij;
|
||||||
|
in {
|
||||||
|
options.base.cliTools.zellij.enable = mkEnableOption "enable zellij multiplexer";
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
programs.zellij = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
theme = "universal";
|
||||||
|
themes.universal = {
|
||||||
|
bg = "#${config.colorScheme.palette.base00}";
|
||||||
|
fg = "#${config.colorScheme.palette.base05}";
|
||||||
|
black = "#${config.colorScheme.palette.base01}";
|
||||||
|
red = "#${config.colorScheme.palette.base08}";
|
||||||
|
green = "#${config.colorScheme.palette.base0B}";
|
||||||
|
yellow = "#${config.colorScheme.palette.base0A}";
|
||||||
|
blue = "#${config.colorScheme.palette.base0D}";
|
||||||
|
magenta = "#${config.colorScheme.palette.base0E}";
|
||||||
|
cyan = "#${config.colorScheme.palette.base0C}";
|
||||||
|
white = "#${config.colorScheme.palette.base07}";
|
||||||
|
orange = "#${config.colorScheme.palette.base09}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
19
home/base/cli-tools/zoxide.nix
Normal file
19
home/base/cli-tools/zoxide.nix
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Zoxide — smarter cd with Fish and Nushell integration.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.base.cliTools.zoxide;
|
||||||
|
in {
|
||||||
|
options.base.cliTools.zoxide.enable = mkEnableOption "enable zoxide smarter cd";
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
programs.zoxide = {
|
||||||
|
enable = true;
|
||||||
|
enableFishIntegration = true;
|
||||||
|
enableNushellIntegration = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -23,6 +23,7 @@ in {
|
|||||||
src = inputs.skills-anthropic;
|
src = inputs.skills-anthropic;
|
||||||
selectSkills = ["pdf" "docx" "frontend-design"];
|
selectSkills = ["pdf" "docx" "frontend-design"];
|
||||||
}
|
}
|
||||||
|
{src = inputs.skills-superpowers;}
|
||||||
{src = inputs.skills-vercel;}
|
{src = inputs.skills-vercel;}
|
||||||
{src = inputs.skills-basecamp;}
|
{src = inputs.skills-basecamp;}
|
||||||
{src = inputs.skills-kestra;}
|
{src = inputs.skills-kestra;}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
neovim
|
neovim
|
||||||
git
|
git
|
||||||
|
tea
|
||||||
ghostty.terminfo
|
ghostty.terminfo
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
extraServices = {
|
extraServices = {
|
||||||
flatpak.enable = false;
|
flatpak.enable = false;
|
||||||
ollama.enable = false;
|
ollama.enable = false;
|
||||||
podman.enable = true;
|
podman.enable = false;
|
||||||
virtualisation.enable = false;
|
virtualisation.enable = false;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,10 +13,35 @@
|
|||||||
venvSitePackages = "/home/hermes/.venv/lib/python3.11/site-packages";
|
venvSitePackages = "/home/hermes/.venv/lib/python3.11/site-packages";
|
||||||
gccLibPath = "${pkgs.stdenv.cc.cc.lib}/lib";
|
gccLibPath = "${pkgs.stdenv.cc.cc.lib}/lib";
|
||||||
in {
|
in {
|
||||||
|
virtualisation.docker.enable = true;
|
||||||
|
|
||||||
|
systemd.tmpfiles.rules = [
|
||||||
|
"d /home/hermes/.config 0755 hermes hermes -"
|
||||||
|
"d /home/hermes/.config/tea 0755 hermes hermes -"
|
||||||
|
"L+ /home/hermes/.config/tea/yml - - - - ${pkgs.writeText "tea-yml" ''
|
||||||
|
logins:
|
||||||
|
- name: m3ta
|
||||||
|
url: https://code.m3ta.dev
|
||||||
|
token:
|
||||||
|
ssh_host: code.m3ta.dev
|
||||||
|
user: m3ta-chiron
|
||||||
|
default: true
|
||||||
|
''}"
|
||||||
|
"f /home/hermes/.gitconfig 0644 hermes hermes - ${pkgs.writeText "gitconfig" ''
|
||||||
|
[user]
|
||||||
|
name = m3ta-chiron
|
||||||
|
email = m3ta-chiron@agentmail.to
|
||||||
|
[init]
|
||||||
|
defaultBranch = main
|
||||||
|
''}"
|
||||||
|
];
|
||||||
|
|
||||||
services.hermes-agent = {
|
services.hermes-agent = {
|
||||||
enable = true;
|
enable = true;
|
||||||
addToSystemPackages = true;
|
addToSystemPackages = true;
|
||||||
|
|
||||||
|
extraPackages = with pkgs; [docker git tea];
|
||||||
|
|
||||||
# Secrets via agenix
|
# Secrets via agenix
|
||||||
environmentFiles = [
|
environmentFiles = [
|
||||||
config.age.secrets."hermes-env".path
|
config.age.secrets."hermes-env".path
|
||||||
@@ -26,11 +51,15 @@ in {
|
|||||||
# Non-secret environment variables
|
# Non-secret environment variables
|
||||||
environment = {
|
environment = {
|
||||||
GLM_BASE_URL = "https://api.z.ai/api/coding/paas/v4/";
|
GLM_BASE_URL = "https://api.z.ai/api/coding/paas/v4/";
|
||||||
|
GIT_AUTHOR_NAME = "m3ta-chiron";
|
||||||
|
GIT_AUTHOR_EMAIL = "m3ta-chiron@agentmail.to";
|
||||||
|
GIT_COMMITTER_NAME = "m3ta-chiron";
|
||||||
|
GIT_COMMITTER_EMAIL = "m3ta-chiron@agentmail.to";
|
||||||
};
|
};
|
||||||
|
|
||||||
# ── Container mode (podman) ──────────────────────────────────────────
|
# ── Container mode (podman) ──────────────────────────────────────────
|
||||||
container = {
|
container = {
|
||||||
enable = true;
|
enable = false;
|
||||||
backend = "podman";
|
backend = "podman";
|
||||||
extraVolumes = ["/home/m3tam3re/p:/projects:rw"];
|
extraVolumes = ["/home/m3tam3re/p:/projects:rw"];
|
||||||
extraOptions = [
|
extraOptions = [
|
||||||
@@ -63,7 +92,7 @@ in {
|
|||||||
|
|
||||||
# ── Terminal ───────────────────────────────────────────────────────
|
# ── Terminal ───────────────────────────────────────────────────────
|
||||||
terminal = {
|
terminal = {
|
||||||
backend = "docker";
|
backend = "local";
|
||||||
modal_mode = "auto";
|
modal_mode = "auto";
|
||||||
cwd = ".";
|
cwd = ".";
|
||||||
timeout = 180;
|
timeout = 180;
|
||||||
@@ -127,6 +156,7 @@ in {
|
|||||||
|
|
||||||
# ── Memory ─────────────────────────────────────────────────────────
|
# ── Memory ─────────────────────────────────────────────────────────
|
||||||
memory = {
|
memory = {
|
||||||
|
provider = "honcho";
|
||||||
memory_enabled = true;
|
memory_enabled = true;
|
||||||
user_profile_enabled = true;
|
user_profile_enabled = true;
|
||||||
memory_char_limit = 2200;
|
memory_char_limit = 2200;
|
||||||
@@ -169,44 +199,6 @@ in {
|
|||||||
|
|
||||||
# ── Web ────────────────────────────────────────────────────────────
|
# ── Web ────────────────────────────────────────────────────────────
|
||||||
web = {backend = "exa";};
|
web = {backend = "exa";};
|
||||||
|
|
||||||
# ── Platform Toolsets ──────────────────────────────────────────────
|
|
||||||
platform_toolsets = {
|
|
||||||
cli = [
|
|
||||||
"browser"
|
|
||||||
"clarify"
|
|
||||||
"code_execution"
|
|
||||||
"cronjob"
|
|
||||||
"delegation"
|
|
||||||
"file"
|
|
||||||
"image_gen"
|
|
||||||
"memory"
|
|
||||||
"session_search"
|
|
||||||
"skills"
|
|
||||||
"terminal"
|
|
||||||
"todo"
|
|
||||||
"tts"
|
|
||||||
"vision"
|
|
||||||
"web"
|
|
||||||
];
|
|
||||||
telegram = [
|
|
||||||
"browser"
|
|
||||||
"clarify"
|
|
||||||
"code_execution"
|
|
||||||
"cronjob"
|
|
||||||
"delegation"
|
|
||||||
"file"
|
|
||||||
"image_gen"
|
|
||||||
"memory"
|
|
||||||
"session_search"
|
|
||||||
"skills"
|
|
||||||
"terminal"
|
|
||||||
"todo"
|
|
||||||
"tts"
|
|
||||||
"vision"
|
|
||||||
"web"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -50,5 +50,6 @@ in {
|
|||||||
"secrets/honcho-key.age".publicKeys = systems ++ users;
|
"secrets/honcho-key.age".publicKeys = systems ++ users;
|
||||||
"secrets/hermes-env.age".publicKeys = systems ++ users;
|
"secrets/hermes-env.age".publicKeys = systems ++ users;
|
||||||
"secrets/hermes-cloud-env.age".publicKeys = systems ++ users;
|
"secrets/hermes-cloud-env.age".publicKeys = systems ++ users;
|
||||||
|
"secrets/hermes-gitea-token.age".publicKeys = systems ++ users;
|
||||||
"secrets/tuwunel-registration-token.age".publicKeys = systems ++ users;
|
"secrets/tuwunel-registration-token.age".publicKeys = systems ++ users;
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
25
secrets/hermes-gitea-token.age
Normal file
25
secrets/hermes-gitea-token.age
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 4NLKrw j+zQu+BGTMVhIEzhqECFLMqs8tK7P8zDF/0fumWTrSY
|
||||||
|
RqemJfrS6bf6r/Owh38FNV14JNqTP2ZtN8diUqJ0NTU
|
||||||
|
-> ssh-ed25519 5kwcsA gYZEiF1oFwd7kddSzmmvFC7umpaD0y4DL2LAOHmmkkI
|
||||||
|
KcOSW/aExT0wJl2Fs97mVSj64CYGL8DsHbKZca3BdTo
|
||||||
|
-> ssh-ed25519 9d4YIQ 41Mx+hpizRKeW4lu1gMcHVI4p5PqN202F/dJl0n9oTw
|
||||||
|
G9zr0kdbswSifyHzqlWNyYB1TEaQjxFyxs7mz9XM7Ko
|
||||||
|
-> ssh-ed25519 3Bcr1w 3FnDPnyWym3Pv70DBEg+tewH6GNM3S/mbbYPGjb1LiY
|
||||||
|
TOpFTHq5XDoJoqfsDnProGUlXKwuGJQhYJf/f23bgKE
|
||||||
|
-> ssh-ed25519 c4NQlA mpZuWGlXdmhqkta3SxcDcm/4dw017Zn9KS29WBznnzg
|
||||||
|
3LjR5O5uezXy3toWAEAEPU4nVx69GYpbYQwQygoIwf4
|
||||||
|
-> ssh-rsa DQlE7w
|
||||||
|
iK5n9EFFD3apn6eJJiAB6dom/llqgneXeSYWNN44Xm0Qez5H3slpn4779BiQwMrI
|
||||||
|
863iJj91E7KSgANfm3yP3JP8veuuwATk1lRjnk/Xx5AbIQjhlANK7SoNB938unKc
|
||||||
|
Syd5sA4NX/SRy5rlJUXmc1ZtJex1sc880xj9xEOrclhd1pMD7zPE647SUDz8FcEU
|
||||||
|
BsHckU3+dKvlLcUVbFJCVfH9LBQezVRE2ajRQRy6FygwTkgrXpD9peTCXLBOacye
|
||||||
|
IOzPCJUsDB0Ats5osq/xdYb23Qz5RaiztBhNuurI6gWkAim17f8sGIdlWirjQOvH
|
||||||
|
NwTIArMT8vexBJsLtiYW0ZbLYPX+byidLRpuk2RXT1pfUMkeVWA2g1CgKCHKJbQG
|
||||||
|
ef4EMFRPhRZ5Knd6279dXalbE2FTbt1uWpxhvjOF8E5O4lM6+3ApWf5d7c0qM6on
|
||||||
|
jP4+Bn/sOIkVsiB1fjd6YqcXdyORNLqlwOsaCtvfLJ5t0EfebpP5Rigk13f2xddf
|
||||||
|
|
||||||
|
-> ssh-ed25519 CSMyhg M6Nc06Maem8c92oFktCHl/FeNdevn8fazYJjxLygxSc
|
||||||
|
h6E9GHEO8l9cKVEO6RlpzVJovuo7aOmKYXVDYHVBs1s
|
||||||
|
--- RlUihZA7p0luD4sv9EY73wq9qIFWMHNnoNmxxVMO8OI
|
||||||
|
¸å¿Ür
|
||||||
Reference in New Issue
Block a user