UNPKG

aios-core

Version:

Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework

434 lines (288 loc) 8.65 kB
# remove-worktree **Task ID:** remove-worktree **Version:** 1.0 **Created:** 2026-01-28 (Story 1.3) **Agent:** @devops (Gage) --- ## Execution Modes **Choose your execution mode:** ### 1. YOLO Mode - Fast, Autonomous (0-1 prompts) - Removes worktree without confirmation - Only prompts if uncommitted changes exist - **Best for:** Cleanup after merge ### 2. Interactive Mode - Safe, Confirming (2-3 prompts) **[DEFAULT]** - Always confirms before removal - Shows worktree details before deletion - **Best for:** Production safety **Parameter:** `mode` (optional, default: `interactive`) --- ## Task Definition (AIOS Task Format V1.0) ```yaml task: removeWorktree() responsável: Gage (DevOps) responsavel_type: Agente atomic_layer: Atom inputs: - campo: story_id tipo: string origem: User Input obrigatório: true validação: Valid story identifier - campo: force tipo: boolean origem: User Input obrigatório: false default: false validação: Force removal even with uncommitted changes outputs: - campo: removed tipo: boolean destino: Return value persistido: false - campo: story_id tipo: string destino: Return value persistido: false ``` --- ## Pre-Conditions ```yaml pre-conditions: - [ ] Current directory is a git repository tipo: pre-condition blocker: true validação: git rev-parse --is-inside-work-tree error_message: "Not a git repository." - [ ] Worktree exists for story tipo: pre-condition blocker: true validação: manager.exists(storyId) === true error_message: "Worktree not found for this story." - [ ] Not currently in the worktree being removed tipo: pre-condition blocker: true validação: cwd !== worktreePath error_message: "Cannot remove worktree while inside it." ``` --- ## Post-Conditions ```yaml post-conditions: - [ ] Worktree directory removed tipo: post-condition blocker: true validação: Directory .aios/worktrees/{storyId} does not exist error_message: "Worktree directory still exists." - [ ] Branch deleted (unless --keep-branch) tipo: post-condition blocker: false validação: Branch auto-claude/{storyId} does not exist error_message: "Branch was not deleted (may be merged)." ``` --- ## Description Removes an AIOS-managed worktree and its associated branch. Includes safety checks for uncommitted changes and provides options for force removal. **Safety Features:** - Warns about uncommitted changes - Confirms before deletion (interactive mode) - Cannot remove while inside worktree - Logs removal for audit trail --- ## Inputs | Parameter | Type | Required | Default | Description | | ---------- | ------- | -------- | ------- | -------------------------------------- | | `story_id` | string | Yes | - | Story identifier to remove | | `force` | boolean | No | `false` | Force removal with uncommitted changes | --- ## Elicitation ```yaml elicit: true # Confirms before destructive operation ``` Prompts for confirmation in interactive mode. --- ## Steps ### Step 1: Validate Git Repository **Action:** Verify current directory is a git repository ```bash git rev-parse --is-inside-work-tree 2>/dev/null ``` --- ### Step 2: Parse Story ID **Action:** Extract and validate story ID from input **If missing, prompt:** ``` 📝 Enter story ID of worktree to remove: Run *list-worktrees to see available worktrees. ``` --- ### Step 3: Check Worktree Exists **Action:** Verify worktree exists ```javascript const WorktreeManager = require('./.aios-core/infrastructure/scripts/worktree-manager.js'); const manager = new WorktreeManager(); const exists = await manager.exists(storyId); ``` **If not exists:** ``` Worktree not found for story '{storyId}'. Available worktrees: {list from manager.list()} Did you mean one of these? ``` --- ### Step 4: Get Worktree Info **Action:** Retrieve worktree details ```javascript const worktree = await manager.get(storyId); ``` **Display:** ``` 📁 Worktree Details Story: {storyId} Path: .aios/worktrees/{storyId} Branch: auto-claude/{storyId} Created: {createdAt} Uncommitted: {uncommittedChanges} files Status: {status} ``` --- ### Step 5: Check Uncommitted Changes **Action:** Warn if there are uncommitted changes ```javascript if (worktree.uncommittedChanges > 0 && !force) { // Prompt for confirmation } ``` **Warning:** ``` ⚠️ WARNING: Uncommitted Changes Detected! This worktree has {uncommittedChanges} uncommitted changes. Removing it will PERMANENTLY DELETE these changes. Files with changes: - src/component.tsx - src/utils.ts - ... Options: 1. Commit changes first : cd .aios/worktrees/{storyId} && git commit 2. Merge to base branch : *merge-worktree {storyId} 3. Force remove (lose data): *remove-worktree {storyId} --force Proceed with removal? [y/N]: ``` --- ### Step 6: Confirm Removal (Interactive) **Action:** Confirm before removal in interactive mode ``` 🗑️ Confirm Removal You are about to remove: Worktree: .aios/worktrees/{storyId} Branch: auto-claude/{storyId} This action cannot be undone. Type 'yes' to confirm: ``` --- ### Step 7: Remove Worktree **Action:** Execute removal ```javascript await manager.remove(storyId, { force: options.force }); ``` **This performs:** 1. `git worktree remove .aios/worktrees/{storyId}` 2. `git branch -d auto-claude/{storyId}` (or -D if force) --- ### Step 8: Display Success **Action:** Confirm removal completed ``` ╔══════════════════════════════════════════════════════════════╗ Worktree Removed Successfully ╚══════════════════════════════════════════════════════════════╝ Removed: Worktree: .aios/worktrees/{storyId} Branch: auto-claude/{storyId} Remaining worktrees: {count.total} Run *list-worktrees to see remaining worktrees. ``` --- ## Outputs ### Return Value ```typescript { removed: boolean; // true if successfully removed storyId: string; // The story ID that was removed } ``` --- ## Validation - [ ] Worktree directory no longer exists - [ ] Branch no longer exists (unless merged to another branch) - [ ] Worktree no longer appears in list --- ## Error Handling ### Worktree Not Found **Error:** ``` Worktree not found for story '{storyId}'. ``` **Resolution:** Check story ID with `*list-worktrees`. ### Currently Inside Worktree **Error:** ``` Cannot remove worktree while inside it. Current directory: .aios/worktrees/{storyId} Please navigate out first: cd {projectRoot} ``` **Resolution:** `cd` out of the worktree first. ### Uncommitted Changes (without --force) **Error:** ``` ⚠️ Worktree has uncommitted changes. Use --force to remove anyway: *remove-worktree {storyId} --force Or commit/merge changes first. ``` **Resolution:** Use `--force` or handle changes. ### Git Command Failed **Error:** ``` Failed to remove worktree: {error.message} ``` **Resolution:** Check git status, may need manual cleanup. --- ## Manual Cleanup If automatic removal fails: ```bash # Remove worktree git worktree remove .aios/worktrees/{storyId} --force # Delete branch git branch -D auto-claude/{storyId} # Prune worktree references git worktree prune ``` --- ## Performance Notes - **Removal time:** ~200-500ms - **Disk space:** Freed immediately (hardlinks removed) - **Branch:** Deleted if not merged elsewhere --- ## Dependencies ### Scripts - `.aios-core/infrastructure/scripts/worktree-manager.js` ### Git Commands Used - `git worktree remove` - Remove worktree - `git branch -d/-D` - Delete branch --- ## Related - **Story:** 1.3 - CLI Commands for Worktree Management - **Tasks:** `create-worktree.md`, `list-worktrees.md`, `cleanup-worktrees.md` --- ## Command Registration This task is exposed as CLI command `*remove-worktree` in @devops agent: ```yaml commands: - 'remove-worktree {storyId}': Remove worktree (confirms first) - 'remove-worktree {storyId} --force': Force remove with uncommitted changes ``` --- **Status:** Production Ready **Tested On:** Windows, Linux, macOS **Git Requirement:** git >= 2.5 (worktree support)