fix(mobile): share one single-line input box and align sign-in provider labels - #6644
Conversation
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Executive SummaryIncremental review of the Files Reviewed (10 incremental files; 29 unchanged since commit 8556f2f)
Previous Review Summaries (2 snapshots, latest commit 8556f2f)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit 8556f2f)Status: No Issues Found | Recommendation: Merge Executive SummaryReviewed the full 39-file mobile change at HEAD Files Reviewed (39 files)
Previous review (commit d7e3d5a)Status: 4 Issues Found | Recommendation: Address before merge Overview
Issue Details (click to expand)WARNING
SUGGESTION
Files Reviewed (38 files)
Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0 Review guidance: REVIEW.md from base branch |
|
bot: rejected: a suggestion, not a defect. A typed review read this finding as needing no code change before merge; the code stays as is. Say so here if one of them does change behaviour and it will be repaired.
|
2cdd920 to
8556f2f
Compare
|
This description names a scenario the proof did not capture:
A repeated proof run rebuilds the same evidence, so no proof run is dispatched for a named gap. Merging with this gap open is your decision. |
Four conflicts, all from main's FlashList migration and the merged #6614 PR Review header tidy meeting this branch's shared single-line input box. - model-picker-content.tsx: take main's react-native import (FlashList replaced FlatList in the body). - share-destination-list.tsx: import only View and ViewStyle; the body keeps this branch's shared Input and main's FlashList. - share-destination-list.mounted.test.tsx: main's react-native + flash-list mock structure, keeping the I18nManager stub the shared Input needs. - pr-review-entry-screen.tsx: take main's tidied paste block (no separate header, from #6614) and swap its TextInput back to the shared Input box, which owns the height floor and the one line box.
The merge of origin/main into this branch kept main's new pr-review-entry-screen test looking for a `TextInput` host and main's value imports of `TextInput`, while this branch renders the shared single-line box from `@/components/ui/input` and only uses `TextInput` as a ref type.
…4554) ## Automated docs sync — 2026-09-25 This PR keeps kilo.ai/docs in sync with features merged to [Kilo-Org/cloud](https://github.com/Kilo-Org/cloud) and [Kilo-Org/kilocode](https://github.com/Kilo-Org/kilocode). Every change below links to the merged PR it documents. - Window: `2026-09-24T07:08:33.639Z` → `2026-09-25T07:05:29.302Z` - Verification (docs build + tests): **passing** ### Surface: `cloud-mobile` - Assignees / requested reviewers: @iscekic and @eshurakov - Derivation: Derived from the repository layout. A product surface is a package under packages/ that ships a distinct client, plugin, backend, or hosted service: cli = packages/opencode/ + packages/tui/ + packages/server/ + packages/sdk/ + packages/plugin/; vscode = packages/kilo-vscode/ + packages/kilo-web-ui/ + packages/kilo-ui/; jetbrains = packages/kilo-jetbrains/; gateway = packages/kilo-gateway/; web = packages/kilo-console/ + packages/kilo-indexing/ + packages/kilo-memory/ + packages/kilo-sandbox/. Docs route from the IA tree packages/kilo-docs/pages/ plus docs/jetbrains-vscode-settings-parity.md: each surface lists the pages sections that document it, and the per-platform pages under packages/kilo-docs/pages/code-with-ai/platforms/ map to the matching extension surface (the vscode/ directory to vscode, jetbrains.md to jetbrains). A doc path belongs to the surface with the longest matching prefix; a path that matches none of those prefixes falls to `other` (the explicit other prefixes are listed under other.docs). The cloud surfaces are derived the same way from the Kilo-Org/cloud layout: cloud-mobile = apps/mobile/, cloud-web = apps/web/, cloud-extension = apps/extension/, and cloud-agent = the cloud-agent packages under packages/ (packages/cloud-agent-sdk/ + packages/cloud-agent-profile/). A cloud source names its repository while a bare string still means this repository. The pages under packages/kilo-docs/pages/collaborate/ document the cloud web app (app.kilo.ai: teams dashboard, billing, SSO, adoption dashboard), so they route to cloud-web. No page under packages/kilo-docs/pages/ documents the browser side-panel extension yet, so cloud-extension lists no docs prefix. - Map: `.github/docs-sync/surfaces.json` - Surface map: `cli`, `vscode`, `jetbrains`, `gateway`, `web`, `cloud-mobile`, `cloud-web`, `cloud-extension`, `cloud-agent`, `other` - Source prefixes: `apps/mobile/` (Kilo-Org/cloud) - Doc prefixes: `packages/kilo-docs/pages/code-with-ai/platforms/mobile.md` - Paths that fall to `other`: `packages/kilo-docs/pages/community/`, `packages/kilo-docs/pages/kiloclaw/`, `packages/kilo-docs/pages/contributing/`, `packages/kilo-docs/LEARNINGS.md`, `docs/` - Reviewers are ranked from `Kilo-Org/cloud`; the workflow needs a token with `contents: read` on that repository (repository secret `CROSS_REPO_ACCESS_TOKEN`, exposed to the upsert step as `CLOUD_REPO_TOKEN`). - How the two were computed: Reviewers for `cloud-mobile` are ranked from `Kilo-Org/cloud` git history over `apps/mobile/` (a commit 180 days old counts half as much, half-life 180 days). Bots (author type "Bot" or a login matching /\[bot\]$/i) and people without admin, write, or maintain permission are excluded. ### Changes <!-- docs-sync:changes:start --> | Docs change | Source | | --- | --- | | updated pages/code-with-ai/platforms/mobile.md | [Kilo-Org/cloud#6386](Kilo-Org/cloud#6386) | | updated pages/ai-providers/openai-chatgpt-plus-pro.md | [Kilo-Org/cloud#6702](Kilo-Org/cloud#6702) | | updated pages/code-with-ai/platforms/cloud-agent.md | [Kilo-Org/cloud#6683](Kilo-Org/cloud#6683) | | updated pages/getting-started/byok.md | [Kilo-Org/cloud#6692](Kilo-Org/cloud#6692) | <!-- docs-sync:changes:end --> ### Pending — will retry <!-- docs-sync:pending:start --> _None._ <!-- docs-sync:pending:end --> ### Considered, no docs change needed <!-- docs-sync:skipped:start --> | PR | Reason | | --- | --- | | [Kilo-Org/cloud#6658](Kilo-Org/cloud#6658) | Internal sandbox lifecycle fix with no user-visible workflow or setting. | | [Kilo-Org/cloud#6673](Kilo-Org/cloud#6673) | Internal container CA trust plumbing, no user-facing behavior. | | [Kilo-Org/cloud#6672](Kilo-Org/cloud#6672) | Internal sandbox launch/recovery fix with no documented workflow change. | | [Kilo-Org/cloud#6660](Kilo-Org/cloud#6660) | Internal cloud-agent queue delivery fix; no new command, setting, or workflow for users. | | [Kilo-Org/cloud#6226](Kilo-Org/cloud#6226) | Internal gateway alias-routing change, not user-visible. | | [#14490](#14490) | Tool-call animation and streaming UI polish; users do not need to learn a new workflow. | | [#14530](#14530) | Bug fix restoring intended worktree-pool behavior, no doc change needed. | | [#14529](#14529) | Bug fix restoring tab/panel state across project switches. | | [#14531](#14531) | Reconnect recovery bug fix, restores already-documented behavior. | | [#14532](#14532) | Bug fix keeping session tab title in sync on rename. | | [Kilo-Org/cloud#6088](Kilo-Org/cloud#6088) | Removes internal/admin model-experiment surfaces, not public product docs. | | [Kilo-Org/cloud#6682](Kilo-Org/cloud#6682) | Internal control-socket reconnect race fix, no user-facing change. | | [#14534](#14534) | Transcript re-render performance bug fix. | | [#14535](#14535) | Bug fix preserving the loaded browser page across context switches. | | [Kilo-Org/cloud#6684](Kilo-Org/cloud#6684) | Reverted by Kilo-Org/cloud#6685. | | [Kilo-Org/cloud#6678](Kilo-Org/cloud#6678) | Dead-code constant removal, no user-visible effect. | | [Kilo-Org/cloud#6687](Kilo-Org/cloud#6687) | Removes internal model-experiment maintenance and retains tables, no user-facing change. | | [#14515](#14515) | JetBrains plugin unload crash fix, no documented behavior change. | | [#14520](#14520) | JetBrains transcript/list rendering performance work. | | [Kilo-Org/cloud#6614](Kilo-Org/cloud#6614) | Mobile PR Review header and session title bug fix, no doc change needed. | | [Kilo-Org/cloud#6625](Kilo-Org/cloud#6625) | Internal mobile secure-store error-handling refactor. | | [Kilo-Org/cloud#6624](Kilo-Org/cloud#6624) | Mobile auth bug fix that stops a retry loop; restores expected sign-in behavior with no new setting or workflow. | | [#14310](#14310) | Contributor/CI fix making the kilo-v2 checkout installable; not user-visible product behavior. | | [Kilo-Org/cloud#6611](Kilo-Org/cloud#6611) | Mobile notification-tap fix that selects the session's organization; restores correct behavior rather than adding a learnable feature. | | [Kilo-Org/cloud#6644](Kilo-Org/cloud#6644) | Mobile sign-in layout/alignment polish; no change to what a user must do. | | [Kilo-Org/cloud#6601](Kilo-Org/cloud#6601) | Mobile layout fix keeping empty states clear of the tab bar; purely visual. | | [#14543](#14543) | CI/release infrastructure adding Windows binary code signing; no public docs impact. | | [Kilo-Org/cloud#6616](Kilo-Org/cloud#6616) | Mobile visual defect fixes and a session-title fallback; no new user workflow or setting. | | [Kilo-Org/cloud#6630](Kilo-Org/cloud#6630) | Reports an edge-case partial worktree restore; failure-path plumbing with no new user-facing workflow, target setting, or config. | | [Kilo-Org/cloud#6699](Kilo-Org/cloud#6699) | Cloud Agent e2e stabilization plus internal idle-sandbox capacity handling; not user-visible. | | [#14545](#14545) | Automated JetBrains release/changelog PR; underlying user-facing changes are triaged from their own PRs. | | [Kilo-Org/cloud#6708](Kilo-Org/cloud#6708) | Internal AI-gateway request-logging policy change in the admin panel; no existing public docs surface and no change to how users run Kilo Code. | | [#14533](#14533) | Documentation already shipped with the merged PR. The experimental.task_model_selection flag is gone from the current source, and pages/code-with-ai/agents/model-selection.md, pages/code-with-ai/agents/context-mentions.md, and pages/getting-started/settings/index.md already describe per-task selection as default-on with no stale experiment references. | | [#14510](#14510) | Documentation already shipped with the merged PR. Marketplace companion-skill support is present in the current source (packages/opencode/src/kilocode/marketplace/companions.ts and installer), and pages/customize/marketplace.md already documents installing, publishing, and removing MCP servers with companion skills. | <!-- docs-sync:skipped:end --> --- (bot) Generated by the docs-sync workflow. Humans review and merge; while this PR stays open, the next daily run appends new changes here. Branch: `docs/auto-sync-2026-09-25`. <!-- docs-sync: processed-through 2026-09-25T07:05:29.302Z -->
Changelog for users
Changelog for maintainers
Inputowns the one single-line box (min-h-[44px] px-3 leading-[normal], no vertical padding) and forces AndroidtextAlignVertical: 'center';FormField, the OTP field, and every migrated search, URL, and day field render it.min-hbox, because the mobile input rules forbidpy-*on a single-line field (iOS insets the already-centred text rect). Reviewer: the box was measured on Android only, so confirm iOS.Inputfolds a caller'stextAlignprop into the style behind the caller's own style, so the RTL default cannot override it; the centred SLA day fields stay centred. Multiline callers keep their own box andtextAlignVertical.28 + 4 + 12 = 44pt), so the visible gaps are the sentence's own while the 28dp node rect and the vertical reach hold.<TextInput>under the app source and resolves aliased imports; its allowlist names 13 multiline composers, each with a written reason.path:lineat a time in the guard, because the owner-boundary gate bars this change from that subtree; the Kilo Claw owner migrates those fields.I18nManagerbecause the shared field reads it each render. Risk:Inputforces centre on single-line fields, so check any field that previously set a non-centre vertical alignment.E2E proof
[e3] Fault 2 (dark, Serbian): the sign-in email field's placeholder 'ime@primer.rs' and the typed value occupy the same box - same x and same y. — android emulator-5554 (this host is android-only; no second platform). e3-field-box.log: the one EditText node draws both hint and value — dark empty bounds="[99,1224][981,1340]" (showing-hint="true") and dark typed bounds="[99,1224][981,1341]" (showing-hint="false") give origin x=99, y=1224 in both, so the placeholder and the value share the box origin (the 1 px box-bottom difference is sub-pixel rounding of the 44dp min-h floor); light captures e3-light-empty.png and e3-light-typed.png show the same x=99 and the same focused box [99,1224][981,1340], so the geometry is…
[e4] Fault 2 unhappy: submitting the empty sign-in field shows the validation message under the field and the text inside the field does not move. — android emulator-5554, locale sr, system dark, live one-session before/after: 'SCENE e4-before OK' shows the empty field 'android.widget.EditText Adresa e-pošte tappable [99,1256][981,1372]' with no error node, then after the empty submit 'SCENE e4 OK' shows the same box 'android.widget.EditText Adresa e-pošte i greška: Unesi svoju adresu e-pošte. tappable [99,1226][981,1342]' (both 882x116, same 13px label gap) with the message as a separate node below it 'android.widget.TextView Unesi svoju adresu e-pošte. tappable [99,1356][981,1402]' (top 1356 > box bottom 1342), so the text's position…
[e10] ux-check: Serbian dark sign-in legal line: the sentence renders on one line, each inter-word gap matches the sentence's own word space, and the final period touches the last link. — [e10] android emulator-5554, app locale sr, system dark: 'SCENE e10 OK' (e10-legal-line.log); the digest records the legal-line nodes with 'node adjacency (no reserved-box gap)' and the period node that 'overlaps the last link => touches', and the one-line/gap layout appearance is the judgement owned by the visual reviewer (e10.png).
[e9] ux-check: Sign-in email field: focusing it, and showing the validation error under it, does not move the text inside the box. — android emulator-5554: the shared box is geometrically identical in every state - empty unfocused placeholder (e9-before.txt: text="you@example.com" bounds="[99,1274][981,1391]"), error shown (e9-scene.log: 'android.widget.EditText Email address and error: Please enter your email address. tappable [99,1213][981,1329]' with the message as a sibling node at [99,1343][981,1389]) and focused+typed (e9-typed.txt: text="ie@primer.rs" focused="true" bounds="[99,1243][981,1359]") - so x=99, width=882 and height 116-117px are unchanged (textAlignVertical:center from the shared Input path), and no…
[e10] ux-check: Serbian dark sign-in legal line: the sentence renders on one line, each inter-word gap matches the sentence's own word space, and the final period touches the last link.
[e3] Fault 2 (dark, Serbian): the sign-in email field's placeholder 'ime@primer.rs' and the typed value occupy the same box - same x and same y.
[e4] Fault 2 unhappy: submitting the empty sign-in field shows the validation message under the field and the text inside the field does not move.
E2E proof — log excerpts
/home/igor_kilocode_ai/.local/share/kwf/sections/signin-label-axis-and-input-box-65ae/e2e-mobile-app/scripted-e5.log/home/igor_kilocode_ai/.local/share/kwf/sections/signin-label-axis-and-input-box-65ae/e2e-mobile-app/e6-geometry.log/home/igor_kilocode_ai/.local/share/kwf/sections/signin-label-axis-and-input-box-65ae/e2e-mobile-app/e6-scene.log/home/igor_kilocode_ai/.local/share/kwf/sections/signin-label-axis-and-input-box-65ae/e2e-mobile-app/e6-tree.txt/home/igor_kilocode_ai/.local/share/kwf/sections/signin-label-axis-and-input-box-65ae/e2e-mobile-app/e6-dark-theme-setting.txt/home/igor_kilocode_ai/.local/share/kwf/sections/signin-label-axis-and-input-box-65ae/e2e-mobile-app/scripted-e7.log/home/igor_kilocode_ai/.local/share/kwf/sections/signin-label-axis-and-input-box-65ae/e2e-mobile-app/scripted-e8.log/home/igor_kilocode_ai/.local/share/kwf/sections/signin-label-axis-and-input-box-65ae/e2e-mobile-app/e9-field.log/home/igor_kilocode_ai/.local/share/kwf/sections/signin-label-axis-and-input-box-65ae/e2e-mobile-app/e9-empty.txt/home/igor_kilocode_ai/.local/share/kwf/sections/signin-label-axis-and-input-box-65ae/e2e-mobile-app/e9-error.txt/home/igor_kilocode_ai/.local/share/kwf/sections/signin-label-axis-and-input-box-65ae/e2e-mobile-app/e9-focus.txt/home/igor_kilocode_ai/.local/share/kwf/sections/signin-label-axis-and-input-box-65ae/e2e-mobile-app/e9-typed.txt/home/igor_kilocode_ai/.local/share/kwf/sections/signin-label-axis-and-input-box-65ae/e2e-mobile-app/scripted-e10.log/home/igor_kilocode_ai/.local/share/kwf/sections/signin-label-axis-and-input-box-65ae/e2e-mobile-app/scripted-e11.logOwner request
[e13] ux-check: Kilo Claw onboarding (Android): the bot-name and location fields draw their placeholder and typed value on the same baseline. — android emulator-5554 (app locale sr), identity step forced via the pack's sanctioned temporary fixture (gate at onboarding-flow.tsx), reverted after capture (git clean); e13-live-scene.log 'SCENE e13 OK' + 'SCENE e13-typed OK' shows EditText 'Ime bota' and 'KiloBot' both at [193,250][1043,379] and 'Grad ili region (opciono)' and 'Beograd' both at [37,761][925,863]; e13-scene.xml/e13-typed-scene.xml show the same node with showing-hint true vs false over the identical bounds, so placeholder and value share the baseline; static nodes identical between frames, no UX-DEFECT; screenshots for the…
[e1] Fault 1 provider label axis + glyph slot (android, sr, dark) — android emulator-5554, app locale sr: Google label x=222 and passkey label x=222 are equal (e1-hierarchy.xml), the passkey row reserves the 18dp slot though it draws no mark (no glyph node, same 123px label offset), the Google slot is 47px=17.9dp; the Apple row is iOS-only so android shows two provider rows; busy state not driven (SSO ceremony, allowed by the request); fresh SCENE e1 OK after STATE HIT signed-out.
[e1] Fault 1 provider label axis + glyph slot (android, sr, dark)
Follow-ups (not changed here)
Merge proof
origin/mainmerged into this branch as merge commit589317d638(parents51033771f2+8d07bf579c). Four files conflicted; each kept main's discoverability/react-native structure plus this branch's sharedInput. One follow-up commit88950b86aaaligned main's newly added test and the merged value imports with the resolved component.Merged cleanly with no conflict markers:
Full mobile suite, from
apps/mobile:The one real merge defect the suite caught, and its fix:
main's #6614 added that test looking for a raw
TextInputhost, while the resolved screen renders the shared single-line box (@/components/ui/input), so the assertion follows the other nine in the same file tofind(tree, 'Input', () => true). The same repair markedTextInputas a type-only import inpr-review-entry-screen.tsxandmodel-picker-content.tsx;pnpm run typecheck(tsgo --noEmit) exits 0 and the mobile oxlint config reports 0 errors.