Commit Graph
42 Commits
Author SHA1 Message Date
spacedandy-agents-simplex ba15850595 ci: report "no Claude session ran" when an earlier step stopped the job
When the smoke test fails, the Claude step is skipped, claude-test.sh never creates its output directory, and the usage step failed writing claude-usage.json there (runs 38781195327, 38787412095) instead of reporting that no session ran.
2026-10-15 19:38:38 +00:00
spacedandy-agents-simplex 1a679f9c1f ci: dismiss the SimpleX Lock notice in the smoke test [claude-test]
Run 38787412095 seeded the names, built the app and passed the smoke test's avatar and header checks in both layouts and the cards check with the one-hand UI. After the restart into the top bar, the app showed its one-time "SimpleX Lock" alert (the first launch with more than two chats, laNoticeAlert in ContentView.swift), which hid the list. The smoke test now taps its "Cancel" after that restart.
2026-10-15 19:37:23 +00:00
spacedandy-agents-simplex 510367afc0 ci: keep the names server for names only in the peers that claim names [claude-test]
The backend now builds, and seeding reached the names (run 38781195327), but the directory could not join cinews_digest ("Error joining group cinews_digest"). The CLI's -s saves its server among the user's servers (a custom operator in the preset list, stored by agentServers), so ci_admin's next plain run put the invitation's queue on the local names server, which the directory reaches only through a preset proxy that has no route to localhost. After each -s command, that server's storage and proxy roles are now turned off in the peer's database, so later runs keep their queues on the preset servers and can still resolve names.
2026-10-15 18:39:08 +00:00
spacedandy-agents-simplex 2df1ccc205 ci: take only the path from cabal list-bin in the smp-server clone [claude-test]
smp-server built and linked in the clone (run 38778506526), but cabal list-bin there first printed git's output from syncing the source packages ("HEAD is now at …"), so cp got all of it as one file name.
2026-10-15 17:54:13 +00:00
spacedandy-agents-simplex eb88d78bdb ci: check out simplexmq's submodules in the smp-server clone [claude-test]
The clone compiled all of simplexmq, then failed on "does not exist: cbits/blst/src/server.c" (run 38776361371): cbits/blst and cbits/libbbs are git submodules, which cabal's own clones check out and this one did not.
2026-10-15 17:34:34 +00:00
spacedandy-agents-simplex 782c08a31b ci: build smp-server from a simplexmq clone, as its sdist leaves out files it embeds [claude-test]
Cabal builds the simplexmq source-repository-package from its sdist, which has apps/common/Web/static/index.html but not .well-known/, so smp-server's embedDir failed at compile time (run 38771835936). build-backend.sh now clones simplexmq at the commit cabal.project pins and builds exe:smp-server there, with the same cabal.project.local; its dependencies come from the same store.

The macOS 26 SDK step worked: every library linked. This push runs the name cases with Claude again.
2026-10-15 17:19:16 +00:00
spacedandy-agents-simplex 4b54d79fec ci: keep the Command Line Tools on the macOS 26 SDK, which Xcode 26.6's linker can read [claude-test]
On runner image 20261013.0424.1 the Command Line Tools' MacOSX.sdk points to a macOS 27 SDK, and the backend build's links failed on it ("tapi error: malformed file … unknown architecture arm64e.x1-macos") although DEVELOPER_DIR selects Xcode 26.6. use-macos26-sdk.sh points it back at the MacOSX26.5.sdk installed beside it, in all three macOS jobs.

This push runs the name cases with Claude again (run 4 failed before the app was built), after the smoke test with its new checks.
2026-10-15 16:46:37 +00:00
spacedandy-agents-simplex f61bbbf49b ci: check "Show more" while its page loads in the smoke test
With the test directory stopped, the next "ci avatar" page waits 10 s before it fails. The smoke test taps "Show more" then, takes a screenshot that shows its colour, and requires it to be disabled. The smoke step gets BACKEND_DIR, so the ui helper can stop and start the directory. One layout only: the row's colour and state are the same in both.
2026-10-15 16:41:03 +00:00
spacedandy-agents-simplex 495a102824 ci: check the results' avatars and the chat list's cards in the smoke test, in both layouts
The directory results must show no placeholder icon in both layouts. Then the smoke test joins ci_cards, and in both layouts: typing "ci seed" keeps the connect cards, the one-hand UI card and the banner (where shown); "Search in Directory" hides them, with the Directory header above the results; clearing the search brings the same cards back. The Claude sessions are told the profile now has that one chat.
2026-10-15 16:37:47 +00:00
spacedandy-agents-simplex ba194afa98 ci: small avatars for the smoke test's directory entries, and a channel for it to join
ci_group and ci_channel get 64 px avatars from avatar.swift (a new side argument), small enough that both still arrive in one directory response; the backend's search probe fails if they do not, and the page sizes go to seed.md. The new channel ci_cards ("ci cards", also with a small avatar) is for the smoke test to join, so that the chat list shows its cards; no Claude case uses it.
2026-10-15 16:37:26 +00:00
spacedandy-agents-simplex 600d76fa72 ci: run the name cases in full with the one-hand UI, and with the top bar only those the layouts draw differently [claude-test]
The top-bar session runs N1, N4 and the full search on the chat list, where the two layouts place the "Connect to …" row and the Names and Directory parts differently. The other name cases, W4 with names, W7, W8 and G1 run once, with the one-hand UI. Run 3 covered the rest of the plan in both layouts.

claude-scope gets a cases line per layout. The prompt now describes joining as the app does it: "Open channel" / "Open group" opens the chat, and its bar joins. A run 3 session took that alert for a known entry. The prompt also points the session at the plan's rows in prompt.md.
2026-10-15 16:36:26 +00:00
spacedandy-agents-simplex db15ab45ab ci: run the name cases and the full search with Claude in both layouts [claude-test]
The prompt now covers SimpleX names: setting the app up once (operators' names role off, the test names server added for names only, saved), what each seeded name is for, and the full search: type cinews, press Search, and record the parts the plan specifies (the chats already loaded, Names, Directory) with their headers and order, also in New chat. claude-scope assigns the names and contacts per layout and allows 900 turns; the session gets the names server's address.
2026-10-15 15:16:57 +00:00
spacedandy-agents-simplex 15367a1d8f ci: a names server on the runner, with channels and contacts that claim names
names-resolver.py answers the smp-server's GET /v2/resolve/<[keccak-256 of the label].tld> from names.json (Keccak-256 written out, as hashlib has only SHA3; checked against known vectors), and "available" for other names. backend.sh starts it and an smp-server initialised with [NAMES] enable: on pointing at it, then seeds: cinews (listed channel), ciboth (a contact address and a channel), and contacts cialice and Robert (cibobby) that stay online with auto-accept, so the app can connect. Claims run with -s <names server>, which gives that one CLI process the local server with every role, names included, leaving the peers' preset servers as they are; a channel claims its name before it is listed. cinews_digest and cinews_weekly let one search show local chats, Names and Directory. A CLI /_connect plan checks every name before the app is built. seed.md lists the names and the server address.
2026-10-15 15:16:54 +00:00
spacedandy-agents-simplex 4cd2b66495 ci: build the SMP server with the test backend, for SimpleX names
The name cases need an SMP server with a [NAMES] resolver on the runner. smp-server comes from the simplexmq source-repository-package (simplexmq:exe:smp-server, buildable without client_library) and goes into the backend zip with the CLI and the directory service. This changes the backend artifact's name, so the next run rebuilds it once.
2026-10-15 15:16:49 +00:00
spacedandy-agents-simplex b5656c56c7 ci: run the whole plan again with a todo checklist, per-layout entries and run 2's lessons [claude-test]
Run 38734049940 covered the plan in both layouts but left D11 unrecorded and W3 unrun after a compaction, and its D6/W6 taps met entries an earlier case had joined, so they showed the open alert instead of the join flow. Now report.md starts as a checklist of every case marked todo, the session re-reads it after a compaction, claude-scope names per layout the entries the joining cases use, and the session gets the link to paste. The prompt also says how to hold a search open (stop the directory), tap ambiguous labels by position, clear the field (focus, then Cancel), and that the keyboard capitalizes and autocorrects.
2026-10-15 14:37:14 +00:00
spacedandy-agents-simplex 10304e1fa3 ci: search a session's files for the token before printing any of them
The step printed report.md and the guard log before the token search, so a leaked token would have reached the log first (GitHub masks the exact value there, but nothing from the session should be printed before the check). A dry run with a stub claude that writes the token into its report now prints nothing from it and deletes the files.
2026-10-15 14:36:51 +00:00
spacedandy-agents-simplex bd448facc2 ci: drop the keyboard preferences, which did not take effect
Written with simctl spawn defaults write, with and without a simulator restart, they changed nothing in runs 38729704027 and 38734049940: typing still capitalized, autocorrected ("Citester" became the profile name "Forester") and predicted. Removing them saves the restart; the Claude prompt says to check typed text in the tree.
2026-10-15 14:34:04 +00:00
spacedandy-agents-simplex b3dd8b7bf8 ci: let Claude's Bash run only the ui helper, and keep the token out of the upload
Claude Code runs read-only commands (echo, cat, env) without asking in every permission mode, and Bash inherits CLAUDE_CODE_OAUTH_TOKEN, so allow rules alone could not stop a session from printing it (found on the desktop lane). claude-guard.py, a PreToolUse hook passed with --settings, lets through only one ui command with plain arguments and logs every decision to <layout>-guard.log, outside the session's directory. After each session, the session's files and the guard log are searched for the token (given to grep through a pipe); if it is there they are deleted before the upload and the step fails. Run 38729704027's session ran only ui commands and its files contain no token.
2026-10-15 13:27:16 +00:00
spacedandy-agents-simplex dec7599590 ci: run the whole device test plan in both layouts with Claude [claude-test]
One Haiku 5.5 session per layout, one-hand UI first, each bounded by 700 turns, $10 and an auto-compact window of 200k tokens, so a long session does not re-read an ever larger context every turn. The validation session (run 38729704027) drove C2, D2 and D7 correctly in 55 turns for $0.03.
2026-10-15 12:21:26 +00:00
spacedandy-agents-simplex 6a551bfa80 ci: Claude prompt: clearing the field, channel counts, one-hand order, re-reading the prompt
From the first session (run 38729704027): clear the search field with Cancel and check it before typing; the keyboard may still change words; a channel row shows the published subscriber count, not the listings' member records; with the one-hand UI later pages stack above earlier ones; disabled elements are marked; prompt.md is there to re-read after a compaction.
2026-10-15 12:20:59 +00:00
spacedandy-agents-simplex dad764fb0f ci: mark disabled elements in the ui tree
The plan checks that "Show more" is disabled while a page loads (D7); AXe reports it, the compact tree did not show it.
2026-10-15 12:20:32 +00:00
spacedandy-agents-simplex 9e19868b7b ci: restart the simulator after setting the keyboard preferences
Run 38729704027 still capitalized and autocorrected typed text ("citester" became "Citester", "Neci" became "Neck"): the keyboard daemon reads these settings when it starts, so the simulator is restarted once after writing them.
2026-10-15 12:20:12 +00:00
spacedandy-agents-simplex 79a1f5f87d ci: run the device test plan with Claude on the runner [claude-test]
After the smoke test, claude-test.sh runs one Claude Code session (pinned 2.1.300) per layout named in claude-scope, with the plan's cases, model, turns and budget from there. A session gets only Bash for the ui helper and Read/Write/Edit in its own directory (--restricted, dontAsk, no MCP), drives the app through ui, and writes report.md with screenshots; its transcript is stream-json. The app job declares the app-sim-claude environment; only the Claude step gets CLAUDE_CODE_OAUTH_TOKEN, and it runs only on workflow_dispatch or a head commit with [claude-test]. claude-usage.sh writes each session's turns, tokens and cost (estimated at API prices) to the job summary and claude-usage.json, even when the session fails. The plan is copied from the iOS directory search run. This run: C2, D2, D7 in the one-hand UI with Haiku 5.5, to validate the harness.
2026-10-15 11:46:04 +00:00
spacedandy-agents-simplex 368e8e1d65 ci: type in the simulator without capitals, corrections or predictions
Set in com.apple.Preferences right after boot, before the app first shows the keyboard, so typed links (C4) and nonsense words (D10) reach the app as typed. The smoke test still compares typed text ignoring case.
2026-10-15 11:45:41 +00:00
spacedandy-agents-simplex 8e600e5c98 ci: check in the smoke test that the Directory header is above its results in both layouts
After the M3 search in the one-hand UI, the header's y must be smaller than both results'. The search is then repeated with the top bar (ui layout top) and checked the same way, and the app is left in the one-hand UI for later steps. A layout the helper cannot set is reported as a warning, not a failure: that is the harness, not the app.
2026-10-15 11:45:31 +00:00
spacedandy-agents-simplex 611ca05536 ci: ui helper commands for a Claude session on the runner
Adds tap-xy, swipe, clipboard, key, find, layout (sets the one-hand UI preference in the app group's defaults and relaunches), relaunch, text-size, directory stop/start, listings and requests (directory searches the app sent, from its log). Elements below the screen, such as keyboard keys, are counted instead of listed; shot also saves a smaller JPEG to look at and only takes plain names. The helper unsets CLAUDE_CODE_OAUTH_TOKEN, so nothing it runs inherits the token.
2026-10-15 11:45:21 +00:00
spacedandy-agents-simplex 09c9936e11 ci: seed the test directory with avatar groups and channels, page through a search near the size limit
avatar.swift makes avatars the way the app makes profile images (JPEG 0.85 at scale 1, shrunk to at most 12500 characters). Three groups and three channels with such avatars match "ci avatar"; a CLI peer follows the search cursor to the end and records each page's entries, JSON and zstd sizes against the 10737-byte limit in seed.md. Also seeded: a long-named group and one with markdown in its description. Every entry is created with the profile JSON the app sends, and each approval is matched by the entry's name. backend.sh can also stop and start the directory and print its listings.
2026-10-15 11:45:17 +00:00
spacedandy-agents-simplex 84e69ab9c3 ci: restart the test directory with the admin's actual contact ID as super user
The admin was contact 3 of the directory, not 2 (run 38713931270), and a super user is matched by contact ID and name. The service now starts with a placeholder super user, the admin connects, and the service restarts with the ID read from its database. This run tests the group and channel registration, the CLI search, the app build and the smoke-test search.
2026-10-15 10:10:38 +00:00
spacedandy-agents-simplex 36c9a065d9 ci: reuse the core library and the backend from earlier runs
Every run waited for macOS runners three times (core, backend, app), even
when core and backend only restored a cache, and those caches are evicted
within hours here. A plan job on ubuntu names both artifacts after the hash
of their sources and finds them in earlier runs of this branch in this
repository (actions: read); core and backend build only when none exists, and
the app job downloads from the run that built them. Artifacts are kept 30
days; the zip caches are dropped.

This run tests: the plan job, building and uploading both artifacts under
their new names (none exist yet), and the app job downloading them; then the
directory start with -y, the seeding, and the search in the app.
2026-10-15 07:25:10 +00:00
spacedandy-agents-simplex 72e5a51294 ci: keep cabal's store in ~/.cabal so the store cache has it
setup-haskell reports ~/.cabal/store, but without ~/.cabal cabal 3.10 keeps its store in XDG directories, so the saved cache held only dist-newstyle (run 38563035327: 401 MB). CABAL_DIR is set before Setup Haskell, so its cabal update, the build and the cache path agree. build-backend.sh prints the store size before building, as build-core.sh does.
2026-10-15 07:24:53 +00:00
spacedandy-agents-simplex d041eebe6b ci: confirm the directory's schema migration when the test directory starts
The database is created by the CLI, so the service's own migration (20250924_directory_schema) asked for confirmation on stdin and the service exited. This run tests that the directory starts and the group and channel get listed.
2026-10-14 16:52:17 +00:00
spacedandy-agents-simplex 2ebad19b21 ci: search the test directory from the chat list in the smoke test
The app is built with DIRECTORY_SERVICE_LINK set to the test directory's
short address (sed in the workflow). The smoke test types "ci seed", taps
"Search in Directory", accepts the first-search consent alert with "Search",
and expects the Directory results with #ci_group (Join group) and
#ci_channel (Join channel), retrying once if the search fails.

The steps now use scripts/ci/ios-sim/ui, which wraps AXe (tap by label or
value, type, wait, screenshot, compact accessibility tree) for scripts and
for an agent on the runner. Later steps get SIM_UDID and UI_OUT.

This run tests: the onboarding and typing steps on the new helper, the
consent alert, and the directory results in the app.
2026-10-14 12:20:10 +00:00
spacedandy-agents-simplex fe992744c7 ci: run a test directory with a group and a channel on the app runner
A new backend job builds simplex-chat and simplex-directory-service with the
server-capable configuration. The app job starts a chat relay and a directory
on the preset servers, registers and approves a group and a channel from a CLI
peer, and checks that a service request for "ci seed" finds both, before the
app is built. The app still uses the production directory link; the smoke
test is unchanged.

The cabal store cache now uses setup-haskell's store path, with a key prefix
per job, so rebuilds after Haskell changes reuse built dependencies.

This run tests: backend build, relay and directory start, registration and
approval over the preset servers, the service request, and that M2 still
passes.
2026-10-14 11:06:28 +00:00
spacedandy-agents-simplex 53cf2fe64e ci: find text fields by placeholder value, compare typed text ignoring case
Run 38448094338 reached the chat list and typed into the search field, which showed "Ci smoke" and the Search in Directory row, but the check looked for "ci smoke": the keyboard capitalizes the first letter. SwiftUI text fields expose no accessibility label, only the placeholder as the value of an empty field, so the fields are now tapped by value.

This run tests the smoke test end to end, with the core library restored from cache.
2026-10-13 20:19:45 +00:00
spacedandy-agents-simplex bcef840e99 ci: build the core library and the app for the iOS simulator, run a UI smoke test
Adds the ios-sim workflow, triggered only by pushes to f/ci-ios-sim and by workflow_dispatch.

The core job builds lib:simplex-chat with cabal using the flake's iOS settings (swift JSON, client library, static roll-up archive, threaded RTS, CommonCrypto), packages it as the Hydra zip, and patches it for the simulator with scripts/ios/prepare.sh and mac2ios. The app job builds "SimpleX (iOS)" for the arm64 simulator against it and drives onboarding, the chat list and the search field with AXe, saving screenshots and accessibility trees.

This first run tests the whole pipeline, mainly whether the core library builds and links.
2026-10-13 18:36:06 +00:00
sh 17ef17cfd0 desktop: fix build (#6896)
* desktop: fix nanohttpd jitpack dependency

* desktop: make assets-dir gradle flag optional
2026-04-27 17:05:30 +01:00
08c69e3dfa ui: add asset image on create channel view; allow to choose image on create profile (#6891)
* ui: create channel picture

* more centered

* better symmetry

* less diff

* choose image on create profile

* fix padding

* fix padding, fit into screen

* fix button layout

* placeholders

* fix padding

* channel pictures

* adjust asset_dir in scripts

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
Co-authored-by: shum <github.shum@liber.li>
2026-04-27 14:00:14 +01:00
3d85480944 ui: new onboarding (#6888)
* ui: onboarding assets

* android: fix gradle version check, pass assets dir to builds

* desktop: pass assets dir to gradle builds

* ui: new onboarding (#6872)

* ios: improve onboarding

* ios version condition

* android strings

* merge keys

* refactor network conditions to old location

* ios scroll headline

* remove nav view

* kotlin: refactor network commitments page to use existing view

* remove unused keys

* update why page

* configure -> setup

* padding for app bar in why page

* fix why page

* padding

* copy translations from the website

* export localizations

* export again

* kotlin: fix why page

* fix

* import localizations

* custom layout

* padding for system bars

* paddings

* more paddings

* more padding 2

* update fonts

* fonts

* line height, padding

* paddings

* refactor notifications

* refactor ios

* notification icons in cards

* restore profile field

* padding

* desktop layout create profile

* fix

* more layout

* create profile layout

* mobile padding

* split mobile and desktop

* layout

* layout

* background

* refactor onboarding images

* use DARK theme by default

* page 3 and 4 layouts

* restructure desktop onboarding to two panes

* improve layout

* improve

* fonts, padding

* link mobile on full page

* fix, reduce noise

* change to animation

* fix animation

* refactor

* colors, animation

* import

* details

* fix padding

* fix icon

* fix

* button paddings

* accept button on terms page

* fix conditions button

* close modal

---------

Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
Co-authored-by: shum <github.shum@liber.li>
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-04-27 11:46:08 +01:00
shandEvgeny Poberezkin 06902fe678 desktop: prepare linux aarch64 (#6107)
* scripts/*: adjust to be arch independent

* github/workflows: build aarch64

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2025-08-01 20:07:52 +01:00
sh 48b1ef764b ci: reproducible builds/refactor (#5808)
* ci: reproducible builds/refactor

* ci: fix mac desktop upload

* ci: docker shell abort on error

* scripts: add reproduce script

* ci: add new reproduce workflow

* scripts/reproduce-builds: change repo back to official
2025-04-11 23:19:24 +01:00
Stanislav Dmitrenko 535ff1d836 actions: add macos aarch64 build and fix openssl include path (#4107) 2024-05-02 21:41:15 +01:00
Stanislav Dmitrenko 7103524174 desktop: signing and notarizing mac build in Github action (#2986)
* desktop: signing and notarizing mac build in Github action

* changed path
2023-08-29 08:22:04 +01:00