From 6f7fcd43a5925c2ea644f9e8f0f72f8269483784 Mon Sep 17 00:00:00 2001 From: OpenClaw Bot Date: Thu, 7 May 2026 16:13:51 +0200 Subject: [PATCH] feat: add one-click feature handoff flow --- README.md | 1 + docs/TEST_PLAN.md | 13 +++++++++++++ src/App.tsx | 34 +++++++++++++++++++++++++++++++--- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a2c7da5..8a9cedf 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ BuildPulse v0.1 includes: - Pulse Log screen - Export screen - AI session prompt export for coding-agent handoff +- One-click handoff prep from a selected feature - Appwrite-backed persistence on the Unraid server - Local cache fallback for resilience during backend hiccups - Pulse-shaped event records diff --git a/docs/TEST_PLAN.md b/docs/TEST_PLAN.md index f0ec112..b370b7e 100644 --- a/docs/TEST_PLAN.md +++ b/docs/TEST_PLAN.md @@ -192,6 +192,19 @@ Expected: - Contains recent pulses. - Is useful as an AI coder handoff. +### Test 5.5: Prepare AI handoff from selected feature + +Steps: +1. Open Feature Plan. +2. Select a feature. +3. Click `Prepare AI Handoff`. +4. Confirm Export view opens with the selected feature loaded into `AI_SESSION_PROMPT.md`. + +Expected: +- Export view opens immediately. +- Prompt focus feature matches the selected feature. +- Prompt includes current goal, acceptance criteria, parking-lot guardrails, and recent relevant pulses. + ## Manual Test Group 6 — Mobile Usability ### Test 6.1: Phone layout diff --git a/src/App.tsx b/src/App.tsx index f665a99..8a793fe 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -279,6 +279,15 @@ function App() { })) } + const openFeatureHandoff = (featureId: string) => { + setPromptFeatureId(featureId) + setPromptTarget('OpenClaw') + setActiveTab('export') + + const feature = appState.features.find((entry) => entry.id === featureId) + setStatusMessage(feature ? `Prepared AI handoff for “${feature.title}”.` : 'Prepared AI handoff prompt.') + } + const beginParkingEdit = (item: ParkingLotItem) => { setSelectedParkingId(item.id) setParkingDraft({ @@ -601,6 +610,20 @@ function App() { + {selectedFeature && ( +
+
+ {selectedFeature.title} +

Selected and ready. Shape it here, then kick a clean brief to your agent.

+
+
+ +
+
+ )} +
{FEATURE_COLUMNS.map((column) => (
@@ -708,9 +731,14 @@ function App() { {selectedFeature && ( - + <> + + + )}