15 KiB
phase, plan, type, wave, depends_on, files_modified, autonomous, requirements, must_haves
| phase | plan | type | wave | depends_on | files_modified | autonomous | requirements | must_haves | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| quick-260729-je5 | 01 | execute | 1 |
|
true |
|
|
-
QUICK-JE5-01 — Connected-nodes list flex fix (both builds): the scrollable nodes list in the dashboard "Connected Nodes" card must always end at a consistent margin above the bottom Find Nodes / Refresh buttons, even when the sibling card (Web5NodeVisibility) stretches the shared grid row. Today the list is hard-capped at
max-h-72and the footer usesmt-auto, so a tall sibling opens a growing dead gap between list and buttons. -
QUICK-JE5-02 — Companion app skips demo intro (demo build only): when the demo runs inside the Android companion WebView (
window.ArchipelagoNativebridge injected), skip the typing splash +/onboarding/introentirely and land on /login, without touching any state the browser demo relies on. Desktop/PWA browser demo intro must be completely unaffected — the user resets and relies on it before demos.
Purpose: fix a visible layout bug on every node dashboard, and stop the companion app from replaying the demo cinematic every time the demo is opened in-app. Output: 2 focused commits on main (frontend only), tests green, verified build.
@/home/archipelago/Projects/archy/CLAUDE.md @/home/archipelago/Projects/archy/neode-ui/src/views/web5/Web5ConnectedNodes.vue @/home/archipelago/Projects/archy/neode-ui/src/utils/openExternal.ts @/home/archipelago/Projects/archy/neode-ui/src/composables/useDemoIntro.tsKey facts already established (do not re-derive):
- The "connected nodes" container is
neode-ui/src/views/web5/Web5ConnectedNodes.vue. Its card root (line 3) is alreadyglass-card p-6 ... flex flex-col. The three tab panes (Trusted ~line 57, Observers ~line 90, Requests ~line 120) each useclass="space-y-2 max-h-72 overflow-y-auto"withv-show, and the button footer (~line 161) is<div class="mt-auto pt-4 space-y-3">. The row isneode-ui/src/views/web5/Web5.vueline 59:grid grid-cols-1 xl:grid-cols-2 gap-6with siblingWeb5NodeVisibility(grid items stretch to row height by default). - Companion detection already exists:
isCompanionApp()inneode-ui/src/utils/openExternal.ts(true iff the native shell injectedwindow.ArchipelagoNativewith anopenInAppfunction; a plain browser/PWA never has it, and the bridge exists before page scripts run — appLauncher.ts already relies on it synchronously). - The demo intro fires from exactly four IS_DEMO branch sites:
neode-ui/src/App.vue~line 433:if (IS_DEMO && bootPath === '/') replayRequested = true(typing splash on every root boot)neode-ui/src/App.vue~line 588: post-splashif (IS_DEMO) { router.push('/onboarding/intro'); reveal(); return }neode-ui/src/views/RootRedirect.vue~lines 82 and 149:if (IS_DEMO) { demoRoute() }→ pushes/onboarding/intro
views/web5/__tests__/Web5ConnectedNodes.test.tsexists but does NOT assert onmax-h-72/mt-autoclasses (verified by grep) — class changes should not break it.
1. On EACH of the three v-show tab panes (Trusted, Observers, Requests — the divs
currently classed `space-y-2 max-h-72 overflow-y-auto`), change the classes to:
`space-y-2 flex-auto min-h-0 overflow-y-auto max-h-72 xl:max-h-none`
- `flex-auto` (flex: 1 1 auto) + `min-h-0` is the standard fix: the visible pane
becomes the flexible middle of the column-flex card, growing to absorb any
extra height the grid row imposes and shrinking (with internal scroll) when
constrained — so the space between list end and footer is always exactly the
footer's own pt-4.
- Keep `max-h-72` ONLY below xl (`xl:max-h-none` lifts it): below xl the grid is
single-column (`grid-cols-1`), no sibling stretches the card, and the current
mobile sizing must not change (constraint: no visual design change).
- Hidden panes are `v-show` (display:none) so applying flex classes to all three
is safe — only the visible one participates in layout.
2. On the footer div (`mt-auto pt-4 space-y-3`), add `shrink-0` so the buttons can
never be compressed by a long list. Keep `mt-auto` (harmless once the list is
flex-auto — it only matters in the sub-xl capped case, where it preserves today's
behavior exactly).
3. Touch NOTHING else in the component: no color, spacing, typography, or markup
changes. The card root already has `flex flex-col` — do not restructure it.
4. Sanity-check the sibling row in `neode-ui/src/views/web5/Web5.vue` line 59 (read
only): default grid item stretch is what feeds the card its height — no change
needed there.
This component is shared by real and demo builds, so one fix covers both builds.
1. `neode-ui/src/App.vue` (~line 433): change
`if (IS_DEMO && bootPath === '/') replayRequested = true`
to also require `!isCompanionApp()` — companion never requests the demo
splash replay.
2. `neode-ui/src/App.vue` (~line 588): gate the post-splash
`if (IS_DEMO) { router.push('/onboarding/intro') ... }` block with
`!isCompanionApp()`. When companion+demo, prefer routing DIRECTLY to '/login'
and `reveal()` (mirroring the "seenOnboarding === true" branch just below)
rather than falling through to `checkOnboardingStatus()` — the mock backend
reports onboarded and would land on /login anyway, but the direct route avoids
the status-check retry ladder and any splash-adjacent behavior. Add a one-line
comment: companion in-app demo skips the intro; browser demo unaffected.
3. `neode-ui/src/views/RootRedirect.vue` (~lines 82 and 149): gate both
`if (IS_DEMO) { demoRoute() }` calls the same way. When IS_DEMO and
isCompanionApp(), route to '/login' (behaving exactly as an intro-already-seen
demo session) instead of demoRoute(). Import `isCompanionApp` from
'@/utils/openExternal' (static import is fine — the module is tiny and already
in the main bundle).
4. HARD invariants (from the task constraints):
- Write NOTHING to localStorage/sessionStorage from any skip path (no
`neode_intro_seen`, no `demo_intro_date`, nothing) — the browser demo's
manually-reset intro state must be untouched.
- Non-demo builds: `IS_DEMO` is false, so every gated branch short-circuits
before `isCompanionApp()` matters — verify by inspection that no new code
runs outside `IS_DEMO === true` paths (keep `isCompanionApp()` on the RIGHT
side of the `&&` / inside the IS_DEMO block).
- Browser/PWA demo: `isCompanionApp()` is false (no bridge) — all four sites
behave byte-identically to today.
5. If an existing unit test covers RootRedirect demo routing, update/extend it; if
cheap, add a small test asserting `isCompanianApp`-style bridge detection drives
the skip (stub `window.ArchipelagoNative = { openInApp: () => {} }`). Do not
build heavy test scaffolding — the 697 existing tests staying green is the gate.
1. `cd /home/archipelago/Projects/archy/neode-ui && npm run build` (vue-tsc + vite;
outputs to web/dist/neode-ui). Build must succeed with zero type errors.
2. Bundle grep (build can silently no-op — always grep the built output):
- Fix 1: `grep -rl "xl:max-h-none" /home/archipelago/Projects/archy/web/dist/neode-ui/assets/` must match at least one asset (the new Tailwind class proves the fresh component shipped).
- Fix 2: the gate is inside IS_DEMO code, which a non-demo build may fold away, so
verify against a scratch demo build:
`VITE_DEMO=1 npx vite build --outDir /tmp/claude-1000/-home-archipelago-Projects-archy/3ca40190-d6bb-4f98-9d89-8d2479484065/scratchpad/demo-dist --emptyOutDir`
then confirm a JS chunk contains BOTH the `demoRoute` log string and
`ArchipelagoNative` (heuristic that the companion gate survived into the demo
bundle):
`grep -rl "demoRoute" <scratch>/demo-dist/assets/*.js | xargs grep -l "ArchipelagoNative"`
Do NOT commit or deploy the scratch demo build — it is verification only.
3. Commits (code only — the orchestrator commits .planning docs):
- Commit 1: Web5ConnectedNodes.vue flex fix.
- Commit 2: App.vue + RootRedirect.vue companion demo-intro skip (plus any test
file touched in Task 2).
- Stage EXPLICITLY by path (`git add neode-ui/src/...`), never `git add -A`.
- NEVER stage anything under `indeedhub/` (git submodule) — check
`git status --porcelain` before each commit and confirm no `indeedhub` entries
are staged.
- Do not commit `web/dist/` build output unless the repo already tracks it AND
it changed as a direct product of these fixes (check `git status` — if dist is
untracked/ignored, leave it alone).
- Messages end with the `Co-Authored-By: Claude ...` trailer per CLAUDE.md.
<success_criteria>
- QUICK-JE5-01: nodes list ends at a constant pt-4 above the bottom buttons at any xl row height; sub-xl sizing unchanged; no visual design changes.
- QUICK-JE5-02: companion WebView + demo lands on /login with no splash and no /onboarding/intro; browser/PWA demo and non-demo builds byte-identical in behavior; no intro-state storage writes from the skip path.
- Tests green, build verified via bundle grep, two clean path-staged commits, nothing from indeedhub/ touched. </success_criteria>