# Implementation Plan: Update OpenCode Skill **Branch**: `002-update-opencode` | **Date**: 2025-11-11 | **Spec**: [spec.md](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 --arg` for 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) ```text 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) ```text 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): 1. **Nix Package File Parsing**: Determine safest approach to read/update `version = "X.Y.Z"` and `sha256 = "hash"` fields - Options: sed with precise patterns, awk field replacement, nix-instantiate parsing - Need to preserve formatting, comments, surrounding code 2. **GitHub API Usage**: Verify API endpoints and response structure for stable releases - Confirm `/repos/sst/opencode/releases/latest` returns non-prerelease versions - Document response fields: `tag_name`, `prerelease`, `tarball_url` 3. **nix-prefetch-url Invocation**: Determine correct syntax for fetching SHA256 - Command pattern for GitHub release tarballs - Error handling for network failures 4. **Version Comparison Logic**: Simple semantic version comparison in bash - Parse major.minor.patch format - Determine if update available (newer vs current) 5. **System Rebuild Triggering**: Verify rebuild command and error handling - Determine if `sudo nixos-rebuild switch` vs home-manager rebuild - Capture rebuild output for error reporting **Output**: ✅ `research.md` completed with all decisions documented --- ## Phase 1: Design & Contracts **Status**: ✅ Complete **Deliverables** (Completed): 1. **data-model.md**: Entity definitions - VersionInfo (current, latest, updateAvailable) - NixPackageFile (path, version, sha256, content) - GitHubRelease (tag, tarballUrl, isPrerelease) 2. **contracts/script-interface.md**: Bash script contracts - Input/output contracts for each helper script - Exit codes, stdout format, stderr error messages - Environment variables required 3. **quickstart.md**: Quick reference for skill usage - How agents invoke the skill - Example agent conversations - Manual script invocation for testing 4. **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.