Implement complete workflow for checking and applying OpenCode updates: - check-version.sh: Compare current vs latest GitHub release - fetch-sha256.sh: Fetch SHA256 hash using nix-prefetch-url - update-nix-file.sh: Update Nix package definition with dry-run support - verify-update.sh: Verify installed version matches expectation Includes comprehensive documentation (SKILL.md for agents, README.md for users) and full spec in specs/002-update-opencode/ with user stories and acceptance criteria. Eliminates manual Nix file editing and hash lookups for OpenCode updates.
7 KiB
Implementation Plan: Update OpenCode Skill
Branch: 002-update-opencode | Date: 2025-11-11 | Spec: spec.md
Input: Feature specification from /specs/002-update-opencode/spec.md
Note: This template is filled in by the /speckit.plan command. See .specify/templates/commands/plan.md for the execution workflow.
Summary
Create an AI agent skill that automates checking for and applying OpenCode version updates in Nix-based dotfiles. The skill eliminates manual Nix file editing and SHA256 hash lookups by querying GitHub releases, fetching cryptographic hashes via nix-prefetch-url, updating package definitions, and triggering system rebuilds with user confirmation.
Technical Context
Language/Version: Bash (no specific version requirement - standard POSIX + bash extensions)
Primary Dependencies: jq, curl, nix-prefetch-url, sed/awk, GitHub API
Storage: Filesystem - modifies ~/proj/dotfiles/pkgs/opencode/default.nix
Testing: Manual verification scripts, bash syntax validation (bash -n)
Target Platform: NixOS or Nix home-manager on Linux
Project Type: AI Agent Skill (Markdown documentation + Bash helper scripts)
Performance Goals: Version checks <10 seconds (network-dependent), updates <5 minutes (rebuild time)
Constraints: Requires network access to GitHub API, sudo for system rebuild, dotfiles at known path
Scale/Scope: Personal/small team use, single user per execution, ~5 helper scripts
Constitution Check
GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.
Skills Repository Constitution (from .specify/memory/constitution.md):
The constitution template is empty/placeholder. Based on project AGENTS.md and observed patterns:
I. Skill-First Design ✅ PASS
- Feature is designed as a standalone skill with clear scope
- SKILL.md will contain agent instructions
- Helper scripts are reusable and testable independently
II. Bash Best Practices ✅ PASS
- FR-012 mandates: shebang,
set -euo pipefail, error handling - Follows established patterns from niri-window-capture skill
- Scripts will use
jq --argfor safe variable handling
III. Security Awareness ✅ PASS
- No security-sensitive operations (reading public GitHub data, modifying user's own files)
- No SECURITY.md required (unlike niri-window-capture which had invisible capture capability)
- User confirmation required before system modifications (FR-010)
IV. Fail-Safe Design ✅ PASS
- FR-009: No partial modifications - atomic operations only
- FR-008: Clear error messages, fail fast
- No sophisticated recovery - rely on git revert
V. Simplicity ✅ PASS
- Removed over-engineering (cross-validation, rate limit parsing, partial update detection)
- Focuses on core task: check, fetch, update, rebuild
- 12 focused requirements (down from 19 in initial draft)
Gate Result: ✅ PASS - No violations, no complexity justification needed
Project Structure
Documentation (this feature)
specs/002-update-opencode/
├── plan.md # This file
├── spec.md # Feature specification (completed)
├── research.md # Phase 0 output (to be created)
├── data-model.md # Phase 1 output (to be created)
├── quickstart.md # Phase 1 output (to be created)
├── contracts/ # Phase 1 output (to be created)
│ └── script-interface.md # Bash script contracts
├── checklists/ # Spec validation (completed)
│ └── requirements.md
└── tasks.md # Phase 2 output (/speckit.tasks - not created yet)
Source Code (skills repository root)
skills/update-opencode/
├── SKILL.md # Agent instructions (main skill definition)
├── README.md # User-facing documentation
├── scripts/ # Helper bash scripts
│ ├── check-version.sh # Compare current vs latest
│ ├── fetch-sha256.sh # Get SHA256 for version
│ ├── update-nix-file.sh # Modify default.nix safely
│ └── verify-update.sh # Confirm version after rebuild
├── examples/ # Example usage and outputs
│ ├── usage-example.sh
│ └── example-output.txt
└── references/ # Supporting documentation
└── nix-package-format.md # Example Nix package structure
Structure Decision: AI Agent Skill structure (documentation + bash scripts). This is not a traditional software project but a skill for Claude Code/OpenCode agents. The skill lives in skills/update-opencode/ and will be deployed to dotfiles via bin/deploy-skill.sh script. Follows established pattern from worklog and niri-window-capture skills.
Complexity Tracking
Not applicable - Constitution Check passed with no violations.
Phase 0: Research & Design Decisions
Status: ✅ Complete
Research Tasks (Completed):
-
Nix Package File Parsing: Determine safest approach to read/update
version = "X.Y.Z"andsha256 = "hash"fields- Options: sed with precise patterns, awk field replacement, nix-instantiate parsing
- Need to preserve formatting, comments, surrounding code
-
GitHub API Usage: Verify API endpoints and response structure for stable releases
- Confirm
/repos/sst/opencode/releases/latestreturns non-prerelease versions - Document response fields:
tag_name,prerelease,tarball_url
- Confirm
-
nix-prefetch-url Invocation: Determine correct syntax for fetching SHA256
- Command pattern for GitHub release tarballs
- Error handling for network failures
-
Version Comparison Logic: Simple semantic version comparison in bash
- Parse major.minor.patch format
- Determine if update available (newer vs current)
-
System Rebuild Triggering: Verify rebuild command and error handling
- Determine if
sudo nixos-rebuild switchvs home-manager rebuild - Capture rebuild output for error reporting
- Determine if
Output: ✅ research.md completed with all decisions documented
Phase 1: Design & Contracts
Status: ✅ Complete
Deliverables (Completed):
-
data-model.md: Entity definitions
- VersionInfo (current, latest, updateAvailable)
- NixPackageFile (path, version, sha256, content)
- GitHubRelease (tag, tarballUrl, isPrerelease)
-
contracts/script-interface.md: Bash script contracts
- Input/output contracts for each helper script
- Exit codes, stdout format, stderr error messages
- Environment variables required
-
quickstart.md: Quick reference for skill usage
- How agents invoke the skill
- Example agent conversations
- Manual script invocation for testing
-
Agent context update: ✅ Completed
- Updated AGENTS.md with bash scripting context
- Added GitHub API and Nix tooling knowledge
- Documented dependencies: jq, curl, nix-prefetch-url, sed/awk
Phase 2: Task Breakdown
Status: ⏳ Not started (separate command: /speckit.tasks)
This phase is handled by the /speckit.tasks command after planning is complete.