docs(05): create phase plan
Phase 05: Polish & Deploy - 3 plans in 3 waves - 1 parallel (Wave 1), 2 sequential (Waves 2-3) - Ready for execution Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
---
|
||||
phase: 05-polish-deploy
|
||||
plan: 01
|
||||
type: execute
|
||||
wave: 1
|
||||
depends_on: []
|
||||
files_modified: [n8n-workflow.json]
|
||||
autonomous: true
|
||||
|
||||
must_haves:
|
||||
truths:
|
||||
- "User sees persistent menu buttons in Telegram"
|
||||
- "Typing 'status' triggers container list (no Claude API call)"
|
||||
- "Typing 'start plex' triggers start flow (no Claude API call)"
|
||||
- "Unknown commands show menu instead of error"
|
||||
artifacts:
|
||||
- path: "n8n-workflow.json"
|
||||
provides: "Keyword Router Switch node"
|
||||
contains: "Keyword Router"
|
||||
- path: "n8n-workflow.json"
|
||||
provides: "Persistent menu reply markup"
|
||||
contains: "is_persistent"
|
||||
key_links:
|
||||
- from: "Telegram Trigger"
|
||||
to: "Keyword Router"
|
||||
via: "Route Message path"
|
||||
pattern: "Keyword Router"
|
||||
- from: "Keyword Router"
|
||||
to: "Docker List Containers"
|
||||
via: "status output"
|
||||
pattern: "status.*Docker List"
|
||||
---
|
||||
|
||||
<objective>
|
||||
Replace Claude/NLU nodes with keyword-based routing and add persistent Telegram menu buttons.
|
||||
|
||||
Purpose: Remove external Claude API dependency, enable offline-first operation with simple keyword matching.
|
||||
Output: Working keyword routing with persistent menu, no Claude API calls in workflow.
|
||||
</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/05-polish-deploy/05-CONTEXT.md
|
||||
@.planning/phases/05-polish-deploy/05-RESEARCH.md
|
||||
@n8n-workflow.json
|
||||
</context>
|
||||
|
||||
<tasks>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 1: Remove NLU/Claude nodes and add Keyword Router</name>
|
||||
<files>n8n-workflow.json</files>
|
||||
<action>
|
||||
Remove these nodes from the workflow:
|
||||
- Prepare Claude Request
|
||||
- Claude Intent Parser (HTTP Request node calling api.anthropic.com)
|
||||
- Parse Intent (Code node)
|
||||
- Intent Router (old Switch node routing on parsed intent)
|
||||
- Send Unknown Intent
|
||||
- Send Intent Error
|
||||
- Remove Anthropic API Key credential reference
|
||||
|
||||
Replace with a single Switch node called "Keyword Router" with these rules (case-insensitive matching on message.text):
|
||||
- Contains "status" -> output "status" -> connect to Docker List Containers
|
||||
- Contains "start" -> output "start" -> connect to Parse Action Command (with action set to start)
|
||||
- Contains "stop" -> output "stop" -> connect to Parse Action Command (with action set to stop)
|
||||
- Contains "restart" -> output "restart" -> connect to Parse Action Command (with action set to restart)
|
||||
- Contains "update" -> output "update" -> connect to existing update flow entry point
|
||||
- Contains "logs" -> output "logs" -> connect to existing logs flow entry point
|
||||
- Fallback (extra) -> connect to new "Show Menu" node
|
||||
|
||||
Use the Switch node pattern from RESEARCH.md:
|
||||
```json
|
||||
{
|
||||
"conditions": {
|
||||
"options": { "caseSensitive": false },
|
||||
"conditions": [{
|
||||
"leftValue": "={{ $json.message.text }}",
|
||||
"rightValue": "status",
|
||||
"operator": { "type": "string", "operation": "contains" }
|
||||
}]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Update "Route Message" node to connect directly to "Keyword Router" instead of the old Claude flow.
|
||||
</action>
|
||||
<verify>
|
||||
Open workflow in n8n UI. Send "status" - should trigger Docker List Containers path.
|
||||
Check that no nodes reference api.anthropic.com or Anthropic API Key credential.
|
||||
</verify>
|
||||
<done>
|
||||
Keyword Router handles all 6 commands (status, start, stop, restart, update, logs) plus fallback.
|
||||
No Claude/NLU nodes remain in workflow.
|
||||
</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 2: Add persistent Telegram menu</name>
|
||||
<files>n8n-workflow.json</files>
|
||||
<action>
|
||||
Create a new "Show Menu" node (HTTP Request type, not native Telegram node - per project pattern for keyboards).
|
||||
|
||||
Configure HTTP Request:
|
||||
- URL: `https://api.telegram.org/bot{{ $credentials.telegramApi.token }}/sendMessage`
|
||||
- Method: POST
|
||||
- Body (JSON):
|
||||
```json
|
||||
{
|
||||
"chat_id": "={{ $json.message.chat.id }}",
|
||||
"text": "Use buttons below or type commands:",
|
||||
"parse_mode": "HTML",
|
||||
"reply_markup": {
|
||||
"keyboard": [
|
||||
[{"text": "Status"}],
|
||||
[{"text": "Start"}, {"text": "Stop"}],
|
||||
[{"text": "Restart"}, {"text": "Update"}],
|
||||
[{"text": "Logs"}]
|
||||
],
|
||||
"is_persistent": true,
|
||||
"resize_keyboard": true,
|
||||
"one_time_keyboard": false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Connect Keyword Router fallback output to Show Menu node.
|
||||
|
||||
NOTE: Research suggests emojis optional (Claude's discretion from CONTEXT.md). Start without emojis for cleaner keyword matching - button text "Status" matches "status" keyword.
|
||||
|
||||
Also wire /start command to Show Menu:
|
||||
- In Keyword Router, add rule: Contains "/start" -> output "menu" -> connect to Show Menu
|
||||
</action>
|
||||
<verify>
|
||||
Send any unknown command (e.g., "hello") - should receive menu with persistent keyboard.
|
||||
Send "/start" - should receive same menu.
|
||||
Keyboard should persist after sending other messages.
|
||||
</verify>
|
||||
<done>
|
||||
Persistent menu visible in Telegram chat.
|
||||
Menu buttons trigger corresponding actions when tapped.
|
||||
/start and unknown commands show menu.
|
||||
</done>
|
||||
</task>
|
||||
|
||||
</tasks>
|
||||
|
||||
<verification>
|
||||
1. All Claude/NLU nodes removed (grep for "anthropic", "Claude", "Intent" in workflow JSON)
|
||||
2. Keyword Router handles: status, start, stop, restart, update, logs, /start, fallback
|
||||
3. Persistent menu shows 6 buttons in grouped layout
|
||||
4. Button taps trigger corresponding keyword routes
|
||||
5. No errors in n8n execution logs for any command
|
||||
</verification>
|
||||
|
||||
<success_criteria>
|
||||
- Zero references to Anthropic API or Claude in workflow
|
||||
- All 6 container commands work via typed keywords
|
||||
- Persistent menu visible and functional
|
||||
- Unknown input shows menu (not error)
|
||||
</success_criteria>
|
||||
|
||||
<output>
|
||||
After completion, create `.planning/phases/05-polish-deploy/05-01-SUMMARY.md`
|
||||
</output>
|
||||
Reference in New Issue
Block a user