docs(09): create phase plan
Phase 09: Batch Operations - 4 plans in 4 waves - 3 autonomous, 1 with checkpoint - Ready for execution Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,199 @@
|
||||
---
|
||||
phase: 09-batch-operations
|
||||
plan: 03
|
||||
type: execute
|
||||
wave: 3
|
||||
depends_on: [09-02]
|
||||
files_modified: [n8n-workflow.json]
|
||||
autonomous: true
|
||||
|
||||
must_haves:
|
||||
truths:
|
||||
- "'Update all' command updates only containers with available updates"
|
||||
- "'Update all' shows confirmation with count before executing"
|
||||
- "If no containers have updates, shows 'All up to date' message"
|
||||
- "Inline keyboard allows selecting multiple containers for batch action"
|
||||
artifacts:
|
||||
- path: "n8n-workflow.json"
|
||||
provides: "Update all command and inline batch selection"
|
||||
contains: "Check Available Updates"
|
||||
key_links:
|
||||
- from: "'update all' command"
|
||||
to: "Docker API image inspection"
|
||||
via: "Compare current vs latest image digests"
|
||||
pattern: "update.*all"
|
||||
- from: "Multi-select keyboard"
|
||||
to: "Batch execution"
|
||||
via: "Toggle selection encoded in callback_data"
|
||||
pattern: "batch:toggle"
|
||||
---
|
||||
|
||||
<objective>
|
||||
Add "update all" command targeting only containers with available updates, plus inline keyboard multi-select for batch operations via buttons.
|
||||
|
||||
Purpose: Enable convenient bulk updates and UI-based batch selection without typing container names.
|
||||
Output: "Update all" flow with pre-flight check and confirmation; multi-select toggle keyboard for batch actions.
|
||||
</objective>
|
||||
|
||||
<execution_context>
|
||||
@/home/luc/.claude/get-shit-done/workflows/execute-plan.md
|
||||
@/home/luc/.claude/get-shit-done/templates/summary.md
|
||||
</execution_context>
|
||||
|
||||
<context>
|
||||
@.planning/PROJECT.md
|
||||
@.planning/ROADMAP.md
|
||||
@.planning/STATE.md
|
||||
@.planning/phases/09-batch-operations/09-CONTEXT.md
|
||||
@.planning/phases/09-batch-operations/09-RESEARCH.md
|
||||
@.planning/phases/09-batch-operations/09-01-SUMMARY.md
|
||||
@.planning/phases/09-batch-operations/09-02-SUMMARY.md
|
||||
@n8n-workflow.json
|
||||
</context>
|
||||
|
||||
<tasks>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 1: Add "update all" command with update availability check</name>
|
||||
<files>n8n-workflow.json</files>
|
||||
<action>
|
||||
Implement "update all" that only targets containers with updates available.
|
||||
|
||||
1. In command detection (early in workflow), detect "update all" as special case:
|
||||
- Add to command matching: if message.toLowerCase() includes "update all" or "updateall"
|
||||
- Route to dedicated "Update All" flow (not the batch parsing flow)
|
||||
|
||||
2. Add HTTP node "Get All Containers For Update All":
|
||||
- GET from Docker API via proxy: `http://docker-socket-proxy:2375/containers/json?all=true`
|
||||
- Returns all containers
|
||||
|
||||
3. Add Code node "Check Available Updates":
|
||||
- For each container, need to check if update is available
|
||||
- This requires comparing current image digest to remote latest
|
||||
- Pattern from existing update flow:
|
||||
a. Get container's current image ID
|
||||
b. Pull :latest tag (or appropriate tag)
|
||||
c. Compare digests
|
||||
- This is expensive for many containers - consider approach:
|
||||
- Option A: Full check for each (slow but accurate)
|
||||
- Option B: Only check containers using :latest tag (faster, common case)
|
||||
- Recommendation: Use Option B as default - most containers use :latest
|
||||
|
||||
4. For containers using :latest tag:
|
||||
- Execute: `docker pull {image}:latest` (via proxy exec or curl)
|
||||
- Compare pulled image digest to running container's image digest
|
||||
- Mark container as "has update" if different
|
||||
|
||||
5. Add Code node "Build Update All Preview":
|
||||
- If no containers have updates: Return "All containers are up to date!"
|
||||
- If some have updates: Build list of containers with updates
|
||||
- Output: `{ containersToUpdate: Container[], count: number }`
|
||||
|
||||
6. Add IF node "Has Updates Available":
|
||||
- TRUE: Continue to confirmation
|
||||
- FALSE: Send "All up to date" message and stop
|
||||
|
||||
7. Add Code node "Build Update All Confirmation":
|
||||
- Text: "Update {N} containers?\n\n{list container names with versions if available}"
|
||||
- Inline keyboard: [Confirm] [Cancel]
|
||||
- Callback format: `uall:confirm:{timestamp}` and `uall:cancel`
|
||||
- Store containers to update in workflow context (or encode in callback if small enough)
|
||||
|
||||
8. Handle callbacks:
|
||||
- `uall:confirm`: Check 30-second timeout, then pass containers to batch execution flow (Plan 02)
|
||||
- `uall:cancel`: Send "Update cancelled" and return to list
|
||||
|
||||
Note: The actual batch execution reuses Plan 02's Loop Over Items infrastructure.
|
||||
</action>
|
||||
<verify>
|
||||
Test "update all" command:
|
||||
- With containers that have updates: Shows confirmation "Update 3 containers? plex, sonarr, radarr"
|
||||
- With no updates available: Shows "All containers are up to date!"
|
||||
- Confirm executes batch update for listed containers
|
||||
- Cancel returns to normal state
|
||||
</verify>
|
||||
<done>"Update all" checks for available updates, shows confirmation with count and list, executes batch for only updatable containers</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 2: Add inline keyboard multi-select for batch operations</name>
|
||||
<files>n8n-workflow.json</files>
|
||||
<action>
|
||||
Implement toggle-style multi-select via inline keyboard buttons.
|
||||
|
||||
1. Add entry point to batch selection mode:
|
||||
- In container list keyboard (from Phase 8), add button row: "Select Multiple"
|
||||
- Callback: `batch:mode`
|
||||
|
||||
2. Handle `batch:mode` callback - Add Code node "Build Batch Select Keyboard":
|
||||
- Show container list with toggle checkmarks
|
||||
- Each container button: text shows name with/without checkmark
|
||||
- Callback format: `batch:toggle:{selected_csv}:{container_name}`
|
||||
- `selected_csv`: comma-separated currently selected containers
|
||||
- `container_name`: container being toggled
|
||||
- Example: `batch:toggle:plex,sonarr:radarr` means "plex and sonarr selected, toggling radarr"
|
||||
|
||||
3. Handle `batch:toggle:*` callbacks:
|
||||
- Parse callback data to get current selection and container being toggled
|
||||
- Toggle the container in/out of selection
|
||||
- Rebuild keyboard with updated checkmarks
|
||||
- Edit message to show new keyboard
|
||||
|
||||
4. Add action buttons when selection exists:
|
||||
- At bottom of keyboard, show: "[Update Selected] [Start Selected] [Stop Selected]"
|
||||
- Only show relevant actions based on container states (or show all and handle gracefully)
|
||||
- Callback format: `batch:exec:{action}:{selected_csv}`
|
||||
|
||||
5. Handle `batch:exec:*` callbacks:
|
||||
- Parse action and selected containers
|
||||
- For stop: Show confirmation (per existing batch stop rule)
|
||||
- For start/restart: Execute immediately via batch loop
|
||||
- For update: Execute immediately via batch loop
|
||||
- Pass selected containers to batch execution infrastructure (Plan 02)
|
||||
|
||||
6. 64-byte callback_data limit handling (per RESEARCH):
|
||||
- Average container name: 6-10 chars
|
||||
- With format `batch:toggle:{csv}:{name}`, limit ~8-10 containers
|
||||
- If limit approached, show warning: "Maximum selection reached. Use 'update all' for more."
|
||||
- Add Code node "Check Selection Size" before toggle to enforce limit
|
||||
|
||||
7. Add "Clear Selection" and "Cancel" buttons:
|
||||
- "Clear": `batch:clear` - reset selection, rebuild keyboard
|
||||
- "Cancel": `batch:cancel` - return to normal container list
|
||||
|
||||
Note: This is Claude's discretion area from CONTEXT. Toggle checkmark pattern chosen for consistency with Phase 8 keyboard patterns.
|
||||
</action>
|
||||
<verify>
|
||||
Test batch selection flow:
|
||||
- Click "Select Multiple" -> Container list with toggle buttons appears
|
||||
- Click container -> Checkmark appears/disappears
|
||||
- With 2+ selected -> Action buttons appear at bottom
|
||||
- Click "Update Selected" -> Batch update executes for selected containers
|
||||
- Clear selection resets all checkmarks
|
||||
- Cancel returns to normal container list
|
||||
</verify>
|
||||
<done>Inline keyboard multi-select works with toggle checkmarks; action buttons execute batch for selected containers; callback_data size limit enforced</done>
|
||||
</task>
|
||||
|
||||
</tasks>
|
||||
|
||||
<verification>
|
||||
1. Workflow imports successfully in n8n
|
||||
2. "update all" shows only containers with available updates
|
||||
3. "update all" with no updates shows "All up to date"
|
||||
4. Multi-select keyboard allows toggling containers
|
||||
5. Selected containers can be batch updated/started/stopped
|
||||
6. Callback data stays within 64-byte limit
|
||||
</verification>
|
||||
|
||||
<success_criteria>
|
||||
- "Update all" scans and shows "Update 3 containers?" only for those needing updates
|
||||
- When all up to date, shows "All containers are up to date!"
|
||||
- Inline multi-select: checkmarks toggle on click
|
||||
- "Update Selected" with 3 containers executes batch update
|
||||
- Selection limit prevents callback_data overflow
|
||||
</success_criteria>
|
||||
|
||||
<output>
|
||||
After completion, create `.planning/phases/09-batch-operations/09-03-SUMMARY.md`
|
||||
</output>
|
||||
Reference in New Issue
Block a user