Demo images / Build & push demo images (push) Successful in 4m55s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
6.6 KiB
6.6 KiB
phase, plan, subsystem, tags, requirements, dependency-graph, tech-stack, key-files, decisions, metrics, status
| phase | plan | subsystem | tags | requirements | dependency-graph | tech-stack | key-files | decisions | metrics | status | ||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| quick-260729-je5 | 01 | neode-ui |
|
|
|
|
|
|
|
complete |
Quick Task 260729-je5: Connected-Nodes Scrollable List + Companion Demo Intro Skip Summary
Connected-nodes list now flexes to fill the xl grid-row (constant pt-4 gap above Find Nodes/Refresh) and the Android companion demo skips the intro straight to /login via isCompanionApp() gates at all four IS_DEMO branch sites, with zero storage writes.
Task Commits
| Task | Name | Commit | Files |
|---|---|---|---|
| 1 | Connected-nodes list fills card (QUICK-JE5-01) | b80e7c34 |
Web5ConnectedNodes.vue |
| 2 | Companion+demo intro skip (QUICK-JE5-02) | d54517cf |
App.vue, RootRedirect.vue, openExternal.test.ts |
| 3 | Build verification + bundle greps | — (verification only, no source edits) | — |
What Was Done
QUICK-JE5-01 — Connected-nodes list flex fix (b80e7c34)
- All three v-show tab panes (Trusted line 57, Observers line 90, Requests line 120) changed from
space-y-2 max-h-72 overflow-y-autotospace-y-2 flex-auto min-h-0 overflow-y-auto max-h-72 xl:max-h-none— the visible pane is now the flexible middle of the card's existing column flex, growing to absorb row height from a tall sibling Web5NodeVisibility card and scrolling internally when constrained. - Below xl (single-column grid) the
max-h-72cap remains — sub-xl sizing byte-identical. - Footer div gets
shrink-0(keptmt-auto) so the buttons can never be compressed. - No other markup/design changes; Web5.vue grid row (line 59) untouched as planned.
QUICK-JE5-02 — Companion demo intro skip (d54517cf)
All four IS_DEMO intro branch sites gated on the existing isCompanionApp() from @/utils/openExternal (static import added to both files):
App.vueline 435:if (IS_DEMO && bootPath === '/' && !isCompanionApp()) replayRequested = true— companion never requests the splash replay; with the mock backend reporting onboarded,shouldShowIntroSplashthen suppresses the splash.App.vuepost-splash block (~line 592): companion+demo routes directly to/login+reveal()(mirrors the seenOnboarding===true branch), avoiding the status-check retry ladder.RootRedirect.vueproceedToApp()(~line 87): companion+demo →router.replace('/login')instead ofdemoRoute().RootRedirect.vueonMounted server-up branch (~line 160): same gate.
Hard invariants verified:
- Zero storage writes on any skip path — RootRedirect skip paths intentionally do NOT call
log()because it writessessionStorage.archipelago_boot_log; diff grep for addedlocalStorage|sessionStoragelines matched only a comment. - Non-demo builds:
isCompanionApp()sits on the right ofIS_DEMO &&/ insideif (IS_DEMO)blocks — never reached when IS_DEMO is false (compile-time false in non-demo builds; demo scratch bundle confirmed dead-code folding of the non-demo path). - Browser/PWA demo: no bridge →
isCompanionApp()false → all four sites behave byte-identically (intro replays on every fresh root boot).
New test src/utils/__tests__/openExternal.test.ts: 3 cases asserting bridge detection (no bridge → false; bridge with openInApp → true; bridge without callable openInApp → false).
Verification
- Full unit suite: 700 passed, 0 failed (697 baseline + 3 new).
npm run build(vue-tsc + vite) green;web/dist/neode-ui/assets/Web5-CB3C73UV.jscontainsxl:max-h-none(fix 1 shipped).- Scratch
VITE_DEMO=1build (scratchpad only, not committed): the plan's single-chunk co-occurrence grep did not match because Vite splits chunks —demoRoutelives inRootRedirect-*.jswhileArchipelagoNativelives in the sharedindex-*.js/Dashboard-*.jschunks. Verified semantically instead (stronger): RootRedirect chunk contains both gated sites compiled asif(E()){_.replace("/login")...;return}x();returnwhereEis imported from the index chunk whoseisCompanionAppimplementation checksopenInApp=="function"onArchipelagoNative. web/distis gitignored — left untouched per plan; no dist output committed.- Both commits path-staged, submodule guard run before each, no
indeedhub/paths (git show --statclean),Co-Authored-By: Claudetrailer present. - Pre-existing untracked files from other agents (
.planning/phases/01-.../01-PATTERNS.md,scripts/resilience/.gitignore-reports.tmp) left alone.
Deviations from Plan
Auto-fixed / adjusted
1. [Verification method] Demo-bundle co-occurrence grep replaced with per-chunk semantic verification
- Found during: Task 3
- Issue: The plan's heuristic (
grep -rl demoRoute ... | xargs grep -l ArchipelagoNative) assumes both strings land in one JS chunk; Vite's code splitting puts them in different chunks. - Fix: Verified the actual gate in the RootRedirect demo chunk (minified
if(E()){replace("/login")}at both sites,E= isCompanionApp import) and theopenInApp=="function"detection in the index chunk. - Files modified: none (verification only).
No other deviations — plan executed as written.
Known Stubs
None.