Compare commits
9 Commits
bead/nixos
...
bead/nixos
| Author | SHA1 | Date | |
|---|---|---|---|
| ec47c4bb4f | |||
| 667f5b28dc | |||
| 4bb71d0b7e | |||
| 0bc134f557 | |||
| 1b9df3926e | |||
| bd98793528 | |||
| d78637cf13 | |||
| 08d16bd2c9 | |||
| a14ff9be4d |
@@ -9,7 +9,7 @@ Directory Structure:
|
|||||||
----------------------
|
----------------------
|
||||||
• packages/ - Custom Nix packages leveraged across various configurations.
|
• packages/ - Custom Nix packages leveraged across various configurations.
|
||||||
• roles/ - Role-based configurations (e.g., kodi, bluetooth) each with its own module (default.nix) for inclusion in machine setups.
|
• roles/ - Role-based configurations (e.g., kodi, bluetooth) each with its own module (default.nix) for inclusion in machine setups.
|
||||||
• machines/ - Machine-specific configurations (e.g., nix-book, z790prors, boxy, wixos) including configuration.nix and hardware-configuration.nix tailored for each hardware.
|
• machines/ - Machine-specific configurations (e.g., nix-book, zix790prors, boxy) including configuration.nix and hardware-configuration.nix tailored for each hardware.
|
||||||
• home/ - Home-manager configurations for personal environments and application settings (e.g., home-nix-book.nix, home-z790prors.nix).
|
• home/ - Home-manager configurations for personal environments and application settings (e.g., home-nix-book.nix, home-z790prors.nix).
|
||||||
|
|
||||||
Design Principles:
|
Design Principles:
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ This repository uses `beads` for issue tracking and management. Run `bd quicksta
|
|||||||
|
|
||||||
### Flake Structure
|
### Flake Structure
|
||||||
- **flake.nix**: Main entry point defining inputs (nixpkgs, home-manager, plasma-manager, etc.) and outputs for multiple NixOS configurations
|
- **flake.nix**: Main entry point defining inputs (nixpkgs, home-manager, plasma-manager, etc.) and outputs for multiple NixOS configurations
|
||||||
- **Machines**: `nix-book`, `boxy`, `wixos` (WSL configuration), `zix790prors`, `live-usb`, `johno-macbookpro` (Darwin/macOS)
|
- **Machines**: `nix-book`, `boxy`, `zix790prors`, `live-usb`, `johno-macbookpro` (Darwin/macOS)
|
||||||
- **Home configurations**: Standalone home-manager configuration for user `johno`
|
- **Home configurations**: Standalone home-manager configuration for user `johno`
|
||||||
|
|
||||||
### Directory Structure
|
### Directory Structure
|
||||||
@@ -78,7 +78,6 @@ The repository also uses a modular home-manager role system for user-space confi
|
|||||||
- **nix-book**: Compact laptop → excludes office/media roles due to SSD space constraints
|
- **nix-book**: Compact laptop → excludes office/media roles due to SSD space constraints
|
||||||
- **boxy**: Living room media center → optimized for media consumption, excludes sync/office (shared machine)
|
- **boxy**: Living room media center → optimized for media consumption, excludes sync/office (shared machine)
|
||||||
- **zix790prors**: All-purpose workstation → full desktop experience with all roles enabled
|
- **zix790prors**: All-purpose workstation → full desktop experience with all roles enabled
|
||||||
- **wixos**: WSL2 development → full desktop experience, inherits from zix790prors Windows host
|
|
||||||
- **live-usb**: Temporary environment → only base + desktop roles, no persistent services
|
- **live-usb**: Temporary environment → only base + desktop roles, no persistent services
|
||||||
- **johno-macbookpro**: macOS work laptop → Darwin-specific configuration with development tools
|
- **johno-macbookpro**: macOS work laptop → Darwin-specific configuration with development tools
|
||||||
|
|
||||||
@@ -111,7 +110,6 @@ darwin-rebuild build --flake .#johno-macbookpro
|
|||||||
- `nix-book`: Compact laptop with storage constraints, uses `home/home-laptop-compact.nix`
|
- `nix-book`: Compact laptop with storage constraints, uses `home/home-laptop-compact.nix`
|
||||||
- `boxy`: Shared living room media center/gaming desktop with AMD GPU, uses `home/home-media-center.nix`
|
- `boxy`: Shared living room media center/gaming desktop with AMD GPU, uses `home/home-media-center.nix`
|
||||||
- `zix790prors`: Powerful all-purpose workstation (gaming, 3D modeling, development), dual-boots Windows 11 with shared btrfs /games partition, uses `home/home-desktop.nix`
|
- `zix790prors`: Powerful all-purpose workstation (gaming, 3D modeling, development), dual-boots Windows 11 with shared btrfs /games partition, uses `home/home-desktop.nix`
|
||||||
- `wixos`: WSL2 development environment running in Windows partition of zix790prors, uses `home/home-desktop.nix`
|
|
||||||
- `live-usb`: Bootable ISO configuration, uses `home/home-live-usb.nix`
|
- `live-usb`: Bootable ISO configuration, uses `home/home-live-usb.nix`
|
||||||
- `johno-macbookpro`: macOS work laptop, uses `home/home-darwin-work.nix`
|
- `johno-macbookpro`: macOS work laptop, uses `home/home-darwin-work.nix`
|
||||||
|
|
||||||
|
|||||||
67
flake.lock
generated
67
flake.lock
generated
@@ -60,22 +60,6 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"flake-compat": {
|
|
||||||
"flake": false,
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1765121682,
|
|
||||||
"narHash": "sha256-4VBOP18BFeiPkyhy9o4ssBNQEvfvv1kXkasAYd0+rrA=",
|
|
||||||
"owner": "edolstra",
|
|
||||||
"repo": "flake-compat",
|
|
||||||
"rev": "65f23138d8d09a92e30f1e5c87611b23ef451bf3",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "edolstra",
|
|
||||||
"repo": "flake-compat",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"flake-utils": {
|
"flake-utils": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"systems": "systems"
|
"systems": "systems"
|
||||||
@@ -241,38 +225,18 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixos-wsl": {
|
|
||||||
"inputs": {
|
|
||||||
"flake-compat": "flake-compat",
|
|
||||||
"nixpkgs": "nixpkgs"
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1765841014,
|
|
||||||
"narHash": "sha256-55V0AJ36V5Egh4kMhWtDh117eE3GOjwq5LhwxDn9eHg=",
|
|
||||||
"owner": "nix-community",
|
|
||||||
"repo": "NixOS-WSL",
|
|
||||||
"rev": "be4af8042e7a61fa12fda58fe9a3b3babdefe17b",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nix-community",
|
|
||||||
"ref": "main",
|
|
||||||
"repo": "NixOS-WSL",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765472234,
|
"lastModified": 1767480499,
|
||||||
"narHash": "sha256-9VvC20PJPsleGMewwcWYKGzDIyjckEz8uWmT0vCDYK0=",
|
"narHash": "sha256-8IQQUorUGiSmFaPnLSo2+T+rjHtiNWc+OAzeHck7N48=",
|
||||||
"owner": "NixOS",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "2fbfb1d73d239d2402a8fe03963e37aab15abe8b",
|
"rev": "30a3c519afcf3f99e2c6df3b359aec5692054d92",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "NixOS",
|
"owner": "nixos",
|
||||||
"ref": "nixos-unstable",
|
"ref": "nixos-25.11",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
@@ -293,22 +257,6 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs_2": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1767480499,
|
|
||||||
"narHash": "sha256-8IQQUorUGiSmFaPnLSo2+T+rjHtiNWc+OAzeHck7N48=",
|
|
||||||
"owner": "nixos",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"rev": "30a3c519afcf3f99e2c6df3b359aec5692054d92",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nixos",
|
|
||||||
"ref": "nixos-25.11",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"plasma-manager": {
|
"plasma-manager": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"home-manager": [
|
"home-manager": [
|
||||||
@@ -364,8 +312,7 @@
|
|||||||
"jovian": "jovian",
|
"jovian": "jovian",
|
||||||
"nix-darwin": "nix-darwin",
|
"nix-darwin": "nix-darwin",
|
||||||
"nix-doom-emacs-unstraightened": "nix-doom-emacs-unstraightened",
|
"nix-doom-emacs-unstraightened": "nix-doom-emacs-unstraightened",
|
||||||
"nixos-wsl": "nixos-wsl",
|
"nixpkgs": "nixpkgs",
|
||||||
"nixpkgs": "nixpkgs_2",
|
|
||||||
"nixpkgs-unstable": "nixpkgs-unstable",
|
"nixpkgs-unstable": "nixpkgs-unstable",
|
||||||
"plasma-manager": "plasma-manager",
|
"plasma-manager": "plasma-manager",
|
||||||
"plasma-manager-unstable": "plasma-manager-unstable"
|
"plasma-manager-unstable": "plasma-manager-unstable"
|
||||||
|
|||||||
20
flake.nix
20
flake.nix
@@ -4,8 +4,7 @@
|
|||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
|
||||||
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
nixos-wsl.url = "github:nix-community/NixOS-WSL/main";
|
|
||||||
|
|
||||||
nix-darwin = {
|
nix-darwin = {
|
||||||
url = "github:nix-darwin/nix-darwin/nix-darwin-25.11";
|
url = "github:nix-darwin/nix-darwin/nix-darwin-25.11";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
@@ -55,7 +54,7 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = { self, nixpkgs, nixpkgs-unstable, nixos-wsl, ... } @ inputs: let
|
outputs = { self, nixpkgs, nixpkgs-unstable, ... } @ inputs: let
|
||||||
# Shared overlay function to reduce duplication across module sets
|
# Shared overlay function to reduce duplication across module sets
|
||||||
# Parameters:
|
# Parameters:
|
||||||
# unstableOverlays: Additional overlays to apply when importing nixpkgs-unstable
|
# unstableOverlays: Additional overlays to apply when importing nixpkgs-unstable
|
||||||
@@ -84,6 +83,7 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
nixosModules = [
|
nixosModules = [
|
||||||
./roles
|
./roles
|
||||||
inputs.home-manager.nixosModules.home-manager
|
inputs.home-manager.nixosModules.home-manager
|
||||||
@@ -157,24 +157,10 @@
|
|||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
nixosConfigurations.wixos = nixpkgs.lib.nixosSystem rec {
|
|
||||||
system = "x86_64-linux";
|
|
||||||
modules = nixosModules ++ [
|
|
||||||
nixos-wsl.nixosModules.default
|
|
||||||
./machines/wixos/configuration.nix
|
|
||||||
inputs.home-manager.nixosModules.home-manager
|
|
||||||
{
|
|
||||||
home-manager.users.johno = import ./home/home-desktop.nix;
|
|
||||||
home-manager.extraSpecialArgs = { inherit system; };
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
nixosConfigurations.zix790prors = nixpkgs.lib.nixosSystem rec {
|
nixosConfigurations.zix790prors = nixpkgs.lib.nixosSystem rec {
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
modules = nixosModules ++ [
|
modules = nixosModules ++ [
|
||||||
./machines/zix790prors/configuration.nix
|
./machines/zix790prors/configuration.nix
|
||||||
inputs.home-manager.nixosModules.home-manager
|
|
||||||
{
|
{
|
||||||
home-manager.users.johno = import ./home/home-desktop.nix;
|
home-manager.users.johno = import ./home/home-desktop.nix;
|
||||||
home-manager.extraSpecialArgs = { inherit system; };
|
home-manager.extraSpecialArgs = { inherit system; };
|
||||||
|
|||||||
317
home/roles/development/skills/beads_batch_research_plan.md
Normal file
317
home/roles/development/skills/beads_batch_research_plan.md
Normal file
@@ -0,0 +1,317 @@
|
|||||||
|
---
|
||||||
|
description: Batch research and planning for multiple beads with interactive question review
|
||||||
|
model: opus
|
||||||
|
---
|
||||||
|
|
||||||
|
# Beads Batch Research+Plan
|
||||||
|
|
||||||
|
This skill automates the common workflow of:
|
||||||
|
1. Running /beads_research in parallel for multiple beads
|
||||||
|
2. Presenting open questions interactively for user input (bead-by-bead)
|
||||||
|
3. Running /beads_plan for all researched beads (plus any spawned from splits)
|
||||||
|
|
||||||
|
## When to Use
|
||||||
|
|
||||||
|
- You have multiple beads ready for work
|
||||||
|
- You want to research and plan them efficiently before implementation
|
||||||
|
- You prefer to batch your question-answering rather than context-switching between skills
|
||||||
|
|
||||||
|
## Phase 1: Selection
|
||||||
|
|
||||||
|
1. **Get ready beads**: Run `bd ready --limit=20` to list beads with no blockers
|
||||||
|
|
||||||
|
2. **Filter already-researched beads**:
|
||||||
|
For each ready bead, check if it already has research:
|
||||||
|
```bash
|
||||||
|
ls thoughts/beads-{bead-id}/research.md 2>/dev/null
|
||||||
|
```
|
||||||
|
|
||||||
|
Categorize beads:
|
||||||
|
- **Needs research**: No `research.md` exists
|
||||||
|
- **Has research, needs plan**: `research.md` exists but no `plan.md`
|
||||||
|
- **Already planned**: Both `research.md` and `plan.md` exist
|
||||||
|
|
||||||
|
3. **Present selection**:
|
||||||
|
```
|
||||||
|
Ready beads available for batch research+plan:
|
||||||
|
|
||||||
|
NEEDS RESEARCH:
|
||||||
|
- {bead-id}: {title} (type: {type})
|
||||||
|
- ...
|
||||||
|
|
||||||
|
HAS RESEARCH (plan only):
|
||||||
|
- {bead-id}: {title} (type: {type})
|
||||||
|
- ...
|
||||||
|
|
||||||
|
ALREADY PLANNED (skip):
|
||||||
|
- {bead-id}: {title}
|
||||||
|
|
||||||
|
Which beads would you like to process?
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Use AskUserQuestion** with `multiSelect: true`:
|
||||||
|
- Include bead ID and title for each option
|
||||||
|
- Separate options by category
|
||||||
|
- Allow selection across categories
|
||||||
|
|
||||||
|
## Phase 2: Parallel Research
|
||||||
|
|
||||||
|
For each selected bead that NEEDS RESEARCH, launch a research subagent.
|
||||||
|
|
||||||
|
### Subagent Instructions Template
|
||||||
|
|
||||||
|
```
|
||||||
|
Research bead [BEAD_ID]: [BEAD_TITLE]
|
||||||
|
|
||||||
|
1. **Load bead context**:
|
||||||
|
```bash
|
||||||
|
bd show [BEAD_ID]
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Create artifact directory**:
|
||||||
|
```bash
|
||||||
|
mkdir -p thoughts/beads-[BEAD_ID]
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Conduct research** following beads_research.md patterns:
|
||||||
|
- Analyze and decompose the research question
|
||||||
|
- Spawn parallel sub-agent tasks (codebase-locator, codebase-analyzer, etc.)
|
||||||
|
- Synthesize findings
|
||||||
|
|
||||||
|
4. **Write research document** to `thoughts/beads-[BEAD_ID]/research.md`:
|
||||||
|
- Include frontmatter with metadata
|
||||||
|
- Document findings with file:line references
|
||||||
|
- **CRITICAL**: Include "## Open Questions" section listing any unresolved items
|
||||||
|
|
||||||
|
5. **Return summary**:
|
||||||
|
- Research status (complete/partial)
|
||||||
|
- Number of open questions
|
||||||
|
- Key findings summary (2-3 bullet points)
|
||||||
|
- List of open questions verbatim
|
||||||
|
```
|
||||||
|
|
||||||
|
### Launching Subagents
|
||||||
|
|
||||||
|
Use `subagent_type: "opus"` for research subagents (matches beads_research model setting).
|
||||||
|
|
||||||
|
Launch ALL research subagents in a single message for parallel execution:
|
||||||
|
```
|
||||||
|
<Task calls for each selected bead needing research - all in one message>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Collecting Results
|
||||||
|
|
||||||
|
Wait for ALL research subagents to complete. Collect:
|
||||||
|
- Bead ID
|
||||||
|
- Research status
|
||||||
|
- Open questions list
|
||||||
|
- Any errors encountered
|
||||||
|
|
||||||
|
## Phase 3: Interactive Question Review
|
||||||
|
|
||||||
|
Present each bead's open questions sequentially for user input.
|
||||||
|
|
||||||
|
### For Each Bead (in order):
|
||||||
|
|
||||||
|
1. **Present research summary**:
|
||||||
|
```
|
||||||
|
## Bead {N}/{total}: {bead-id} - {title}
|
||||||
|
|
||||||
|
Research complete. Key findings:
|
||||||
|
- {finding 1}
|
||||||
|
- {finding 2}
|
||||||
|
|
||||||
|
Open questions requiring your input:
|
||||||
|
1. {question 1}
|
||||||
|
2. {question 2}
|
||||||
|
|
||||||
|
Additionally:
|
||||||
|
- Should this bead be split into multiple beads? (y/n)
|
||||||
|
- If split, describe the split:
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Collect user responses**:
|
||||||
|
- Answers to open questions
|
||||||
|
- Split decision (yes/no)
|
||||||
|
- If split: new bead titles and how to divide the work
|
||||||
|
|
||||||
|
3. **Handle splits**:
|
||||||
|
If user indicates a split:
|
||||||
|
```bash
|
||||||
|
# Create new beads for split work
|
||||||
|
bd create --title="{split title 1}" --type={type} --priority={priority} \
|
||||||
|
--description="{description based on user input}"
|
||||||
|
|
||||||
|
# Update original bead if scope narrowed
|
||||||
|
bd update {original-bead-id} --description="{updated description}"
|
||||||
|
```
|
||||||
|
|
||||||
|
Track new bead IDs for inclusion in planning phase.
|
||||||
|
|
||||||
|
4. **Update research document**:
|
||||||
|
Append user answers to `thoughts/beads-{id}/research.md`:
|
||||||
|
```markdown
|
||||||
|
## User Clarifications [{timestamp}]
|
||||||
|
|
||||||
|
Q: {question 1}
|
||||||
|
A: {user answer 1}
|
||||||
|
|
||||||
|
Q: {question 2}
|
||||||
|
A: {user answer 2}
|
||||||
|
|
||||||
|
## Bead Splits
|
||||||
|
{If split: description of split and new bead IDs}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Progress Tracking
|
||||||
|
|
||||||
|
After each bead's questions are answered, confirm before moving to next:
|
||||||
|
```
|
||||||
|
Questions answered for {bead-id}. {N-1} beads remaining.
|
||||||
|
Continue to next bead? (y/n)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Beads with No Questions
|
||||||
|
|
||||||
|
If a bead's research had no open questions:
|
||||||
|
```
|
||||||
|
## Bead {N}/{total}: {bead-id} - {title}
|
||||||
|
|
||||||
|
Research complete with no open questions.
|
||||||
|
|
||||||
|
Key findings:
|
||||||
|
- {finding 1}
|
||||||
|
- {finding 2}
|
||||||
|
|
||||||
|
Should this bead be split? (y/n)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Phase 4: Parallel Planning
|
||||||
|
|
||||||
|
After all questions answered, launch planning subagents for all beads.
|
||||||
|
|
||||||
|
### Beads to Plan
|
||||||
|
|
||||||
|
Include:
|
||||||
|
- Original beads that were researched
|
||||||
|
- Beads that had existing research (from selection phase)
|
||||||
|
- New beads spawned from splits
|
||||||
|
|
||||||
|
### Subagent Instructions Template
|
||||||
|
|
||||||
|
```
|
||||||
|
Create implementation plan for bead [BEAD_ID]: [BEAD_TITLE]
|
||||||
|
|
||||||
|
1. **Load context**:
|
||||||
|
```bash
|
||||||
|
bd show [BEAD_ID]
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Read research** (it exists and has user clarifications):
|
||||||
|
Read `thoughts/beads-[BEAD_ID]/research.md` FULLY
|
||||||
|
|
||||||
|
3. **Create plan** following beads_plan.md patterns:
|
||||||
|
- Context gathering via sub-agents
|
||||||
|
- Design approach based on research findings and user clarifications
|
||||||
|
- **Skip interactive questions** - they were already answered in research review
|
||||||
|
|
||||||
|
4. **Write plan** to `thoughts/beads-[BEAD_ID]/plan.md`:
|
||||||
|
- Full plan structure with phases
|
||||||
|
- Success criteria (automated and manual)
|
||||||
|
- References to research document
|
||||||
|
|
||||||
|
5. **Update bead**:
|
||||||
|
```bash
|
||||||
|
bd update [BEAD_ID] --notes="Plan created: thoughts/beads-[BEAD_ID]/plan.md"
|
||||||
|
```
|
||||||
|
|
||||||
|
6. **Return summary**:
|
||||||
|
- Plan status (complete/failed)
|
||||||
|
- Number of phases
|
||||||
|
- Estimated complexity (small/medium/large)
|
||||||
|
- Any issues encountered
|
||||||
|
```
|
||||||
|
|
||||||
|
### Launching Subagents
|
||||||
|
|
||||||
|
Use `subagent_type: "opus"` for planning subagents (matches beads_plan model setting).
|
||||||
|
|
||||||
|
Launch ALL planning subagents in a single message:
|
||||||
|
```
|
||||||
|
<Task calls for each bead to plan - all in one message>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Handling Beads Without Research
|
||||||
|
|
||||||
|
For beads that had existing research but user didn't review questions:
|
||||||
|
- Planning subagent reads existing research
|
||||||
|
- If research has unresolved open questions, subagent should flag this in its return
|
||||||
|
|
||||||
|
## Phase 5: Summary
|
||||||
|
|
||||||
|
After all planning completes, present final summary.
|
||||||
|
|
||||||
|
### Summary Format
|
||||||
|
|
||||||
|
```
|
||||||
|
## Batch Research+Plan Complete
|
||||||
|
|
||||||
|
### Successfully Processed:
|
||||||
|
| Bead | Title | Research | Plan | Phases | Complexity |
|
||||||
|
|------|-------|----------|------|--------|------------|
|
||||||
|
| {id} | {title} | Complete | Complete | 3 | medium |
|
||||||
|
| {id} | {title} | Complete | Complete | 2 | small |
|
||||||
|
|
||||||
|
### New Beads (from splits):
|
||||||
|
| Bead | Title | Parent | Status |
|
||||||
|
|------|-------|--------|--------|
|
||||||
|
| {new-id} | {title} | {parent-id} | Planned |
|
||||||
|
|
||||||
|
### Failed:
|
||||||
|
| Bead | Title | Phase Failed | Error |
|
||||||
|
|------|-------|--------------|-------|
|
||||||
|
| {id} | {title} | Research | Timeout |
|
||||||
|
|
||||||
|
### Next Steps:
|
||||||
|
1. Review plans at `thoughts/beads-{id}/plan.md`
|
||||||
|
2. Run `/parallel_beads` to implement all planned beads
|
||||||
|
3. Or run `/beads_implement {id}` for individual implementation
|
||||||
|
|
||||||
|
### Artifacts Created:
|
||||||
|
- Research: thoughts/beads-{id}/research.md (x{N} files)
|
||||||
|
- Plans: thoughts/beads-{id}/plan.md (x{N} files)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
### Research Subagent Failure
|
||||||
|
- Log the failure with bead ID and error
|
||||||
|
- Continue with other beads
|
||||||
|
- Exclude failed beads from question review and planning
|
||||||
|
- Report in final summary
|
||||||
|
|
||||||
|
### Planning Subagent Failure
|
||||||
|
- Log the failure with bead ID and error
|
||||||
|
- Research still valid - can retry planning manually
|
||||||
|
- Report in final summary
|
||||||
|
|
||||||
|
### User Cancellation During Question Review
|
||||||
|
- Save progress to bead notes
|
||||||
|
- Report which beads were completed
|
||||||
|
- User can resume with remaining beads in new session
|
||||||
|
|
||||||
|
### Split Bead Creation Failure
|
||||||
|
- Report error but continue with original bead
|
||||||
|
- User can manually create split beads later
|
||||||
|
|
||||||
|
## Resource Limits
|
||||||
|
|
||||||
|
- Maximum concurrent research subagents: 5
|
||||||
|
- Maximum concurrent planning subagents: 5
|
||||||
|
- If more beads selected, process in batches
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- This skill is designed for the "research+plan before implementation" workflow
|
||||||
|
- Pairs well with `/parallel_beads` for subsequent implementation
|
||||||
|
- Run `/reconcile_beads` after implementation PRs merge
|
||||||
@@ -4,12 +4,13 @@ description: Reconcile beads with merged PRs and close completed beads
|
|||||||
|
|
||||||
# Reconcile Beads Workflow
|
# Reconcile Beads Workflow
|
||||||
|
|
||||||
This skill reconciles beads that are in `in_review` status with their corresponding PRs. If a PR has been merged, the bead is closed.
|
This skill reconciles beads that are in `in_review` status with their corresponding PRs. If a PR has been merged, the bead is closed and any linked Gitea issue is also closed.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- Custom status `in_review` must be configured: `bd config set status.custom "in_review"`
|
- Custom status `in_review` must be configured: `bd config set status.custom "in_review"`
|
||||||
- Beads in `in_review` status should have a PR URL in their notes
|
- Beads in `in_review` status should have a PR URL in their notes
|
||||||
|
- `tea` CLI must be configured for closing Gitea issues
|
||||||
|
|
||||||
## Workflow
|
## Workflow
|
||||||
|
|
||||||
@@ -52,6 +53,34 @@ If the PR is merged:
|
|||||||
bd close [BEAD_ID] --reason="PR merged: [PR_URL]"
|
bd close [BEAD_ID] --reason="PR merged: [PR_URL]"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Step 3.1: Close corresponding Gitea issue (if any)
|
||||||
|
|
||||||
|
After closing a bead, check if it has a linked Gitea issue:
|
||||||
|
|
||||||
|
1. **Check for Gitea issue URL in bead notes**:
|
||||||
|
Look for the pattern `Gitea issue: <URL>` in the notes. Extract the URL.
|
||||||
|
|
||||||
|
2. **Extract issue number from URL**:
|
||||||
|
```bash
|
||||||
|
# Example: https://git.johnogle.info/johno/nixos-configs/issues/16 -> 16
|
||||||
|
echo "$GITEA_URL" | grep -oP '/issues/\K\d+'
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Close the Gitea issue**:
|
||||||
|
```bash
|
||||||
|
tea issues close [ISSUE_NUMBER]
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Handle errors gracefully**:
|
||||||
|
- If issue is already closed: Log warning, continue
|
||||||
|
- If issue not found: Log warning, continue
|
||||||
|
- If `tea` fails: Log error, continue with other beads
|
||||||
|
|
||||||
|
Example warning output:
|
||||||
|
```
|
||||||
|
Warning: Could not close Gitea issue #16: issue already closed
|
||||||
|
```
|
||||||
|
|
||||||
### Step 4: Report summary
|
### Step 4: Report summary
|
||||||
|
|
||||||
Present results:
|
Present results:
|
||||||
@@ -60,10 +89,17 @@ Present results:
|
|||||||
## Beads Reconciliation Summary
|
## Beads Reconciliation Summary
|
||||||
|
|
||||||
### Closed (PR Merged)
|
### Closed (PR Merged)
|
||||||
| Bead | PR | Title |
|
| Bead | PR | Gitea Issue | Title |
|
||||||
|------|-----|-------|
|
|------|-----|-------------|-------|
|
||||||
| beads-abc | #123 | Feature X |
|
| beads-abc | #123 | #16 closed | Feature X |
|
||||||
| beads-xyz | #456 | Bug fix Y |
|
| beads-xyz | #456 | (none) | Bug fix Y |
|
||||||
|
|
||||||
|
### Gitea Issues Closed
|
||||||
|
| Issue | Bead | Status |
|
||||||
|
|-------|------|--------|
|
||||||
|
| #16 | beads-abc | Closed successfully |
|
||||||
|
| #17 | beads-def | Already closed (skipped) |
|
||||||
|
| #99 | beads-ghi | Error: issue not found |
|
||||||
|
|
||||||
### Still in Review
|
### Still in Review
|
||||||
| Bead | PR | Status | Title |
|
| Bead | PR | Status | Title |
|
||||||
@@ -80,9 +116,14 @@ Present results:
|
|||||||
- **Missing PR URL**: Skip the bead and report it
|
- **Missing PR URL**: Skip the bead and report it
|
||||||
- **PR not found**: Report the error but continue with other beads
|
- **PR not found**: Report the error but continue with other beads
|
||||||
- **API errors**: Report and continue
|
- **API errors**: Report and continue
|
||||||
|
- **Gitea issue already closed**: Log warning, continue (not an error)
|
||||||
|
- **Gitea issue not found**: Log warning, continue (issue may have been deleted)
|
||||||
|
- **No Gitea issue linked**: Normal case, no action needed
|
||||||
|
- **tea command fails**: Log error with output, continue with other beads
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
- This skill complements `/parallel_beads` which sets beads to `in_review` status
|
- This skill complements `/parallel_beads` which sets beads to `in_review` status
|
||||||
- Run this skill periodically or after merging PRs to keep beads in sync
|
- Run this skill periodically or after merging PRs to keep beads in sync
|
||||||
- Beads with closed (but not merged) PRs are not automatically closed - they may need rework
|
- Beads with closed (but not merged) PRs are not automatically closed - they may need rework
|
||||||
|
- Gitea issues are only closed for beads that have a `Gitea issue: <URL>` in their notes
|
||||||
|
|||||||
@@ -225,11 +225,16 @@
|
|||||||
mu4e-headers-time-format "%H:%M")
|
mu4e-headers-time-format "%H:%M")
|
||||||
|
|
||||||
;; Sending mail via msmtp
|
;; Sending mail via msmtp
|
||||||
(setq message-send-mail-function 'message-send-mail-with-sendmail
|
;; NOTE: message-sendmail-f-is-evil and --read-envelope-from are required
|
||||||
sendmail-program (executable-find "msmtp")
|
;; to prevent msmtp from stripping the email body when processing headers.
|
||||||
message-sendmail-envelope-from 'header
|
;; Without these, multipart messages (especially from org-msg) may arrive
|
||||||
mail-envelope-from 'header
|
;; with empty bodies.
|
||||||
mail-specify-envelope-from t))
|
(setq sendmail-program (executable-find "msmtp")
|
||||||
|
send-mail-function #'message-send-mail-with-sendmail
|
||||||
|
message-send-mail-function #'message-send-mail-with-sendmail
|
||||||
|
message-sendmail-f-is-evil t
|
||||||
|
message-sendmail-extra-arguments '("--read-envelope-from")
|
||||||
|
message-sendmail-envelope-from 'header))
|
||||||
|
|
||||||
;; Whenever you reconfigure a package, make sure to wrap your config in an
|
;; Whenever you reconfigure a package, make sure to wrap your config in an
|
||||||
;; `after!' block, otherwise Doom's defaults may override your settings. E.g.
|
;; `after!' block, otherwise Doom's defaults may override your settings. E.g.
|
||||||
|
|||||||
@@ -1,56 +0,0 @@
|
|||||||
# Edit this configuration file to define what should be installed on
|
|
||||||
# your system. Help is available in the configuration.nix(5) man page, on
|
|
||||||
# https://search.nixos.org/options and in the NixOS manual (`nixos-help`).
|
|
||||||
|
|
||||||
# NixOS-WSL specific options are documented on the NixOS-WSL repository:
|
|
||||||
# https://github.com/nix-community/NixOS-WSL
|
|
||||||
|
|
||||||
{ config, lib, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
];
|
|
||||||
|
|
||||||
roles = {
|
|
||||||
audio.enable = true;
|
|
||||||
desktop = {
|
|
||||||
enable = true;
|
|
||||||
wayland = true;
|
|
||||||
};
|
|
||||||
nvidia = {
|
|
||||||
enable = true;
|
|
||||||
package = "latest";
|
|
||||||
graphics.extraPackages = with pkgs; [
|
|
||||||
mesa
|
|
||||||
libvdpau-va-gl
|
|
||||||
libva-vdpau-driver
|
|
||||||
];
|
|
||||||
};
|
|
||||||
users.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
networking.hostName = "wixos";
|
|
||||||
|
|
||||||
wsl.enable = true;
|
|
||||||
wsl.defaultUser = "johno";
|
|
||||||
wsl.startMenuLaunchers = true;
|
|
||||||
wsl.useWindowsDriver = true;
|
|
||||||
wsl.wslConf.network.hostname = "wixos";
|
|
||||||
wsl.wslConf.user.default = "johno";
|
|
||||||
|
|
||||||
# WSL-specific environment variables for graphics
|
|
||||||
environment.sessionVariables = {
|
|
||||||
LD_LIBRARY_PATH = [
|
|
||||||
"/usr/lib/wsl/lib"
|
|
||||||
"/run/opengl-driver/lib"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
# This value determines the NixOS release from which the default
|
|
||||||
# settings for stateful data, like file locations and database versions
|
|
||||||
# on your system were taken. It's perfectly fine and recommended to leave
|
|
||||||
# this value at the release version of the first install of this system.
|
|
||||||
# Before changing this value read the documentation for this option
|
|
||||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
|
||||||
system.stateVersion = "24.05"; # Did you read the comment?
|
|
||||||
}
|
|
||||||
@@ -21,6 +21,8 @@ in
|
|||||||
|
|
||||||
services.pipewire = {
|
services.pipewire = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
alsa.enable = true;
|
||||||
|
alsa.support32Bit = true;
|
||||||
pulse.enable = true;
|
pulse.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,21 @@ in
|
|||||||
{
|
{
|
||||||
options.roles.nfs-mounts = {
|
options.roles.nfs-mounts = {
|
||||||
enable = mkEnableOption "Enable default NFS mounts";
|
enable = mkEnableOption "Enable default NFS mounts";
|
||||||
|
server = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "10.0.0.43";
|
||||||
|
description = "IP address or hostname of the NFS server";
|
||||||
|
};
|
||||||
|
remotePath = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "/media";
|
||||||
|
description = "Remote path to mount from the NFS server";
|
||||||
|
};
|
||||||
|
mountPoint = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "/media";
|
||||||
|
description = "Local mount point for the NFS share";
|
||||||
|
};
|
||||||
# TODO: implement requireMount
|
# TODO: implement requireMount
|
||||||
requireMount = mkOption {
|
requireMount = mkOption {
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
@@ -18,8 +33,8 @@ in
|
|||||||
|
|
||||||
config = mkIf cfg.enable
|
config = mkIf cfg.enable
|
||||||
{
|
{
|
||||||
fileSystems."/media" = {
|
fileSystems.${cfg.mountPoint} = {
|
||||||
device = "10.0.0.43:/media";
|
device = "${cfg.server}:${cfg.remotePath}";
|
||||||
fsType = "nfs";
|
fsType = "nfs";
|
||||||
options = [
|
options = [
|
||||||
"defaults"
|
"defaults"
|
||||||
|
|||||||
@@ -8,6 +8,21 @@ in
|
|||||||
{
|
{
|
||||||
options.roles.printing = {
|
options.roles.printing = {
|
||||||
enable = mkEnableOption "Enable default printing setup";
|
enable = mkEnableOption "Enable default printing setup";
|
||||||
|
printerName = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "MFC-L8900CDW_series";
|
||||||
|
description = "Name for the default printer";
|
||||||
|
};
|
||||||
|
printerUri = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "ipp://brother.oglehome/ipp/print";
|
||||||
|
description = "Device URI for the default printer (e.g., ipp://hostname/ipp/print)";
|
||||||
|
};
|
||||||
|
printerModel = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "everywhere";
|
||||||
|
description = "PPD model for the printer (use 'everywhere' for driverless IPP)";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable
|
config = mkIf cfg.enable
|
||||||
@@ -21,11 +36,11 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
hardware.printers.ensurePrinters = [{
|
hardware.printers.ensurePrinters = [{
|
||||||
name = "MFC-L8900CDW_series";
|
name = cfg.printerName;
|
||||||
deviceUri = "ipp://brother.oglehome/ipp/print";
|
deviceUri = cfg.printerUri;
|
||||||
model = "everywhere";
|
model = cfg.printerModel;
|
||||||
}];
|
}];
|
||||||
hardware.printers.ensureDefaultPrinter = "MFC-L8900CDW_series";
|
hardware.printers.ensureDefaultPrinter = cfg.printerName;
|
||||||
|
|
||||||
# Fix ensure-printers service to wait for network availability
|
# Fix ensure-printers service to wait for network availability
|
||||||
systemd.services.ensure-printers = {
|
systemd.services.ensure-printers = {
|
||||||
|
|||||||
@@ -8,6 +8,11 @@ in
|
|||||||
{
|
{
|
||||||
options.roles.virtualisation = {
|
options.roles.virtualisation = {
|
||||||
enable = mkEnableOption "Enable virtualisation";
|
enable = mkEnableOption "Enable virtualisation";
|
||||||
|
dockerUsers = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
default = [ "johno" ];
|
||||||
|
description = "List of users to add to the docker group";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable
|
config = mkIf cfg.enable
|
||||||
@@ -15,6 +20,6 @@ in
|
|||||||
virtualisation.libvirtd.enable = true;
|
virtualisation.libvirtd.enable = true;
|
||||||
programs.virt-manager.enable = true;
|
programs.virt-manager.enable = true;
|
||||||
virtualisation.docker.enable = true;
|
virtualisation.docker.enable = true;
|
||||||
users.extraGroups.docker.members = [ "johno" ];
|
users.extraGroups.docker.members = cfg.dockerUsers;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,30 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Parse arguments
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
--help|-h)
|
||||||
|
echo "Usage: $0 [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Rotate to the next wallpaper in the configured list."
|
||||||
|
echo ""
|
||||||
|
echo "This script increments the currentIndex in home/wallpapers/default.nix,"
|
||||||
|
echo "cycling through available wallpapers. Rebuild your system to apply"
|
||||||
|
echo "the new wallpaper."
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo " --help, -h Show this help message"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown option: $1"
|
||||||
|
echo "Use --help for usage information"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
# Colors for output
|
# Colors for output
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
|
|||||||
@@ -1,6 +1,30 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Parse arguments
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
--help|-h)
|
||||||
|
echo "Usage: $0 [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Update Doom Emacs to the latest commit from the doomemacs repository."
|
||||||
|
echo ""
|
||||||
|
echo "This script fetches the latest commit SHA from the default branch,"
|
||||||
|
echo "updates the rev and sha256 in home/roles/emacs/default.nix, and"
|
||||||
|
echo "prepares the configuration for a system rebuild."
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo " --help, -h Show this help message"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown option: $1"
|
||||||
|
echo "Use --help for usage information"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
# Colors for output
|
# Colors for output
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
|
|||||||
@@ -1,6 +1,35 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Parse arguments
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
--help|-h)
|
||||||
|
echo "Usage: $0 [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Perform a major upgrade of the NixOS configuration."
|
||||||
|
echo ""
|
||||||
|
echo "This script runs the following steps:"
|
||||||
|
echo " 1. Update all flake inputs (nix flake update)"
|
||||||
|
echo " 2. Update Doom Emacs to the latest commit"
|
||||||
|
echo " 3. Update Claude Code to the latest version"
|
||||||
|
echo " 4. Rotate to the next wallpaper"
|
||||||
|
echo ""
|
||||||
|
echo "After completion, review changes with 'git diff' and rebuild"
|
||||||
|
echo "your system with 'sudo nixos-rebuild switch --flake .'"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo " --help, -h Show this help message"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown option: $1"
|
||||||
|
echo "Use --help for usage information"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
# Colors for output
|
# Colors for output
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
|
|||||||
Reference in New Issue
Block a user