Compare commits
84 Commits
f203bb7463
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
29d1cdf894 | ||
|
|
7551a6b919 | ||
|
|
8bb7211ccc | ||
|
|
25512af24c | ||
|
|
3bd2f23e0d | ||
|
|
22b43adbb2 | ||
|
|
140b5cb682 | ||
|
|
291e3a0744 | ||
|
|
e830d37a9e | ||
|
|
eb9744a01d | ||
|
|
74f23ed9f1 | ||
|
|
2d0311cd15 | ||
|
|
3e49f81c76 | ||
|
|
2d2c545c10 | ||
|
|
106aa3749f | ||
|
|
89197e81e4 | ||
|
|
8ab4fba471 | ||
|
|
3ebda192e9 | ||
|
|
68964eb099 | ||
|
|
7b9fc8f280 | ||
|
|
1fe74b6d7d | ||
|
|
11f3da30c3 | ||
|
|
be401c2ebb | ||
|
|
41e6ea8280 | ||
|
|
6693c09465 | ||
|
|
51d79fbbcf | ||
|
|
9ef17eb7eb | ||
|
|
81cffd22cb | ||
|
|
c2c0201295 | ||
|
|
47cace3dd1 | ||
|
|
bfa707c11d | ||
|
|
e22774539a | ||
|
|
166ed9e825 | ||
|
|
5b55f47020 | ||
|
|
f95fe5bf6d | ||
|
|
34dda52d53 | ||
|
|
06a40240ea | ||
|
|
ad0bc14461 | ||
|
|
6d262127e7 | ||
|
|
839d7ae743 | ||
|
|
2e37c16ac7 | ||
|
|
3b99d1215e | ||
|
|
f05865972b | ||
|
|
58312b2ca2 | ||
|
|
dc206b13e2 | ||
|
|
d43bb33dcb | ||
|
|
d2ec6a0474 | ||
|
|
f69dd15474 | ||
|
|
c7935658e6 | ||
|
|
af56407296 | ||
|
|
51dd2be6ea | ||
|
|
6ebd7b94d5 | ||
|
|
22bfba739d | ||
|
|
9d27e48b2b | ||
|
|
3f26c44b5a | ||
|
|
6775659538 | ||
|
|
b80422c16e | ||
|
|
a6c1d7cf97 | ||
|
|
e6c22a04d7 | ||
|
|
56a7a7bfa8 | ||
|
|
42cd0849b4 | ||
|
|
47b622745d | ||
|
|
fbeb39ec22 | ||
|
|
8ab5b4de8d | ||
|
|
dc2f3b6802 | ||
|
|
909acf61d3 | ||
|
|
105629502a | ||
|
|
f1fff4245f | ||
|
|
d85f2df603 | ||
|
|
f6af27e960 | ||
|
|
19456800ed | ||
|
|
8dac838645 | ||
|
|
644c7eac5d | ||
|
|
90a5344f62 | ||
|
|
8751ef9b1f | ||
|
|
de0bdd8ae3 | ||
|
|
caa2fd57dd | ||
|
|
62ce3dc646 | ||
|
|
3c87721011 | ||
|
|
4c81a909a3 | ||
|
|
112db85fa1 | ||
|
|
0b08fb400e | ||
|
|
51b8a8296c | ||
|
|
be44229e5a |
44
.beads/.gitignore
vendored
44
.beads/.gitignore
vendored
@@ -1,44 +0,0 @@
|
|||||||
# SQLite databases
|
|
||||||
*.db
|
|
||||||
*.db?*
|
|
||||||
*.db-journal
|
|
||||||
*.db-wal
|
|
||||||
*.db-shm
|
|
||||||
|
|
||||||
# Daemon runtime files
|
|
||||||
daemon.lock
|
|
||||||
daemon.log
|
|
||||||
daemon.pid
|
|
||||||
bd.sock
|
|
||||||
sync-state.json
|
|
||||||
last-touched
|
|
||||||
|
|
||||||
# Local version tracking (prevents upgrade notification spam after git ops)
|
|
||||||
.local_version
|
|
||||||
|
|
||||||
# Legacy database files
|
|
||||||
db.sqlite
|
|
||||||
bd.db
|
|
||||||
|
|
||||||
# Worktree redirect file (contains relative path to main repo's .beads/)
|
|
||||||
# Must not be committed as paths would be wrong in other clones
|
|
||||||
redirect
|
|
||||||
|
|
||||||
# Merge artifacts (temporary files from 3-way merge)
|
|
||||||
beads.base.jsonl
|
|
||||||
beads.base.meta.json
|
|
||||||
beads.left.jsonl
|
|
||||||
beads.left.meta.json
|
|
||||||
beads.right.jsonl
|
|
||||||
beads.right.meta.json
|
|
||||||
|
|
||||||
# Sync state (local-only, per-machine)
|
|
||||||
# These files are machine-specific and should not be shared across clones
|
|
||||||
.sync.lock
|
|
||||||
sync_base.jsonl
|
|
||||||
|
|
||||||
# NOTE: Do NOT add negation patterns (e.g., !issues.jsonl) here.
|
|
||||||
# They would override fork protection in .git/info/exclude, allowing
|
|
||||||
# contributors to accidentally commit upstream issue databases.
|
|
||||||
# The JSONL files (issues.jsonl, interactions.jsonl) and config files
|
|
||||||
# are tracked by git by default since no pattern above ignores them.
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
# 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> --status in_progress
|
|
||||||
bd update <issue-id> --status done
|
|
||||||
|
|
||||||
# Sync with git remote
|
|
||||||
bd sync
|
|
||||||
```
|
|
||||||
|
|
||||||
### Working with Issues
|
|
||||||
|
|
||||||
Issues in Beads are:
|
|
||||||
- **Git-native**: Stored in `.beads/issues.jsonl` and synced like code
|
|
||||||
- **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
|
|
||||||
- Intelligent JSONL 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* ⚡
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
# 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: load from JSONL, no SQLite, write back after each command
|
|
||||||
# When true, bd will use .beads/issues.jsonl as the source of truth
|
|
||||||
# instead of SQLite database
|
|
||||||
# no-db: false
|
|
||||||
|
|
||||||
# Disable daemon for RPC communication (forces direct database access)
|
|
||||||
# no-daemon: false
|
|
||||||
|
|
||||||
# Disable auto-flush of database to JSONL after mutations
|
|
||||||
# no-auto-flush: false
|
|
||||||
|
|
||||||
# Disable auto-import from JSONL when it's newer than database
|
|
||||||
# no-auto-import: false
|
|
||||||
|
|
||||||
# Enable JSON output by default
|
|
||||||
# json: false
|
|
||||||
|
|
||||||
# Default actor for audit trails (overridden by BD_ACTOR or --actor)
|
|
||||||
# actor: ""
|
|
||||||
|
|
||||||
# Path to database (overridden by BEADS_DB or --db)
|
|
||||||
# db: ""
|
|
||||||
|
|
||||||
# Auto-start daemon if not running (can also use BEADS_AUTO_START_DAEMON)
|
|
||||||
# auto-start-daemon: true
|
|
||||||
|
|
||||||
# Debounce interval for auto-flush (can also use BEADS_FLUSH_DEBOUNCE)
|
|
||||||
# flush-debounce: "5s"
|
|
||||||
|
|
||||||
# Git branch for beads commits (bd sync will commit to this branch)
|
|
||||||
# IMPORTANT: Set this for team projects so all clones use the same sync branch.
|
|
||||||
# This setting persists across clones (unlike database config which is gitignored).
|
|
||||||
# Can also use BEADS_SYNC_BRANCH env var for local override.
|
|
||||||
# If not set, bd sync will require you to run 'bd config set sync.branch <branch>'.
|
|
||||||
# sync-branch: "beads-sync"
|
|
||||||
|
|
||||||
# Multi-repo configuration (experimental - bd-307)
|
|
||||||
# Allows hydrating from multiple repositories and routing writes to the correct JSONL
|
|
||||||
# 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
|
|
||||||
|
|
||||||
# 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
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
{"id":"nixpkgs-1xm","title":"Package Basecamp MCP Server","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T05:01:20.465656454+01:00","created_by":"m3tam3re","updated_at":"2026-01-12T05:01:26.623404603+01:00","closed_at":"2026-01-12T05:01:26.623404603+01:00","close_reason":"Packaged successfully with env file support"}
|
|
||||||
{"id":"nixpkgs-3k8","title":"Export project config as environment variable","description":"Export project configuration as home.sessionVariables (similar to zellij-ps pattern). Use JSON format for the env var since projects now have structured data (path + args).","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T12:45:50.803017318+01:00","created_by":"m3tam3re","updated_at":"2026-01-05T12:48:22.968626155+01:00","closed_at":"2026-01-05T12:48:22.968626155+01:00","close_reason":"Added home.sessionVariables.ROFI_PROJECT_OPENER_CONFIG with JSON config","dependencies":[{"issue_id":"nixpkgs-3k8","depends_on_id":"nixpkgs-hrh","type":"parent-child","created_at":"2026-01-05T12:46:03.16885012+01:00","created_by":"m3tam3re"}]}
|
|
||||||
{"id":"nixpkgs-3w3","title":"Add authentication command and environment file generation to basecamp-mcp-server","description":"The basecamp-mcp-server package at pkgs/basecamp-mcp-server/default.nix wraps the FastMCP server for Basecamp 3 integration. Currently, there's no convenient way for users to:\n\n1. Set up OAuth 2.0 authentication interactively\n2. Generate a sample environment file with required credentials\n3. Guide users through the Basecamp OAuth flow\n\n## Current State\n\nThe package wraps but users must:\n- Manually clone the upstream repository\n- Run to generate template\n- Edit with OAuth credentials from https://launchpad.37signals.com/integrations\n- Run to complete OAuth flow\n- Handle token storage manually\n\n## Required Environment Variables\n\n### OAuth Configuration (Primary)\n- - OAuth client ID from Basecamp\n- - OAuth client secret\n- - Found in Basecamp URL: https://3.basecamp.com/ID/...\n- - Format: \"App Name (email@domain.com)\"\n- - http://localhost:8000/auth/callback\n- - For Flask session security\n\n### Basic Auth (Legacy)\n- - Email for direct API access\n- - Password for direct API access\n\n## Proposed Solution\n\nAdd a Nix package wrapper command () that:\n\n1. **Interactive Setup Wizard**\n - Guides users through OAuth app creation at launchpad.37signals.com\n - Prompts for credentials (with secure input for secrets)\n - Validates inputs before proceeding\n\n2. **Environment File Generation**\n - Creates or project-local \n - Includes all required variables with clear documentation\n - Sets secure permissions (600)\n - Provides example values\n\n3. **OAuth Flow Handler**\n - Starts local Flask server on port 8000\n - Opens browser to initiate OAuth flow\n - Handles callback and token exchange\n - Stores tokens securely in \n - Shows success/failure status\n\n4. **Documentation**\n - Inline help for all steps\n - Links to Basecamp integration setup\n - Account ID discovery instructions\n\n## References\n\n- Upstream repo: https://github.com/georgeantonopoulos/Basecamp-MCP-Server\n- Key files: , , , \n- OAuth endpoints: launchpad.37signals.com/authorization/new\n\n## Subtasks\n\n- [ ] Create auth command wrapper (basecamp-mcp-auth)\n- [ ] Implement interactive OAuth wizard\n- [ ] Generate sample environment file template\n- [ ] Add token storage handling\n- [ ] Update package documentation\n- [ ] Add Home Manager module support (optional)","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-12T18:25:50.929926505+01:00","created_by":"m3tam3re","updated_at":"2026-01-12T19:12:57.941267399+01:00","closed_at":"2026-01-12T19:12:57.941267399+01:00","close_reason":"Closed"}
|
|
||||||
{"id":"nixpkgs-5ml","title":"Update rofi-project-opener script to pass args to opencode","description":"Modify pkgs/rofi-project-opener script to read the new config format and launch opencode with: 'opencode \u003cdirectory\u003e \u003carguments\u003e' instead of just 'opencode' in the directory.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-05T12:45:49.748958951+01:00","created_by":"m3tam3re","updated_at":"2026-01-05T12:49:40.800083615+01:00","closed_at":"2026-01-05T12:49:40.800083615+01:00","close_reason":"Script updated to read JSON config and pass args to opencode","dependencies":[{"issue_id":"nixpkgs-5ml","depends_on_id":"nixpkgs-w3u","type":"parent-child","created_at":"2026-01-05T12:46:02.338350208+01:00","created_by":"m3tam3re"},{"issue_id":"nixpkgs-5ml","depends_on_id":"nixpkgs-sys","type":"blocks","created_at":"2026-01-05T12:46:04.966269033+01:00","created_by":"m3tam3re"}]}
|
|
||||||
{"id":"nixpkgs-61l","title":"Update documentation to reflect latest changes","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-10T18:48:19.599467206+01:00","created_by":"m3tam3re","updated_at":"2026-01-10T19:12:26.294895563+01:00","closed_at":"2026-01-10T19:12:26.294895563+01:00","close_reason":"Documentation updated: Added stt-ptt language support docs, rofi-project-opener module docs, and updated zellij-ps docs"}
|
|
||||||
{"id":"nixpkgs-69z","title":"n8n overlay -\u003e pkgs","description":"Create a full package definition in pkgs/n8n/default.nix that mirrors nixpkgs-unstable's n8n package but with version 2.4.1 and updated hashes from overlays/mods/n8n.nix. Register the new package in pkgs/default.nix. The overlay overrides: src (n8n-io/n8n@2.4.1) and pnpmDeps hash. Reference nixpkgs-unstable for the base package structure, then apply the version/hash modifications.","status":"closed","priority":2,"issue_type":"chore","owner":"p@m3ta.dev","created_at":"2026-01-13T19:42:35.643928163+01:00","created_by":"m3tm3re","updated_at":"2026-01-13T20:25:53.712987689+01:00","closed_at":"2026-01-13T20:25:53.712987689+01:00","close_reason":"Packages created successfully: pkgs/n8n/default.nix, pkgs/beads/default.nix, pkgs/opencode/default.nix. All packages build successfully."}
|
|
||||||
{"id":"nixpkgs-7ez","title":"Add authentication command for basecamp-mcp-server","description":"Add a command for the basecamp-mcp-server that will guide the user through the authentication flow and create a sample environment file with the necessary values. This involves researching the original basecamp-mcp-server repository for authentication details and implementing a user-friendly authentication workflow.","status":"tombstone","priority":0,"issue_type":"feature","created_at":"2026-01-12T18:20:55.665717166+01:00","created_by":"m3tam3re","updated_at":"2026-01-13T19:46:32.112562429+01:00","dependencies":[{"issue_id":"nixpkgs-7ez","depends_on_id":"nixpkgs-3w3","type":"blocks","created_at":"2026-01-12T18:48:31.806330931+01:00","created_by":"m3tam3re"}],"deleted_at":"2026-01-13T19:46:32.112562429+01:00","deleted_by":"daemon","delete_reason":"delete","original_type":"feature"}
|
|
||||||
{"id":"nixpkgs-8jw","title":"fix: self-hosted nixos runner missing node in PATH for Gitea Actions","description":"The nix-update workflow fails on self-hosted nixos runner because node is not available in PATH. Error: Cannot find: node in PATH. Root cause: actions/checkout@v4 requires Node.js to execute post-checkout steps. The self-hosted nixos runner does not have node installed or not in PATH. Possible solutions: 1) Add Node.js to the nixos runner environment, 2) Use container-based runner instead of bare nixos, 3) Use a different checkout action that does not require node, 4) Configure PATH to include node installation. Impact: Automated package updates are completely blocked.","status":"closed","priority":1,"issue_type":"bug","owner":"p@m3ta.dev","created_at":"2026-01-14T20:50:59.153145341+01:00","created_by":"m3tm3re","updated_at":"2026-01-18T18:36:50.926416564+01:00","closed_at":"2026-01-17T09:49:26.658187402+01:00"}
|
|
||||||
{"id":"nixpkgs-8ng","title":"fix: Add nix-update arguments for opencode subpackage","description":"The Gitea workflow does not work correctly on the opencode package because opencode uses a subpackage. To fix this, nix-update needs to be run with additional arguments to adjust the output hash of the subpackage.\n\n**Solution:**\nRun nix-update with the following arguments:\n$ nix-instantiate --eval --json --strict /nix/store/ybiynv89drnshjdlb089r3i687c5k878-nix-update-1.14.0/lib/python3.13/site-packages/nix_update/eval.nix --argstr importPath /home/m3tam3re/p/NIX/nixpkgs --argstr attribute '[\"opencode\"]' --arg isFlake true --arg sanitizePositions true\nfetch https://github.com/anomalyco/opencode/releases.atom\nNot updating version, already 1.1.25\nUpdating subpackage node_modules\n$ nix-instantiate --eval --json --strict /nix/store/ybiynv89drnshjdlb089r3i687c5k878-nix-update-1.14.0/lib/python3.13/site-packages/nix_update/eval.nix --argstr importPath /home/m3tam3re/p/NIX/nixpkgs --argstr attribute '[\"opencode\", \"node_modules\"]' --arg isFlake true --arg sanitizePositions true\n$ nix-build --expr 'let src = (let flake = builtins.getFlake \"/home/m3tam3re/p/NIX/nixpkgs\"; in flake.packages.${builtins.currentSystem}.\"opencode\".\"node_modules\" or flake.\"opencode\".\"node_modules\").src; in (src.overrideAttrs or (f: src // f src)) (_: { outputHash = \"\"; outputHashAlgo = \"sha256\"; })' --extra-experimental-features 'flakes nix-command'\n$ nix-build --expr 'let src = (let flake = builtins.getFlake \"/home/m3tam3re/p/NIX/nixpkgs\"; in flake.packages.${builtins.currentSystem}.\"opencode\".\"node_modules\" or flake.\"opencode\".\"node_modules\"); in (src.overrideAttrs or (f: src // f src)) (_: { outputHash = \"\"; outputHashAlgo = \"sha256\"; })' --extra-experimental-features 'flakes nix-command'\nPackage maintainers:\n - Thierry Delafontaine (@delafthi)\n$ git -C /home/m3tam3re/p/NIX/nixpkgs diff -- /home/m3tam3re/p/NIX/nixpkgs/pkgs/opencode\n\nThe workflow file needs to be updated to pass these arguments when updating the opencode package.","status":"closed","priority":2,"issue_type":"bug","owner":"p@m3ta.dev","created_at":"2026-01-17T09:47:55.750805329+01:00","created_by":"m3tm3re","updated_at":"2026-01-18T10:38:06.536530593+01:00","closed_at":"2026-01-18T10:38:06.536530593+01:00","close_reason":"Closed"}
|
|
||||||
{"id":"nixpkgs-98j","title":"beads overlay -\u003e pkgs","description":"Create a full package definition in pkgs/beads/default.nix that mirrors nixpkgs-unstable's beads package but with version 0.47.1 and updated hashes from overlays/mods/beads.nix. Register the new package in pkgs/default.nix. The overlay overrides: src (steveyegge/beads@v0.47.1), vendorHash, and disables tests (doCheck = false). Reference nixpkgs-unstable for the base package structure, then apply the version/hash modifications.","status":"closed","priority":2,"issue_type":"chore","owner":"p@m3ta.dev","created_at":"2026-01-13T19:43:35.645275221+01:00","created_by":"m3tm3re","updated_at":"2026-01-13T20:25:53.715613545+01:00","closed_at":"2026-01-13T20:25:53.715613545+01:00","close_reason":"Packages created successfully: pkgs/n8n/default.nix, pkgs/beads/default.nix, pkgs/opencode/default.nix. All packages build successfully."}
|
|
||||||
{"id":"nixpkgs-bqc","title":"opencode overlay -\u003e pkgs","description":"Create a full package definition in pkgs/opencode/default.nix that mirrors nixpkgs-unstable's opencode package but with version 1.1.18 and updated hashes from overlays/mods/opencode.nix. Register the new package in pkgs/default.nix. The overlay overrides: src (anomalyco/opencode@v1.1.18) and node_modules hash. Reference nixpkgs-unstable for the base package structure, then apply the version/hash modifications.","status":"closed","priority":2,"issue_type":"chore","owner":"p@m3ta.dev","created_at":"2026-01-13T19:43:36.450930004+01:00","created_by":"m3tm3re","updated_at":"2026-01-13T20:25:53.717928297+01:00","closed_at":"2026-01-13T20:25:53.717928297+01:00","close_reason":"Packages created successfully: pkgs/n8n/default.nix, pkgs/beads/default.nix, pkgs/opencode/default.nix. All packages build successfully."}
|
|
||||||
{"id":"nixpkgs-e2u","title":"Change projectDirs from list to attrset with path and args","description":"Change projectDirs option type from 'types.listOf types.str' to an attrset like:\n\nprojectDirs = {\n nixpkgs = { path = \"~/p/NIX/nixpkgs\"; args = \"--agent Planner-Sisyphus\"; };\n myproject = { path = \"~/dev/myproject\"; }; # args optional\n};\n\nMust maintain backward compatibility consideration.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-05T12:45:48.6992807+01:00","created_by":"m3tam3re","updated_at":"2026-01-05T12:48:12.178120719+01:00","closed_at":"2026-01-05T12:48:12.178120719+01:00","close_reason":"Changed projectDirs from listOf str to attrsOf submodule with path+args","dependencies":[{"issue_id":"nixpkgs-e2u","depends_on_id":"nixpkgs-w3u","type":"parent-child","created_at":"2026-01-05T12:46:00.515400521+01:00","created_by":"m3tam3re"}]}
|
|
||||||
{"id":"nixpkgs-fka","title":"Ensure docs are staged and committed","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-10T18:48:18.05472995+01:00","created_by":"m3tam3re","updated_at":"2026-01-10T19:12:26.306880401+01:00","closed_at":"2026-01-10T19:12:26.306880401+01:00","close_reason":"Documentation staged and ready for commit"}
|
|
||||||
{"id":"nixpkgs-hrh","title":"projectDirs on rofi-project-switcher should be exported to users home-manager environment","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-05T11:46:43.640224459+01:00","created_by":"m3tam3re","updated_at":"2026-01-05T12:49:43.584087541+01:00","closed_at":"2026-01-05T12:49:43.584087541+01:00","close_reason":"Feature complete: config exported as ROFI_PROJECT_OPENER_CONFIG env var","dependencies":[{"issue_id":"nixpkgs-hrh","depends_on_id":"nixpkgs-w3u","type":"blocks","created_at":"2026-01-05T12:46:05.867959608+01:00","created_by":"m3tam3re"}]}
|
|
||||||
{"id":"nixpkgs-p79","title":"feat: Add auto-language detection support to stt-ptt package","description":"## Current State\n- **Package**: `/home/m3tam3re/p/NIX/nixpkgs/pkgs/stt-ptt/default.nix`\n- **Module**: `/home/m3tam3re/p/NIX/nixpkgs/modules/home-manager/cli/stt-ptt.nix`\n- **Current whisper-cli call** (line 55): `\"$WHISPER\" -m \"$STT_MODEL\" -f \"$AUDIO\" -np -nt 2\u003e/dev/null`\n- **Missing**: Language configuration option and auto-detection\n\n## Required Changes\n\n### 1. Update Package (`pkgs/stt-ptt/default.nix`)\nAdd support for language configuration:\n- Add `STT_LANGUAGE` environment variable (default: \"auto\" for auto-detection)\n- Modify whisper-cli call to use `-l \"$STT_LANGUAGE\"` flag\n- Support the special value \"auto\" for automatic language detection\n- Update help text to document the new environment variable\n\n### 2. Update Home Manager Module (`modules/home-manager/cli/stt-ptt.nix`)\nAdd new `language` option:\n- Add `language` option with type `types.enum [\"auto\" \"en\" \"es\" \"fr\" \"de\" \"it\" \"pt\" \"ru\" \"zh\" \"ja\" \"ko\" ...]`\n- Default should be \"auto\" (auto-detect)\n- Set `STT_LANGUAGE` environment variable in `home.sessionVariables`\n- Add documentation describing available languages and auto-detection behavior\n- Consider using `types.nullOr(types.str)` with \"auto\" as default for more flexibility\n\n### 3. Technical Details\nFrom whisper.cpp CLI documentation:\n- `-l LANG, --language LANG [en] spoken language ('auto' for auto-detect)`\n- Auto-detection analyzes audio to determine spoken language automatically\n- Specifying a language can improve accuracy if you know the language\n- Language codes follow ISO 639-1 standard (2-letter codes)\n\n## Implementation Plan\n\n### Package Changes:\n```nix\n# Add to environment variables section:\nSTT_LANGUAGE=\"${STT_LANGUAGE:-auto}\"\n\n# Modify whisper call:\n\"$WHISPER\" -m \"$STT_MODEL\" -f \"$AUDIO\" -l \"$STT_LANGUAGE\" -np -nt 2\u003e/dev/null\n\n# Update help text:\necho \" STT_LANGUAGE - Language code or 'auto' for auto-detection (default: auto)\"\n```\n\n### Module Changes:\n```nix\nlanguage = mkOption {\n type = types.enum [\"auto\" \"en\" \"es\" \"fr\" \"de\" \"it\" \"pt\" \"ru\" \"zh\" \"ja\" \"ko\"];\n default = \"auto\";\n description = ''\n Language for speech recognition. Use \"auto\" for automatic language detection,\n or specify a language code (e.g., \"en\", \"es\", \"fr\") for better accuracy.\n Auto-detection analyzes the audio to determine the spoken language.\n '';\n};\n\nhome.sessionVariables = {\n STT_LANGUAGE = cfg.language;\n # ... existing variables\n};\n```\n\n## Benefits\n- **Multilingual support**: Users can speak in any language\n- **Convenience**: Auto-detection eliminates need to specify language\n- **Accuracy**: Explicit language selection improves transcription accuracy\n- **Backward compatible**: Default behavior (auto) matches current functionality\n\n## Testing Considerations\n1. Test auto-detection with multiple languages\n2. Test explicit language selection\n3. Test fallback behavior when auto-detection fails\n4. Test with different Whisper models\n\n## Related\n- whisper.cpp supports 100+ languages\n- Language codes follow ISO 639-1 standard\n- Auto-detection adds slight processing overhead","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-10T08:40:51.478869019+01:00","created_by":"m3tam3re","updated_at":"2026-01-10T09:35:49.421572334+01:00","closed_at":"2026-01-10T09:35:49.421572334+01:00","close_reason":"Implemented auto-language detection support: Added STT_LANGUAGE environment variable to package, modified whisper-cli call to use -l flag, updated help text, and added language option to HM module with enum support for 23 common languages plus 'auto'."}
|
|
||||||
{"id":"nixpkgs-r3u","title":"Add a Gitea action for nix-update to automatically update packages","description":"Create a Gitea action that runs nix-update to automatically update packages in this repository. My Gitea instance runs on NixOS (hostname: m3-atlas). Check the Gitea configuration in /home/m3tam3re/p/NIX/nixos-config for reference on how to set up actions. The action should target the packages directory and create PRs with updates when nix-update finds newer versions.","status":"closed","priority":2,"issue_type":"task","owner":"p@m3ta.dev","created_at":"2026-01-13T19:50:22.953433727+01:00","created_by":"m3tm3re","updated_at":"2026-01-18T18:36:50.936219311+01:00","closed_at":"2026-01-17T09:49:05.573319795+01:00","dependencies":[{"issue_id":"nixpkgs-r3u","depends_on_id":"nixpkgs-69z","type":"discovered-from","created_at":"2026-01-13T19:52:40.98774707+01:00","created_by":"m3tm3re"},{"issue_id":"nixpkgs-r3u","depends_on_id":"nixpkgs-98j","type":"discovered-from","created_at":"2026-01-13T19:52:41.501620297+01:00","created_by":"m3tm3re"},{"issue_id":"nixpkgs-r3u","depends_on_id":"nixpkgs-bqc","type":"discovered-from","created_at":"2026-01-13T19:52:42.010721971+01:00","created_by":"m3tm3re"}]}
|
|
||||||
{"id":"nixpkgs-sys","title":"Update config file format to include args per project","description":"Update the config file at ~/.config/rofi-project-opener/config to support per-project args. Change from PROJECT_DIRS to a format that encodes both path and args, e.g. JSON or structured text.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-05T12:45:51.793810575+01:00","created_by":"m3tam3re","updated_at":"2026-01-05T12:48:21.75755315+01:00","closed_at":"2026-01-05T12:48:21.75755315+01:00","close_reason":"Config file now writes JSON (projects.json) with per-project path and args","dependencies":[{"issue_id":"nixpkgs-sys","depends_on_id":"nixpkgs-w3u","type":"parent-child","created_at":"2026-01-05T12:46:01.400263722+01:00","created_by":"m3tam3re"},{"issue_id":"nixpkgs-sys","depends_on_id":"nixpkgs-e2u","type":"blocks","created_at":"2026-01-05T12:46:04.055948778+01:00","created_by":"m3tam3re"}]}
|
|
||||||
{"id":"nixpkgs-tsh","title":"Prevent verification of ignored packages in nix-update workflow","status":"closed","priority":2,"issue_type":"task","owner":"p@m3ta.dev","created_at":"2026-01-18T10:36:45.393068138+01:00","created_by":"m3tm3re","updated_at":"2026-01-18T10:37:31.686158451+01:00","closed_at":"2026-01-18T10:37:31.686158451+01:00","close_reason":"Fixed by changing return 0 to return 1 for ignored packages"}
|
|
||||||
{"id":"nixpkgs-w3u","title":"projectDirs should support args, for example --agent \u003cagentname\u003e","description":"This means project directories need to be an attribute set and we also need to change the launch command to \"opencode \u003cdirectory name\u003e \u003carguments\u003e\".\n","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-05T11:56:13.844735432+01:00","created_by":"m3tam3re","updated_at":"2026-01-05T12:49:42.34144046+01:00","closed_at":"2026-01-05T12:49:42.34144046+01:00","close_reason":"Feature complete: projectDirs now supports args per directory"}
|
|
||||||
{"id":"nixpkgs-xi7","title":"There is a bug in the basecamp-mcp server","description":"OSError: [Errno 30] Read-only file system when trying to write log file.\n\nTraceback:\nFile: /nix/store/708ksr7z3484bj8faysd7djwpa8xvw12-basecamp-mcp-server-0.0.1-unstable/lib/basecamp-mcp-server/basecamp_fastmcp.py, line 35\nError: logging.FileHandler(LOG_FILE_PATH) - attempting to write to read-only Nix store location: /nix/store/708ksr7z3484bj8faysd7djwpa8xvw12-basecamp-mcp-server-0.0.1-unstable/lib/basecamp-mcp-server/basecamp_fastmcp.log\n\nThe package needs to use a writable directory (e.g., XDG_DATA_HOME or /tmp) for log files instead of the Nix store.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-12T18:16:37.597147907+01:00","created_by":"m3tam3re","updated_at":"2026-01-12T19:12:57.91076765+01:00","closed_at":"2026-01-12T19:12:57.91076765+01:00","close_reason":"Closed"}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"database": "beads.db",
|
|
||||||
"jsonl_export": "issues.jsonl"
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
{"id":"nixpkgs-1xm","title":"Package Basecamp MCP Server","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T05:01:20.465656454+01:00","created_by":"m3tam3re","updated_at":"2026-01-12T05:01:26.623404603+01:00","closed_at":"2026-01-12T05:01:26.623404603+01:00","close_reason":"Packaged successfully with env file support"}
|
|
||||||
{"id":"nixpkgs-3k8","title":"Export project config as environment variable","description":"Export project configuration as home.sessionVariables (similar to zellij-ps pattern). Use JSON format for the env var since projects now have structured data (path + args).","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T12:45:50.803017318+01:00","created_by":"m3tam3re","updated_at":"2026-01-05T12:48:22.968626155+01:00","closed_at":"2026-01-05T12:48:22.968626155+01:00","close_reason":"Added home.sessionVariables.ROFI_PROJECT_OPENER_CONFIG with JSON config","dependencies":[{"issue_id":"nixpkgs-3k8","depends_on_id":"nixpkgs-hrh","type":"parent-child","created_at":"2026-01-05T12:46:03.16885012+01:00","created_by":"m3tam3re"}]}
|
|
||||||
{"id":"nixpkgs-3w3","title":"Add authentication command and environment file generation to basecamp-mcp-server","description":"The basecamp-mcp-server package at pkgs/basecamp-mcp-server/default.nix wraps the FastMCP server for Basecamp 3 integration. Currently, there's no convenient way for users to:\n\n1. Set up OAuth 2.0 authentication interactively\n2. Generate a sample environment file with required credentials\n3. Guide users through the Basecamp OAuth flow\n\n## Current State\n\nThe package wraps but users must:\n- Manually clone the upstream repository\n- Run to generate template\n- Edit with OAuth credentials from https://launchpad.37signals.com/integrations\n- Run to complete OAuth flow\n- Handle token storage manually\n\n## Required Environment Variables\n\n### OAuth Configuration (Primary)\n- - OAuth client ID from Basecamp\n- - OAuth client secret\n- - Found in Basecamp URL: https://3.basecamp.com/ID/...\n- - Format: \"App Name (email@domain.com)\"\n- - http://localhost:8000/auth/callback\n- - For Flask session security\n\n### Basic Auth (Legacy)\n- - Email for direct API access\n- - Password for direct API access\n\n## Proposed Solution\n\nAdd a Nix package wrapper command () that:\n\n1. **Interactive Setup Wizard**\n - Guides users through OAuth app creation at launchpad.37signals.com\n - Prompts for credentials (with secure input for secrets)\n - Validates inputs before proceeding\n\n2. **Environment File Generation**\n - Creates or project-local \n - Includes all required variables with clear documentation\n - Sets secure permissions (600)\n - Provides example values\n\n3. **OAuth Flow Handler**\n - Starts local Flask server on port 8000\n - Opens browser to initiate OAuth flow\n - Handles callback and token exchange\n - Stores tokens securely in \n - Shows success/failure status\n\n4. **Documentation**\n - Inline help for all steps\n - Links to Basecamp integration setup\n - Account ID discovery instructions\n\n## References\n\n- Upstream repo: https://github.com/georgeantonopoulos/Basecamp-MCP-Server\n- Key files: , , , \n- OAuth endpoints: launchpad.37signals.com/authorization/new\n\n## Subtasks\n\n- [ ] Create auth command wrapper (basecamp-mcp-auth)\n- [ ] Implement interactive OAuth wizard\n- [ ] Generate sample environment file template\n- [ ] Add token storage handling\n- [ ] Update package documentation\n- [ ] Add Home Manager module support (optional)","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-12T18:25:50.929926505+01:00","created_by":"m3tam3re","updated_at":"2026-01-12T19:12:57.941267399+01:00","closed_at":"2026-01-12T19:12:57.941267399+01:00","close_reason":"Closed"}
|
|
||||||
{"id":"nixpkgs-5ml","title":"Update rofi-project-opener script to pass args to opencode","description":"Modify pkgs/rofi-project-opener script to read the new config format and launch opencode with: 'opencode <directory> <arguments>' instead of just 'opencode' in the directory.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-05T12:45:49.748958951+01:00","created_by":"m3tam3re","updated_at":"2026-01-05T12:49:40.800083615+01:00","closed_at":"2026-01-05T12:49:40.800083615+01:00","close_reason":"Script updated to read JSON config and pass args to opencode","dependencies":[{"issue_id":"nixpkgs-5ml","depends_on_id":"nixpkgs-w3u","type":"parent-child","created_at":"2026-01-05T12:46:02.338350208+01:00","created_by":"m3tam3re"},{"issue_id":"nixpkgs-5ml","depends_on_id":"nixpkgs-sys","type":"blocks","created_at":"2026-01-05T12:46:04.966269033+01:00","created_by":"m3tam3re"}]}
|
|
||||||
{"id":"nixpkgs-61l","title":"Update documentation to reflect latest changes","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-10T18:48:19.599467206+01:00","created_by":"m3tam3re","updated_at":"2026-01-10T19:12:26.294895563+01:00","closed_at":"2026-01-10T19:12:26.294895563+01:00","close_reason":"Documentation updated: Added stt-ptt language support docs, rofi-project-opener module docs, and updated zellij-ps docs"}
|
|
||||||
{"id":"nixpkgs-69z","title":"n8n overlay -> pkgs","description":"Create a full package definition in pkgs/n8n/default.nix that mirrors nixpkgs-unstable's n8n package but with version 2.4.1 and updated hashes from overlays/mods/n8n.nix. Register the new package in pkgs/default.nix. The overlay overrides: src (n8n-io/n8n@2.4.1) and pnpmDeps hash. Reference nixpkgs-unstable for the base package structure, then apply the version/hash modifications.","status":"closed","priority":2,"issue_type":"chore","owner":"p@m3ta.dev","created_at":"2026-01-13T19:42:35.643928163+01:00","created_by":"m3tm3re","updated_at":"2026-01-13T20:25:53.712987689+01:00","closed_at":"2026-01-13T20:25:53.712987689+01:00","close_reason":"Packages created successfully: pkgs/n8n/default.nix, pkgs/beads/default.nix, pkgs/opencode/default.nix. All packages build successfully."}
|
|
||||||
{"id":"nixpkgs-7ez","title":"Add authentication command for basecamp-mcp-server","description":"Add a command for the basecamp-mcp-server that will guide the user through the authentication flow and create a sample environment file with the necessary values. This involves researching the original basecamp-mcp-server repository for authentication details and implementing a user-friendly authentication workflow.","status":"tombstone","priority":0,"issue_type":"feature","created_at":"2026-01-12T18:20:55.665717166+01:00","created_by":"m3tam3re","updated_at":"2026-01-13T19:46:32.112562429+01:00","dependencies":[{"issue_id":"nixpkgs-7ez","depends_on_id":"nixpkgs-3w3","type":"blocks","created_at":"2026-01-12T18:48:31.806330931+01:00","created_by":"m3tam3re"}],"deleted_at":"2026-01-13T19:46:32.112562429+01:00","deleted_by":"daemon","delete_reason":"delete","original_type":"feature"}
|
|
||||||
{"id":"nixpkgs-8jw","title":"fix: self-hosted nixos runner missing node in PATH for Gitea Actions","description":"The nix-update workflow fails on self-hosted nixos runner because node is not available in PATH. Error: Cannot find: node in PATH. Root cause: actions/checkout@v4 requires Node.js to execute post-checkout steps. The self-hosted nixos runner does not have node installed or not in PATH. Possible solutions: 1) Add Node.js to the nixos runner environment, 2) Use container-based runner instead of bare nixos, 3) Use a different checkout action that does not require node, 4) Configure PATH to include node installation. Impact: Automated package updates are completely blocked.","status":"open","priority":1,"issue_type":"bug","owner":"p@m3ta.dev","created_at":"2026-01-14T20:50:59.153145341+01:00","created_by":"m3tm3re","updated_at":"2026-01-14T20:51:34.044954071+01:00"}
|
|
||||||
{"id":"nixpkgs-98j","title":"beads overlay -> pkgs","description":"Create a full package definition in pkgs/beads/default.nix that mirrors nixpkgs-unstable's beads package but with version 0.47.1 and updated hashes from overlays/mods/beads.nix. Register the new package in pkgs/default.nix. The overlay overrides: src (steveyegge/beads@v0.47.1), vendorHash, and disables tests (doCheck = false). Reference nixpkgs-unstable for the base package structure, then apply the version/hash modifications.","status":"closed","priority":2,"issue_type":"chore","owner":"p@m3ta.dev","created_at":"2026-01-13T19:43:35.645275221+01:00","created_by":"m3tm3re","updated_at":"2026-01-13T20:25:53.715613545+01:00","closed_at":"2026-01-13T20:25:53.715613545+01:00","close_reason":"Packages created successfully: pkgs/n8n/default.nix, pkgs/beads/default.nix, pkgs/opencode/default.nix. All packages build successfully."}
|
|
||||||
{"id":"nixpkgs-bqc","title":"opencode overlay -> pkgs","description":"Create a full package definition in pkgs/opencode/default.nix that mirrors nixpkgs-unstable's opencode package but with version 1.1.18 and updated hashes from overlays/mods/opencode.nix. Register the new package in pkgs/default.nix. The overlay overrides: src (anomalyco/opencode@v1.1.18) and node_modules hash. Reference nixpkgs-unstable for the base package structure, then apply the version/hash modifications.","status":"closed","priority":2,"issue_type":"chore","owner":"p@m3ta.dev","created_at":"2026-01-13T19:43:36.450930004+01:00","created_by":"m3tm3re","updated_at":"2026-01-13T20:25:53.717928297+01:00","closed_at":"2026-01-13T20:25:53.717928297+01:00","close_reason":"Packages created successfully: pkgs/n8n/default.nix, pkgs/beads/default.nix, pkgs/opencode/default.nix. All packages build successfully."}
|
|
||||||
{"id":"nixpkgs-e2u","title":"Change projectDirs from list to attrset with path and args","description":"Change projectDirs option type from 'types.listOf types.str' to an attrset like:\n\nprojectDirs = {\n nixpkgs = { path = \"~/p/NIX/nixpkgs\"; args = \"--agent Planner-Sisyphus\"; };\n myproject = { path = \"~/dev/myproject\"; }; # args optional\n};\n\nMust maintain backward compatibility consideration.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-05T12:45:48.6992807+01:00","created_by":"m3tam3re","updated_at":"2026-01-05T12:48:12.178120719+01:00","closed_at":"2026-01-05T12:48:12.178120719+01:00","close_reason":"Changed projectDirs from listOf str to attrsOf submodule with path+args","dependencies":[{"issue_id":"nixpkgs-e2u","depends_on_id":"nixpkgs-w3u","type":"parent-child","created_at":"2026-01-05T12:46:00.515400521+01:00","created_by":"m3tam3re"}]}
|
|
||||||
{"id":"nixpkgs-fka","title":"Ensure docs are staged and committed","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-10T18:48:18.05472995+01:00","created_by":"m3tam3re","updated_at":"2026-01-10T19:12:26.306880401+01:00","closed_at":"2026-01-10T19:12:26.306880401+01:00","close_reason":"Documentation staged and ready for commit"}
|
|
||||||
{"id":"nixpkgs-hrh","title":"projectDirs on rofi-project-switcher should be exported to users home-manager environment","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-05T11:46:43.640224459+01:00","created_by":"m3tam3re","updated_at":"2026-01-05T12:49:43.584087541+01:00","closed_at":"2026-01-05T12:49:43.584087541+01:00","close_reason":"Feature complete: config exported as ROFI_PROJECT_OPENER_CONFIG env var","dependencies":[{"issue_id":"nixpkgs-hrh","depends_on_id":"nixpkgs-w3u","type":"blocks","created_at":"2026-01-05T12:46:05.867959608+01:00","created_by":"m3tam3re"}]}
|
|
||||||
{"id":"nixpkgs-p79","title":"feat: Add auto-language detection support to stt-ptt package","description":"## Current State\n- **Package**: `/home/m3tam3re/p/NIX/nixpkgs/pkgs/stt-ptt/default.nix`\n- **Module**: `/home/m3tam3re/p/NIX/nixpkgs/modules/home-manager/cli/stt-ptt.nix`\n- **Current whisper-cli call** (line 55): `\"$WHISPER\" -m \"$STT_MODEL\" -f \"$AUDIO\" -np -nt 2>/dev/null`\n- **Missing**: Language configuration option and auto-detection\n\n## Required Changes\n\n### 1. Update Package (`pkgs/stt-ptt/default.nix`)\nAdd support for language configuration:\n- Add `STT_LANGUAGE` environment variable (default: \"auto\" for auto-detection)\n- Modify whisper-cli call to use `-l \"$STT_LANGUAGE\"` flag\n- Support the special value \"auto\" for automatic language detection\n- Update help text to document the new environment variable\n\n### 2. Update Home Manager Module (`modules/home-manager/cli/stt-ptt.nix`)\nAdd new `language` option:\n- Add `language` option with type `types.enum [\"auto\" \"en\" \"es\" \"fr\" \"de\" \"it\" \"pt\" \"ru\" \"zh\" \"ja\" \"ko\" ...]`\n- Default should be \"auto\" (auto-detect)\n- Set `STT_LANGUAGE` environment variable in `home.sessionVariables`\n- Add documentation describing available languages and auto-detection behavior\n- Consider using `types.nullOr(types.str)` with \"auto\" as default for more flexibility\n\n### 3. Technical Details\nFrom whisper.cpp CLI documentation:\n- `-l LANG, --language LANG [en] spoken language ('auto' for auto-detect)`\n- Auto-detection analyzes audio to determine spoken language automatically\n- Specifying a language can improve accuracy if you know the language\n- Language codes follow ISO 639-1 standard (2-letter codes)\n\n## Implementation Plan\n\n### Package Changes:\n```nix\n# Add to environment variables section:\nSTT_LANGUAGE=\"${STT_LANGUAGE:-auto}\"\n\n# Modify whisper call:\n\"$WHISPER\" -m \"$STT_MODEL\" -f \"$AUDIO\" -l \"$STT_LANGUAGE\" -np -nt 2>/dev/null\n\n# Update help text:\necho \" STT_LANGUAGE - Language code or 'auto' for auto-detection (default: auto)\"\n```\n\n### Module Changes:\n```nix\nlanguage = mkOption {\n type = types.enum [\"auto\" \"en\" \"es\" \"fr\" \"de\" \"it\" \"pt\" \"ru\" \"zh\" \"ja\" \"ko\"];\n default = \"auto\";\n description = ''\n Language for speech recognition. Use \"auto\" for automatic language detection,\n or specify a language code (e.g., \"en\", \"es\", \"fr\") for better accuracy.\n Auto-detection analyzes the audio to determine the spoken language.\n '';\n};\n\nhome.sessionVariables = {\n STT_LANGUAGE = cfg.language;\n # ... existing variables\n};\n```\n\n## Benefits\n- **Multilingual support**: Users can speak in any language\n- **Convenience**: Auto-detection eliminates need to specify language\n- **Accuracy**: Explicit language selection improves transcription accuracy\n- **Backward compatible**: Default behavior (auto) matches current functionality\n\n## Testing Considerations\n1. Test auto-detection with multiple languages\n2. Test explicit language selection\n3. Test fallback behavior when auto-detection fails\n4. Test with different Whisper models\n\n## Related\n- whisper.cpp supports 100+ languages\n- Language codes follow ISO 639-1 standard\n- Auto-detection adds slight processing overhead","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-10T08:40:51.478869019+01:00","created_by":"m3tam3re","updated_at":"2026-01-10T09:35:49.421572334+01:00","closed_at":"2026-01-10T09:35:49.421572334+01:00","close_reason":"Implemented auto-language detection support: Added STT_LANGUAGE environment variable to package, modified whisper-cli call to use -l flag, updated help text, and added language option to HM module with enum support for 23 common languages plus 'auto'."}
|
|
||||||
{"id":"nixpkgs-r3u","title":"Add a Gitea action for nix-update to automatically update packages","description":"Create a Gitea action that runs nix-update to automatically update packages in this repository. My Gitea instance runs on NixOS (hostname: m3-atlas). Check the Gitea configuration in /home/m3tam3re/p/NIX/nixos-config for reference on how to set up actions. The action should target the packages directory and create PRs with updates when nix-update finds newer versions.","status":"open","priority":2,"issue_type":"task","owner":"p@m3ta.dev","created_at":"2026-01-13T19:50:22.953433727+01:00","created_by":"m3tm3re","updated_at":"2026-01-13T19:52:40.071361668+01:00","dependencies":[{"issue_id":"nixpkgs-r3u","depends_on_id":"nixpkgs-69z","type":"discovered-from","created_at":"2026-01-13T19:52:40.98774707+01:00","created_by":"m3tm3re"},{"issue_id":"nixpkgs-r3u","depends_on_id":"nixpkgs-98j","type":"discovered-from","created_at":"2026-01-13T19:52:41.501620297+01:00","created_by":"m3tm3re"},{"issue_id":"nixpkgs-r3u","depends_on_id":"nixpkgs-bqc","type":"discovered-from","created_at":"2026-01-13T19:52:42.010721971+01:00","created_by":"m3tm3re"}]}
|
|
||||||
{"id":"nixpkgs-sys","title":"Update config file format to include args per project","description":"Update the config file at ~/.config/rofi-project-opener/config to support per-project args. Change from PROJECT_DIRS to a format that encodes both path and args, e.g. JSON or structured text.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-05T12:45:51.793810575+01:00","created_by":"m3tam3re","updated_at":"2026-01-05T12:48:21.75755315+01:00","closed_at":"2026-01-05T12:48:21.75755315+01:00","close_reason":"Config file now writes JSON (projects.json) with per-project path and args","dependencies":[{"issue_id":"nixpkgs-sys","depends_on_id":"nixpkgs-w3u","type":"parent-child","created_at":"2026-01-05T12:46:01.400263722+01:00","created_by":"m3tam3re"},{"issue_id":"nixpkgs-sys","depends_on_id":"nixpkgs-e2u","type":"blocks","created_at":"2026-01-05T12:46:04.055948778+01:00","created_by":"m3tam3re"}]}
|
|
||||||
{"id":"nixpkgs-w3u","title":"projectDirs should support args, for example --agent <agentname>","description":"This means project directories need to be an attribute set and we also need to change the launch command to \"opencode <directory name> <arguments>\".\n","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-05T11:56:13.844735432+01:00","created_by":"m3tam3re","updated_at":"2026-01-05T12:49:42.34144046+01:00","closed_at":"2026-01-05T12:49:42.34144046+01:00","close_reason":"Feature complete: projectDirs now supports args per directory"}
|
|
||||||
{"id":"nixpkgs-xi7","title":"There is a bug in the basecamp-mcp server","description":"OSError: [Errno 30] Read-only file system when trying to write log file.\n\nTraceback:\nFile: /nix/store/708ksr7z3484bj8faysd7djwpa8xvw12-basecamp-mcp-server-0.0.1-unstable/lib/basecamp-mcp-server/basecamp_fastmcp.py, line 35\nError: logging.FileHandler(LOG_FILE_PATH) - attempting to write to read-only Nix store location: /nix/store/708ksr7z3484bj8faysd7djwpa8xvw12-basecamp-mcp-server-0.0.1-unstable/lib/basecamp-mcp-server/basecamp_fastmcp.log\n\nThe package needs to use a writable directory (e.g., XDG_DATA_HOME or /tmp) for log files instead of the Nix store.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-12T18:16:37.597147907+01:00","created_by":"m3tam3re","updated_at":"2026-01-12T19:12:57.91076765+01:00","closed_at":"2026-01-12T19:12:57.91076765+01:00","close_reason":"Closed"}
|
|
||||||
@@ -52,72 +52,91 @@ jobs:
|
|||||||
"https://m3tam3re@code.m3ta.dev/m3tam3re/nixpkgs.git" \
|
"https://m3tam3re@code.m3ta.dev/m3tam3re/nixpkgs.git" \
|
||||||
"$REPO_DIR"
|
"$REPO_DIR"
|
||||||
|
|
||||||
- name: Update opencode Flake Input
|
- name: Update All Flake Inputs
|
||||||
id: update-opencode
|
id: update-flake-inputs
|
||||||
run: |
|
run: |
|
||||||
cd "$REPO_DIR"
|
cd "$REPO_DIR"
|
||||||
|
|
||||||
echo "::group::Checking for opencode updates"
|
echo "::group::Discovering version-pinned flake inputs"
|
||||||
|
|
||||||
# Get latest release from GitHub API (strip v prefix for comparison)
|
# Get GitHub inputs with version refs (e.g., v1.2.9)
|
||||||
LATEST_RELEASE=$(curl -s "https://api.github.com/repos/anomalyco/opencode/releases/latest" | jq -r '.tag_name' | sed 's/^v//')
|
VERSIONED_INPUTS=$(nix flake metadata --json | jq -r '
|
||||||
|
.locks.nodes | to_entries[] |
|
||||||
|
select(.value.original.type == "github") |
|
||||||
|
select(.value.original.ref != null) |
|
||||||
|
select(.value.original.ref | test("^v?[0-9]+\\.[0-9]+")) |
|
||||||
|
"\(.key) \(.value.original.owner) \(.value.original.repo) \(.value.original.ref)"
|
||||||
|
')
|
||||||
|
|
||||||
# Extract current version from flake.nix
|
echo "Discovered version-pinned inputs:"
|
||||||
CURRENT_VERSION=$(grep -oP 'opencode\.url = "github:anomalyco/opencode/v\K[^"]+' flake.nix)
|
echo "$VERSIONED_INPUTS"
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
echo "Current opencode version: $CURRENT_VERSION"
|
UPDATED_INPUTS=""
|
||||||
echo "Latest opencode version: $LATEST_RELEASE"
|
FAILED_INPUTS=""
|
||||||
|
|
||||||
# Check if update is needed
|
# Update each version-pinned input
|
||||||
if [ "$LATEST_RELEASE" != "$CURRENT_VERSION" ]; then
|
while read -r INPUT_NAME OWNER REPO CURRENT_REF; do
|
||||||
echo "🔄 Updating opencode from $CURRENT_VERSION to $LATEST_RELEASE"
|
[ -z "$INPUT_NAME" ] && continue
|
||||||
|
|
||||||
# Update flake.nix with new version
|
echo "::group::Checking $INPUT_NAME ($OWNER/$REPO)"
|
||||||
sed -i 's|opencode\.url = "github:anomalyco/opencode/v.*"|opencode.url = "github:anomalyco/opencode/v'"$LATEST_RELEASE"'"|' flake.nix
|
|
||||||
|
|
||||||
# Update flake lock to fetch new revision
|
# Get latest stable release (exclude prereleases)
|
||||||
nix flake update opencode
|
# The /releases/latest endpoint already returns the latest non-prerelease, non-draft release
|
||||||
|
LATEST=$(curl -sf "https://api.github.com/repos/$OWNER/$REPO/releases/latest" | \
|
||||||
|
jq -r 'if .prerelease == false then .tag_name else empty end')
|
||||||
|
|
||||||
# Format with alejandra
|
if [ -z "$LATEST" ]; then
|
||||||
|
echo "⚠️ No stable release found for $INPUT_NAME (repo may only have prereleases)"
|
||||||
|
FAILED_INPUTS="$FAILED_INPUTS $INPUT_NAME(no-stable-release)"
|
||||||
|
echo "::endgroup::"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Current: $CURRENT_REF | Latest: $LATEST"
|
||||||
|
|
||||||
|
if [ "$LATEST" != "$CURRENT_REF" ]; then
|
||||||
|
echo "Updating $INPUT_NAME from $CURRENT_REF to $LATEST"
|
||||||
|
|
||||||
|
# Update flake.nix
|
||||||
|
sed -i "s|github:$OWNER/$REPO/[^\"']*|github:$OWNER/$REPO/$LATEST|g" flake.nix
|
||||||
|
|
||||||
|
# Update flake.lock for this input
|
||||||
|
if nix flake update "$INPUT_NAME" 2>&1 | tee /tmp/input-update.log; then
|
||||||
|
UPDATED_INPUTS="$UPDATED_INPUTS $INPUT_NAME($LATEST)"
|
||||||
|
echo "✅ Updated $INPUT_NAME to $LATEST"
|
||||||
|
else
|
||||||
|
echo "❌ Failed to update $INPUT_NAME"
|
||||||
|
FAILED_INPUTS="$FAILED_INPUTS $INPUT_NAME(update-failed)"
|
||||||
|
git checkout flake.nix flake.lock 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "✓ $INPUT_NAME is already up to date"
|
||||||
|
fi
|
||||||
|
echo "::endgroup::"
|
||||||
|
done <<< "$VERSIONED_INPUTS"
|
||||||
|
|
||||||
|
echo "::group::Updating non-version-pinned inputs"
|
||||||
|
# Update all non-version-pinned inputs (branches, no-ref)
|
||||||
|
nix flake update
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
# Check if we have any changes
|
||||||
|
if [ -n "$(git status --porcelain flake.nix flake.lock)" ]; then
|
||||||
|
echo "::group::Committing flake input updates"
|
||||||
nix fmt flake.nix
|
nix fmt flake.nix
|
||||||
|
|
||||||
# Verify the update
|
|
||||||
echo "::endgroup::"
|
|
||||||
echo "::group::Verifying opencode update"
|
|
||||||
|
|
||||||
# Run flake check
|
|
||||||
if ! nix flake check; then
|
|
||||||
echo "❌ Flake check failed after opencode update"
|
|
||||||
git checkout flake.nix flake.lock
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Build opencode package
|
|
||||||
if ! nix build .#opencode 2>&1 | tee /tmp/opencode-build.log; then
|
|
||||||
echo "❌ Build failed for opencode"
|
|
||||||
git checkout flake.nix flake.lock
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "✅ Flake check passed"
|
|
||||||
echo "✅ Build successful for opencode"
|
|
||||||
echo "::endgroup::"
|
|
||||||
|
|
||||||
# Commit the change
|
|
||||||
echo "::group::Committing opencode update"
|
|
||||||
git add flake.nix flake.lock
|
git add flake.nix flake.lock
|
||||||
git commit -m "chore: update opencode flake input to $LATEST_RELEASE"
|
|
||||||
|
|
||||||
echo "opencode_update=true" >> $GITHUB_OUTPUT
|
COMMIT_MSG="chore: update flake inputs"
|
||||||
echo "opencode_version=${LATEST_RELEASE}" >> $GITHUB_OUTPUT
|
[ -n "$UPDATED_INPUTS" ] && COMMIT_MSG="$COMMIT_MSG - $(echo $UPDATED_INPUTS | tr ' ' ', ')"
|
||||||
|
|
||||||
|
git commit -m "$COMMIT_MSG"
|
||||||
|
echo "flake_inputs_updated=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "updated_inputs=${UPDATED_INPUTS# }" >> $GITHUB_OUTPUT
|
||||||
|
[ -n "$FAILED_INPUTS" ] && echo "failed_inputs=${FAILED_INPUTS# }" >> $GITHUB_OUTPUT
|
||||||
echo "::endgroup::"
|
echo "::endgroup::"
|
||||||
|
|
||||||
echo "✅ Updated opencode to $LATEST_RELEASE"
|
|
||||||
else
|
else
|
||||||
echo "✓ opencode is already up to date"
|
echo "flake_inputs_updated=false" >> $GITHUB_OUTPUT
|
||||||
echo "opencode_update=false" >> $GITHUB_OUTPUT
|
|
||||||
echo "opencode_version=${CURRENT_VERSION}" >> $GITHUB_OUTPUT
|
|
||||||
echo "::endgroup::"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Check Prerequisites
|
- name: Check Prerequisites
|
||||||
@@ -150,21 +169,130 @@ jobs:
|
|||||||
[ "$1" != "$(git rev-parse HEAD)" ] && echo "true" || echo "false"
|
[ "$1" != "$(git rev-parse HEAD)" ] && echo "true" || echo "false"
|
||||||
}
|
}
|
||||||
|
|
||||||
has_update_script() {
|
has_update_script() {
|
||||||
local pkg=$1
|
local pkg=$1
|
||||||
# Check if package has passthru.updateScript attribute
|
# Check if package has passthru.updateScript attribute
|
||||||
nix eval .#${pkg}.passthru.updateScript --json >/dev/null 2>&1
|
nix eval .#${pkg}.passthru.updateScript --json >/dev/null 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
run_update() {
|
# Check if updateScript is a custom script (path-based) vs nix-update-script
|
||||||
|
is_custom_update_script() {
|
||||||
|
local pkg=$1
|
||||||
|
local result
|
||||||
|
# nix-update-script returns a list like [ "/nix/store/...-nix-update/bin/nix-update" ]
|
||||||
|
# Custom scripts return a path like "/nix/store/.../update.sh"
|
||||||
|
result=$(nix eval --impure --raw --expr "
|
||||||
|
let
|
||||||
|
flake = builtins.getFlake (toString ./.);
|
||||||
|
pkg = flake.packages.\${builtins.currentSystem}.${pkg};
|
||||||
|
script = pkg.passthru.updateScript or [];
|
||||||
|
in
|
||||||
|
if builtins.isPath script then
|
||||||
|
\"custom\"
|
||||||
|
else if builtins.isList script && builtins.length script > 0 then
|
||||||
|
let first = builtins.head script;
|
||||||
|
in if builtins.isString first && builtins.match \".*/nix-update$\" first != null then
|
||||||
|
\"nix-update-script\"
|
||||||
|
else if builtins.isPath first then
|
||||||
|
\"custom\"
|
||||||
|
else
|
||||||
|
\"other\"
|
||||||
|
else if builtins.isAttrs script && script ? command then
|
||||||
|
if builtins.isPath script.command then \"custom\"
|
||||||
|
else if builtins.isList script.command && builtins.isPath (builtins.head script.command) then \"custom\"
|
||||||
|
else \"other\"
|
||||||
|
else
|
||||||
|
\"other\"
|
||||||
|
" 2>/dev/null || echo "other")
|
||||||
|
[[ "$result" == "custom" ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run a custom update script directly (for packages like n8n)
|
||||||
|
run_custom_update_script() {
|
||||||
local pkg=$1
|
local pkg=$1
|
||||||
local before_hash=$(git rev-parse HEAD)
|
local before_hash=$(git rev-parse HEAD)
|
||||||
|
|
||||||
echo "::group::Updating $pkg"
|
echo " 🔧 Detected custom update script for $pkg"
|
||||||
|
|
||||||
local args=("--flake" "--commit" "--use-github-releases")
|
# Get package metadata for environment variables
|
||||||
|
local name pname version
|
||||||
|
name=$(nix eval --raw .#${pkg}.name 2>/dev/null || echo "$pkg")
|
||||||
|
pname=$(nix eval --raw .#${pkg}.pname 2>/dev/null || echo "$pkg")
|
||||||
|
version=$(nix eval --raw .#${pkg}.version 2>/dev/null || echo "unknown")
|
||||||
|
|
||||||
args+=("$pkg")
|
# Run the custom script using nix develop
|
||||||
|
if nix develop --impure --expr "
|
||||||
|
with builtins;
|
||||||
|
let
|
||||||
|
flake = getFlake (toString ./.);
|
||||||
|
pkgs = flake.inputs.nixpkgs.legacyPackages.\${currentSystem};
|
||||||
|
pkg' = flake.packages.\${currentSystem}.${pkg};
|
||||||
|
script = pkg'.passthru.updateScript;
|
||||||
|
cmd = if isAttrs script then script.command else script;
|
||||||
|
scriptPath = if isList cmd then head cmd else cmd;
|
||||||
|
in pkgs.mkShell {
|
||||||
|
inputsFrom = [pkg'];
|
||||||
|
packages = with pkgs; [ curl jq git ];
|
||||||
|
}
|
||||||
|
" --command bash -c "
|
||||||
|
export UPDATE_NIX_NAME='${name}'
|
||||||
|
export UPDATE_NIX_PNAME='${pname}'
|
||||||
|
export UPDATE_NIX_OLD_VERSION='${version}'
|
||||||
|
export UPDATE_NIX_ATTR_PATH='${pkg}'
|
||||||
|
|
||||||
|
# Get the script path and execute it
|
||||||
|
script_path=\$(nix eval --impure --raw --expr '
|
||||||
|
let
|
||||||
|
flake = builtins.getFlake (toString ./.);
|
||||||
|
pkg = flake.packages.\${builtins.currentSystem}.${pkg};
|
||||||
|
script = pkg.passthru.updateScript;
|
||||||
|
cmd = if builtins.isAttrs script then script.command else script;
|
||||||
|
in if builtins.isList cmd then toString (builtins.head cmd)
|
||||||
|
else toString cmd
|
||||||
|
' 2>/dev/null)
|
||||||
|
|
||||||
|
if [ -n \"\$script_path\" ]; then
|
||||||
|
echo \"Running: \$script_path\"
|
||||||
|
bash \"\$script_path\"
|
||||||
|
fi
|
||||||
|
" 2>&1 | tee /tmp/update-${pkg}.log; then
|
||||||
|
if [ "$(check_commit "$before_hash")" = "true" ]; then
|
||||||
|
echo "✅ Updated $pkg (via custom script)"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clean up on failure
|
||||||
|
git checkout -- . 2>/dev/null || true
|
||||||
|
git clean -fd 2>/dev/null || true
|
||||||
|
|
||||||
|
if ! grep -q "already up to date\|No new version found" /tmp/update-${pkg}.log; then
|
||||||
|
echo "⚠️ Custom update script failed for $pkg"
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
run_update() {
|
||||||
|
local pkg=$1
|
||||||
|
local before_hash=$(git rev-parse HEAD)
|
||||||
|
|
||||||
|
echo "::group::Updating $pkg"
|
||||||
|
|
||||||
|
# Check if this package has a custom update script
|
||||||
|
if is_custom_update_script "$pkg"; then
|
||||||
|
if run_custom_update_script "$pkg"; then
|
||||||
|
echo "::endgroup::"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "::endgroup::"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Standard nix-update for packages with nix-update-script
|
||||||
|
local args=("--flake" "--commit" "--use-github-releases")
|
||||||
|
|
||||||
|
args+=("$pkg")
|
||||||
|
|
||||||
if nix-update "${args[@]}" 2>&1 | tee /tmp/update-${pkg}.log; then
|
if nix-update "${args[@]}" 2>&1 | tee /tmp/update-${pkg}.log; then
|
||||||
if [ "$(check_commit "$before_hash")" = "true" ]; then
|
if [ "$(check_commit "$before_hash")" = "true" ]; then
|
||||||
@@ -173,6 +301,11 @@ jobs:
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Clean up any uncommitted changes from failed update
|
||||||
|
git checkout -- . 2>/dev/null || true
|
||||||
|
git clean -fd 2>/dev/null || true
|
||||||
|
|
||||||
echo "::endgroup::"
|
echo "::endgroup::"
|
||||||
|
|
||||||
if ! grep -q "already up to date\|No new version found" /tmp/update-${pkg}.log; then
|
if ! grep -q "already up to date\|No new version found" /tmp/update-${pkg}.log; then
|
||||||
@@ -222,34 +355,16 @@ jobs:
|
|||||||
echo "📦 Found $(echo $UPDATABLE_PACKAGES | wc -w) updatable packages"
|
echo "📦 Found $(echo $UPDATABLE_PACKAGES | wc -w) updatable packages"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# Parallel updates with 4 concurrent jobs
|
|
||||||
MAX_JOBS=4
|
|
||||||
JOB_COUNT=0
|
|
||||||
SUCCESS_LIST=()
|
|
||||||
|
|
||||||
for pkg in $UPDATABLE_PACKAGES; do
|
for pkg in $UPDATABLE_PACKAGES; do
|
||||||
(run_update "$pkg" && echo "$pkg" >> /tmp/success.txt || true) &
|
if run_update "$pkg"; then
|
||||||
|
UPDATES_FOUND=true
|
||||||
JOB_COUNT=$((JOB_COUNT + 1))
|
if [ -n "$UPDATED_PACKAGES" ]; then
|
||||||
|
UPDATED_PACKAGES="$UPDATED_PACKAGES, $pkg"
|
||||||
# Wait if we hit max concurrent jobs
|
else
|
||||||
if [ $JOB_COUNT -ge $MAX_JOBS ]; then
|
UPDATED_PACKAGES="$pkg"
|
||||||
wait
|
fi
|
||||||
JOB_COUNT=0
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# Wait for remaining jobs
|
|
||||||
wait
|
|
||||||
|
|
||||||
# Parse results
|
|
||||||
if [ -f /tmp/success.txt ]; then
|
|
||||||
SUCCESS_LIST=$(cat /tmp/success.txt | tr '\n' ' ')
|
|
||||||
UPDATED_PACKAGES=$(echo "$SUCCESS_LIST" | sed 's/ /, /g' | sed 's/, $//')
|
|
||||||
UPDATES_FOUND=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm -f /tmp/success.txt
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
COMMIT_COUNT=$(git rev-list --count origin/master..HEAD)
|
COMMIT_COUNT=$(git rev-list --count origin/master..HEAD)
|
||||||
@@ -264,7 +379,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Verify Builds
|
- name: Verify Builds
|
||||||
if: steps.update.outputs.has_updates == 'true' || steps.update-opencode.outputs.opencode_update == 'true'
|
if: steps.update.outputs.has_updates == 'true' || steps.update-flake-inputs.outputs.flake_inputs_updated == 'true'
|
||||||
run: |
|
run: |
|
||||||
cd "$REPO_DIR"
|
cd "$REPO_DIR"
|
||||||
|
|
||||||
@@ -316,17 +431,17 @@ jobs:
|
|||||||
echo "✅ All packages built successfully: ${SUCCESSFUL_PACKAGES[*]}"
|
echo "✅ All packages built successfully: ${SUCCESSFUL_PACKAGES[*]}"
|
||||||
|
|
||||||
- name: Push Changes
|
- name: Push Changes
|
||||||
if: steps.update.outputs.has_updates == 'true' || steps.update-opencode.outputs.opencode_update == 'true'
|
if: steps.update.outputs.has_updates == 'true' || steps.update-flake-inputs.outputs.flake_inputs_updated == 'true'
|
||||||
run: |
|
run: |
|
||||||
cd "$REPO_DIR"
|
cd "$REPO_DIR"
|
||||||
PACKAGES="${{ steps.update.outputs.updated_packages }}"
|
PACKAGES="${{ steps.update.outputs.updated_packages }}"
|
||||||
|
|
||||||
# Add opencode to packages list if it was updated
|
if [ "${{ steps.update-flake-inputs.outputs.flake_inputs_updated }}" = "true" ]; then
|
||||||
if [ "${{ steps.update-opencode.outputs.opencode_update }}" = "true" ]; then
|
UPDATED_INPUTS="${{ steps.update-flake-inputs.outputs.updated_inputs }}"
|
||||||
if [ -n "$PACKAGES" ]; then
|
if [ -n "$PACKAGES" ]; then
|
||||||
PACKAGES="$PACKAGES, opencode"
|
PACKAGES="$PACKAGES, flake inputs ($UPDATED_INPUTS)"
|
||||||
else
|
else
|
||||||
PACKAGES="opencode"
|
PACKAGES="flake inputs ($UPDATED_INPUTS)"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -339,10 +454,10 @@ jobs:
|
|||||||
if git pull --rebase origin master; then
|
if git pull --rebase origin master; then
|
||||||
echo "✅ Rebase successful"
|
echo "✅ Rebase successful"
|
||||||
else
|
else
|
||||||
echo "⚠️ Rebase failed, attempting force push..."
|
echo "⚠️ Rebase failed, resetting and retrying..."
|
||||||
|
git rebase --abort 2>/dev/null || true
|
||||||
git reset --hard origin/master
|
git reset --hard origin/master
|
||||||
git push --force-with-lease origin master
|
echo "❌ Could not rebase, updates lost. Will retry next run."
|
||||||
echo "✓ Force push completed"
|
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -354,17 +469,6 @@ jobs:
|
|||||||
echo "✅ Successfully pushed updates for: $PACKAGES"
|
echo "✅ Successfully pushed updates for: $PACKAGES"
|
||||||
echo "::endgroup::"
|
echo "::endgroup::"
|
||||||
|
|
||||||
- name: Upload Build Logs
|
|
||||||
if: failure()
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: build-logs-${{ github.run_number }}
|
|
||||||
path: |
|
|
||||||
/tmp/update-*.log
|
|
||||||
/tmp/build-*.log
|
|
||||||
/tmp/opencode-build.log
|
|
||||||
retention-days: 7
|
|
||||||
|
|
||||||
- name: Cleanup
|
- name: Cleanup
|
||||||
if: always()
|
if: always()
|
||||||
run: |
|
run: |
|
||||||
@@ -395,12 +499,26 @@ jobs:
|
|||||||
echo "\`${{ steps.update.outputs.updated_packages }}\`" >> $GITHUB_STEP_SUMMARY
|
echo "\`${{ steps.update.outputs.updated_packages }}\`" >> $GITHUB_STEP_SUMMARY
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${{ steps.update-opencode.outputs.opencode_update }}" = "true" ]; then
|
if [ "${{ steps.update-flake-inputs.outputs.flake_inputs_updated }}" = "true" ]; then
|
||||||
HAS_UPDATES="true"
|
HAS_UPDATES="true"
|
||||||
echo "" >> $GITHUB_STEP_SUMMARY
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "## Updated Flake Input" >> $GITHUB_STEP_SUMMARY
|
echo "## Updated Flake Inputs" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "" >> $GITHUB_STEP_SUMMARY
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "- **opencode**: \`v${{ steps.update-opencode.outputs.opencode_version }}\`" >> $GITHUB_STEP_SUMMARY
|
UPDATED_INPUTS="${{ steps.update-flake-inputs.outputs.updated_inputs }}"
|
||||||
|
if [ -n "$UPDATED_INPUTS" ]; then
|
||||||
|
echo "$UPDATED_INPUTS" | tr ' ' '\n' | while read -r input; do
|
||||||
|
[ -n "$input" ] && echo "- **$input**" >> $GITHUB_STEP_SUMMARY
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
FAILED_INPUTS="${{ steps.update-flake-inputs.outputs.failed_inputs }}"
|
||||||
|
if [ -n "$FAILED_INPUTS" ]; then
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "### Failed Inputs" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "$FAILED_INPUTS" | tr ' ' '\n' | while read -r input; do
|
||||||
|
[ -n "$input" ] && echo "- $input" >> $GITHUB_STEP_SUMMARY
|
||||||
|
done
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$HAS_UPDATES" = "true" ]; then
|
if [ "$HAS_UPDATES" = "true" ]; then
|
||||||
|
|||||||
6
.gitignore
vendored
6
.gitignore
vendored
@@ -31,3 +31,9 @@ test-result/
|
|||||||
# Local configuration (if you want to keep local overrides)
|
# Local configuration (if you want to keep local overrides)
|
||||||
local.nix
|
local.nix
|
||||||
flake.lock.bak
|
flake.lock.bak
|
||||||
|
.todos/
|
||||||
|
|
||||||
|
# AI agent state
|
||||||
|
.sidecar/
|
||||||
|
.sidecar-*
|
||||||
|
.sisyphus/
|
||||||
|
|||||||
25
AGENTS.md
25
AGENTS.md
@@ -1,7 +1,12 @@
|
|||||||
# m3ta-nixpkgs Knowledge Base
|
# m3ta-nixpkgs Knowledge Base
|
||||||
|
|
||||||
**Generated:** 2026-01-13
|
## MANDATORY: Use td for Task Management
|
||||||
**Commit:** 366af12
|
|
||||||
|
You must run td usage --new-session at conversation start (or after /clear) to see current work.
|
||||||
|
Use td usage -q for subsequent reads.
|
||||||
|
|
||||||
|
**Generated:** 2026-02-14
|
||||||
|
**Commit:** dc2f3b6
|
||||||
**Branch:** master
|
**Branch:** master
|
||||||
|
|
||||||
## OVERVIEW
|
## OVERVIEW
|
||||||
@@ -150,16 +155,16 @@ Types: `feat`, `fix`, `docs`, `style`, `refactor`, `chore`
|
|||||||
- **Dev shell tools**: `statix`, `deadnix` only available inside `nix develop`
|
- **Dev shell tools**: `statix`, `deadnix` only available inside `nix develop`
|
||||||
- **Automated package updates**: Packages are automatically updated weekly via Gitea Actions using `nix-update`. Review PRs from the automation before merging. For urgent updates, manually run the workflow or update manually.
|
- **Automated package updates**: Packages are automatically updated weekly via Gitea Actions using `nix-update`. Review PRs from the automation before merging. For urgent updates, manually run the workflow or update manually.
|
||||||
|
|
||||||
## Issue Tracking
|
## Task Management
|
||||||
|
|
||||||
This project uses **bd (beads)** for issue tracking.
|
This project uses **td** for tracking tasks across AI coding sessions.
|
||||||
Run `bd prime` for workflow context, or install hooks (`bd hooks install`) for auto-injection.
|
Run `td usage --new-session` at conversation start to see current work.
|
||||||
|
Use `td usage -q` for subsequent reads.
|
||||||
|
|
||||||
**Quick reference:**
|
**Quick reference:**
|
||||||
|
|
||||||
- `bd ready` - Find unblocked work
|
- `td usage --new-session` - Start new session and view tasks
|
||||||
- `bd create "Title" --type task --priority 2` - Create issue
|
- `td usage -q` - Quick view of current tasks (subsequent reads)
|
||||||
- `bd close <id>` - Complete work
|
- `td version` - Check version
|
||||||
- `bd sync` - Sync with git (run at session end)
|
|
||||||
|
|
||||||
For full workflow details: `bd prime`
|
For full workflow details, see the [td documentation](./docs/packages/td.md).
|
||||||
|
|||||||
@@ -40,17 +40,19 @@ nix run git+https://code.m3ta.dev/m3tam3re/nixpkgs#zellij-ps
|
|||||||
|
|
||||||
| Package | Description |
|
| Package | Description |
|
||||||
| ------------------ | ------------------------------------- |
|
| ------------------ | ------------------------------------- |
|
||||||
| `beads` | Lightweight memory system for AI coding agents with graph-based issue tracking |
|
|
||||||
| `code2prompt` | Convert code to prompts |
|
| `code2prompt` | Convert code to prompts |
|
||||||
| `hyprpaper-random` | Random wallpaper setter for Hyprpaper |
|
| `hyprpaper-random` | Random wallpaper setter for Hyprpaper |
|
||||||
| `launch-webapp` | Launch web applications |
|
| `launch-webapp` | Launch web applications |
|
||||||
| `mem0` | AI memory assistant with vector storage |
|
| `mem0` | AI memory assistant with vector storage |
|
||||||
| `msty-studio` | Msty Studio application |
|
| `msty-studio` | Msty Studio application |
|
||||||
| `n8n` | Free and source-available fair-code licensed workflow automation tool |
|
| `n8n` | Free and source-available fair-code licensed workflow automation tool |
|
||||||
| `opencode` | AI coding agent built for the terminal |
|
| `notesmd-cli` | Obsidian CLI (Community) - Interact with Obsidian in the terminal |
|
||||||
|
| `opencode-desktop` | OpenCode Desktop App with Wayland support (includes workaround for upstream issue #11755) |
|
||||||
| `pomodoro-timer` | Pomodoro timer utility |
|
| `pomodoro-timer` | Pomodoro timer utility |
|
||||||
| `rofi-project-opener` | Rofi-based project launcher |
|
| `rofi-project-opener` | Rofi-based project launcher |
|
||||||
|
| `sidecar` | Companion tool for CLI agents with diffs, file trees, and task management |
|
||||||
| `stt-ptt` | Push to Talk Speech to Text |
|
| `stt-ptt` | Push to Talk Speech to Text |
|
||||||
|
| `td` | Minimalist CLI for tracking tasks across AI coding sessions |
|
||||||
| `tuxedo-backlight` | Backlight control for Tuxedo laptops |
|
| `tuxedo-backlight` | Backlight control for Tuxedo laptops |
|
||||||
| `zellij-ps` | Project switcher for Zellij |
|
| `zellij-ps` | Project switcher for Zellij |
|
||||||
|
|
||||||
|
|||||||
@@ -28,17 +28,18 @@ Step-by-step guides for common tasks:
|
|||||||
|
|
||||||
Documentation for all custom packages:
|
Documentation for all custom packages:
|
||||||
|
|
||||||
- [beads](./packages/beads.md) - Lightweight memory system for AI coding agents with graph-based issue tracking
|
|
||||||
- [code2prompt](./packages/code2prompt.md) - Convert code to prompts
|
- [code2prompt](./packages/code2prompt.md) - Convert code to prompts
|
||||||
- [hyprpaper-random](./packages/hyprpaper-random.md) - Random wallpaper setter for Hyprpaper
|
- [hyprpaper-random](./packages/hyprpaper-random.md) - Random wallpaper setter for Hyprpaper
|
||||||
- [launch-webapp](./packages/launch-webapp.md) - Launch web applications
|
- [launch-webapp](./packages/launch-webapp.md) - Launch web applications
|
||||||
- [mem0](./packages/mem0.md) - AI memory assistant with vector storage
|
- [mem0](./packages/mem0.md) - AI memory assistant with vector storage
|
||||||
- [msty-studio](./packages/msty-studio.md) - Msty Studio application
|
- [msty-studio](./packages/msty-studio.md) - Msty Studio application
|
||||||
- [n8n](./packages/n8n.md) - Free and source-available fair-code licensed workflow automation tool
|
- [n8n](./packages/n8n.md) - Free and source-available fair-code licensed workflow automation tool
|
||||||
- [opencode](./packages/opencode.md) - AI coding agent built for terminal
|
- [notesmd-cli](./packages/notesmd-cli.md) - Obsidian CLI (Community) - Interact with Obsidian in the terminal
|
||||||
- [pomodoro-timer](./packages/pomodoro-timer.md) - Pomodoro timer utility
|
- [pomodoro-timer](./packages/pomodoro-timer.md) - Pomodoro timer utility
|
||||||
- [rofi-project-opener](./packages/rofi-project-opener.md) - Rofi-based project launcher with custom args
|
- [rofi-project-opener](./packages/rofi-project-opener.md) - Rofi-based project launcher with custom args
|
||||||
|
- [sidecar](./packages/sidecar.md) - Companion tool for CLI agents with diffs, file trees, and task management
|
||||||
- [stt-ptt](./packages/stt-ptt.md) - Push to Talk Speech to Text using Whisper
|
- [stt-ptt](./packages/stt-ptt.md) - Push to Talk Speech to Text using Whisper
|
||||||
|
- [td](./packages/td.md) - Minimalist CLI for tracking tasks across AI coding sessions
|
||||||
- [tuxedo-backlight](./packages/tuxedo-backlight.md) - Backlight control for Tuxedo laptops
|
- [tuxedo-backlight](./packages/tuxedo-backlight.md) - Backlight control for Tuxedo laptops
|
||||||
- [zellij-ps](./packages/zellij-ps.md) - Project switcher for Zellij
|
- [zellij-ps](./packages/zellij-ps.md) - Project switcher for Zellij
|
||||||
|
|
||||||
|
|||||||
@@ -1,220 +1,23 @@
|
|||||||
# beads
|
# beads (Removed)
|
||||||
|
|
||||||
Lightweight memory system for AI coding agents with graph-based issue tracking.
|
> **Note**: The `beads` package has been removed from this repository.
|
||||||
|
|
||||||
## Description
|
## Why was it removed?
|
||||||
|
|
||||||
beads is a command-line tool designed to provide persistent memory and issue tracking for AI coding agents. It features a graph-based system for managing issues, dependencies, and discovered work across development sessions.
|
The beads package was removed as it is no longer actively used.
|
||||||
|
|
||||||
## Features
|
## What was beads?
|
||||||
|
|
||||||
- 🧠 **Persistent Memory**: Store and retrieve context across AI sessions
|
Beads was a lightweight memory system for AI coding agents with graph-based issue tracking. It provided:
|
||||||
- 📊 **Graph-Based Issue Tracking**: Manage issues with dependency relationships
|
- Persistent memory across AI sessions
|
||||||
- 🔄 **Discovered Work**: Track work discovered during development
|
- Graph-based issue tracking with dependencies
|
||||||
- 🎯 **Multi-Session Continuity**: Resume work from previous sessions
|
- Discovered work tracking
|
||||||
- 📝 **Git Integration**: Seamless integration with git workflows
|
- Git integration
|
||||||
- 🐚 **Shell Completions**: Bash, Fish, and Zsh completions included
|
|
||||||
|
|
||||||
## Installation
|
If you need beads, you can still build it from source:
|
||||||
|
|
||||||
### Via Overlay
|
|
||||||
|
|
||||||
```nix
|
|
||||||
{pkgs, ...}: {
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
beads
|
|
||||||
];
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Direct Reference
|
|
||||||
|
|
||||||
```nix
|
|
||||||
{pkgs, ...}: {
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
inputs.m3ta-nixpkgs.packages.${pkgs.system}.beads
|
|
||||||
];
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Run Directly
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
nix run git+https://code.m3ta.dev/m3tam3re/nixpkgs#beads
|
git clone https://github.com/steveyegge/beads
|
||||||
|
cd beads
|
||||||
|
go build ./cmd/bd
|
||||||
```
|
```
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
### Basic Commands
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Show available issues ready to work on
|
|
||||||
bd ready
|
|
||||||
|
|
||||||
# Create a new issue
|
|
||||||
bd create "Fix authentication bug" --type bug --priority 2
|
|
||||||
|
|
||||||
# Show issue details
|
|
||||||
bd show beads-123
|
|
||||||
|
|
||||||
# Update issue status
|
|
||||||
bd update beads-123 --status in_progress
|
|
||||||
|
|
||||||
# Close completed issues
|
|
||||||
bd close beads-123
|
|
||||||
|
|
||||||
# Sync with git remote
|
|
||||||
bd sync
|
|
||||||
```
|
|
||||||
|
|
||||||
### Issue Types
|
|
||||||
|
|
||||||
- `task`: General tasks
|
|
||||||
- `bug`: Bug fixes
|
|
||||||
- `feature`: New features
|
|
||||||
- `epic`: Large-scale initiatives
|
|
||||||
|
|
||||||
### Priority Levels
|
|
||||||
|
|
||||||
- `0` (P0): Critical
|
|
||||||
- `1` (P1): High
|
|
||||||
- `2` (P2): Medium
|
|
||||||
- `3` (P3): Low
|
|
||||||
- `4` (P4): Backlog
|
|
||||||
|
|
||||||
### Dependency Management
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Add dependency (beads-123 depends on beads-456)
|
|
||||||
bd dep add beads-123 beads-456
|
|
||||||
|
|
||||||
# Show blocked issues
|
|
||||||
bd blocked
|
|
||||||
|
|
||||||
# Show what blocks an issue
|
|
||||||
bd show beads-123 --blocked-by
|
|
||||||
```
|
|
||||||
|
|
||||||
## Advanced Usage
|
|
||||||
|
|
||||||
### Finding Work
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Show ready tasks (no blockers)
|
|
||||||
bd ready
|
|
||||||
|
|
||||||
# Show all open issues
|
|
||||||
bd list --status open
|
|
||||||
|
|
||||||
# Show in-progress work
|
|
||||||
bd list --status in_progress
|
|
||||||
```
|
|
||||||
|
|
||||||
### Assignment
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Assign issue to yourself
|
|
||||||
bd update beads-123 --assignee username
|
|
||||||
|
|
||||||
# Create assigned issue
|
|
||||||
bd create "Review PR" --assignee reviewer
|
|
||||||
```
|
|
||||||
|
|
||||||
### Bulk Operations
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Close multiple issues at once
|
|
||||||
bd close beads-123 beads-456 beads-789
|
|
||||||
|
|
||||||
# Close with reason
|
|
||||||
bd close beads-123 --reason "Completed in v1.2.0"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Hooks
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Install git hooks for automatic sync
|
|
||||||
bd hooks install
|
|
||||||
|
|
||||||
# Remove hooks
|
|
||||||
bd hooks uninstall
|
|
||||||
```
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
### Environment Variables
|
|
||||||
|
|
||||||
- `BEADS_DATA_DIR`: Custom directory for beads data (default: `.beads/`)
|
|
||||||
- `BEADS_CONFIG`: Custom configuration file path
|
|
||||||
- `BEADS_EDITOR`: Default editor for editing issues
|
|
||||||
|
|
||||||
### Git Integration
|
|
||||||
|
|
||||||
beads integrates with git for version-controlled issue tracking:
|
|
||||||
|
|
||||||
- Automatic sync before commits (via hooks)
|
|
||||||
- Issue references in commit messages
|
|
||||||
- Branch name tracking
|
|
||||||
- Git-aware issue states
|
|
||||||
|
|
||||||
## Workflow Integration
|
|
||||||
|
|
||||||
### Typical Development Workflow
|
|
||||||
|
|
||||||
1. **Start session**: `bd prime` or check `bd ready`
|
|
||||||
2. **Claim work**: `bd update beads-123 --status in_progress`
|
|
||||||
3. **Work on task**: Implement changes
|
|
||||||
4. **Discover new work**: `bd create "Discovered subtask"` as needed
|
|
||||||
5. **Complete task**: `bd close beads-123`
|
|
||||||
6. **Sync**: `bd sync` (automatic via hooks)
|
|
||||||
|
|
||||||
### Team Collaboration
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Create issue and assign
|
|
||||||
bd create "Implement feature X" --assignee dev1
|
|
||||||
|
|
||||||
# Review assigned work
|
|
||||||
bd list --assignee yourname
|
|
||||||
|
|
||||||
# Close with review notes
|
|
||||||
bd close beads-123 --reason "Reviewed and approved"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Shell Completions
|
|
||||||
|
|
||||||
beads provides shell completions for bash, fish, and zsh:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Bash completions are auto-loaded
|
|
||||||
source <(bd completion bash)
|
|
||||||
|
|
||||||
# Fish completions
|
|
||||||
bd completion fish | source
|
|
||||||
|
|
||||||
# Zsh completions
|
|
||||||
bd completion zsh > ~/.zfunc/_bd
|
|
||||||
```
|
|
||||||
|
|
||||||
## Build Information
|
|
||||||
|
|
||||||
- **Version**: 0.47.1
|
|
||||||
- **Language**: Go
|
|
||||||
- **License**: MIT
|
|
||||||
- **Source**: [GitHub](https://github.com/steveyegge/beads)
|
|
||||||
|
|
||||||
## Platform Support
|
|
||||||
|
|
||||||
- Linux
|
|
||||||
- macOS
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
|
|
||||||
- Tests are disabled in the Nix package due to git worktree operations that fail in the sandbox
|
|
||||||
- Security tests on Darwin are skipped due to `/etc/passwd` unavailability in sandbox
|
|
||||||
- Shell completions are installed for platforms that can execute the build target
|
|
||||||
|
|
||||||
## Related
|
|
||||||
|
|
||||||
- [Adding Packages](../guides/adding-packages.md) - How to add new packages
|
|
||||||
- [Quick Start](../QUICKSTART.md) - Getting started guide
|
|
||||||
|
|||||||
117
docs/packages/notesmd-cli.md
Normal file
117
docs/packages/notesmd-cli.md
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
# notesmd-cli
|
||||||
|
|
||||||
|
Obsidian CLI (Community) - Interact with Obsidian in the terminal.
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
notesmd-cli is a command-line interface for interacting with Obsidian, the popular knowledge management and note-taking application. It allows you to create, search, and manipulate notes directly from the terminal.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- 📝 **Note Creation**: Create new notes from the command line
|
||||||
|
- 🔍 **Search**: Search through your Obsidian vault
|
||||||
|
- 📂 **Vault Management**: Interact with your vault structure
|
||||||
|
- 🔗 **WikiLink Support**: Work with Obsidian's WikiLink format
|
||||||
|
- 🏷️ **Tag Support**: Manage and search by tags
|
||||||
|
- ⚡ **Fast**: Lightweight Go binary with no external dependencies
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### Via Overlay
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{pkgs, ...}: {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
notesmd-cli
|
||||||
|
];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Direct Reference
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{pkgs, ...}: {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
inputs.m3ta-nixpkgs.packages.${pkgs.system}.notesmd-cli
|
||||||
|
];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run Directly
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix run git+https://code.m3ta.dev/m3tam3re/nixpkgs#notesmd-cli
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Basic Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Show help
|
||||||
|
notesmd-cli --help
|
||||||
|
|
||||||
|
# Create a new note
|
||||||
|
notesmd-cli new "My Note Title"
|
||||||
|
|
||||||
|
# Search notes
|
||||||
|
notesmd-cli search "search term"
|
||||||
|
|
||||||
|
# List notes
|
||||||
|
notesmd-cli list
|
||||||
|
```
|
||||||
|
|
||||||
|
### Working with Vaults
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Specify vault path
|
||||||
|
notesmd-cli --vault /path/to/vault new "Note Title"
|
||||||
|
|
||||||
|
# Open a note in Obsidian
|
||||||
|
notesmd-cli open "Note Name"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Advanced Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Search with tags
|
||||||
|
notesmd-cli search --tag "project"
|
||||||
|
|
||||||
|
# Append to existing note
|
||||||
|
notesmd-cli append "Note Name" "Additional content"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
- `OBSIDIAN_VAULT`: Default vault path
|
||||||
|
|
||||||
|
### Command Line Options
|
||||||
|
|
||||||
|
Run `notesmd-cli --help` for a complete list of options.
|
||||||
|
|
||||||
|
## Build Information
|
||||||
|
|
||||||
|
- **Version**: 0.3.0
|
||||||
|
- **Language**: Go
|
||||||
|
- **License**: MIT
|
||||||
|
- **Source**: [GitHub](https://github.com/Yakitrak/notesmd-cli)
|
||||||
|
- **Vendor Hash**: null (no external dependencies)
|
||||||
|
|
||||||
|
## Platform Support
|
||||||
|
|
||||||
|
- Linux
|
||||||
|
- macOS (Unix systems)
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- No vendor dependencies (pure Go stdlib)
|
||||||
|
- The binary is named `notesmd-cli` (not `notesmd`)
|
||||||
|
- This is the community CLI, not the official Obsidian CLI
|
||||||
|
|
||||||
|
## Related
|
||||||
|
|
||||||
|
- [Obsidian](https://obsidian.md) - The Obsidian application
|
||||||
|
- [Adding Packages](../guides/adding-packages.md) - How to add new packages
|
||||||
|
- [Quick Start](../QUICKSTART.md) - Getting started guide
|
||||||
@@ -1,346 +1,37 @@
|
|||||||
# opencode
|
# opencode (Deprecated)
|
||||||
|
|
||||||
AI coding agent built for the terminal that can build anything. Combines a TypeScript/JavaScript core with a Go-based TUI for an interactive AI coding experience.
|
> **Note**: The `opencode` package has been removed from this repository.
|
||||||
|
|
||||||
## Description
|
## Why was it removed?
|
||||||
|
|
||||||
OpenCode is a terminal-based AI coding agent designed for power users. It provides a comprehensive development environment with AI assistance, code generation, refactoring, and project management capabilities. The tool features a sophisticated TUI (Terminal User Interface) built with Go, while the core functionality is implemented in TypeScript/JavaScript.
|
OpenCode (CLI version) has been removed because there is now a well-maintained upstream repository for AI coding tools:
|
||||||
|
|
||||||
## Features
|
**[numtide/llm-agents.nix](https://github.com/numtide/llm-agents.nix)**
|
||||||
|
|
||||||
- 🤖 **AI-Powered Coding**: Generate, refactor, and optimize code with AI assistance
|
This repository provides Nix packages for various AI coding agents, including OpenCode and others, with active maintenance and updates.
|
||||||
- 🖥️ **Modern TUI**: Beautiful terminal interface built with Go
|
|
||||||
- 🔍 **Code Understanding**: Parse and understand existing codebases
|
|
||||||
- 🌳 **Tree-Sitter Integration**: Accurate syntax highlighting and code structure analysis
|
|
||||||
- 📁 **Project Management**: Navigate and manage projects efficiently
|
|
||||||
- 🧠 **Multi-LLM Support**: Works with various language models (OpenAI, Anthropic, etc.)
|
|
||||||
- 📝 **Code Generation**: Create new files and features from natural language
|
|
||||||
- 🔄 **Refactoring**: Intelligent code refactoring with AI
|
|
||||||
- 🐛 **Bug Detection**: Find and fix bugs automatically
|
|
||||||
- 📚 **Context Awareness**: Maintains context across editing sessions
|
|
||||||
- 🎯 **Task Orchestration**: Break down and execute complex tasks
|
|
||||||
- 💾 **Local Development**: Runs entirely on your machine
|
|
||||||
|
|
||||||
## Installation
|
## What should I use instead?
|
||||||
|
|
||||||
### Via Overlay
|
Use the [llm-agents.nix](https://github.com/numtide/llm-agents.nix) flake directly:
|
||||||
|
|
||||||
```nix
|
```nix
|
||||||
{pkgs, ...}: {
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
opencode
|
|
||||||
];
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Direct Reference
|
|
||||||
|
|
||||||
```nix
|
|
||||||
{pkgs, ...}: {
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
inputs.m3ta-nixpkgs.packages.${pkgs.system}.opencode
|
|
||||||
];
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Run Directly
|
|
||||||
|
|
||||||
```bash
|
|
||||||
nix run git+https://code.m3ta.dev/m3tam3re/nixpkgs#opencode
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
### Basic Usage
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Start OpenCode in current directory
|
|
||||||
opencode
|
|
||||||
|
|
||||||
# Open specific project
|
|
||||||
opencode /path/to/project
|
|
||||||
|
|
||||||
# Start with specific task description
|
|
||||||
opencode "Fix the login bug"
|
|
||||||
|
|
||||||
# Show help
|
|
||||||
opencode --help
|
|
||||||
|
|
||||||
# Show version
|
|
||||||
opencode --version
|
|
||||||
```
|
|
||||||
|
|
||||||
### Interactive Commands
|
|
||||||
|
|
||||||
OpenCode provides an interactive TUI with various commands:
|
|
||||||
|
|
||||||
- **Navigation**: Arrow keys to move, Enter to select
|
|
||||||
- **Search**: `/` to search files, `?` for help
|
|
||||||
- **Edit**: `e` to edit selected file
|
|
||||||
- **Command Palette**: `Ctrl+p` to access commands
|
|
||||||
- **AI Chat**: `Ctrl+c` to open AI chat
|
|
||||||
- **Exit**: `q` or `Ctrl+d` to quit
|
|
||||||
|
|
||||||
### AI Chat Mode
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Start OpenCode
|
|
||||||
opencode
|
|
||||||
|
|
||||||
# Enter AI chat mode (Ctrl+c)
|
|
||||||
# Ask questions, request code changes, etc.
|
|
||||||
# Examples:
|
|
||||||
# - "Generate a REST API endpoint for user management"
|
|
||||||
# - "Refactor this function to use async/await"
|
|
||||||
# - "Find and fix potential memory leaks"
|
|
||||||
# - "Add unit tests for this module"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Task Management
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Ask OpenCode to work on a specific task
|
|
||||||
opencode "Implement authentication with JWT tokens"
|
|
||||||
|
|
||||||
# The agent will:
|
|
||||||
# 1. Understand the codebase
|
|
||||||
# 2. Plan the implementation
|
|
||||||
# 3. Generate necessary code
|
|
||||||
# 4. Make the changes
|
|
||||||
# 5. Verify the implementation
|
|
||||||
```
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
### Environment Variables
|
|
||||||
|
|
||||||
- `OPENCODE_API_KEY`: API key for LLM provider
|
|
||||||
- `OPENCODE_MODEL`: Default model to use (e.g., gpt-4, claude-3-opus)
|
|
||||||
- `OPENCODE_PROVIDER`: LLM provider (openai, anthropic, etc.)
|
|
||||||
- `OPENCODE_MAX_TOKENS`: Maximum tokens for responses
|
|
||||||
- `OPENCODE_TEMPERATURE`: Sampling temperature (0-1)
|
|
||||||
- `OPENCODE_CONFIG`: Path to configuration file
|
|
||||||
|
|
||||||
### Configuration File
|
|
||||||
|
|
||||||
Create `~/.opencode/config.json`:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
{
|
||||||
"model": "gpt-4",
|
inputs = {
|
||||||
"provider": "openai",
|
llm-agents.url = "github:numtide/llm-agents.nix";
|
||||||
"maxTokens": 4096,
|
};
|
||||||
"temperature": 0.7,
|
|
||||||
"systemPrompt": "You are a helpful coding assistant"
|
outputs = { inputs, ... }: {
|
||||||
|
# Access packages via inputs.llm-agents.packages.${system}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Project-Specific Config
|
Or run directly:
|
||||||
|
|
||||||
Create `.opencode.json` in your project:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"include": ["src/**/*.ts", "tests/**/*.ts"],
|
|
||||||
"exclude": ["node_modules", "dist", "*.test.ts"],
|
|
||||||
"systemPrompt": "You are a TypeScript expert"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Advanced Usage
|
|
||||||
|
|
||||||
### Code Refactoring
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Ask for refactoring suggestions
|
nix run github:numtide/llm-agents.nix#opencode
|
||||||
opencode "Review and refactor src/utils.ts for better performance"
|
|
||||||
|
|
||||||
# Apply refactoring automatically
|
|
||||||
opencode "Optimize the database queries in src/db/*.ts"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Bug Fixing
|
## What about opencode-desktop?
|
||||||
|
|
||||||
```bash
|
The `opencode-desktop` package remains available in this repository as it includes a Wayland support workaround for [upstream issue #11755](https://github.com/opencode-ai/opencode/issues/11755). Once this issue is resolved upstream, `opencode-desktop` may also be removed in favor of the llm-agents.nix repository.
|
||||||
# Describe the bug
|
|
||||||
opencode "Fix the race condition in the payment processing module"
|
|
||||||
|
|
||||||
# OpenCode will:
|
|
||||||
# 1. Analyze the code
|
|
||||||
# 2. Identify the issue
|
|
||||||
# 3. Propose and implement fixes
|
|
||||||
# 4. Verify the solution
|
|
||||||
```
|
|
||||||
|
|
||||||
### Feature Implementation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Request new features
|
|
||||||
opencode "Add support for OAuth2 authentication"
|
|
||||||
|
|
||||||
# Be specific about requirements
|
|
||||||
opencode "Create a REST API with these endpoints: GET /users, POST /users, PUT /users/:id, DELETE /users/:id"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Code Review
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Get code review
|
|
||||||
opencode "Review src/api/*.ts for security vulnerabilities"
|
|
||||||
|
|
||||||
# Check for best practices
|
|
||||||
opencode "Review the entire codebase and suggest improvements following SOLID principles"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Documentation Generation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Generate documentation
|
|
||||||
opencode "Add JSDoc comments to all functions in src/utils.ts"
|
|
||||||
|
|
||||||
# Create README
|
|
||||||
opencode "Generate a comprehensive README.md for this project"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Integration with Editors
|
|
||||||
|
|
||||||
### VS Code
|
|
||||||
|
|
||||||
OpenCode can work alongside your editor:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Keep VS Code running for editing
|
|
||||||
code .
|
|
||||||
|
|
||||||
# Use OpenCode for AI assistance in another terminal
|
|
||||||
opencode
|
|
||||||
|
|
||||||
# Switch between them as needed
|
|
||||||
```
|
|
||||||
|
|
||||||
### Vim/Neovim
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Use Vim/Neovim as your editor
|
|
||||||
vim src/main.ts
|
|
||||||
|
|
||||||
# Use OpenCode for complex tasks
|
|
||||||
opencode "Refactor the authentication module"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Use Cases
|
|
||||||
|
|
||||||
### Learning New Codebases
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# OpenCode will:
|
|
||||||
# 1. Analyze the code structure
|
|
||||||
# 2. Explain how components work
|
|
||||||
# 3. Answer questions about the code
|
|
||||||
opencode "Explain how this project handles user authentication"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Porting Code
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Port from one language to another
|
|
||||||
opencode "Port this Python function to TypeScript"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Writing Tests
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Generate unit tests
|
|
||||||
opencode "Add comprehensive unit tests for src/utils.ts with 100% coverage"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Debugging
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Get help with debugging
|
|
||||||
opencode "I'm getting a null pointer exception in src/api/users.ts. Help me debug it"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Keyboard Shortcuts
|
|
||||||
|
|
||||||
### Global
|
|
||||||
|
|
||||||
- `Ctrl+p` - Open command palette
|
|
||||||
- `Ctrl+c` - Open AI chat
|
|
||||||
- `Ctrl+s` - Save current file
|
|
||||||
- `Ctrl+q` - Quit
|
|
||||||
- `?` - Show help
|
|
||||||
|
|
||||||
### Navigation
|
|
||||||
|
|
||||||
- `j` / `k` - Down / Up
|
|
||||||
- `h` / `l` - Left / Right
|
|
||||||
- `gg` - Go to top
|
|
||||||
- `G` - Go to bottom
|
|
||||||
- `/` - Search
|
|
||||||
- `n` - Next search result
|
|
||||||
- `N` - Previous search result
|
|
||||||
|
|
||||||
### File Operations
|
|
||||||
|
|
||||||
- `e` - Edit file
|
|
||||||
- `o` - Open in external editor
|
|
||||||
- `d` - Delete file (with confirmation)
|
|
||||||
- `y` - Yank (copy)
|
|
||||||
- `p` - Paste
|
|
||||||
|
|
||||||
## Build Information
|
|
||||||
|
|
||||||
- **Version**: 1.1.18
|
|
||||||
- **Language**: TypeScript/JavaScript (core), Go (TUI)
|
|
||||||
- **Runtime**: Bun
|
|
||||||
- **License**: MIT
|
|
||||||
- **Source**: [GitHub](https://github.com/anomalyco/opencode)
|
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
|
|
||||||
- `bun` - JavaScript runtime and package manager
|
|
||||||
- `fzf` - Fuzzy finder for file selection
|
|
||||||
- `ripgrep` - Fast text search
|
|
||||||
- `models-dev` - Model definitions and schemas
|
|
||||||
|
|
||||||
## Platform Support
|
|
||||||
|
|
||||||
- Linux (aarch64, x86_64)
|
|
||||||
- macOS (aarch64, x86_64)
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
|
|
||||||
- Includes a patch to relax Bun version check (changed to warning instead of error)
|
|
||||||
- Shell completions are installed for supported platforms (excludes x86_64-darwin)
|
|
||||||
- Tree-sitter WASM files are patched to use absolute store paths
|
|
||||||
- JSON schema is generated and installed to `$out/share/opencode/schema.json`
|
|
||||||
|
|
||||||
## Tips and Best Practices
|
|
||||||
|
|
||||||
### Getting Started
|
|
||||||
|
|
||||||
1. **Start Small**: Begin with simple tasks to get familiar with the interface
|
|
||||||
2. **Provide Context**: Give clear, detailed descriptions of what you want
|
|
||||||
3. **Iterate**: Work with OpenCode iteratively, refining requests as needed
|
|
||||||
4. **Review Changes**: Always review AI-generated code before committing
|
|
||||||
|
|
||||||
### Effective Prompts
|
|
||||||
|
|
||||||
- Be specific about requirements
|
|
||||||
- Provide examples of expected behavior
|
|
||||||
- Mention constraints or preferences
|
|
||||||
- Break complex tasks into smaller steps
|
|
||||||
|
|
||||||
### Project Structure
|
|
||||||
|
|
||||||
- Keep your project well-organized
|
|
||||||
- Use consistent naming conventions
|
|
||||||
- Add clear comments to complex logic
|
|
||||||
- Maintain a clean git history
|
|
||||||
|
|
||||||
## Related
|
|
||||||
|
|
||||||
- [Adding Packages](../guides/adding-packages.md) - How to add new packages
|
|
||||||
- [Quick Start](../QUICKSTART.md) - Getting started guide
|
|
||||||
- [OpenCode Documentation](https://github.com/anomalyco/opencode) - Official repository and documentation
|
|
||||||
|
|||||||
134
docs/packages/sidecar.md
Normal file
134
docs/packages/sidecar.md
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
# sidecar
|
||||||
|
|
||||||
|
A companion tool for CLI coding agents, providing diffs, file trees, conversation history, and task management with td integration.
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
sidecar is a terminal UI tool designed to enhance the experience of using AI coding agents in the terminal. It provides a side panel interface for viewing diffs, file trees, conversation history, and integrates with `td` for task management across coding sessions.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- 🔀 **Diff Viewer**: Visual diff display for code changes
|
||||||
|
- 📁 **File Tree**: Navigate and understand project structure
|
||||||
|
- 💬 **Conversation History**: Review and search past AI interactions
|
||||||
|
- ✅ **Task Management**: Integrated with `td` for tracking tasks
|
||||||
|
- 🖥️ **Terminal UI**: Clean interface using tmux panes
|
||||||
|
- 🤖 **AI Agent Integration**: Designed to work with opencode and similar CLI agents
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### Via Overlay
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{pkgs, ...}: {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
sidecar
|
||||||
|
];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Direct Reference
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{pkgs, ...}: {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
inputs.m3ta-nixpkgs.packages.${pkgs.system}.sidecar
|
||||||
|
];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run Directly
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix run git+https://code.m3ta.dev/m3tam3re/nixpkgs#sidecar
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Starting sidecar
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start sidecar alongside your AI coding agent
|
||||||
|
sidecar
|
||||||
|
|
||||||
|
# Start with a specific agent
|
||||||
|
sidecar --agent opencode
|
||||||
|
```
|
||||||
|
|
||||||
|
### Basic Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Show help
|
||||||
|
sidecar --help
|
||||||
|
|
||||||
|
# Check version
|
||||||
|
sidecar --version
|
||||||
|
```
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
sidecar is packaged with the following runtime dependencies:
|
||||||
|
|
||||||
|
- **opencode**: AI coding agent
|
||||||
|
- **td**: Task tracking CLI
|
||||||
|
- **tmux**: Terminal multiplexer for UI layout
|
||||||
|
|
||||||
|
These are automatically included in the PATH when running sidecar.
|
||||||
|
|
||||||
|
## Workflow Integration
|
||||||
|
|
||||||
|
### Typical Session
|
||||||
|
|
||||||
|
1. Start `sidecar` in your project directory
|
||||||
|
2. The tool opens a tmux session with panes for:
|
||||||
|
- Your AI coding agent (opencode)
|
||||||
|
- Task list (via td)
|
||||||
|
- Diff viewer
|
||||||
|
- File tree navigator
|
||||||
|
3. Work with your AI agent as usual
|
||||||
|
4. View diffs and changes in real-time
|
||||||
|
5. Track tasks using the integrated td panel
|
||||||
|
|
||||||
|
### With opencode
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# sidecar automatically integrates with opencode
|
||||||
|
cd your-project
|
||||||
|
sidecar
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
- `SIDECAR_CONFIG`: Custom configuration file path
|
||||||
|
- `SIDECAR_AGENT`: Default AI agent to use (default: opencode)
|
||||||
|
|
||||||
|
### Customization
|
||||||
|
|
||||||
|
Configuration is managed through sidecar's own config system. See the upstream documentation for details.
|
||||||
|
|
||||||
|
## Build Information
|
||||||
|
|
||||||
|
- **Version**: 0.71.1
|
||||||
|
- **Language**: Go
|
||||||
|
- **License**: MIT
|
||||||
|
- **Source**: [GitHub](https://github.com/marcus/sidecar)
|
||||||
|
|
||||||
|
## Platform Support
|
||||||
|
|
||||||
|
- Linux
|
||||||
|
- macOS (Unix systems)
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Tests are disabled in the Nix package build
|
||||||
|
- The package wraps the binary with required dependencies (opencode, td, tmux) in PATH
|
||||||
|
- Version check is enabled for the Nix package
|
||||||
|
|
||||||
|
## Related
|
||||||
|
|
||||||
|
- [td](./td.md) - Task tracking CLI used by sidecar
|
||||||
|
- [opencode](./opencode.md) - AI coding agent integration
|
||||||
|
- [Adding Packages](../guides/adding-packages.md) - How to add new packages
|
||||||
|
- [Quick Start](../QUICKSTART.md) - Getting started guide
|
||||||
130
docs/packages/td.md
Normal file
130
docs/packages/td.md
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
# td
|
||||||
|
|
||||||
|
Minimalist CLI for tracking tasks across AI coding sessions.
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
td (task daemon) is a lightweight command-line tool designed for tracking tasks during AI-assisted coding sessions. It provides a simple, fast way to manage todos and maintain context across conversations with AI coding agents.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- ✅ **Minimal Task Tracking**: Simple, focused task management
|
||||||
|
- 🤖 **AI Session Aware**: Designed to work with AI coding workflows
|
||||||
|
- 📊 **Usage Tracking**: Track session usage and context
|
||||||
|
- 🔄 **Session Continuity**: Resume tasks from previous sessions
|
||||||
|
- 📝 **Git Integration**: Works alongside git workflows
|
||||||
|
- ⚡ **Fast**: Lightweight Go binary with minimal overhead
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### Via Overlay
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{pkgs, ...}: {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
td
|
||||||
|
];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Direct Reference
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{pkgs, ...}: {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
inputs.m3ta-nixpkgs.packages.${pkgs.system}.td
|
||||||
|
];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run Directly
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix run git+https://code.m3ta.dev/m3tam3re/nixpkgs#td
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Starting a Session
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start a new session and view current tasks
|
||||||
|
td usage --new-session
|
||||||
|
|
||||||
|
# Quick view of current tasks (no session tracking)
|
||||||
|
td usage -q
|
||||||
|
```
|
||||||
|
|
||||||
|
### Basic Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Show version
|
||||||
|
td version
|
||||||
|
|
||||||
|
# View help
|
||||||
|
td --help
|
||||||
|
```
|
||||||
|
|
||||||
|
### Task Management
|
||||||
|
|
||||||
|
td integrates with AI coding workflows to track tasks across sessions. Use it at the start of conversations to establish context:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# At conversation start (or after /clear)
|
||||||
|
td usage --new-session
|
||||||
|
|
||||||
|
# For subsequent reads within the same session
|
||||||
|
td usage -q
|
||||||
|
```
|
||||||
|
|
||||||
|
## Integration with AI Agents
|
||||||
|
|
||||||
|
td is designed to be used by AI coding agents as part of their workflow:
|
||||||
|
|
||||||
|
1. **Session Start**: Agent reads current tasks with `td usage --new-session`
|
||||||
|
2. **Work Progress**: Tasks are tracked and updated during the session
|
||||||
|
3. **Session End**: State is preserved for the next session
|
||||||
|
|
||||||
|
### Example Integration
|
||||||
|
|
||||||
|
In an AI agent's system prompt or configuration:
|
||||||
|
|
||||||
|
```
|
||||||
|
You must run td usage --new-session at conversation start (or after /clear) to see current work.
|
||||||
|
Use td usage -q for subsequent reads.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
- `TD_DATA_DIR`: Custom directory for td data storage
|
||||||
|
|
||||||
|
### Data Storage
|
||||||
|
|
||||||
|
Task data is stored locally in the project or user directory. See upstream documentation for exact storage location.
|
||||||
|
|
||||||
|
## Build Information
|
||||||
|
|
||||||
|
- **Version**: 0.34.0
|
||||||
|
- **Language**: Go
|
||||||
|
- **License**: MIT
|
||||||
|
- **Source**: [GitHub](https://github.com/marcus/td)
|
||||||
|
|
||||||
|
## Platform Support
|
||||||
|
|
||||||
|
- Linux
|
||||||
|
- macOS (Unix systems)
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Tests are disabled in the Nix package build due to git worktree operations
|
||||||
|
- Version check is enabled for the Nix package (`td version`)
|
||||||
|
- Minimal dependencies - pure Go binary
|
||||||
|
|
||||||
|
## Related
|
||||||
|
|
||||||
|
- [sidecar](./sidecar.md) - Uses td for integrated task management
|
||||||
|
- [opencode](./opencode.md) - AI coding agent that integrates with td
|
||||||
|
- [Adding Packages](../guides/adding-packages.md) - How to add new packages
|
||||||
|
- [Quick Start](../QUICKSTART.md) - Getting started guide
|
||||||
52
flake.lock
generated
52
flake.lock
generated
@@ -2,11 +2,11 @@
|
|||||||
"nodes": {
|
"nodes": {
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1768127708,
|
"lastModified": 1772963539,
|
||||||
"narHash": "sha256-1Sm77VfZh3mU0F5OqKABNLWxOuDeHIlcFjsXeeiPazs=",
|
"narHash": "sha256-9jVDGZnvCckTGdYT53d/EfznygLskyLQXYwJLKMPsZs=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "ffbc9f8cbaacfb331b6017d5a5abb21a492c9a38",
|
"rev": "9dcb002ca1690658be4a04645215baea8b95f31d",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -16,45 +16,69 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs_2": {
|
"nixpkgs-master": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1768393167,
|
"lastModified": 1773150927,
|
||||||
"narHash": "sha256-n2063BRjHde6DqAz2zavhOOiLUwA3qXt7jQYHyETjX8=",
|
"narHash": "sha256-0Js8/ZxXH575nfmUENgX2JlFY6GrXjFTlQT81mfN1bQ=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "2f594d5af95d4fdac67fba60376ec11e482041cb",
|
"rev": "2d82c4ce7238cc3e5bf80ba48894185ea3947615",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"ref": "nixpkgs-unstable",
|
"ref": "master",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"opencode": {
|
"opencode": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": "nixpkgs_2"
|
"nixpkgs": [
|
||||||
|
"nixpkgs-master"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1769733066,
|
"lastModified": 1773072574,
|
||||||
"narHash": "sha256-+CBqfdK3mw5qnl4sViFEcTSslW0sOE53AtryD2MdhTI=",
|
"narHash": "sha256-smGIc6lYWSjfmGAikoYpP7GbB6mWacrPWrRtp/+HJ3E=",
|
||||||
"owner": "anomalyco",
|
"owner": "anomalyco",
|
||||||
"repo": "opencode",
|
"repo": "opencode",
|
||||||
"rev": "bbc7bdb3fd5078d0add23273e0fdae436b9b47e4",
|
"rev": "c6262f9d4002d86a1f1795c306aa329d45361d12",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "anomalyco",
|
"owner": "anomalyco",
|
||||||
"ref": "v1.1.43",
|
"ref": "v1.2.24",
|
||||||
"repo": "opencode",
|
"repo": "opencode",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"openspec": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1772182342,
|
||||||
|
"narHash": "sha256-9Q0iUyZGcDPLdgvnrBN3GumV8g9akV8TFb8bFkD1yYs=",
|
||||||
|
"owner": "Fission-AI",
|
||||||
|
"repo": "OpenSpec",
|
||||||
|
"rev": "afdca0d5dab1aa109cfd8848b2512333ccad60c3",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "Fission-AI",
|
||||||
|
"repo": "OpenSpec",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": "nixpkgs",
|
"nixpkgs": "nixpkgs",
|
||||||
"opencode": "opencode"
|
"nixpkgs-master": "nixpkgs-master",
|
||||||
|
"opencode": "opencode",
|
||||||
|
"openspec": "openspec"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
75
flake.nix
75
flake.nix
@@ -3,10 +3,19 @@
|
|||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
opencode.url = "github:anomalyco/opencode/v1.1.43";
|
nixpkgs-master.url = "github:NixOS/nixpkgs/master";
|
||||||
|
|
||||||
# Optional: Add stable channel if needed
|
# opencode needs newer bun from master
|
||||||
# nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-24.05";
|
opencode = {
|
||||||
|
url = "github:anomalyco/opencode/v1.2.24";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs-master";
|
||||||
|
};
|
||||||
|
|
||||||
|
# openspec - spec-driven development for AI coding assistants
|
||||||
|
openspec = {
|
||||||
|
url = "github:Fission-AI/OpenSpec";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = {
|
outputs = {
|
||||||
@@ -15,12 +24,7 @@
|
|||||||
...
|
...
|
||||||
} @ inputs: let
|
} @ inputs: let
|
||||||
# Supported systems
|
# Supported systems
|
||||||
systems = [
|
systems = ["x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin"];
|
||||||
"x86_64-linux"
|
|
||||||
"aarch64-linux"
|
|
||||||
"x86_64-darwin"
|
|
||||||
"aarch64-darwin"
|
|
||||||
];
|
|
||||||
|
|
||||||
# Helper function to generate an attrset for each of the systems
|
# Helper function to generate an attrset for each of the systems
|
||||||
forAllSystems = nixpkgs.lib.genAttrs systems;
|
forAllSystems = nixpkgs.lib.genAttrs systems;
|
||||||
@@ -33,12 +37,10 @@
|
|||||||
};
|
};
|
||||||
in {
|
in {
|
||||||
# Custom packages - accessible via 'nix build .#package-name'
|
# Custom packages - accessible via 'nix build .#package-name'
|
||||||
packages = forAllSystems (
|
packages = forAllSystems (system: let
|
||||||
system: let
|
pkgs = pkgsFor system;
|
||||||
pkgs = pkgsFor system;
|
in
|
||||||
in
|
import ./pkgs {inherit pkgs inputs;});
|
||||||
import ./pkgs {inherit pkgs inputs;}
|
|
||||||
);
|
|
||||||
|
|
||||||
# Overlays - can be imported in your system configuration
|
# Overlays - can be imported in your system configuration
|
||||||
overlays = {
|
overlays = {
|
||||||
@@ -56,8 +58,7 @@
|
|||||||
inputs = inputs;
|
inputs = inputs;
|
||||||
};
|
};
|
||||||
|
|
||||||
modifications = final: prev:
|
modifications = final: prev: import ./overlays/mods {inherit prev;};
|
||||||
import ./overlays/mods {inherit prev;};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
# NixOS modules - for system-level configuration
|
# NixOS modules - for system-level configuration
|
||||||
@@ -76,28 +77,34 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
# Library functions - helper utilities for your configuration
|
# Library functions - helper utilities for your configuration
|
||||||
lib = forAllSystems (
|
lib = forAllSystems (system: let
|
||||||
system: let
|
pkgs = pkgsFor system;
|
||||||
pkgs = pkgsFor system;
|
in
|
||||||
in
|
import ./lib {lib = pkgs.lib;});
|
||||||
import ./lib {lib = pkgs.lib;}
|
|
||||||
);
|
|
||||||
|
|
||||||
# Development shells for various programming environments
|
# Development shells for various programming environments
|
||||||
# Usage: nix develop .#<shell-name>
|
# Usage: nix develop .#<shell-name>
|
||||||
# Available shells: default, python, devops
|
# Available shells: default, python, devops, opencode
|
||||||
devShells = forAllSystems (
|
devShells = forAllSystems (system: let
|
||||||
system: let
|
pkgs = pkgsFor system;
|
||||||
pkgs = pkgsFor system;
|
in
|
||||||
in
|
import ./shells {inherit pkgs inputs;});
|
||||||
import ./shells {inherit pkgs;}
|
|
||||||
);
|
|
||||||
|
|
||||||
# Formatter for 'nix fmt'
|
# Formatter for 'nix fmt'
|
||||||
formatter = forAllSystems (
|
formatter = forAllSystems (system: (pkgsFor system).alejandra);
|
||||||
system:
|
|
||||||
(pkgsFor system).alejandra
|
# Checks for 'nix flake check' - verifies all packages build
|
||||||
);
|
checks = forAllSystems (system: let
|
||||||
|
pkgs = pkgsFor system;
|
||||||
|
packages = import ./pkgs {inherit pkgs inputs;};
|
||||||
|
in
|
||||||
|
builtins.mapAttrs (name: pkg: pkgs.lib.hydraJob pkg) packages
|
||||||
|
// {
|
||||||
|
formatting = pkgs.runCommand "check-formatting" {} ''
|
||||||
|
${pkgs.alejandra}/bin/alejandra --check ${./.}
|
||||||
|
touch $out
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
|
||||||
# Templates for creating new packages/modules
|
# Templates for creating new packages/modules
|
||||||
templates = {
|
templates = {
|
||||||
|
|||||||
@@ -7,6 +7,6 @@
|
|||||||
# Port management utilities
|
# Port management utilities
|
||||||
ports = import ./ports.nix {inherit lib;};
|
ports = import ./ports.nix {inherit lib;};
|
||||||
|
|
||||||
# Add more helper modules here as needed
|
# OpenCode rules injection utilities
|
||||||
# example = import ./example.nix { inherit lib; };
|
opencode-rules = import ./opencode-rules.nix {inherit lib;};
|
||||||
}
|
}
|
||||||
|
|||||||
116
lib/opencode-rules.nix
Normal file
116
lib/opencode-rules.nix
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
# Opencode rules management utilities
|
||||||
|
#
|
||||||
|
# This module provides functions to configure Opencode agent rules across
|
||||||
|
# multiple projects. Rules are defined in the AGENTS repository and can be
|
||||||
|
# selectively included based on language, framework, and concerns.
|
||||||
|
#
|
||||||
|
# Usage in your configuration:
|
||||||
|
#
|
||||||
|
# # In your flake or configuration:
|
||||||
|
# let
|
||||||
|
# m3taLib = inputs.m3ta-nixpkgs.lib.${system};
|
||||||
|
#
|
||||||
|
# rules = m3taLib.opencode-rules.mkOpencodeRules {
|
||||||
|
# agents = inputs.agents;
|
||||||
|
# languages = [ "python" "typescript" ];
|
||||||
|
# concerns = [ "coding-style" "naming" "documentation" ];
|
||||||
|
# frameworks = [ "react" "fastapi" ];
|
||||||
|
# };
|
||||||
|
# in {
|
||||||
|
# # Use in your devShell:
|
||||||
|
# devShells.default = pkgs.mkShell {
|
||||||
|
# shellHook = rules.shellHook;
|
||||||
|
# inherit (rules) instructions;
|
||||||
|
# };
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# The shellHook creates:
|
||||||
|
# - A `.opencode-rules/` symlink pointing to the AGENTS repository rules directory
|
||||||
|
# - An `opencode.json` file with a $schema reference and instructions list
|
||||||
|
#
|
||||||
|
# The instructions list contains paths relative to the project root, all prefixed
|
||||||
|
# with `.opencode-rules/`, making them portable across different project locations.
|
||||||
|
{lib}: {
|
||||||
|
# Create Opencode rules configuration from AGENTS repository
|
||||||
|
#
|
||||||
|
# Args:
|
||||||
|
# agents: Path to the AGENTS repository (non-flake input)
|
||||||
|
# languages: Optional list of language-specific rules to include
|
||||||
|
# (e.g., [ "python" "typescript" "rust" ])
|
||||||
|
# concerns: Optional list of concern rules to include
|
||||||
|
# Default: [ "coding-style" "naming" "documentation" "testing" "git-workflow" "project-structure" ]
|
||||||
|
# frameworks: Optional list of framework-specific rules to include
|
||||||
|
# (e.g., [ "react" "fastapi" "django" ])
|
||||||
|
# extraInstructions: Optional list of additional instruction paths
|
||||||
|
# (for custom rules outside standard locations)
|
||||||
|
#
|
||||||
|
# Returns:
|
||||||
|
# An attribute set containing:
|
||||||
|
# - shellHook: Bash code to create symlink and opencode.json
|
||||||
|
# - instructions: List of rule file paths (relative to project root)
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# mkOpencodeRules {
|
||||||
|
# agents = inputs.agents;
|
||||||
|
# languages = [ "python" ];
|
||||||
|
# frameworks = [ "fastapi" ];
|
||||||
|
# }
|
||||||
|
# # Returns:
|
||||||
|
# # {
|
||||||
|
# # shellHook = "...";
|
||||||
|
# # instructions = [
|
||||||
|
# # ".opencode-rules/concerns/coding-style.md"
|
||||||
|
# # ".opencode-rules/concerns/naming.md"
|
||||||
|
# # ".opencode-rules/concerns/documentation.md"
|
||||||
|
# # ".opencode-rules/concerns/testing.md"
|
||||||
|
# # ".opencode-rules/concerns/git-workflow.md"
|
||||||
|
# # ".opencode-rules/concerns/project-structure.md"
|
||||||
|
# # ".opencode-rules/languages/python.md"
|
||||||
|
# # ".opencode-rules/frameworks/fastapi.md"
|
||||||
|
# # ];
|
||||||
|
# # }
|
||||||
|
mkOpencodeRules = {
|
||||||
|
agents,
|
||||||
|
languages ? [],
|
||||||
|
concerns ? [
|
||||||
|
"coding-style"
|
||||||
|
"naming"
|
||||||
|
"documentation"
|
||||||
|
"testing"
|
||||||
|
"git-workflow"
|
||||||
|
"project-structure"
|
||||||
|
],
|
||||||
|
frameworks ? [],
|
||||||
|
extraInstructions ? [],
|
||||||
|
}: let
|
||||||
|
rulesDir = ".opencode-rules";
|
||||||
|
|
||||||
|
# Build instructions list by mapping concerns, languages, frameworks to their file paths
|
||||||
|
# All paths are relative to project root via the rulesDir symlink
|
||||||
|
instructions =
|
||||||
|
(map (c: "${rulesDir}/concerns/${c}.md") concerns)
|
||||||
|
++ (map (l: "${rulesDir}/languages/${l}.md") languages)
|
||||||
|
++ (map (f: "${rulesDir}/frameworks/${f}.md") frameworks)
|
||||||
|
++ extraInstructions;
|
||||||
|
|
||||||
|
# Generate JSON configuration for Opencode
|
||||||
|
opencodeConfig = {
|
||||||
|
"$schema" = "https://opencode.ai/config.json";
|
||||||
|
inherit instructions;
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
inherit instructions;
|
||||||
|
|
||||||
|
# Shell hook to set up rules in the project
|
||||||
|
# Creates a symlink to the AGENTS rules directory and generates opencode.json
|
||||||
|
shellHook = ''
|
||||||
|
# Create/update symlink to AGENTS rules directory
|
||||||
|
ln -sfn ${agents}/rules ${rulesDir}
|
||||||
|
|
||||||
|
# Generate opencode.json configuration file
|
||||||
|
cat > opencode.json <<'OPENCODE_EOF'
|
||||||
|
${builtins.toJSON opencodeConfig}
|
||||||
|
OPENCODE_EOF
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -29,7 +29,7 @@ in {
|
|||||||
withNodeJs = true;
|
withNodeJs = true;
|
||||||
withPython3 = true;
|
withPython3 = true;
|
||||||
|
|
||||||
# This is your init.lua content
|
# This is your init.lua content (extraLuaConfig for compatibility with older home-manager)
|
||||||
extraLuaConfig = ''
|
extraLuaConfig = ''
|
||||||
-- Bootstrap lazy.nvim
|
-- Bootstrap lazy.nvim
|
||||||
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
|
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
|
||||||
|
|||||||
@@ -1,64 +0,0 @@
|
|||||||
{
|
|
||||||
lib,
|
|
||||||
stdenv,
|
|
||||||
buildGoModule,
|
|
||||||
fetchFromGitHub,
|
|
||||||
gitMinimal,
|
|
||||||
installShellFiles,
|
|
||||||
nix-update-script,
|
|
||||||
versionCheckHook,
|
|
||||||
writableTmpDirAsHomeHook,
|
|
||||||
}:
|
|
||||||
buildGoModule (finalAttrs: {
|
|
||||||
pname = "beads";
|
|
||||||
version = "0.49.1";
|
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
|
||||||
owner = "steveyegge";
|
|
||||||
repo = "beads";
|
|
||||||
tag = "v${finalAttrs.version}";
|
|
||||||
hash = "sha256-roOyTMy9nKxH2Bk8MnP4h2CDjStwK6z0ThQhFcM64QI=";
|
|
||||||
};
|
|
||||||
|
|
||||||
vendorHash = "sha256-YU+bRLVlWtHzJ1QPzcKJ70f+ynp8lMoIeFlm+29BNPE=";
|
|
||||||
|
|
||||||
subPackages = ["cmd/bd"];
|
|
||||||
|
|
||||||
ldflags = ["-s" "-w"];
|
|
||||||
|
|
||||||
nativeBuildInputs = [installShellFiles];
|
|
||||||
|
|
||||||
nativeCheckInputs = [gitMinimal writableTmpDirAsHomeHook];
|
|
||||||
|
|
||||||
# Skip security tests on Darwin - they check for /etc/passwd which isn't available in sandbox
|
|
||||||
checkFlags =
|
|
||||||
lib.optionals stdenv.hostPlatform.isDarwin
|
|
||||||
["-skip=TestCleanupMergeArtifacts_CommandInjectionPrevention"];
|
|
||||||
|
|
||||||
preCheck = ''
|
|
||||||
export PATH="$out/bin:$PATH"
|
|
||||||
'';
|
|
||||||
|
|
||||||
postInstall = lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
|
|
||||||
installShellCompletion --cmd bd \
|
|
||||||
--bash <($out/bin/bd completion bash) \
|
|
||||||
--fish <($out/bin/bd completion fish) \
|
|
||||||
--zsh <($out/bin/bd completion zsh)
|
|
||||||
'';
|
|
||||||
|
|
||||||
nativeInstallCheckInputs = [versionCheckHook writableTmpDirAsHomeHook];
|
|
||||||
versionCheckProgramArg = "version";
|
|
||||||
doInstallCheck = true;
|
|
||||||
|
|
||||||
doCheck = false;
|
|
||||||
|
|
||||||
passthru.updateScript = nix-update-script {};
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
description = "Lightweight memory system for AI coding agents with graph-based issue tracking";
|
|
||||||
homepage = "https://github.com/steveyegge/beads";
|
|
||||||
license = lib.licenses.mit;
|
|
||||||
maintainers = with lib.maintainers; [kedry];
|
|
||||||
mainProgram = "bd";
|
|
||||||
};
|
|
||||||
})
|
|
||||||
@@ -1,20 +1,25 @@
|
|||||||
{ pkgs, inputs ? null, ... }: {
|
{
|
||||||
|
pkgs,
|
||||||
|
inputs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
# Custom packages registry
|
# Custom packages registry
|
||||||
# Each package is defined in its own directory under pkgs/
|
# Each package is defined in its own directory under pkgs/
|
||||||
beads = pkgs.callPackage ./beads { };
|
sidecar = pkgs.callPackage ./sidecar {};
|
||||||
code2prompt = pkgs.callPackage ./code2prompt { };
|
td = pkgs.callPackage ./td {};
|
||||||
hyprpaper-random = pkgs.callPackage ./hyprpaper-random { };
|
code2prompt = pkgs.callPackage ./code2prompt {};
|
||||||
launch-webapp = pkgs.callPackage ./launch-webapp { };
|
hyprpaper-random = pkgs.callPackage ./hyprpaper-random {};
|
||||||
mem0 = pkgs.callPackage ./mem0 { };
|
launch-webapp = pkgs.callPackage ./launch-webapp {};
|
||||||
msty-studio = pkgs.callPackage ./msty-studio { };
|
mem0 = pkgs.callPackage ./mem0 {};
|
||||||
n8n = pkgs.callPackage ./n8n { };
|
msty-studio = pkgs.callPackage ./msty-studio {};
|
||||||
pomodoro-timer = pkgs.callPackage ./pomodoro-timer { };
|
notesmd-cli = pkgs.callPackage ./notesmd-cli {};
|
||||||
rofi-project-opener = pkgs.callPackage ./rofi-project-opener { };
|
n8n = pkgs.callPackage ./n8n {};
|
||||||
stt-ptt = pkgs.callPackage ./stt-ptt { };
|
pomodoro-timer = pkgs.callPackage ./pomodoro-timer {};
|
||||||
tuxedo-backlight = pkgs.callPackage ./tuxedo-backlight { };
|
rofi-project-opener = pkgs.callPackage ./rofi-project-opener {};
|
||||||
zellij-ps = pkgs.callPackage ./zellij-ps { };
|
stt-ptt = pkgs.callPackage ./stt-ptt {};
|
||||||
|
tuxedo-backlight = pkgs.callPackage ./tuxedo-backlight {};
|
||||||
|
zellij-ps = pkgs.callPackage ./zellij-ps {};
|
||||||
|
|
||||||
# Imported from flake inputs
|
# Imported from flake inputs
|
||||||
opencode = inputs.opencode.packages.${pkgs.system}.opencode;
|
opencode-desktop = pkgs.callPackage ./opencode-desktop {inherit inputs;};
|
||||||
opencode-desktop = pkgs.callPackage ./opencode-desktop { inherit inputs; };
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,14 +6,14 @@
|
|||||||
}:
|
}:
|
||||||
python3.pkgs.buildPythonPackage rec {
|
python3.pkgs.buildPythonPackage rec {
|
||||||
pname = "mem0ai";
|
pname = "mem0ai";
|
||||||
version = "1.0.2";
|
version = "1.0.5";
|
||||||
pyproject = true;
|
pyproject = true;
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "mem0ai";
|
owner = "mem0ai";
|
||||||
repo = "mem0";
|
repo = "mem0";
|
||||||
rev = "v${version}";
|
rev = "v${version}";
|
||||||
hash = "sha256-wvIPmqYlpto+ggifdSOjveEmSneKeZcoltItusYSu4Q=";
|
hash = "sha256-UGmDNCsvDPyAKfqo9BPP9ISnYkcNSJ5FS9mh3kAyo0M=";
|
||||||
};
|
};
|
||||||
|
|
||||||
# Relax Python dependency version constraints
|
# Relax Python dependency version constraints
|
||||||
|
|||||||
@@ -15,100 +15,113 @@
|
|||||||
libmongocrypt,
|
libmongocrypt,
|
||||||
libpq,
|
libpq,
|
||||||
makeWrapper,
|
makeWrapper,
|
||||||
}:
|
}: let
|
||||||
stdenv.mkDerivation (finalAttrs: {
|
python = python3.withPackages (ps: with ps; [websockets]);
|
||||||
pname = "n8n";
|
in
|
||||||
version = "n8n@2.4.8";
|
stdenv.mkDerivation (finalAttrs: {
|
||||||
|
pname = "n8n";
|
||||||
|
version = "2.9.4";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "n8n-io";
|
owner = "n8n-io";
|
||||||
repo = "n8n";
|
repo = "n8n";
|
||||||
tag = finalAttrs.version;
|
tag = "n8n@${finalAttrs.version}";
|
||||||
hash = "sha256-wl9+LluC35DbXhqzTpfCJwIRM6ZjMW+r6hDgjrZeJ2M=";
|
hash = "sha256-XXQPZHtY66gOQ+nYH+Q1IjbR+SRZ9g06sgBy2x8gGh4=";
|
||||||
};
|
};
|
||||||
|
|
||||||
pnpmDeps = fetchPnpmDeps {
|
pnpmDeps = fetchPnpmDeps {
|
||||||
inherit (finalAttrs) pname version src;
|
inherit (finalAttrs) pname version src;
|
||||||
pnpm = pnpm_10;
|
pnpm = pnpm_10;
|
||||||
fetcherVersion = 3;
|
fetcherVersion = 3;
|
||||||
hash = "sha256-QtusZm9WaLMjfopsX4t2WiiU++j3V/PQHbelKubhMII=";
|
hash = "sha256-TU7HIShYj20QtdcthP0nQdubYl0bdy+XM3CoX5Rvhzk=";
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs =
|
nativeBuildInputs =
|
||||||
[
|
[
|
||||||
pnpmConfigHook
|
pnpmConfigHook
|
||||||
pnpm_10
|
pnpm_10
|
||||||
python3 # required to build sqlite3 bindings
|
python3 # required to build sqlite3 bindings
|
||||||
node-gyp # required to build sqlite3 bindings
|
node-gyp # required to build sqlite3 bindings
|
||||||
makeWrapper
|
makeWrapper
|
||||||
]
|
]
|
||||||
++ lib.optional stdenv.hostPlatform.isDarwin [cctools xcbuild];
|
++ lib.optional stdenv.hostPlatform.isDarwin [cctools xcbuild];
|
||||||
|
|
||||||
buildInputs = [nodejs libkrb5 libmongocrypt libpq];
|
buildInputs = [nodejs libkrb5 libmongocrypt libpq];
|
||||||
|
|
||||||
buildPhase = ''
|
buildPhase = ''
|
||||||
runHook preBuild
|
runHook preBuild
|
||||||
|
|
||||||
pushd node_modules/sqlite3
|
pushd node_modules/sqlite3
|
||||||
node-gyp rebuild
|
node-gyp rebuild
|
||||||
popd
|
popd
|
||||||
|
|
||||||
# TODO: use deploy after resolved https://github.com/pnpm/pnpm/issues/5315
|
# TODO: use deploy after resolved https://github.com/pnpm/pnpm/issues/5315
|
||||||
pnpm build --filter=n8n
|
pnpm build --filter=n8n
|
||||||
|
|
||||||
runHook postBuild
|
runHook postBuild
|
||||||
'';
|
|
||||||
|
|
||||||
preInstall = ''
|
|
||||||
echo "Removing non-deterministic and unnecessary files"
|
|
||||||
|
|
||||||
find -type d -name .turbo -exec rm -rf {} +
|
|
||||||
rm node_modules/.modules.yaml
|
|
||||||
rm packages/nodes-base/dist/types/nodes.json
|
|
||||||
|
|
||||||
CI=true pnpm --ignore-scripts prune --prod
|
|
||||||
find -type f \( -name "*.ts" -o -name "*.map" \) -exec rm -rf {} +
|
|
||||||
rm -rf node_modules/.pnpm/{typescript*,prettier*}
|
|
||||||
shopt -s globstar
|
|
||||||
# https://github.com/pnpm/pnpm/issues/3645
|
|
||||||
find node_modules packages/**/node_modules -xtype l -delete
|
|
||||||
|
|
||||||
echo "Removed non-deterministic and unnecessary files"
|
|
||||||
'';
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
runHook preInstall
|
|
||||||
|
|
||||||
mkdir -p $out/{bin,lib/n8n}
|
|
||||||
mv {packages,node_modules} $out/lib/n8n
|
|
||||||
|
|
||||||
makeWrapper $out/lib/n8n/packages/cli/bin/n8n $out/bin/n8n \
|
|
||||||
--set N8N_RELEASE_TYPE "stable"
|
|
||||||
|
|
||||||
runHook postInstall
|
|
||||||
'';
|
|
||||||
|
|
||||||
passthru = {
|
|
||||||
tests = nixosTests.n8n;
|
|
||||||
updateScript = ./update.sh;
|
|
||||||
};
|
|
||||||
|
|
||||||
# this package has ~80000 files, these take too long and seem to be unnecessary
|
|
||||||
dontStrip = true;
|
|
||||||
dontPatchELF = true;
|
|
||||||
dontRewriteSymlinks = true;
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
description = "Free and source-available fair-code licensed workflow automation tool";
|
|
||||||
longDescription = ''
|
|
||||||
Free and source-available fair-code licensed workflow automation tool.
|
|
||||||
Easily automate tasks across different services.
|
|
||||||
'';
|
'';
|
||||||
homepage = "https://n8n.io";
|
|
||||||
changelog = "https://github.com/n8n-io/n8n/releases/tag/n8n@${finalAttrs.version}";
|
preInstall = ''
|
||||||
maintainers = with lib.maintainers; [gepbird AdrienLemaire sweenu];
|
echo "Removing non-deterministic and unnecessary files"
|
||||||
license = lib.licenses.sustainableUse;
|
|
||||||
mainProgram = "n8n";
|
find -type d -name .turbo -exec rm -rf {} +
|
||||||
platforms = lib.platforms.unix;
|
rm node_modules/.modules.yaml
|
||||||
};
|
rm packages/nodes-base/dist/types/nodes.json
|
||||||
})
|
|
||||||
|
CI=true pnpm --ignore-scripts prune --prod
|
||||||
|
find -type f \( -name "*.ts" -o -name "*.map" \) -exec rm -rf {} +
|
||||||
|
rm -rf node_modules/.pnpm/{typescript*,prettier*}
|
||||||
|
shopt -s globstar
|
||||||
|
# https://github.com/pnpm/pnpm/issues/3645
|
||||||
|
find node_modules packages/**/node_modules -xtype l -delete
|
||||||
|
|
||||||
|
echo "Removed non-deterministic and unnecessary files"
|
||||||
|
'';
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
|
mkdir -p $out/{bin,lib/n8n}
|
||||||
|
cp -r {packages,node_modules} $out/lib/n8n
|
||||||
|
|
||||||
|
makeWrapper $out/lib/n8n/packages/cli/bin/n8n $out/bin/n8n \
|
||||||
|
--set N8N_RELEASE_TYPE "stable"
|
||||||
|
|
||||||
|
# JavaScript runner
|
||||||
|
makeWrapper ${nodejs}/bin/node $out/bin/n8n-task-runner \
|
||||||
|
--add-flags "$out/lib/n8n/packages/@n8n/task-runner/dist/start.js"
|
||||||
|
|
||||||
|
# Python runner
|
||||||
|
mkdir -p $out/lib/n8n-task-runner-python
|
||||||
|
cp -r packages/@n8n/task-runner-python/* $out/lib/n8n-task-runner-python/
|
||||||
|
makeWrapper ${python}/bin/python $out/bin/n8n-task-runner-python \
|
||||||
|
--add-flags "$out/lib/n8n-task-runner-python/src/main.py" \
|
||||||
|
--prefix PYTHONPATH : "$out/lib/n8n-task-runner-python"
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
tests = nixosTests.n8n;
|
||||||
|
updateScript = ./update.sh;
|
||||||
|
};
|
||||||
|
|
||||||
|
# this package has ~80000 files, these take too long and seem to be unnecessary
|
||||||
|
dontStrip = true;
|
||||||
|
dontPatchELF = true;
|
||||||
|
dontRewriteSymlinks = true;
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "Free and source-available fair-code licensed workflow automation tool";
|
||||||
|
longDescription = ''
|
||||||
|
Free and source-available fair-code licensed workflow automation tool.
|
||||||
|
Easily automate tasks across different services.
|
||||||
|
'';
|
||||||
|
homepage = "https://n8n.io";
|
||||||
|
changelog = "https://github.com/n8n-io/n8n/releases/tag/n8n@${finalAttrs.version}";
|
||||||
|
maintainers = with lib.maintainers; [gepbird AdrienLemaire sweenu];
|
||||||
|
license = lib.licenses.sustainableUse;
|
||||||
|
mainProgram = "n8n";
|
||||||
|
platforms = lib.platforms.unix;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
|||||||
@@ -3,4 +3,4 @@
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
new_version="$(curl -s "https://api.github.com/repos/n8n-io/n8n/releases/latest" | jq --raw-output '.tag_name | ltrimstr("n8n@")')"
|
new_version="$(curl -s "https://api.github.com/repos/n8n-io/n8n/releases/latest" | jq --raw-output '.tag_name | ltrimstr("n8n@")')"
|
||||||
nix-update n8n --version "$new_version"
|
nix-update n8n --flake --version "$new_version"
|
||||||
|
|||||||
31
pkgs/notesmd-cli/default.nix
Normal file
31
pkgs/notesmd-cli/default.nix
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
buildGoModule,
|
||||||
|
fetchFromGitHub,
|
||||||
|
nix-update-script,
|
||||||
|
}:
|
||||||
|
buildGoModule (finalAttrs: {
|
||||||
|
pname = "notesmd-cli";
|
||||||
|
version = "0.3.2";
|
||||||
|
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "Yakitrak";
|
||||||
|
repo = "notesmd-cli";
|
||||||
|
tag = "v${finalAttrs.version}";
|
||||||
|
hash = "sha256-/yewtA5eJ4hxwZ4bBx8Pef+/TSY6Hfv15AAB9lxsW+4=";
|
||||||
|
};
|
||||||
|
|
||||||
|
vendorHash = null;
|
||||||
|
|
||||||
|
ldflags = ["-s" "-w"];
|
||||||
|
|
||||||
|
passthru.updateScript = nix-update-script {};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "Obsidian CLI (Community) - Interact with Obsidian in the terminal";
|
||||||
|
homepage = "https://github.com/Yakitrak/notesmd-cli";
|
||||||
|
license = lib.licenses.mit;
|
||||||
|
platforms = lib.platforms.unix;
|
||||||
|
mainProgram = "notesmd-cli";
|
||||||
|
};
|
||||||
|
})
|
||||||
@@ -1,23 +1,106 @@
|
|||||||
{ lib, stdenv, symlinkJoin, makeWrapper, inputs ? null, }:
|
{
|
||||||
let
|
lib,
|
||||||
opencode-desktop =
|
stdenv,
|
||||||
inputs.opencode.packages.${stdenv.hostPlatform.system}.desktop;
|
symlinkJoin,
|
||||||
in symlinkJoin {
|
makeWrapper,
|
||||||
name = "opencode-desktop";
|
rustPlatform,
|
||||||
paths = [ opencode-desktop ];
|
pkg-config,
|
||||||
|
cargo-tauri,
|
||||||
|
bun,
|
||||||
|
nodejs,
|
||||||
|
cargo,
|
||||||
|
rustc,
|
||||||
|
jq,
|
||||||
|
wrapGAppsHook4,
|
||||||
|
dbus,
|
||||||
|
glib,
|
||||||
|
gtk4,
|
||||||
|
libsoup_3,
|
||||||
|
librsvg,
|
||||||
|
libappindicator,
|
||||||
|
glib-networking,
|
||||||
|
openssl,
|
||||||
|
webkitgtk_4_1,
|
||||||
|
gst_all_1,
|
||||||
|
inputs ? null,
|
||||||
|
}: let
|
||||||
|
# Get upstream opencode package for shared attributes
|
||||||
|
opencode = inputs.opencode.packages.${stdenv.hostPlatform.system}.default;
|
||||||
|
|
||||||
nativeBuildInputs = [ makeWrapper ];
|
# Workaround for https://github.com/anomalyco/opencode/issues/11755
|
||||||
|
# Upstream is missing outputHashes for git dependencies
|
||||||
|
opencode-desktop = rustPlatform.buildRustPackage (finalAttrs: {
|
||||||
|
pname = "opencode-desktop";
|
||||||
|
inherit (opencode) version src node_modules patches;
|
||||||
|
|
||||||
postBuild = ''
|
cargoRoot = "packages/desktop/src-tauri";
|
||||||
wrapProgram $out/bin/opencode-desktop \
|
cargoLock = {
|
||||||
--run 'if [[ "$NIXOS_OZONE_WL" == "1" ]]; then export OC_ALLOW_WAYLAND=1; fi'
|
lockFile = finalAttrs.src + "/packages/desktop/src-tauri/Cargo.lock";
|
||||||
'';
|
outputHashes = {
|
||||||
|
"specta-2.0.0-rc.22" = "sha256-YsyOAnXELLKzhNlJ35dHA6KGbs0wTAX/nlQoW8wWyJQ=";
|
||||||
|
"tauri-2.9.5" = "sha256-dv5E/+A49ZBvnUQUkCGGJ21iHrVvrhHKNcpUctivJ8M=";
|
||||||
|
"tauri-specta-2.0.0-rc.21" = "sha256-n2VJ+B1nVrh6zQoZyfMoctqP+Csh7eVHRXwUQuiQjaQ=";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
buildAndTestSubdir = finalAttrs.cargoRoot;
|
||||||
|
|
||||||
meta = {
|
nativeBuildInputs =
|
||||||
description = "OpenCode Desktop App with Wayland support";
|
[pkg-config cargo-tauri.hook bun nodejs cargo rustc jq makeWrapper]
|
||||||
homepage = "https://opencode.ai";
|
++ lib.optionals stdenv.hostPlatform.isLinux [wrapGAppsHook4];
|
||||||
license = lib.licenses.mit;
|
|
||||||
platforms = lib.platforms.linux;
|
buildInputs = lib.optionals stdenv.isLinux [
|
||||||
mainProgram = "opencode-desktop";
|
dbus
|
||||||
};
|
glib
|
||||||
}
|
gtk4
|
||||||
|
libsoup_3
|
||||||
|
librsvg
|
||||||
|
libappindicator
|
||||||
|
glib-networking
|
||||||
|
openssl
|
||||||
|
webkitgtk_4_1
|
||||||
|
gst_all_1.gstreamer
|
||||||
|
gst_all_1.gst-plugins-base
|
||||||
|
gst_all_1.gst-plugins-good
|
||||||
|
gst_all_1.gst-plugins-bad
|
||||||
|
];
|
||||||
|
|
||||||
|
strictDeps = true;
|
||||||
|
|
||||||
|
preBuild = ''
|
||||||
|
cp -a ${finalAttrs.node_modules}/{node_modules,packages} .
|
||||||
|
chmod -R u+w node_modules packages
|
||||||
|
patchShebangs node_modules
|
||||||
|
patchShebangs packages/desktop/node_modules
|
||||||
|
|
||||||
|
mkdir -p packages/desktop/src-tauri/sidecars
|
||||||
|
cp ${opencode}/bin/opencode packages/desktop/src-tauri/sidecars/opencode-cli-${stdenv.hostPlatform.rust.rustcTarget}
|
||||||
|
'';
|
||||||
|
|
||||||
|
tauriBuildFlags = ["--config" "tauri.prod.conf.json" "--no-sign"];
|
||||||
|
|
||||||
|
postFixup = lib.optionalString stdenv.hostPlatform.isLinux ''
|
||||||
|
mv $out/bin/OpenCode $out/bin/opencode-desktop
|
||||||
|
sed -i 's|^Exec=OpenCode$|Exec=opencode-desktop|' $out/share/applications/OpenCode.desktop
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
# Wrapper for Wayland support
|
||||||
|
in
|
||||||
|
symlinkJoin {
|
||||||
|
name = "opencode-desktop";
|
||||||
|
paths = [opencode-desktop];
|
||||||
|
|
||||||
|
nativeBuildInputs = [makeWrapper];
|
||||||
|
|
||||||
|
postBuild = ''
|
||||||
|
wrapProgram $out/bin/opencode-desktop \
|
||||||
|
--run 'if [[ "$NIXOS_OZONE_WL" == "1" ]]; then export OC_ALLOW_WAYLAND=1; fi'
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "OpenCode Desktop App with Wayland support";
|
||||||
|
homepage = "https://opencode.ai";
|
||||||
|
license = lib.licenses.mit;
|
||||||
|
platforms = lib.platforms.linux;
|
||||||
|
mainProgram = "opencode-desktop";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|||||||
68
pkgs/sidecar/default.nix
Normal file
68
pkgs/sidecar/default.nix
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
buildGoModule,
|
||||||
|
fetchFromGitHub,
|
||||||
|
gitMinimal,
|
||||||
|
makeWrapper, # Add this
|
||||||
|
nix-update-script,
|
||||||
|
opencode,
|
||||||
|
td,
|
||||||
|
tmux,
|
||||||
|
versionCheckHook,
|
||||||
|
writableTmpDirAsHomeHook,
|
||||||
|
}:
|
||||||
|
buildGoModule (finalAttrs: {
|
||||||
|
pname = "sidecar";
|
||||||
|
version = "0.78.0";
|
||||||
|
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "marcus";
|
||||||
|
repo = "sidecar";
|
||||||
|
tag = "v${finalAttrs.version}";
|
||||||
|
hash = "sha256-dVRSd8svfuv1+fYbHpFtXYHXvbAqomXKu9qi6Y5Y5S4=";
|
||||||
|
};
|
||||||
|
|
||||||
|
vendorHash = "sha256-WIhE4CNbxmXaCczLOpFmAkxFcM37iE2tFuUmRnKRN54=";
|
||||||
|
|
||||||
|
subPackages = ["cmd/sidecar"];
|
||||||
|
|
||||||
|
ldflags = [
|
||||||
|
"-s"
|
||||||
|
"-w"
|
||||||
|
"-X main.Version=v${finalAttrs.version}" # Can combine these
|
||||||
|
];
|
||||||
|
|
||||||
|
nativeBuildInputs = [makeWrapper]; # Add this
|
||||||
|
|
||||||
|
nativeCheckInputs = [
|
||||||
|
gitMinimal
|
||||||
|
writableTmpDirAsHomeHook
|
||||||
|
];
|
||||||
|
|
||||||
|
nativeInstallCheckInputs = [
|
||||||
|
versionCheckHook
|
||||||
|
writableTmpDirAsHomeHook
|
||||||
|
];
|
||||||
|
|
||||||
|
versionCheckProgramArg = "--version";
|
||||||
|
doInstallCheck = true;
|
||||||
|
doCheck = false;
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
wrapProgram $out/bin/sidecar \
|
||||||
|
--prefix PATH : ${lib.makeBinPath [opencode td tmux]}
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
updateScript = nix-update-script {};
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "Use sidecar next to CLI agents for diffs, file trees, conversation history, and task management with td";
|
||||||
|
homepage = "https://github.com/marcus/sidecar";
|
||||||
|
changelog = "https://github.com/marcus/sidecar/releases/tag/v${finalAttrs.version}";
|
||||||
|
license = lib.licenses.mit;
|
||||||
|
mainProgram = "sidecar";
|
||||||
|
platforms = lib.platforms.unix;
|
||||||
|
};
|
||||||
|
})
|
||||||
47
pkgs/td/default.nix
Normal file
47
pkgs/td/default.nix
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
buildGoModule,
|
||||||
|
fetchFromGitHub,
|
||||||
|
gitMinimal,
|
||||||
|
nix-update-script,
|
||||||
|
versionCheckHook,
|
||||||
|
writableTmpDirAsHomeHook,
|
||||||
|
}:
|
||||||
|
buildGoModule (finalAttrs: {
|
||||||
|
pname = "td";
|
||||||
|
version = "0.42.0";
|
||||||
|
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "marcus";
|
||||||
|
repo = "td";
|
||||||
|
tag = "v${finalAttrs.version}";
|
||||||
|
hash = "sha256-fUvEgbwN3zBb4r64GwLlUNVydVacP0wiOIBb1BuPWzQ=";
|
||||||
|
};
|
||||||
|
|
||||||
|
vendorHash = "sha256-8mOebFPbf7+hCpn9hUrE0IGu6deEPSujr+yHqrzYEec=";
|
||||||
|
|
||||||
|
ldflags = [
|
||||||
|
"-s"
|
||||||
|
"-w"
|
||||||
|
"-X"
|
||||||
|
"main.Version=v${finalAttrs.version}"
|
||||||
|
];
|
||||||
|
|
||||||
|
nativeCheckInputs = [gitMinimal writableTmpDirAsHomeHook];
|
||||||
|
|
||||||
|
nativeInstallCheckInputs = [versionCheckHook writableTmpDirAsHomeHook];
|
||||||
|
versionCheckProgramArg = "version";
|
||||||
|
doInstallCheck = true;
|
||||||
|
|
||||||
|
doCheck = false;
|
||||||
|
|
||||||
|
passthru.updateScript = nix-update-script {};
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = "Minimalist CLI for tracking tasks across AI coding sessions";
|
||||||
|
homepage = "https://github.com/marcus/td";
|
||||||
|
license = licenses.mit;
|
||||||
|
mainProgram = "td";
|
||||||
|
platforms = platforms.unix;
|
||||||
|
};
|
||||||
|
})
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
# Development shells for various programming environments
|
# Development shells for various programming environments
|
||||||
# Each shell can be accessed via: nix develop .#<shell-name>
|
# Each shell can be accessed via: nix develop .#<shell-name>
|
||||||
# Or used in home-manager/system configs
|
# Or used in home-manager/system configs
|
||||||
{pkgs}: {
|
{
|
||||||
|
pkgs,
|
||||||
|
inputs,
|
||||||
|
}: {
|
||||||
# Default shell for working on this repository
|
# Default shell for working on this repository
|
||||||
default = pkgs.mkShell {
|
default = pkgs.mkShell {
|
||||||
name = "m3ta-nixpkgs-dev";
|
name = "m3ta-nixpkgs-dev";
|
||||||
@@ -27,6 +30,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
# Import all individual shell environments
|
# Import all individual shell environments
|
||||||
python = import ./python.nix {inherit pkgs;};
|
python = import ./python.nix {inherit pkgs inputs;};
|
||||||
devops = import ./devops.nix {inherit pkgs;};
|
devops = import ./devops.nix {inherit pkgs inputs;};
|
||||||
|
opencode = import ./opencode.nix {inherit pkgs inputs;};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
# DevOps development environment
|
# DevOps development environment
|
||||||
# Usage: nix develop .#devops
|
# Usage: nix develop .#devops
|
||||||
{pkgs}:
|
{
|
||||||
|
pkgs,
|
||||||
|
inputs ? null,
|
||||||
|
}:
|
||||||
pkgs.mkShell {
|
pkgs.mkShell {
|
||||||
name = "devops-dev";
|
name = "devops-dev";
|
||||||
|
|
||||||
|
|||||||
155
shells/opencode.nix
Normal file
155
shells/opencode.nix
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
# OpenCode development environment with AI coding rules
|
||||||
|
# This shell demonstrates the mkOpencodeRules library provided by this repository
|
||||||
|
# Usage: nix develop .#opencode
|
||||||
|
#
|
||||||
|
# To enable OpenCode rules, add the agents input to your flake:
|
||||||
|
# agents = {
|
||||||
|
# url = "git+https://code.m3ta.dev/m3tam3re/AGENTS";
|
||||||
|
# flake = false;
|
||||||
|
# };
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
lib ? pkgs.lib,
|
||||||
|
inputs ? null,
|
||||||
|
agents ? null,
|
||||||
|
}: let
|
||||||
|
# Import the opencode-rules library
|
||||||
|
m3taLib = import ../lib {lib = pkgs.lib;};
|
||||||
|
|
||||||
|
# Import custom packages
|
||||||
|
customPackages = import ../pkgs {inherit pkgs inputs;};
|
||||||
|
|
||||||
|
# Create rules configuration only if agents input is provided
|
||||||
|
# This demonstrates how to use mkOpencodeRules in a real project
|
||||||
|
rulesConfig = lib.optionalAttrs (agents != null) {
|
||||||
|
rules = m3taLib.opencode-rules.mkOpencodeRules {
|
||||||
|
# Pass the AGENTS repository path
|
||||||
|
inherit agents;
|
||||||
|
|
||||||
|
# Languages relevant to this repository
|
||||||
|
languages = ["python" "typescript" "nix"];
|
||||||
|
|
||||||
|
# Frameworks used in this repo
|
||||||
|
frameworks = ["n8n"];
|
||||||
|
|
||||||
|
# Standard concerns for development
|
||||||
|
concerns = [
|
||||||
|
"coding-style"
|
||||||
|
"naming"
|
||||||
|
"documentation"
|
||||||
|
"testing"
|
||||||
|
"git-workflow"
|
||||||
|
"project-structure"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
pkgs.mkShell {
|
||||||
|
name = "opencode-dev";
|
||||||
|
|
||||||
|
# Development tools
|
||||||
|
buildInputs = with pkgs;
|
||||||
|
[
|
||||||
|
# OpenCode AI coding agent (if inputs are available)
|
||||||
|
]
|
||||||
|
++ lib.optionals (inputs != null)
|
||||||
|
[inputs.opencode.packages.${pkgs.system}.opencode]
|
||||||
|
++ [
|
||||||
|
# Task management for AI coding sessions
|
||||||
|
customPackages.td
|
||||||
|
|
||||||
|
# Companion tool for CLI agents (diffs, file trees, task management)
|
||||||
|
customPackages.sidecar
|
||||||
|
|
||||||
|
# Code analysis tools
|
||||||
|
customPackages.code2prompt
|
||||||
|
|
||||||
|
# Nix development tools (for this repo)
|
||||||
|
nil
|
||||||
|
alejandra
|
||||||
|
statix
|
||||||
|
deadnix
|
||||||
|
];
|
||||||
|
|
||||||
|
# Shell hook that sets up OpenCode rules
|
||||||
|
shellHook = ''
|
||||||
|
echo "🤖 OpenCode Development Environment"
|
||||||
|
echo ""
|
||||||
|
echo "This environment demonstrates the mkOpencodeRules library"
|
||||||
|
echo "provided by the m3ta-nixpkgs repository."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
${
|
||||||
|
if (agents != null)
|
||||||
|
then ''
|
||||||
|
# Execute the OpenCode rules shellHook
|
||||||
|
${rulesConfig.rules.shellHook}
|
||||||
|
|
||||||
|
echo "✅ OpenCode rules configured!"
|
||||||
|
''
|
||||||
|
else ''
|
||||||
|
echo "⚠️ OpenCode rules not configured"
|
||||||
|
echo ""
|
||||||
|
echo "To enable OpenCode rules, add the agents input to your flake.nix:"
|
||||||
|
echo ""
|
||||||
|
echo " inputs = {"
|
||||||
|
echo " m3ta-nixpkgs.url = \"git+https://code.m3ta.dev/m3tam3re/nixpkgs\";"
|
||||||
|
echo " agents = {"
|
||||||
|
echo " url = \"git+https://code.m3ta.dev/m3tam3re/AGENTS\";"
|
||||||
|
echo " flake = false;"
|
||||||
|
echo " };"
|
||||||
|
echo " };"
|
||||||
|
echo ""
|
||||||
|
echo "Then pass agents to the shell:"
|
||||||
|
echo " opencode = import ./opencode.nix { inherit pkgs inputs agents; };"
|
||||||
|
''
|
||||||
|
}
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Available tools:"
|
||||||
|
echo " opencode - AI coding agent"
|
||||||
|
echo " td usage --new-session - View current tasks"
|
||||||
|
echo " sidecar - Companion tool (diffs, file trees, tasks)"
|
||||||
|
echo " code2prompt - Convert code to prompts"
|
||||||
|
echo ""
|
||||||
|
echo "Nix development tools:"
|
||||||
|
echo " nix flake check - Check flake validity"
|
||||||
|
echo " nix fmt . - Format Nix files"
|
||||||
|
echo " statix check . - Lint Nix files"
|
||||||
|
echo " deadnix . - Find dead code"
|
||||||
|
echo ""
|
||||||
|
${
|
||||||
|
if (agents == null)
|
||||||
|
then ''
|
||||||
|
echo "💡 Using mkOpencodeRules in your project:"
|
||||||
|
echo ""
|
||||||
|
echo "Add to your flake.nix:"
|
||||||
|
echo " inputs = {"
|
||||||
|
echo " m3ta-nixpkgs.url = \"git+https://code.m3ta.dev/m3tam3re/nixpkgs\";"
|
||||||
|
echo " agents = {"
|
||||||
|
echo " url = \"git+https://code.m3ta.dev/m3tam3re/AGENTS\";"
|
||||||
|
echo " flake = false;"
|
||||||
|
echo " };"
|
||||||
|
echo " };"
|
||||||
|
echo ""
|
||||||
|
echo " outputs = {self, nixpkgs, m3ta-nixpkgs, agents, ...}:"
|
||||||
|
echo " let"
|
||||||
|
echo " system = \"x86_64-linux\";"
|
||||||
|
echo " pkgs = nixpkgs.legacyPackages.''${system};"
|
||||||
|
echo " m3taLib = m3ta-nixpkgs.lib.''${system};"
|
||||||
|
echo " rules = m3taLib.opencode-rules.mkOpencodeRules {"
|
||||||
|
echo " inherit agents;"
|
||||||
|
echo " languages = [\"python\" \"typescript\"];"
|
||||||
|
echo " frameworks = [\"n8n\"];"
|
||||||
|
echo " };"
|
||||||
|
echo " in {"
|
||||||
|
echo " devShells.''${system}.default = pkgs.mkShell {"
|
||||||
|
echo " shellHook = rules.shellHook;"
|
||||||
|
echo " };"
|
||||||
|
echo " };"
|
||||||
|
''
|
||||||
|
else ""
|
||||||
|
}
|
||||||
|
echo ""
|
||||||
|
'';
|
||||||
|
}
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
# Modern Python development environment with marimo and uv — Nushell version
|
# Modern Python development environment with marimo and uv — Nushell version
|
||||||
# Usage: nix develop .#python (drops into Nushell)
|
# Usage: nix develop .#python (drops into Nushell)
|
||||||
{pkgs}: let
|
{
|
||||||
|
pkgs,
|
||||||
|
inputs ? null,
|
||||||
|
}: let
|
||||||
# Use the latest Python available in nixpkgs
|
# Use the latest Python available in nixpkgs
|
||||||
python = pkgs.python313;
|
python = pkgs.python313;
|
||||||
in
|
in
|
||||||
|
|||||||
Reference in New Issue
Block a user