Commit Graph

208 Commits

Author SHA1 Message Date
Lucas Berger f3bdd88c75 chore(10-01): remove 2 orphan nodes from workflow
Cleaned up orphan nodes before modularization:
- Removed "Answer Batch Exec" (httpRequest at [1340, 900])
- Removed "Batch Loop" (splitInBatches at [3100, -500])

Both nodes had no incoming connections and were vestigial
from earlier batch operation development that was replaced.

Node count: 248 -> 246
Deployed and verified working via n8n API.
2026-02-04 13:02:58 -05:00
Lucas Berger c122803fad docs(10): create phase plan for workflow modularization
Phase 10: Workflow Modularization
- 4 plan(s) in 3 wave(s)
- Wave 1: Orphan cleanup (1 plan)
- Wave 2: Sub-workflow extraction (2 plans parallel)
- Wave 3: Integration verification (1 plan)
- Ready for execution

Plans:
- 10-01: Remove 8 orphan nodes
- 10-02: Extract container-update sub-workflow (DEBT-03)
- 10-03: Extract container-actions sub-workflow
- 10-04: Integration verification with user checkpoint

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 11:39:54 -05:00
Lucas Berger a8e947ec95 docs: split Phase 10 into modularization and update all
Phase 10: Workflow Modularization (MOD-01, MOD-02, DEBT-03)
Phase 11: Update All & Callback Limits (BATCH-04-07)
Phase 12: Polish & Audit (UNR-01, ENV-01, ENV-02, DEBT-02)
Phase 13: Documentation Overhaul (DEBT-01)

12 requirements across 4 phases.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 11:23:19 -05:00
Lucas Berger 63df54e8e3 docs: formalize v1.2 requirements and roadmap
12 requirements across 3 phases:
- Phase 10: Modularization, update all, callback limits (7 reqs)
- Phase 11: Unraid sync, env audit, tech debt (4 reqs)
- Phase 12: Documentation overhaul (1 req)

Removed WEB-01 (webhook fix) - already resolved.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 11:21:31 -05:00
Lucas Berger 6a0551e0d6 chore: archive v1.1 audit and add tech debt to Phase 11
Archived:
- milestones/v1.1/v1.1-MILESTONE-AUDIT.md
- milestones/v1.1/INTEGRATION-CHECK.md

Updated:
- ROADMAP.md: Added v1.1 tech debt to Phase 11
- STATE.md: Updated with tech debt tracking

Tech debt items added to Phase 11:
- README.md documentation (still shows direct socket)
- Duplicate --max-time flags in image pull
- Update flow duplication between single/batch paths

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 11:16:03 -05:00
Lucas Berger b89f78db21 chore: complete v1.1 milestone
Archived:
- milestones/v1.1-ROADMAP.md
- milestones/v1.1-REQUIREMENTS.md

Deleted (fresh for next milestone):
- REQUIREMENTS.md

Updated:
- MILESTONES.md (new v1.1 entry)
- PROJECT.md (requirements → Validated, updated current state)
- ROADMAP.md (v1.1 collapsed, v1.2 phases added)
- STATE.md (reset for v1.2)

v1.1 shipped: Inline keyboard UX and Docker security hardening
- Phases 6-9 complete (11 plans)
- 4 requirements deferred to v1.2 (UNR-01, ENV-01, ENV-02, WEB-01)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:55:26 -05:00
Lucas Berger fa7c60394e docs(09): complete batch operations phase verification
- Created 09-04-SUMMARY.md with verification results
- Documented 5 bugs fixed during verification
- All batch operations tested and working
- Update all testing deferred (Unraid UI issue)
- Updated STATE.md to reflect phase completion

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:49:35 -05:00
Lucas Berger 5565334d94 fix(09-04): restore missing update route in Keyword Router
- Added missing connection for "update" rule (index 6)
- This shifted "logs" to correct index 7
- Both text-based update and logs commands now work

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:47:41 -05:00
Lucas Berger 7ee722418c fix(09-04): show Back to List for inline keyboard batch stop
- Add :kb marker to inline keyboard stop confirmation callback
- Parse Callback Data detects :kb and sets fromKeyboard: true
- Prepare Batch Stop Exec passes fromKeyboard through to batch state
- Summary now correctly shows Back to List for keyboard flows only

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:41:55 -05:00
Lucas Berger 850a507684 fix(09-04): hide Back to List button for text command batches
- Track fromKeyboard in batch state (true for callbacks, false for text)
- Pass fromKeyboard through entire batch loop chain
- Build Batch Summary only includes Back to List when fromKeyboard=true
- Send Batch Summary uses conditional reply_markup from input

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:33:46 -05:00
Lucas Berger 8b231bbbb5 docs(09-04): note 64-byte callback_data limitations
- Long container names hit limit
- Batch select limited to ~2 containers with current format
- Consider short IDs or server-side state in Phase 9.1

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:25:24 -05:00
Lucas Berger 893a37e9c9 chore(09-04): defer batch Update to Phase 9.1
- Remove Update button from batch select (not implemented)
- Document in STATE.md: batch update needs sub-workflow modularization
- Batch Start and Stop work; Update requires complex 5-step sequence

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:24:08 -05:00
Lucas Berger 5a0d73cb98 fix(09-04): fix Delete Batch Select Message chatId reference
Reference Prepare Immediate Batch Exec directly for chatId/messageId
instead of $json which is the Telegram response from previous node.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:18:55 -05:00
Lucas Berger 36345b0de8 fix(09-04): fix batch Start from inline keyboard
Prepare Batch Exec now references Prepare Immediate Batch Exec directly
instead of relying on $json which gets overwritten by Delete Batch
Select Message. Also handles both 'action' and 'batchAction' field names.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:17:36 -05:00
Lucas Berger 20ec40336e fix(09-04): fix Clear button in batch select
- Add batchPage to Handle Batch Clear output
- Update Rebuild Batch Select Keyboard to also check Handle Batch Clear
  as data source

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:14:45 -05:00
Lucas Berger 660b969f6e feat(09-04): add Start button to batch select action row
Now shows Start, Stop, and Update buttons when containers are selected.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:13:36 -05:00
Lucas Berger ee4205d61d fix(09-04): show all containers in batch select (including stopped)
Changed Fetch Containers For Batch Mode and Fetch Containers For Toggle
Update to use all=true instead of all=false, so stopped containers
appear in the batch select list for batch start operations.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:12:12 -05:00
Lucas Berger ec9e0a07a4 fix(09-04): preserve selection when navigating batch select pages
- Add batch:nav callback type for page navigation with selection
- Parse batch:nav in Parse Callback Data
- Add route for isBatchNav in Route Callback switch
- Add Prepare Batch Nav node to format data for rebuild
- Update Rebuild Batch Select Keyboard to use batch:nav for navigation
- Now Previous/Next buttons preserve selected containers

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:02:31 -05:00
Lucas Berger 5ab66de4c2 fix(09-04): fix batch cancel routing and pagination after toggle
- Don't set isCancel:true for batch:cancel (was routing to wrong handler)
- Add page to batch:toggle callback format: batch:toggle:{page}:{selected}:{name}
- Parse page in Parse Callback Data for toggle callbacks
- Pass page through Handle Batch Toggle
- Add pagination to Rebuild Batch Select Keyboard (6 per page)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 09:57:57 -05:00
Lucas Berger 713fdaa00d feat(09-04): add pagination to batch select menu
- Parse Callback Data now handles batch:mode:{page} format
- Build Batch Select Keyboard uses 6 containers per page
- Added Previous/Next navigation buttons
- Shows "Showing X-Y of Z" count when paginated

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 09:52:36 -05:00
Lucas Berger 3192eb3ea0 fix(09-04): batch cancel returns to container list instead of deleting message
- Replace Delete Batch Cancel Message with Prepare Batch Cancel Return code node
- Connect Prepare Batch Cancel Return to Get Containers For List
- Update Build Paginated List to accept data from multiple sources
- Cancel now shows the container list instead of deleting the menu

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 09:51:18 -05:00
Lucas Berger ddbae3c54e fix(09-04): replace splitInBatches with manual loop for batch execution
- Route Batch Loop Action now references Build Progress Message node
- Build Batch Action Command references Build Progress Message node
- Prepare Batch Loop outputs single item with currentIndex for manual loop
- Prepare Next Iteration increments currentIndex and sets next container
- Is Batch Complete loops back to Build Progress Message instead of Batch Loop
- Bypasses problematic splitInBatches node that wasn't processing items

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 09:46:18 -05:00
Lucas Berger 652d877ce1 docs(09-04): add comprehensive test plan for batch operations
- 21 test cases across 5 suites (text commands, update all, multi-select, errors, regression)
- Deployment steps for n8n workflow import
- Success criteria mapping to tests
- Test execution log template with issue tracking
- Covers all BAT-01 through BAT-06 requirements
2026-02-04 08:22:15 -05:00
Lucas Berger 93be20d9c4 docs(09-03): complete update all and multi-select plan
Tasks completed: 2/2
- Task 1: Update all command with availability check
- Task 2: Inline keyboard multi-select for batch operations

SUMMARY: .planning/phases/09-batch-operations/09-03-SUMMARY.md
Phase 9 complete: 3/3 plans done
2026-02-04 08:19:00 -05:00
Lucas Berger 7d6e683f87 feat(09-03): add update all and inline multi-select for batch operations
Task 1: Update All Command
- Detects 'update all' or 'updateall' in Keyword Router
- Fetches all containers and filters to :latest tag containers
- Shows confirmation with count and list (up to 10 displayed)
- On confirm: passes to batch execution infrastructure
- Shows 'All containers are up to date!' if no :latest containers
- 30-second timeout on confirmation

Task 2: Inline Multi-Select
- Added batch:mode callback to enter selection mode
- batch:toggle:{csv}:{name} for toggling container selection
- batch:exec:{action}:{csv} for executing batch actions
- batch:clear and batch:cancel for selection management
- Checkmarks show selected containers in keyboard
- Action buttons appear when selection exists
- Callback size limit enforced (max ~8 containers)
- Stop action requires confirmation (per existing batch flow)
- Update/start/restart execute immediately

Integration:
- Both flows connect to existing batch execution from 09-02
- Reuses batch loop and progress display infrastructure
2026-02-04 08:17:04 -05:00
Lucas Berger 1561d1a13a wip: batch-operations paused at plan 2/4 (waves 1-2 complete) 2026-02-03 21:35:58 -05:00
Lucas Berger 3e5fa5d8bd docs(09-02): complete batch execution and progress plan
Tasks completed: 3/3
- Add Loop Over Items for sequential batch execution
- Add per-container progress updates and action execution
- Add batch summary with failure emphasis

SUMMARY: .planning/phases/09-batch-operations/09-02-SUMMARY.md
2026-02-03 21:35:08 -05:00
Lucas Berger b704a6cff2 feat(09-02): add batch summary with failure emphasis
- Add Is Batch Complete IF node to check loop termination
- Add Build Batch Summary code node with failure-first format
- Add Send Batch Summary HTTP node with Back to List button
- Connect Is Batch Complete true output to summary flow
- Connect Is Batch Complete false output back to Batch Loop
- Summary shows failures with reasons prominently
- Warnings shown in detail (<=3) or summary (>3)
- Success count shown last
2026-02-03 21:33:28 -05:00
Lucas Berger fd4c614afd feat(09-02): add per-container progress updates and action execution
- Add Build Progress Message node for per-container status display
- Add Edit Progress Message to update Telegram with current progress
- Add Route Batch Loop Action switch for action-specific execution
- Add Build Batch Action Command with container lookup support
- Add Execute Batch Container Action with error handling
- Add Check Batch Action Result for lookup vs direct action
- Add Needs Action Call IF node for two-phase execution
- Add Execute Batch Action 2 for follow-up action calls
- Add Parse Batch Action 2 for result handling
- Add Handle Action Result to aggregate success/failure counts
- Add Prepare Next Iteration for loop continuation
- Add Prepare Batch Stop Exec for confirmed stop callbacks
- Add Prepare Batch Exec for bexec callbacks
- Connect Check Batch Stop Expired to execution flow
- Connect Answer Batch Exec to execution flow
2026-02-03 21:32:03 -05:00
Lucas Berger 62f50cb502 feat(09-02): add loop over items for sequential batch execution
- Add Initialize Batch State code node to prepare batch data
- Add Send Batch Start Message to show initial progress
- Add Prepare Batch Loop to format containers for iteration
- Add Batch Loop (splitInBatches) for sequential processing
- Connect Route Batch Action outputs (update/start/restart) to batch flow
2026-02-03 21:28:33 -05:00
Lucas Berger 1274eab438 docs(09-01): complete batch command parsing plan
Tasks completed: 3/3
- Task 1: Add batch command detection and parsing
- Task 2: Add container name matching with exact-match priority
- Task 3: Wire batch routing and add batch stop confirmation

SUMMARY: .planning/phases/09-batch-operations/09-01-SUMMARY.md
2026-02-03 21:24:13 -05:00
Lucas Berger feea06c4c3 feat(09-01): wire batch routing and add batch stop confirmation
- Add "Route Batch Action" switch node (update/start/restart/stop)
- Add "Build Batch Stop Confirmation" code node with confirm/cancel keyboard
- Add "Send Batch Stop Confirmation" HTTP node
- Update Parse Callback Data to handle bstop: and bexec: prefixes
- Add Route Callback outputs for batch stop confirm/cancel/exec
- Add callback handler nodes for batch operations:
  - Answer Batch Stop Confirm with 30-second timeout check
  - Answer Batch Stop Cancel with message deletion
  - Answer Batch Exec for batch execution callbacks
- Add Check Batch Stop Expired with expiry message flow

Routing behavior:
- update/start/restart: route immediately to batch execution (Plan 02)
- stop: requires confirmation due to fuzzy matching risk
- Confirmation callback format: bstop:confirm:{names}:{timestamp}
- Cancel callback: bstop:cancel
2026-02-03 21:22:19 -05:00
Lucas Berger f02f98406c feat(09-01): add container matching with exact-match priority
- Add "Match Batch Containers" code node with exact-match-first algorithm
- Add "Needs Disambiguation" IF node to route ambiguous matches
- Add "Build Disambiguation Message" code node with inline keyboard
- Add "Send Disambiguation" HTTP node to display options
- Add "Has Not Found" IF node to handle missing containers
- Add "Build Not Found Message" code node with partial match confirmation
- Add "Send Not Found Message" HTTP node

Matching algorithm:
1. Exact match first: 'plex' matches 'plex' even if 'jellyplex' exists
2. Single fuzzy match: treated as found
3. Multiple fuzzy matches: triggers disambiguation with keyboard options
4. No matches: reported as not found with option to proceed with found containers
2026-02-03 21:19:01 -05:00
Lucas Berger 9e7ff2ab08 feat(09-01): add batch command detection and parsing
- Add "Detect Batch Command" code node to parse multi-container commands
- Add "Is Batch Command" IF node to route batch vs single container
- Add "Route Single Action" switch to route single commands to appropriate flow
- Add "Get Containers for Batch" node for Docker API container list
- Modify Keyword Router to route restart/start/stop/update through batch detection
- Single container commands route to existing Parse Action/Update Command flows
- Batch commands (2+ containers) route to new batch processing flow

Batch detection logic:
- Pattern: {action} {name1} {name2} ... where action is update/start/stop/restart
- Single container = not batch (existing flow)
- Two or more containers = batch (new flow)
2026-02-03 21:16:41 -05:00
Lucas Berger 59ed1245c2 docs(09.1): insert modular sub-workflows phase
- Add Phase 9.1 between Phase 9 and Phase 10
- Update Phase 10 dependency to Phase 9.1
- Create phase directory structure

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 21:10:02 -05:00
Lucas Berger a409671dc6 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>
2026-02-03 21:01:06 -05:00
Lucas Berger 3ca89c3815 docs(09): research phase domain
Phase 9: Batch Operations
- Standard stack identified (Loop Over Items, If Error node, editMessageText)
- Sequential execution patterns documented
- Error handling with continue-on-failure
- Multi-select keyboard toggle pattern
- Rate limiting and callback_data constraints
- Fuzzy matching with exact match priority
2026-02-03 20:52:50 -05:00
Lucas Berger 13d27fd2d1 docs(09): capture phase context
Phase 09: Batch Operations
- Implementation decisions documented
- Phase boundary established
2026-02-03 20:44:58 -05:00
Lucas Berger 03e56503de docs(08): complete Phase 8 with verification summary
- Update STATE.md with Phase 8 completion status
- Add 08-03-SUMMARY.md documenting bug fixes and verification
- Remove .continue-here checkpoint file
- Record key decisions from verification session

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 20:32:15 -05:00
Lucas Berger d1da276aa4 fix(08): resolve n8n deployment issues and clean up orphan nodes
Bug fixes:
- Fix array handling in Code nodes ($input.all() vs $input.item.json)
  - Build Logs Action Command
  - Build Confirmed Stop Command
  - Build Immediate Action Command
  - Find Container For Update
- Add timestamp to logs refresh to avoid "message not modified" error
- Add :latest tag protection to callback update flow
- Add image cleanup after callback updates

Cleanup:
- Remove orphan nodes: Parse and Match, Format Response, Send Docker Response
- Rename duplicate "Inspect New Image" to "Inspect New Image (Text)"
- Restore Compare Digests to fix text update command flow
- Add callback image cleanup nodes (Build Callback Remove Image, Callback Remove Old Image)

Both text commands and inline keyboard buttons now work correctly.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 20:31:20 -05:00
Lucas Berger 1331ee1331 wip(08): paused at verification checkpoint - workflow fixes in progress 2026-02-03 17:04:12 -05:00
Lucas Berger 127f176056 feat(08-03): enhance update progress with explicit button removal
- Update progress message uses upward arrow icon for update
- Add "This may take a few minutes" notice
- Explicitly pass empty inline_keyboard to remove buttons
- Prevents accidental duplicate action triggers during update

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:34:53 -05:00
Lucas Berger 3e11dea2ed feat(08-03): simplify completion messages to back-only button
- Update Format Immediate Result for start/restart actions
- Update Format Confirmed Stop Result for stop action
- Update Format Update Complete for update action
- Update Format No Update Needed for already-up-to-date case
- Success shows only "Back to Containers" button
- Errors show "Try Again" + "Back to Containers" buttons
- Removes action buttons from completion state per UX spec

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:34:10 -05:00
Lucas Berger a6548b300f docs(08-02): complete action execution plan
Tasks completed: 2/2
- Task 1: Route Action Callbacks to Container Operations
- Task 2: Add Confirmation Flow for Dangerous Actions

SUMMARY: .planning/phases/08-inline-keyboard-infrastructure/08-02-SUMMARY.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:29:42 -05:00
Lucas Berger ab7ce88792 feat(08-02): add confirmation flow for dangerous actions
- Update Parse Callback Data to handle confirm: and cancel: callbacks
- Add isConfirm and isCancelConfirm outputs to Route Callback switch
- Add 30-second timeout check for confirmations (timestamp in callback_data)
- Wire confirmed stop action to container stop flow with result display
- Wire confirmed update action to full update flow (pull, recreate, start)
- Handle cancel by returning to container submenu
- Show expired message when confirmation times out
- Progress indicator during update: "Updating..."

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:28:33 -05:00
Lucas Berger d1584197f8 feat(08-02): route action callbacks to container operations
- Add Answer Action Callback node to answer query immediately
- Add Route Action Type switch with start/restart/stop/update/logs outputs
- Wire start/restart to immediate action flow (Get Container, Build Command, Execute, Format Result)
- Wire logs to logs action flow with 30-line display
- Wire stop/update to confirmation dialog builders with 30s timeout
- All action results update message in-place with editMessageText

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:24:21 -05:00
Lucas Berger 1a3feecd91 docs(08-01): complete container list keyboard plan
Tasks completed: 3/3
- Task 1: Add Container List Inline Keyboard
- Task 2: Add Container Submenu with Action Buttons
- Task 3: Handle List Pagination Callbacks

SUMMARY: .planning/phases/08-inline-keyboard-infrastructure/08-01-SUMMARY.md
2026-02-03 16:19:51 -05:00
Lucas Berger 393d368dec feat(08-01): handle list pagination callbacks
- Add Answer List Callback HTTP node (prevents loading indicator)
- Add Prepare List Fetch code node
- Add Get Containers For List HTTP Request node
- Add Build Paginated List code node (reuses keyboard logic)
- Add Edit Container List HTTP node (editMessageText for in-place updates)
- Wire Route Callback list output to pagination flow
- All page transitions use message edits (no new messages)
2026-02-03 16:18:50 -05:00
Lucas Berger 01482827fb feat(08-01): add container submenu with action buttons
- Update Parse Callback Data to recognize select:, list:, action:, noop formats
- Add Route Callback outputs: select, list, action, noop
- Add Answer Select Callback HTTP node (prevents loading indicator)
- Add Prepare Container Fetch code node
- Add Get Single Container HTTP Request node
- Add Build Container Submenu code node with state-based action buttons
- Add Send Container Submenu HTTP node (editMessageText for in-place updates)
- Add Answer Noop Callback for page indicator button
- Wire complete select flow: Route -> Answer -> Fetch -> Submenu -> Send
2026-02-03 16:17:38 -05:00
Lucas Berger f8d616e26d feat(08-01): add container list inline keyboard
- Add Build Container List Keyboard code node
- Add Send Container List HTTP Request node
- Add Check Single Container IF node for direct access routing
- Add Build Container Submenu Direct for /status <name> flow
- Add Send Container Submenu Direct HTTP Request
- Wire Keyword Router status -> Docker List -> Build Keyboard flow
- Running containers shown first with green icon
- Pagination support for >6 containers
2026-02-03 16:15:29 -05:00