📦️ Create a release.
f95c2c9 parent: 642e6ba deleted
.github/workflows/ci.yml +0 -64 | deleted file mode 100644 | ||
| @@ -1,64 +0,0 @@ | ||
| 1 | -# Copyright (c) 2026 Philippe Charrière — Sidekicks Source-Available License 1.0, see LICENSE | |
| 2 | -# | |
| 3 | -# Continuous integration: `make check` (lint + every test that needs no real | |
| 4 | -# agent) and a check that the committed TypeScript bindings are up to date. | |
| 5 | -# | |
| 6 | -# The job runs in an ubuntu:26.04 container — the system the project is | |
| 7 | -# developed and checked on — not on the runner's own ubuntu-latest: Wails v3 | |
| 8 | -# needs GTK >= 4.10 (GtkFileDialog), which older Ubuntu releases lack. | |
| 9 | -# Rickub runs it as an ordinary GitHub Actions workflow, on every push and | |
| 10 | -# every merge request. No workflow_dispatch: Rickub's dispatch API fires every | |
| 11 | -# dispatchable workflow of a ref, and release.yml must stay the only one. | |
| 12 | -name: CI | |
| 13 | - | |
| 14 | -on: | |
| 15 | - push: | |
| 16 | - pull_request: | |
| 17 | - | |
| 18 | -concurrency: | |
| 19 | - group: ci-${{ github.ref }} | |
| 20 | - cancel-in-progress: true | |
| 21 | - | |
| 22 | -jobs: | |
| 23 | - check: | |
| 24 | - runs-on: ubuntu-latest | |
| 25 | - container: | |
| 26 | - image: ubuntu:26.04 | |
| 27 | - env: | |
| 28 | - DEBIAN_FRONTEND: noninteractive | |
| 29 | - steps: | |
| 30 | - # Everything is installed with bash: on Rickub's runner, JavaScript | |
| 31 | - # actions run inside this container and setup-go did not read go.mod. | |
| 32 | - # Only actions/checkout is used, once node is there. | |
| 33 | - - name: Install the system packages (node, npm, git, C compiler, GTK 4, WebKitGTK 6, procps, jq) | |
| 34 | - run: | | |
| 35 | - apt-get update -qq | |
| 36 | - apt-get install -y -qq --no-install-recommends \ | |
| 37 | - ca-certificates curl git nodejs npm build-essential pkg-config \ | |
| 38 | - libgtk-4-dev libwebkitgtk-6.0-dev procps jq | |
| 39 | - git config --global --add safe.directory "$GITHUB_WORKSPACE" | |
| 40 | - node --version | |
| 41 | - | |
| 42 | - - name: Checkout | |
| 43 | - uses: actions/checkout@v4 | |
| 44 | - | |
| 45 | - - name: Install Go (version from go.mod) | |
| 46 | - run: | | |
| 47 | - version="$(awk '/^go /{print $2}' go.mod)" | |
| 48 | - arch="$(dpkg --print-architecture)" | |
| 49 | - curl -fsSL "https://go.dev/dl/go${version}.linux-${arch}.tar.gz" | tar -C /usr/local -xz | |
| 50 | - echo "/usr/local/go/bin" >> "$GITHUB_PATH" | |
| 51 | - echo "$(/usr/local/go/bin/go env GOPATH)/bin" >> "$GITHUB_PATH" | |
| 52 | - /usr/local/go/bin/go version | |
| 53 | - | |
| 54 | - - name: Install pnpm (version from frontend/package.json) | |
| 55 | - run: npm install -g "$(node -p "require('./frontend/package.json').packageManager")" | |
| 56 | - | |
| 57 | - - name: Install the Wails CLI | |
| 58 | - run: go install github.com/wailsapp/wails/v3/cmd/wails3@v3.0.0 | |
| 59 | - | |
| 60 | - - name: Bindings are up to date | |
| 61 | - run: make bindings-check | |
| 62 | - | |
| 63 | - - name: Lint and tests | |
| 64 | - run: make check | |
| deleted file mode 100644 | |||
| @@ -1,64 +0,0 @@ | |||
| 1 | -# Copyright (c) 2026 Philippe Charrière — Sidekicks Source-Available License 1.0, see LICENSE | ||
| 2 | -# | ||
| 3 | -# Continuous integration: `make check` (lint + every test that needs no real | ||
| 4 | -# agent) and a check that the committed TypeScript bindings are up to date. | ||
| 5 | -# | ||
| 6 | -# The job runs in an ubuntu:26.04 container — the system the project is | ||
| 7 | -# developed and checked on — not on the runner's own ubuntu-latest: Wails v3 | ||
| 8 | -# needs GTK >= 4.10 (GtkFileDialog), which older Ubuntu releases lack. | ||
| 9 | -# Rickub runs it as an ordinary GitHub Actions workflow, on every push and | ||
| 10 | -# every merge request. No workflow_dispatch: Rickub's dispatch API fires every | ||
| 11 | -# dispatchable workflow of a ref, and release.yml must stay the only one. | ||
| 12 | -name: CI | ||
| 13 | - | ||
| 14 | -on: | ||
| 15 | - push: | ||
| 16 | - pull_request: | ||
| 17 | - | ||
| 18 | -concurrency: | ||
| 19 | - group: ci-${{ github.ref }} | ||
| 20 | - cancel-in-progress: true | ||
| 21 | - | ||
| 22 | -jobs: | ||
| 23 | - check: | ||
| 24 | - runs-on: ubuntu-latest | ||
| 25 | - container: | ||
| 26 | - image: ubuntu:26.04 | ||
| 27 | - env: | ||
| 28 | - DEBIAN_FRONTEND: noninteractive | ||
| 29 | - steps: | ||
| 30 | - # Everything is installed with bash: on Rickub's runner, JavaScript | ||
| 31 | - # actions run inside this container and setup-go did not read go.mod. | ||
| 32 | - # Only actions/checkout is used, once node is there. | ||
| 33 | - - name: Install the system packages (node, npm, git, C compiler, GTK 4, WebKitGTK 6, procps, jq) | ||
| 34 | - run: | | ||
| 35 | - apt-get update -qq | ||
| 36 | - apt-get install -y -qq --no-install-recommends \ | ||
| 37 | - ca-certificates curl git nodejs npm build-essential pkg-config \ | ||
| 38 | - libgtk-4-dev libwebkitgtk-6.0-dev procps jq | ||
| 39 | - git config --global --add safe.directory "$GITHUB_WORKSPACE" | ||
| 40 | - node --version | ||
| 41 | - | ||
| 42 | - - name: Checkout | ||
| 43 | - uses: actions/checkout@v4 | ||
| 44 | - | ||
| 45 | - - name: Install Go (version from go.mod) | ||
| 46 | - run: | | ||
| 47 | - version="$(awk '/^go /{print $2}' go.mod)" | ||
| 48 | - arch="$(dpkg --print-architecture)" | ||
| 49 | - curl -fsSL "https://go.dev/dl/go${version}.linux-${arch}.tar.gz" | tar -C /usr/local -xz | ||
| 50 | - echo "/usr/local/go/bin" >> "$GITHUB_PATH" | ||
| 51 | - echo "$(/usr/local/go/bin/go env GOPATH)/bin" >> "$GITHUB_PATH" | ||
| 52 | - /usr/local/go/bin/go version | ||
| 53 | - | ||
| 54 | - - name: Install pnpm (version from frontend/package.json) | ||
| 55 | - run: npm install -g "$(node -p "require('./frontend/package.json').packageManager")" | ||
| 56 | - | ||
| 57 | - - name: Install the Wails CLI | ||
| 58 | - run: go install github.com/wailsapp/wails/v3/cmd/wails3@v3.0.0 | ||
| 59 | - | ||
| 60 | - - name: Bindings are up to date | ||
| 61 | - run: make bindings-check | ||
| 62 | - | ||
| 63 | - - name: Lint and tests | ||
| 64 | - run: make check | ||
modified
.memory/history.md +2 -0 | @@ -188,3 +188,5 @@ | ||
| 188 | 188 | - **Follow-up (macOS packages into the release)**: Rickub's CLI cannot upload release files (no `release` command; `rickub api` sends JSON only; the public API has no asset endpoint); the release web page accepts files by hand (owner checked). Owner chose the branch route: `scripts/push-macos-packages.sh` (on the Mac, after `make package-macos`: the .dmg and .zip as one parentless commit `built-from: <HEAD>`, built with plumbing — hash-object, mktree, commit-tree — force-pushed to `macos-packages`), `scripts/fetch-macos-packages.sh` (CI: writes them into dist/ for the version of build/config.yml, fails listing the branch content otherwise, prints built-from). Release workflow: step "macOS packages" before the checksums, input `without_macos`, warning when built-from ≠ released commit, notes say where the macOS packages come from. Test `scripts/macos-packages_test.sh` (bare remote + Mac clone + CI clone, 9 checks) in `make test-scripts`. Docs publish-a-release (steps reordered: version → Mac packages → workflow), commands reference, run-the-tests (EN/FR). |
| 189 | 189 | - **Follow-up**: root `RELEASING.md` / `RELEASING.fr.md` (owner asked for a document at the root): how a release is built (table), five-step checklist (version → Mac packages → dry run → publish → after), troubleshooting table, manual builds; linked from README and the publish-a-release guides. |
| 190 | 190 | - **Follow-up (owner: "c'est trop compliqué")**: release procedure simplified to the owner's plan — build everything on the Mac, tag with a script, the tag push creates the release, the files are attached by hand. `scripts/build-release.sh` (`make release-build`: macOS native, Windows cross-built, Linux `scripts/package.sh linux` in a Docker container from `scripts/linux-packages.Dockerfile` per `LINUX_ARCHES` (default amd64), `SKIP`, then `dist/SHA256SUMS`), `scripts/tag-release.sh` (`make release-tag`: clean tree, on main, equal to origin/main, tag free; warns when dist/ misses a package; annotated tag pushed; `--no-push`; test `tag-release_test.sh`, 11 checks), `.github/workflows/release.yml` now `on: push: tags: v*` → checks tag = config version, creates the release with notes (file table) via softprops, no files, `contents: write`. The `macos-packages` branch scripts and their test were removed; CI no longer builds packages. `scripts/package.sh` removes `bin/sidekicks` before a Linux or macOS build (a binary of the other OS in the shared bin/ made go build fail: "not an object file"). The Docker image needs `ibus-gtk4` (the AppImage GTK plugin copies `/usr/lib/<arch>/gtk-4.0`). RELEASING.md/.fr.md, publish-a-release (EN/FR) and the commands reference rewritten. |
| 191 | +- **Follow-up (owner: "je préfère vérifier en local")**: `.github/workflows/ci.yml` removed — only `release.yml` (tag push → release) remains. `make verify` (= `check` + `bindings-check`) is what to run before merging; `bindings-check` now also fails on binding files git does not know; `make check-linux` (`scripts/check-linux.sh`) runs `make check` in the Linux Docker image (now with jq and procps for the agents.sh tests). New guide check-before-merging / verifier-avant-de-fusionner (EN/FR, with an optional pre-push hook); run-the-tests, develop-the-application, commands reference, README, RELEASING and indexes no longer mention a CI. | |
| 192 | +- **Follow-up**: `make check-linux` checked in the sandbox (arm64): passes. Fixes on the way: the image needs `binutils-gold` (Go links cgo programs with `-fuse-ld=gold` on arm64: golangci-lint failed "cannot find 'ld'"), `jq` and `procps` (agents.sh tests); the container gets its own `frontend/node_modules` (volume `sidekicks-node-modules-<arch>`) so that its pnpm install never touches the Mac's node_modules, whose store (outside the repo on the Mac) it cannot see; its pnpm store lands in `.pnpm-store/` (ignored; pnpm 12 ignored `npm_config_store_dir`). Docker disk in the sandbox filled up once (image 4.1 GB → 2.6 GB after cleaning the Go/npm caches in the image; `docker builder prune` freed the rest). | |
| @@ -188,3 +188,5 @@ | |||
| 188 | - **Follow-up (macOS packages into the release)**: Rickub's CLI cannot upload release files (no `release` command; `rickub api` sends JSON only; the public API has no asset endpoint); the release web page accepts files by hand (owner checked). Owner chose the branch route: `scripts/push-macos-packages.sh` (on the Mac, after `make package-macos`: the .dmg and .zip as one parentless commit `built-from: <HEAD>`, built with plumbing — hash-object, mktree, commit-tree — force-pushed to `macos-packages`), `scripts/fetch-macos-packages.sh` (CI: writes them into dist/ for the version of build/config.yml, fails listing the branch content otherwise, prints built-from). Release workflow: step "macOS packages" before the checksums, input `without_macos`, warning when built-from ≠ released commit, notes say where the macOS packages come from. Test `scripts/macos-packages_test.sh` (bare remote + Mac clone + CI clone, 9 checks) in `make test-scripts`. Docs publish-a-release (steps reordered: version → Mac packages → workflow), commands reference, run-the-tests (EN/FR). | 188 | - **Follow-up (macOS packages into the release)**: Rickub's CLI cannot upload release files (no `release` command; `rickub api` sends JSON only; the public API has no asset endpoint); the release web page accepts files by hand (owner checked). Owner chose the branch route: `scripts/push-macos-packages.sh` (on the Mac, after `make package-macos`: the .dmg and .zip as one parentless commit `built-from: <HEAD>`, built with plumbing — hash-object, mktree, commit-tree — force-pushed to `macos-packages`), `scripts/fetch-macos-packages.sh` (CI: writes them into dist/ for the version of build/config.yml, fails listing the branch content otherwise, prints built-from). Release workflow: step "macOS packages" before the checksums, input `without_macos`, warning when built-from ≠ released commit, notes say where the macOS packages come from. Test `scripts/macos-packages_test.sh` (bare remote + Mac clone + CI clone, 9 checks) in `make test-scripts`. Docs publish-a-release (steps reordered: version → Mac packages → workflow), commands reference, run-the-tests (EN/FR). |
| 189 | - **Follow-up**: root `RELEASING.md` / `RELEASING.fr.md` (owner asked for a document at the root): how a release is built (table), five-step checklist (version → Mac packages → dry run → publish → after), troubleshooting table, manual builds; linked from README and the publish-a-release guides. | 189 | - **Follow-up**: root `RELEASING.md` / `RELEASING.fr.md` (owner asked for a document at the root): how a release is built (table), five-step checklist (version → Mac packages → dry run → publish → after), troubleshooting table, manual builds; linked from README and the publish-a-release guides. |
| 190 | - **Follow-up (owner: "c'est trop compliqué")**: release procedure simplified to the owner's plan — build everything on the Mac, tag with a script, the tag push creates the release, the files are attached by hand. `scripts/build-release.sh` (`make release-build`: macOS native, Windows cross-built, Linux `scripts/package.sh linux` in a Docker container from `scripts/linux-packages.Dockerfile` per `LINUX_ARCHES` (default amd64), `SKIP`, then `dist/SHA256SUMS`), `scripts/tag-release.sh` (`make release-tag`: clean tree, on main, equal to origin/main, tag free; warns when dist/ misses a package; annotated tag pushed; `--no-push`; test `tag-release_test.sh`, 11 checks), `.github/workflows/release.yml` now `on: push: tags: v*` → checks tag = config version, creates the release with notes (file table) via softprops, no files, `contents: write`. The `macos-packages` branch scripts and their test were removed; CI no longer builds packages. `scripts/package.sh` removes `bin/sidekicks` before a Linux or macOS build (a binary of the other OS in the shared bin/ made go build fail: "not an object file"). The Docker image needs `ibus-gtk4` (the AppImage GTK plugin copies `/usr/lib/<arch>/gtk-4.0`). RELEASING.md/.fr.md, publish-a-release (EN/FR) and the commands reference rewritten. | 190 | - **Follow-up (owner: "c'est trop compliqué")**: release procedure simplified to the owner's plan — build everything on the Mac, tag with a script, the tag push creates the release, the files are attached by hand. `scripts/build-release.sh` (`make release-build`: macOS native, Windows cross-built, Linux `scripts/package.sh linux` in a Docker container from `scripts/linux-packages.Dockerfile` per `LINUX_ARCHES` (default amd64), `SKIP`, then `dist/SHA256SUMS`), `scripts/tag-release.sh` (`make release-tag`: clean tree, on main, equal to origin/main, tag free; warns when dist/ misses a package; annotated tag pushed; `--no-push`; test `tag-release_test.sh`, 11 checks), `.github/workflows/release.yml` now `on: push: tags: v*` → checks tag = config version, creates the release with notes (file table) via softprops, no files, `contents: write`. The `macos-packages` branch scripts and their test were removed; CI no longer builds packages. `scripts/package.sh` removes `bin/sidekicks` before a Linux or macOS build (a binary of the other OS in the shared bin/ made go build fail: "not an object file"). The Docker image needs `ibus-gtk4` (the AppImage GTK plugin copies `/usr/lib/<arch>/gtk-4.0`). RELEASING.md/.fr.md, publish-a-release (EN/FR) and the commands reference rewritten. |
| 191 | +- **Follow-up (owner: "je préfère vérifier en local")**: `.github/workflows/ci.yml` removed — only `release.yml` (tag push → release) remains. `make verify` (= `check` + `bindings-check`) is what to run before merging; `bindings-check` now also fails on binding files git does not know; `make check-linux` (`scripts/check-linux.sh`) runs `make check` in the Linux Docker image (now with jq and procps for the agents.sh tests). New guide check-before-merging / verifier-avant-de-fusionner (EN/FR, with an optional pre-push hook); run-the-tests, develop-the-application, commands reference, README, RELEASING and indexes no longer mention a CI. | ||
| 192 | +- **Follow-up**: `make check-linux` checked in the sandbox (arm64): passes. Fixes on the way: the image needs `binutils-gold` (Go links cgo programs with `-fuse-ld=gold` on arm64: golangci-lint failed "cannot find 'ld'"), `jq` and `procps` (agents.sh tests); the container gets its own `frontend/node_modules` (volume `sidekicks-node-modules-<arch>`) so that its pnpm install never touches the Mac's node_modules, whose store (outside the repo on the Mac) it cannot see; its pnpm store lands in `.pnpm-store/` (ignored; pnpm 12 ignored `npm_config_store_dir`). Docker disk in the sandbox filled up once (image 4.1 GB → 2.6 GB after cleaning the Go/npm caches in the image; `docker builder prune` freed the rest). | ||
modified
.memory/summary.md +3 -3 | @@ -15,7 +15,7 @@ What exists: | ||
| 15 | 15 | |
| 16 | 16 | - `main.go` (root, only Wails importer; registers 11 typed events; injects the native file dialog; its emitter ignores events sent before the Wails app exists) · `internal/app` (Core, AgentService, ChannelService, ConfigService; opens the history per config file) · `internal/channels` (routing, sessions, context, queue, permissions) · `internal/store` (Pebble) · `internal/workspace` (Local, Container, Terminals; contract tests local + alpine container) · `internal/agents` · `internal/acp` (sessions, readable AgentError, stdin→TERM→KILL) · `internal/config` (+ `WatchWithReady`, `AppendAgent` keeps comments and unescapes emoji) · `internal/prefs` · `internal/events` · `internal/shellpath` · `schema`. |
| 17 | 17 | - `frontend/`: shell + panel registry, `state.svelte.ts` (`appState`, one ordered frame batcher for message events), `lib/chat/*` (Markdown, MessageView, ToolCallCard, PermissionCard, Composer), `lib/settings/ConfigEditor.svelte`, `lib/i18n` (en/fr catalogue, `t()`), pure modules with vitest (`markdown`, `conversation`, `composer`, `suggestions`, `tools`, `yamlSchema`, `events`, `theme`, `panels/registry`). State is keyed by channel id; a `$derived` must never call `conversationOf` (it writes state → `state_unsafe_mutation` freezes the UI). |
| 18 | -- Tooling: `Makefile`, golangci-lint (`tools/go.mod`), CI (`.github/workflows/ci.yml`, job in a `ubuntu:26.04` container, green on Rickub), `scripts/agents.sh`, `scripts/install-test-config.sh`, `scripts/check-license-headers.sh`, `scripts/package.sh` (+ `package_test.sh`), `scripts/build-release.sh`, `scripts/tag-release.sh` (+ `tag-release_test.sh`), `scripts/linux-packages.Dockerfile`, release workflow (tag push → release) `.github/workflows/release.yml`. | |
| 18 | +- Tooling: `Makefile`, golangci-lint (`tools/go.mod`), no CI (owner's choice: checks run locally, `make verify`; `make check-linux` runs `make check` in the Linux Docker image), `scripts/agents.sh`, `scripts/install-test-config.sh`, `scripts/check-license-headers.sh`, `scripts/package.sh` (+ `package_test.sh`), `scripts/build-release.sh`, `scripts/tag-release.sh` (+ `tag-release_test.sh`), `scripts/linux-packages.Dockerfile`, `scripts/check-linux.sh`, release workflow (tag push → release) `.github/workflows/release.yml`. | |
| 19 | 19 | |
| 20 | 20 | ## Decisions in force |
| 21 | 21 | |
| @@ -37,11 +37,11 @@ What exists: | ||
| 37 | 37 | |
| 38 | 38 | | | | |
| 39 | 39 | | --- | --- | |
| 40 | -| Everything the CI runs | `make check` (lint + tests; needs `wails3`, `pnpm`, GTK/WebKit dev packages on Linux) | | |
| 40 | +| Before merging (no CI) | `make verify` = `make check` (lint + tests; needs `wails3`, `pnpm`, GTK/WebKit dev packages on Linux) + `make bindings-check` · Linux from the Mac: `make check-linux` | | |
| 41 | 41 | | Tests only | `make test` (Go + vitest + shell) · real agents: `make test-real` | |
| 42 | 42 | | Run | `SIDEKICKS_CONFIG="$PWD/examples/test-agents.yaml" make dev` · build `make build` · macOS app `make package` | |
| 43 | 43 | | Release | `make release-build` (Mac: all packages → dist/, Linux in Docker) · `make release-tag` · single systems: `make package-linux` / `package-windows` / `package-macos`; see RELEASING.md | |
| 44 | -| Bindings | `make bindings` after changing a service/event; CI runs `make bindings-check` | | |
| 44 | +| Bindings | `make bindings` after changing a service/event, stage them; `make bindings-check` compares with the index | | |
| 45 | 45 | | Test agents | `scripts/agents.sh run alice` · `ps` · `unload --all` (`MM_BIN`, llmman on 127.0.0.1 or host.docker.internal:17434) | |
| 46 | 46 | | Headless UI check (sandbox) | `Xvfb :97`, `GDK_BACKEND=x11 WEBKIT_DISABLE_DMABUF_RENDERER=1 dbus-launch bin/sidekicks --config …`, `xdotool`, `import -window root` | |
| 47 | 47 | | Wireframes / package diagram | `python3 docs/design/wireframes.py` · `python3 .claude/skills/drawio-fancy-diagram/generator/examples/sidekicks_packages.py docs/diagrams` + `rsvg-convert -w 1690 -h 800` | |
| @@ -15,7 +15,7 @@ What exists: | |||
| 15 | 15 | ||
| 16 | - `main.go` (root, only Wails importer; registers 11 typed events; injects the native file dialog; its emitter ignores events sent before the Wails app exists) · `internal/app` (Core, AgentService, ChannelService, ConfigService; opens the history per config file) · `internal/channels` (routing, sessions, context, queue, permissions) · `internal/store` (Pebble) · `internal/workspace` (Local, Container, Terminals; contract tests local + alpine container) · `internal/agents` · `internal/acp` (sessions, readable AgentError, stdin→TERM→KILL) · `internal/config` (+ `WatchWithReady`, `AppendAgent` keeps comments and unescapes emoji) · `internal/prefs` · `internal/events` · `internal/shellpath` · `schema`. | 16 | - `main.go` (root, only Wails importer; registers 11 typed events; injects the native file dialog; its emitter ignores events sent before the Wails app exists) · `internal/app` (Core, AgentService, ChannelService, ConfigService; opens the history per config file) · `internal/channels` (routing, sessions, context, queue, permissions) · `internal/store` (Pebble) · `internal/workspace` (Local, Container, Terminals; contract tests local + alpine container) · `internal/agents` · `internal/acp` (sessions, readable AgentError, stdin→TERM→KILL) · `internal/config` (+ `WatchWithReady`, `AppendAgent` keeps comments and unescapes emoji) · `internal/prefs` · `internal/events` · `internal/shellpath` · `schema`. |
| 17 | - `frontend/`: shell + panel registry, `state.svelte.ts` (`appState`, one ordered frame batcher for message events), `lib/chat/*` (Markdown, MessageView, ToolCallCard, PermissionCard, Composer), `lib/settings/ConfigEditor.svelte`, `lib/i18n` (en/fr catalogue, `t()`), pure modules with vitest (`markdown`, `conversation`, `composer`, `suggestions`, `tools`, `yamlSchema`, `events`, `theme`, `panels/registry`). State is keyed by channel id; a `$derived` must never call `conversationOf` (it writes state → `state_unsafe_mutation` freezes the UI). | 17 | - `frontend/`: shell + panel registry, `state.svelte.ts` (`appState`, one ordered frame batcher for message events), `lib/chat/*` (Markdown, MessageView, ToolCallCard, PermissionCard, Composer), `lib/settings/ConfigEditor.svelte`, `lib/i18n` (en/fr catalogue, `t()`), pure modules with vitest (`markdown`, `conversation`, `composer`, `suggestions`, `tools`, `yamlSchema`, `events`, `theme`, `panels/registry`). State is keyed by channel id; a `$derived` must never call `conversationOf` (it writes state → `state_unsafe_mutation` freezes the UI). |
| 18 | -- Tooling: `Makefile`, golangci-lint (`tools/go.mod`), CI (`.github/workflows/ci.yml`, job in a `ubuntu:26.04` container, green on Rickub), `scripts/agents.sh`, `scripts/install-test-config.sh`, `scripts/check-license-headers.sh`, `scripts/package.sh` (+ `package_test.sh`), `scripts/build-release.sh`, `scripts/tag-release.sh` (+ `tag-release_test.sh`), `scripts/linux-packages.Dockerfile`, release workflow (tag push → release) `.github/workflows/release.yml`. | 18 | +- Tooling: `Makefile`, golangci-lint (`tools/go.mod`), no CI (owner's choice: checks run locally, `make verify`; `make check-linux` runs `make check` in the Linux Docker image), `scripts/agents.sh`, `scripts/install-test-config.sh`, `scripts/check-license-headers.sh`, `scripts/package.sh` (+ `package_test.sh`), `scripts/build-release.sh`, `scripts/tag-release.sh` (+ `tag-release_test.sh`), `scripts/linux-packages.Dockerfile`, `scripts/check-linux.sh`, release workflow (tag push → release) `.github/workflows/release.yml`. |
| 19 | 19 | ||
| 20 | ## Decisions in force | 20 | ## Decisions in force |
| 21 | 21 | ||
| @@ -37,11 +37,11 @@ What exists: | |||
| 37 | 37 | ||
| 38 | | | | | 38 | | | | |
| 39 | | --- | --- | | 39 | | --- | --- | |
| 40 | -| Everything the CI runs | `make check` (lint + tests; needs `wails3`, `pnpm`, GTK/WebKit dev packages on Linux) | | 40 | +| Before merging (no CI) | `make verify` = `make check` (lint + tests; needs `wails3`, `pnpm`, GTK/WebKit dev packages on Linux) + `make bindings-check` · Linux from the Mac: `make check-linux` | |
| 41 | | Tests only | `make test` (Go + vitest + shell) · real agents: `make test-real` | | 41 | | Tests only | `make test` (Go + vitest + shell) · real agents: `make test-real` | |
| 42 | | Run | `SIDEKICKS_CONFIG="$PWD/examples/test-agents.yaml" make dev` · build `make build` · macOS app `make package` | | 42 | | Run | `SIDEKICKS_CONFIG="$PWD/examples/test-agents.yaml" make dev` · build `make build` · macOS app `make package` | |
| 43 | | Release | `make release-build` (Mac: all packages → dist/, Linux in Docker) · `make release-tag` · single systems: `make package-linux` / `package-windows` / `package-macos`; see RELEASING.md | | 43 | | Release | `make release-build` (Mac: all packages → dist/, Linux in Docker) · `make release-tag` · single systems: `make package-linux` / `package-windows` / `package-macos`; see RELEASING.md | |
| 44 | -| Bindings | `make bindings` after changing a service/event; CI runs `make bindings-check` | | 44 | +| Bindings | `make bindings` after changing a service/event, stage them; `make bindings-check` compares with the index | |
| 45 | | Test agents | `scripts/agents.sh run alice` · `ps` · `unload --all` (`MM_BIN`, llmman on 127.0.0.1 or host.docker.internal:17434) | | 45 | | Test agents | `scripts/agents.sh run alice` · `ps` · `unload --all` (`MM_BIN`, llmman on 127.0.0.1 or host.docker.internal:17434) | |
| 46 | | Headless UI check (sandbox) | `Xvfb :97`, `GDK_BACKEND=x11 WEBKIT_DISABLE_DMABUF_RENDERER=1 dbus-launch bin/sidekicks --config …`, `xdotool`, `import -window root` | | 46 | | Headless UI check (sandbox) | `Xvfb :97`, `GDK_BACKEND=x11 WEBKIT_DISABLE_DMABUF_RENDERER=1 dbus-launch bin/sidekicks --config …`, `xdotool`, `import -window root` | |
| 47 | | Wireframes / package diagram | `python3 docs/design/wireframes.py` · `python3 .claude/skills/drawio-fancy-diagram/generator/examples/sidekicks_packages.py docs/diagrams` + `rsvg-convert -w 1690 -h 800` | | 47 | | Wireframes / package diagram | `python3 docs/design/wireframes.py` · `python3 .claude/skills/drawio-fancy-diagram/generator/examples/sidekicks_packages.py docs/diagrams` + `rsvg-convert -w 1690 -h 800` | |
modified
Makefile +9 -3 | @@ -7,7 +7,7 @@ GOLANGCI_LINT := go tool -modfile=tools/go.mod golangci-lint | ||
| 7 | 7 | PNPM := pnpm --dir frontend |
| 8 | 8 | |
| 9 | 9 | .PHONY: help install bindings frontend dev build package package-linux package-windows package-macos release-build release-tag install-test-config \ |
| 10 | - check test test-go test-frontend test-scripts test-real \ | |
| 10 | + check verify check-linux test test-go test-frontend test-scripts test-real \ | |
| 11 | 11 | lint lint-go lint-frontend lint-headers bindings-check |
| 12 | 12 | |
| 13 | 13 | help: ## List the available targets |
| @@ -57,7 +57,12 @@ install-test-config: ## Write the test agents configuration at the default locat | ||
| 57 | 57 | |
| 58 | 58 | # ---------------------------------------------------------------- tests |
| 59 | 59 | |
| 60 | -check: lint test ## Everything the CI runs: lint, then all the tests | |
| 60 | +check: lint test ## Lint, then all the tests (no real agent, no network) | |
| 61 | + | |
| 62 | +verify: check bindings-check ## Before merging: check, then the staged bindings are up to date | |
| 63 | + | |
| 64 | +check-linux: ## On the Mac: make check on Linux, in Docker (scripts/check-linux.sh) | |
| 65 | + @scripts/check-linux.sh | |
| 61 | 66 | |
| 62 | 67 | test: test-go test-frontend test-scripts ## Run all the tests (no real agent, no network) |
| 63 | 68 | |
| @@ -90,5 +95,6 @@ lint-frontend: ## svelte-check (types and Svelte warnings) | ||
| 90 | 95 | lint-headers: ## Check the licence header of every source file |
| 91 | 96 | @scripts/check-license-headers.sh |
| 92 | 97 | |
| 93 | -bindings-check: bindings ## Fail when the committed bindings are not up to date | |
| 98 | +bindings-check: bindings ## Fail when the staged or committed bindings are not up to date | |
| 94 | 99 | @git diff --exit-code -- frontend/bindings |
| 100 | + @test -z "$$(git ls-files --others --exclude-standard -- frontend/bindings)" || { echo "new binding files are not staged:"; git ls-files --others --exclude-standard -- frontend/bindings; exit 1; } | |
| @@ -7,7 +7,7 @@ GOLANGCI_LINT := go tool -modfile=tools/go.mod golangci-lint | |||
| 7 | PNPM := pnpm --dir frontend | 7 | PNPM := pnpm --dir frontend |
| 8 | 8 | ||
| 9 | .PHONY: help install bindings frontend dev build package package-linux package-windows package-macos release-build release-tag install-test-config \ | 9 | .PHONY: help install bindings frontend dev build package package-linux package-windows package-macos release-build release-tag install-test-config \ |
| 10 | - check test test-go test-frontend test-scripts test-real \ | 10 | + check verify check-linux test test-go test-frontend test-scripts test-real \ |
| 11 | lint lint-go lint-frontend lint-headers bindings-check | 11 | lint lint-go lint-frontend lint-headers bindings-check |
| 12 | 12 | ||
| 13 | help: ## List the available targets | 13 | help: ## List the available targets |
| @@ -57,7 +57,12 @@ install-test-config: ## Write the test agents configuration at the default locat | |||
| 57 | 57 | ||
| 58 | # ---------------------------------------------------------------- tests | 58 | # ---------------------------------------------------------------- tests |
| 59 | 59 | ||
| 60 | -check: lint test ## Everything the CI runs: lint, then all the tests | 60 | +check: lint test ## Lint, then all the tests (no real agent, no network) |
| 61 | + | ||
| 62 | +verify: check bindings-check ## Before merging: check, then the staged bindings are up to date | ||
| 63 | + | ||
| 64 | +check-linux: ## On the Mac: make check on Linux, in Docker (scripts/check-linux.sh) | ||
| 65 | + @scripts/check-linux.sh | ||
| 61 | 66 | ||
| 62 | test: test-go test-frontend test-scripts ## Run all the tests (no real agent, no network) | 67 | test: test-go test-frontend test-scripts ## Run all the tests (no real agent, no network) |
| 63 | 68 | ||
| @@ -90,5 +95,6 @@ lint-frontend: ## svelte-check (types and Svelte warnings) | |||
| 90 | lint-headers: ## Check the licence header of every source file | 95 | lint-headers: ## Check the licence header of every source file |
| 91 | @scripts/check-license-headers.sh | 96 | @scripts/check-license-headers.sh |
| 92 | 97 | ||
| 93 | -bindings-check: bindings ## Fail when the committed bindings are not up to date | 98 | +bindings-check: bindings ## Fail when the staged or committed bindings are not up to date |
| 94 | @git diff --exit-code -- frontend/bindings | 99 | @git diff --exit-code -- frontend/bindings |
| 100 | + @test -z "$$(git ls-files --others --exclude-standard -- frontend/bindings)" || { echo "new binding files are not staged:"; git ls-files --others --exclude-standard -- frontend/bindings; exit 1; } | ||
modified
README.md +3 -2 | @@ -22,7 +22,8 @@ Prerequisites: Go ≥ 1.26, Node ≥ 20, pnpm 12.11.2 (`npm install -g pnpm@12.1 | ||
| 22 | 22 | ```bash |
| 23 | 23 | make install # frontend dependencies (macOS and Linux binaries side by side) |
| 24 | 24 | make dev # run the application with hot reload |
| 25 | -make check # lint + every test, as the CI does | |
| 25 | +make check # lint + every test | |
| 26 | +make verify # before merging: check + bindings up to date (there is no CI) | |
| 26 | 27 | make package # macOS: bin/sidekicks.app |
| 27 | 28 | make package-linux # release packages into dist/ (also package-windows, package-macos) |
| 28 | 29 | make help # every target |
| @@ -34,7 +35,7 @@ Run it with the four test agents of `agents/` (they need [mm](https://rickub.com | ||
| 34 | 35 | SIDEKICKS_CONFIG="$PWD/examples/test-agents.yaml" make dev # or: bin/sidekicks --config examples/test-agents.yaml |
| 35 | 36 | ``` |
| 36 | 37 | |
| 37 | -Details: [How to develop the application](docs/en/how-to/develop-the-application.md) · [How to run the tests](docs/en/how-to/run-the-tests.md). | |
| 38 | +Details: [How to develop the application](docs/en/how-to/develop-the-application.md) · [How to run the tests](docs/en/how-to/run-the-tests.md) · [How to check a change before merging it](docs/en/how-to/check-before-merging.md). | |
| 38 | 39 | |
| 39 | 40 | ## Layout |
| 40 | 41 | |
| @@ -22,7 +22,8 @@ Prerequisites: Go ≥ 1.26, Node ≥ 20, pnpm 12.11.2 (`npm install -g pnpm@12.1 | |||
| 22 | ```bash | 22 | ```bash |
| 23 | make install # frontend dependencies (macOS and Linux binaries side by side) | 23 | make install # frontend dependencies (macOS and Linux binaries side by side) |
| 24 | make dev # run the application with hot reload | 24 | make dev # run the application with hot reload |
| 25 | -make check # lint + every test, as the CI does | 25 | +make check # lint + every test |
| 26 | +make verify # before merging: check + bindings up to date (there is no CI) | ||
| 26 | make package # macOS: bin/sidekicks.app | 27 | make package # macOS: bin/sidekicks.app |
| 27 | make package-linux # release packages into dist/ (also package-windows, package-macos) | 28 | make package-linux # release packages into dist/ (also package-windows, package-macos) |
| 28 | make help # every target | 29 | make help # every target |
| @@ -34,7 +35,7 @@ Run it with the four test agents of `agents/` (they need [mm](https://rickub.com | |||
| 34 | SIDEKICKS_CONFIG="$PWD/examples/test-agents.yaml" make dev # or: bin/sidekicks --config examples/test-agents.yaml | 35 | SIDEKICKS_CONFIG="$PWD/examples/test-agents.yaml" make dev # or: bin/sidekicks --config examples/test-agents.yaml |
| 35 | ``` | 36 | ``` |
| 36 | 37 | ||
| 37 | -Details: [How to develop the application](docs/en/how-to/develop-the-application.md) · [How to run the tests](docs/en/how-to/run-the-tests.md). | 38 | +Details: [How to develop the application](docs/en/how-to/develop-the-application.md) · [How to run the tests](docs/en/how-to/run-the-tests.md) · [How to check a change before merging it](docs/en/how-to/check-before-merging.md). |
| 38 | 39 | ||
| 39 | ## Layout | 40 | ## Layout |
| 40 | 41 | ||
modified
RELEASING.fr.md +1 -1 | @@ -16,7 +16,7 @@ La version est `info.version` dans `build/config.yml` ; le tag est `v` + cette v | ||
| 16 | 16 | |
| 17 | 17 | 1. Dans `build/config.yml`, réglez `info.version` (par exemple `"0.2.0"`). |
| 18 | 18 | 2. `wails3 task common:update:build-assets`, puis remettez `LSMinimumSystemVersion` à `13.0.0` dans `build/darwin/Info.plist` et `build/darwin/Info.dev.plist` (la commande le remet à `12.0.0`). |
| 19 | -3. `make check`, commitez, fusionnez dans `main`, puis `git checkout main && git pull`. | |
| 19 | +3. `make verify` ([vérifications avant de fusionner](docs/fr/how-to/verifier-avant-de-fusionner.md)), commitez, fusionnez dans `main`, puis `git checkout main && git pull`. | |
| 20 | 20 | |
| 21 | 21 | ## 1. Construire |
| 22 | 22 | |
| @@ -16,7 +16,7 @@ La version est `info.version` dans `build/config.yml` ; le tag est `v` + cette v | |||
| 16 | 16 | ||
| 17 | 1. Dans `build/config.yml`, réglez `info.version` (par exemple `"0.2.0"`). | 17 | 1. Dans `build/config.yml`, réglez `info.version` (par exemple `"0.2.0"`). |
| 18 | 2. `wails3 task common:update:build-assets`, puis remettez `LSMinimumSystemVersion` à `13.0.0` dans `build/darwin/Info.plist` et `build/darwin/Info.dev.plist` (la commande le remet à `12.0.0`). | 18 | 2. `wails3 task common:update:build-assets`, puis remettez `LSMinimumSystemVersion` à `13.0.0` dans `build/darwin/Info.plist` et `build/darwin/Info.dev.plist` (la commande le remet à `12.0.0`). |
| 19 | -3. `make check`, commitez, fusionnez dans `main`, puis `git checkout main && git pull`. | 19 | +3. `make verify` ([vérifications avant de fusionner](docs/fr/how-to/verifier-avant-de-fusionner.md)), commitez, fusionnez dans `main`, puis `git checkout main && git pull`. |
| 20 | 20 | ||
| 21 | ## 1. Construire | 21 | ## 1. Construire |
| 22 | 22 | ||
modified
RELEASING.md +1 -1 | @@ -16,7 +16,7 @@ The version is `info.version` in `build/config.yml`; the tag is `v` + that versi | ||
| 16 | 16 | |
| 17 | 17 | 1. In `build/config.yml`, set `info.version` (e.g. `"0.2.0"`). |
| 18 | 18 | 2. `wails3 task common:update:build-assets`, then put `LSMinimumSystemVersion` back to `13.0.0` in `build/darwin/Info.plist` and `build/darwin/Info.dev.plist` (the command resets it to `12.0.0`). |
| 19 | -3. `make check`, commit, merge into `main`, and `git checkout main && git pull`. | |
| 19 | +3. `make verify` ([checks before merging](docs/en/how-to/check-before-merging.md)), commit, merge into `main`, and `git checkout main && git pull`. | |
| 20 | 20 | |
| 21 | 21 | ## 1. Build |
| 22 | 22 | |
| @@ -16,7 +16,7 @@ The version is `info.version` in `build/config.yml`; the tag is `v` + that versi | |||
| 16 | 16 | ||
| 17 | 1. In `build/config.yml`, set `info.version` (e.g. `"0.2.0"`). | 17 | 1. In `build/config.yml`, set `info.version` (e.g. `"0.2.0"`). |
| 18 | 2. `wails3 task common:update:build-assets`, then put `LSMinimumSystemVersion` back to `13.0.0` in `build/darwin/Info.plist` and `build/darwin/Info.dev.plist` (the command resets it to `12.0.0`). | 18 | 2. `wails3 task common:update:build-assets`, then put `LSMinimumSystemVersion` back to `13.0.0` in `build/darwin/Info.plist` and `build/darwin/Info.dev.plist` (the command resets it to `12.0.0`). |
| 19 | -3. `make check`, commit, merge into `main`, and `git checkout main && git pull`. | 19 | +3. `make verify` ([checks before merging](docs/en/how-to/check-before-merging.md)), commit, merge into `main`, and `git checkout main && git pull`. |
| 20 | 20 | ||
| 21 | ## 1. Build | 21 | ## 1. Build |
| 22 | 22 | ||
modified
build/linux/desktop +4 -1 | @@ -2,9 +2,12 @@ | ||
| 2 | 2 | Version=1.0 |
| 3 | 3 | Name=Sidekicks |
| 4 | 4 | Comment=Converse with AI agents in channels |
| 5 | -Exec=sidekicks | |
| 5 | +# The Exec line includes %u to pass the URL to the application | |
| 6 | +Exec=/usr/local/bin/sidekicks %u | |
| 6 | 7 | Terminal=false |
| 7 | 8 | Type=Application |
| 8 | 9 | Icon=sidekicks |
| 9 | 10 | Categories=Utility; |
| 10 | 11 | StartupWMClass=sidekicks |
| 12 | + | |
| 13 | + | |
| @@ -2,9 +2,12 @@ | |||
| 2 | Version=1.0 | 2 | Version=1.0 |
| 3 | Name=Sidekicks | 3 | Name=Sidekicks |
| 4 | Comment=Converse with AI agents in channels | 4 | Comment=Converse with AI agents in channels |
| 5 | -Exec=sidekicks | 5 | +# The Exec line includes %u to pass the URL to the application |
| 6 | +Exec=/usr/local/bin/sidekicks %u | ||
| 6 | Terminal=false | 7 | Terminal=false |
| 7 | Type=Application | 8 | Type=Application |
| 8 | Icon=sidekicks | 9 | Icon=sidekicks |
| 9 | Categories=Utility; | 10 | Categories=Utility; |
| 10 | StartupWMClass=sidekicks | 11 | StartupWMClass=sidekicks |
| 12 | + | ||
| 13 | + | ||
modified
build/linux/nfpm/nfpm.yaml +4 -6 | @@ -9,20 +9,18 @@ platform: "linux" | ||
| 9 | 9 | version: "0.1.0" |
| 10 | 10 | section: "default" |
| 11 | 11 | priority: "extra" |
| 12 | -maintainer: "Philippe Charrière" | |
| 12 | +maintainer: ${GIT_COMMITTER_NAME} <${GIT_COMMITTER_EMAIL}> | |
| 13 | 13 | description: "Converse with AI agents in channels" |
| 14 | 14 | vendor: "Philippe Charrière" |
| 15 | -homepage: "https://git.rickub.com/bots-garden/sidekicks" | |
| 16 | -license: "LicenseRef-Sidekicks-Source-Available-1.0" | |
| 15 | +homepage: "https://wails.io" | |
| 16 | +license: "MIT" | |
| 17 | 17 | release: "1" |
| 18 | 18 | |
| 19 | 19 | contents: |
| 20 | 20 | - src: "./bin/sidekicks" |
| 21 | 21 | dst: "/usr/local/bin/sidekicks" |
| 22 | - - src: "./build/appicon.svg" | |
| 23 | - dst: "/usr/share/icons/hicolor/scalable/apps/sidekicks.svg" | |
| 24 | 22 | - src: "./build/appicon.png" |
| 25 | - dst: "/usr/share/pixmaps/sidekicks.png" | |
| 23 | + dst: "/usr/share/icons/hicolor/128x128/apps/sidekicks.png" | |
| 26 | 24 | - src: "./build/linux/sidekicks.desktop" |
| 27 | 25 | dst: "/usr/share/applications/sidekicks.desktop" |
| 28 | 26 | |
| @@ -9,20 +9,18 @@ platform: "linux" | |||
| 9 | version: "0.1.0" | 9 | version: "0.1.0" |
| 10 | section: "default" | 10 | section: "default" |
| 11 | priority: "extra" | 11 | priority: "extra" |
| 12 | -maintainer: "Philippe Charrière" | 12 | +maintainer: ${GIT_COMMITTER_NAME} <${GIT_COMMITTER_EMAIL}> |
| 13 | description: "Converse with AI agents in channels" | 13 | description: "Converse with AI agents in channels" |
| 14 | vendor: "Philippe Charrière" | 14 | vendor: "Philippe Charrière" |
| 15 | -homepage: "https://git.rickub.com/bots-garden/sidekicks" | 15 | +homepage: "https://wails.io" |
| 16 | -license: "LicenseRef-Sidekicks-Source-Available-1.0" | 16 | +license: "MIT" |
| 17 | release: "1" | 17 | release: "1" |
| 18 | 18 | ||
| 19 | contents: | 19 | contents: |
| 20 | - src: "./bin/sidekicks" | 20 | - src: "./bin/sidekicks" |
| 21 | dst: "/usr/local/bin/sidekicks" | 21 | dst: "/usr/local/bin/sidekicks" |
| 22 | - - src: "./build/appicon.svg" | ||
| 23 | - dst: "/usr/share/icons/hicolor/scalable/apps/sidekicks.svg" | ||
| 24 | - src: "./build/appicon.png" | 22 | - src: "./build/appicon.png" |
| 25 | - dst: "/usr/share/pixmaps/sidekicks.png" | 23 | + dst: "/usr/share/icons/hicolor/128x128/apps/sidekicks.png" |
| 26 | - src: "./build/linux/sidekicks.desktop" | 24 | - src: "./build/linux/sidekicks.desktop" |
| 27 | dst: "/usr/share/applications/sidekicks.desktop" | 25 | dst: "/usr/share/applications/sidekicks.desktop" |
| 28 | 26 | ||
modified
docs/en/README.md +1 -1 | @@ -7,7 +7,7 @@ This documentation follows [Diátaxis](https://diataxis.fr): pick the section th | ||
| 7 | 7 | | You want to… | Section | Pages | |
| 8 | 8 | | --- | --- | --- | |
| 9 | 9 | | **learn** by doing | Tutorials | [Your first agent, without writing any configuration](tutorials/your-first-agent.md) · [A channel with two agents](tutorials/first-channel.md) · [Your first conversation with an agent](tutorials/first-conversation.md) · [Your first launch of Sidekicks](tutorials/first-launch.md) · [Your first ACP exchange with a test agent](tutorials/first-acp-exchange.md) | |
| 10 | -| **do** a specific task | How-to guides | [Install Sidekicks](how-to/install-sidekicks.md) · [Add an agent](how-to/add-an-agent.md) · [Work with an agent's files and terminal](how-to/work-with-an-agents-files.md) · [Run an agent in a Docker container](how-to/run-an-agent-in-docker.md) · [Run an agent in an sbx sandbox](how-to/run-an-agent-in-a-sandbox.md) · [Manage channels and their agents](how-to/manage-channels.md) · [Edit or switch the configuration](how-to/edit-or-switch-the-configuration.md) · [Reset Sidekicks](how-to/reset-sidekicks.md) · [Develop the application](how-to/develop-the-application.md) · [Run the tests](how-to/run-the-tests.md) · [Run a test agent](how-to/run-a-test-agent.md) · [Run the end-to-end scenarios (v0.1)](how-to/run-the-end-to-end-scenarios.md) · [Publish a release](how-to/publish-a-release.md) · [Test milestone M4 on macOS](how-to/test-milestone-m4-on-macos.md) · [Test milestone M3 on macOS](how-to/test-milestone-m3-on-macos.md) · [Test milestone M2 on macOS](how-to/test-milestone-m2-on-macos.md) · [Test milestone M1 on macOS](how-to/test-milestone-m1-on-macos.md) · [Test milestone Initialize on macOS](how-to/test-milestone-initialize-on-macos.md) | | |
| 10 | +| **do** a specific task | How-to guides | [Install Sidekicks](how-to/install-sidekicks.md) · [Add an agent](how-to/add-an-agent.md) · [Work with an agent's files and terminal](how-to/work-with-an-agents-files.md) · [Run an agent in a Docker container](how-to/run-an-agent-in-docker.md) · [Run an agent in an sbx sandbox](how-to/run-an-agent-in-a-sandbox.md) · [Manage channels and their agents](how-to/manage-channels.md) · [Edit or switch the configuration](how-to/edit-or-switch-the-configuration.md) · [Reset Sidekicks](how-to/reset-sidekicks.md) · [Develop the application](how-to/develop-the-application.md) · [Run the tests](how-to/run-the-tests.md) · [Check a change before merging it](how-to/check-before-merging.md) · [Run a test agent](how-to/run-a-test-agent.md) · [Run the end-to-end scenarios (v0.1)](how-to/run-the-end-to-end-scenarios.md) · [Publish a release](how-to/publish-a-release.md) · [Test milestone M4 on macOS](how-to/test-milestone-m4-on-macos.md) · [Test milestone M3 on macOS](how-to/test-milestone-m3-on-macos.md) · [Test milestone M2 on macOS](how-to/test-milestone-m2-on-macos.md) · [Test milestone M1 on macOS](how-to/test-milestone-m1-on-macos.md) · [Test milestone Initialize on macOS](how-to/test-milestone-initialize-on-macos.md) | | |
| 11 | 11 | | **look up** an exact detail | Reference | [The configuration file](reference/configuration.md) · [Keyboard shortcuts](reference/keyboard-shortcuts.md) · [Agents, channels and events](reference/agents-and-events.md) · [Commands](reference/commands.md) · [scripts/agents.sh](reference/agents-script.md) | |
| 12 | 12 | | **understand** why | Explanation | [Workspaces and terminals](explanation/workspaces-and-terminals.md) · [Channels and what each agent knows](explanation/channels-and-context.md) · [Permissions and trust](explanation/permissions.md) · [Why ACP](explanation/why-acp.md) · [The interface stack](explanation/ui-stack.md) · [Architecture](explanation/architecture.md) · [Memory and local models](explanation/memory-and-local-models.md) | |
| 13 | 13 | |
| @@ -7,7 +7,7 @@ This documentation follows [Diátaxis](https://diataxis.fr): pick the section th | |||
| 7 | | You want to… | Section | Pages | | 7 | | You want to… | Section | Pages | |
| 8 | | --- | --- | --- | | 8 | | --- | --- | --- | |
| 9 | | **learn** by doing | Tutorials | [Your first agent, without writing any configuration](tutorials/your-first-agent.md) · [A channel with two agents](tutorials/first-channel.md) · [Your first conversation with an agent](tutorials/first-conversation.md) · [Your first launch of Sidekicks](tutorials/first-launch.md) · [Your first ACP exchange with a test agent](tutorials/first-acp-exchange.md) | | 9 | | **learn** by doing | Tutorials | [Your first agent, without writing any configuration](tutorials/your-first-agent.md) · [A channel with two agents](tutorials/first-channel.md) · [Your first conversation with an agent](tutorials/first-conversation.md) · [Your first launch of Sidekicks](tutorials/first-launch.md) · [Your first ACP exchange with a test agent](tutorials/first-acp-exchange.md) | |
| 10 | -| **do** a specific task | How-to guides | [Install Sidekicks](how-to/install-sidekicks.md) · [Add an agent](how-to/add-an-agent.md) · [Work with an agent's files and terminal](how-to/work-with-an-agents-files.md) · [Run an agent in a Docker container](how-to/run-an-agent-in-docker.md) · [Run an agent in an sbx sandbox](how-to/run-an-agent-in-a-sandbox.md) · [Manage channels and their agents](how-to/manage-channels.md) · [Edit or switch the configuration](how-to/edit-or-switch-the-configuration.md) · [Reset Sidekicks](how-to/reset-sidekicks.md) · [Develop the application](how-to/develop-the-application.md) · [Run the tests](how-to/run-the-tests.md) · [Run a test agent](how-to/run-a-test-agent.md) · [Run the end-to-end scenarios (v0.1)](how-to/run-the-end-to-end-scenarios.md) · [Publish a release](how-to/publish-a-release.md) · [Test milestone M4 on macOS](how-to/test-milestone-m4-on-macos.md) · [Test milestone M3 on macOS](how-to/test-milestone-m3-on-macos.md) · [Test milestone M2 on macOS](how-to/test-milestone-m2-on-macos.md) · [Test milestone M1 on macOS](how-to/test-milestone-m1-on-macos.md) · [Test milestone Initialize on macOS](how-to/test-milestone-initialize-on-macos.md) | | 10 | +| **do** a specific task | How-to guides | [Install Sidekicks](how-to/install-sidekicks.md) · [Add an agent](how-to/add-an-agent.md) · [Work with an agent's files and terminal](how-to/work-with-an-agents-files.md) · [Run an agent in a Docker container](how-to/run-an-agent-in-docker.md) · [Run an agent in an sbx sandbox](how-to/run-an-agent-in-a-sandbox.md) · [Manage channels and their agents](how-to/manage-channels.md) · [Edit or switch the configuration](how-to/edit-or-switch-the-configuration.md) · [Reset Sidekicks](how-to/reset-sidekicks.md) · [Develop the application](how-to/develop-the-application.md) · [Run the tests](how-to/run-the-tests.md) · [Check a change before merging it](how-to/check-before-merging.md) · [Run a test agent](how-to/run-a-test-agent.md) · [Run the end-to-end scenarios (v0.1)](how-to/run-the-end-to-end-scenarios.md) · [Publish a release](how-to/publish-a-release.md) · [Test milestone M4 on macOS](how-to/test-milestone-m4-on-macos.md) · [Test milestone M3 on macOS](how-to/test-milestone-m3-on-macos.md) · [Test milestone M2 on macOS](how-to/test-milestone-m2-on-macos.md) · [Test milestone M1 on macOS](how-to/test-milestone-m1-on-macos.md) · [Test milestone Initialize on macOS](how-to/test-milestone-initialize-on-macos.md) | |
| 11 | | **look up** an exact detail | Reference | [The configuration file](reference/configuration.md) · [Keyboard shortcuts](reference/keyboard-shortcuts.md) · [Agents, channels and events](reference/agents-and-events.md) · [Commands](reference/commands.md) · [scripts/agents.sh](reference/agents-script.md) | | 11 | | **look up** an exact detail | Reference | [The configuration file](reference/configuration.md) · [Keyboard shortcuts](reference/keyboard-shortcuts.md) · [Agents, channels and events](reference/agents-and-events.md) · [Commands](reference/commands.md) · [scripts/agents.sh](reference/agents-script.md) | |
| 12 | | **understand** why | Explanation | [Workspaces and terminals](explanation/workspaces-and-terminals.md) · [Channels and what each agent knows](explanation/channels-and-context.md) · [Permissions and trust](explanation/permissions.md) · [Why ACP](explanation/why-acp.md) · [The interface stack](explanation/ui-stack.md) · [Architecture](explanation/architecture.md) · [Memory and local models](explanation/memory-and-local-models.md) | | 12 | | **understand** why | Explanation | [Workspaces and terminals](explanation/workspaces-and-terminals.md) · [Channels and what each agent knows](explanation/channels-and-context.md) · [Permissions and trust](explanation/permissions.md) · [Why ACP](explanation/why-acp.md) · [The interface stack](explanation/ui-stack.md) · [Architecture](explanation/architecture.md) · [Memory and local models](explanation/memory-and-local-models.md) | |
| 13 | 13 | ||
added
docs/en/how-to/check-before-merging.md +49 -0 | new file mode 100644 | ||
| @@ -0,0 +1,49 @@ | ||
| 1 | +# How to check a change before merging it | |
| 2 | + | |
| 3 | +Sidekicks has no CI: the checks run on your machine. This guide shows what to run before merging a branch into `main`. It assumes the development tools of [How to develop the application](develop-the-application.md) and a terminal at the root of the repository. | |
| 4 | + | |
| 5 | +## Steps | |
| 6 | + | |
| 7 | +1. **Stage or commit your change**, bindings included (`git add -A`). The bindings check compares the regenerated bindings with what git has, not with your working tree. | |
| 8 | +2. **Run every check**: | |
| 9 | + | |
| 10 | + ```bash | |
| 11 | + make verify | |
| 12 | + ``` | |
| 13 | + | |
| 14 | + It runs `make check` — golangci-lint, svelte-check, the licence headers, then the Go, frontend and shell tests — and then `make bindings-check`: the TypeScript bindings are regenerated and must be identical to the staged ones. A green run ends with: | |
| 15 | + | |
| 16 | + ```text | |
| 17 | + all tag-release tests passed | |
| 18 | + ``` | |
| 19 | + | |
| 20 | + and no `git diff` output. | |
| 21 | +3. **If the bindings check fails**: the services or events changed without `make bindings`. The regeneration has just updated `frontend/bindings`: stage it (`git add frontend/bindings`) and run `make verify` again. | |
| 22 | +4. **Check on Linux too**, from the Mac, when the change touches the terminals, the workspaces, the shell scripts or the build: | |
| 23 | + | |
| 24 | + ```bash | |
| 25 | + make check-linux | |
| 26 | + ``` | |
| 27 | + | |
| 28 | + It runs `make check` in an ubuntu:26.04 container with GTK 4 and WebKitGTK 6 (Docker must be running; the first run builds the image, about 2.6 GB). | |
| 29 | +5. **Merge** into `main`. | |
| 30 | + | |
| 31 | +## Variants | |
| 32 | + | |
| 33 | +- **The change touches ACP, the agents or the channels**: also run the tests against the real agents, `make test-real` (needs `mm` and llmman; see [How to run the tests](run-the-tests.md#run-the-tests-against-the-real-agents)). | |
| 34 | +- **The change shows in the interface**: `make dev` and try it; for a release, the [end-to-end scenarios](run-the-end-to-end-scenarios.md). | |
| 35 | +- **Check automatically before every push**: install a git hook once — | |
| 36 | + | |
| 37 | + ```bash | |
| 38 | + printf '#!/bin/sh\nexec make verify\n' > .git/hooks/pre-push && chmod +x .git/hooks/pre-push | |
| 39 | + ``` | |
| 40 | + | |
| 41 | + `git push --no-verify` skips it when needed (pushing a tag, for instance). | |
| 42 | +- **Linux x86-64 from an Apple Silicon Mac**: `LINUX_ARCH=amd64 make check-linux` (emulated, so slower). | |
| 43 | +- **On Linux**: `make verify` is enough; `make check-linux` is for the Mac. | |
| 44 | + | |
| 45 | +## See also | |
| 46 | + | |
| 47 | +- [How to run the tests](run-the-tests.md) — one part at a time, real agents, containers | |
| 48 | +- [Reference: commands](../reference/commands.md) — every `make` target | |
| 49 | +- [RELEASING.md](../../../RELEASING.md) — once `main` is ready to be released | |
| new file mode 100644 | |||
| @@ -0,0 +1,49 @@ | |||
| 1 | +# How to check a change before merging it | ||
| 2 | + | ||
| 3 | +Sidekicks has no CI: the checks run on your machine. This guide shows what to run before merging a branch into `main`. It assumes the development tools of [How to develop the application](develop-the-application.md) and a terminal at the root of the repository. | ||
| 4 | + | ||
| 5 | +## Steps | ||
| 6 | + | ||
| 7 | +1. **Stage or commit your change**, bindings included (`git add -A`). The bindings check compares the regenerated bindings with what git has, not with your working tree. | ||
| 8 | +2. **Run every check**: | ||
| 9 | + | ||
| 10 | + ```bash | ||
| 11 | + make verify | ||
| 12 | + ``` | ||
| 13 | + | ||
| 14 | + It runs `make check` — golangci-lint, svelte-check, the licence headers, then the Go, frontend and shell tests — and then `make bindings-check`: the TypeScript bindings are regenerated and must be identical to the staged ones. A green run ends with: | ||
| 15 | + | ||
| 16 | + ```text | ||
| 17 | + all tag-release tests passed | ||
| 18 | + ``` | ||
| 19 | + | ||
| 20 | + and no `git diff` output. | ||
| 21 | +3. **If the bindings check fails**: the services or events changed without `make bindings`. The regeneration has just updated `frontend/bindings`: stage it (`git add frontend/bindings`) and run `make verify` again. | ||
| 22 | +4. **Check on Linux too**, from the Mac, when the change touches the terminals, the workspaces, the shell scripts or the build: | ||
| 23 | + | ||
| 24 | + ```bash | ||
| 25 | + make check-linux | ||
| 26 | + ``` | ||
| 27 | + | ||
| 28 | + It runs `make check` in an ubuntu:26.04 container with GTK 4 and WebKitGTK 6 (Docker must be running; the first run builds the image, about 2.6 GB). | ||
| 29 | +5. **Merge** into `main`. | ||
| 30 | + | ||
| 31 | +## Variants | ||
| 32 | + | ||
| 33 | +- **The change touches ACP, the agents or the channels**: also run the tests against the real agents, `make test-real` (needs `mm` and llmman; see [How to run the tests](run-the-tests.md#run-the-tests-against-the-real-agents)). | ||
| 34 | +- **The change shows in the interface**: `make dev` and try it; for a release, the [end-to-end scenarios](run-the-end-to-end-scenarios.md). | ||
| 35 | +- **Check automatically before every push**: install a git hook once — | ||
| 36 | + | ||
| 37 | + ```bash | ||
| 38 | + printf '#!/bin/sh\nexec make verify\n' > .git/hooks/pre-push && chmod +x .git/hooks/pre-push | ||
| 39 | + ``` | ||
| 40 | + | ||
| 41 | + `git push --no-verify` skips it when needed (pushing a tag, for instance). | ||
| 42 | +- **Linux x86-64 from an Apple Silicon Mac**: `LINUX_ARCH=amd64 make check-linux` (emulated, so slower). | ||
| 43 | +- **On Linux**: `make verify` is enough; `make check-linux` is for the Mac. | ||
| 44 | + | ||
| 45 | +## See also | ||
| 46 | + | ||
| 47 | +- [How to run the tests](run-the-tests.md) — one part at a time, real agents, containers | ||
| 48 | +- [Reference: commands](../reference/commands.md) — every `make` target | ||
| 49 | +- [RELEASING.md](../../../RELEASING.md) — once `main` is ready to be released | ||
modified
docs/en/how-to/develop-the-application.md +1 -1 | @@ -34,7 +34,7 @@ Release packages go to `dist/`: `make package-macos`, `make package-linux`, `mak | ||
| 34 | 34 | |
| 35 | 35 | ## When you change… |
| 36 | 36 | |
| 37 | -- **a Go service or an event payload** (`internal/app`, `internal/events`, `main.go`): run `make bindings` and commit `frontend/bindings` — the CI fails when they are stale. | |
| 37 | +- **a Go service or an event payload** (`internal/app`, `internal/events`, `main.go`): run `make bindings` and commit `frontend/bindings` — `make verify` fails when they are stale. | |
| 38 | 38 | - **the configuration format**: update `schema/config.schema.json`, `internal/config`, the testdata and the [configuration reference](../reference/configuration.md). |
| 39 | 39 | - **a package or its imports**: update `docs/diagrams/packages.drawio` (its generator is described in the [architecture explanation](../explanation/architecture.md)). |
| 40 | 40 | - **any source file you create**: start it with the licence header (`make lint-headers` checks it). |
| @@ -34,7 +34,7 @@ Release packages go to `dist/`: `make package-macos`, `make package-linux`, `mak | |||
| 34 | 34 | ||
| 35 | ## When you change… | 35 | ## When you change… |
| 36 | 36 | ||
| 37 | -- **a Go service or an event payload** (`internal/app`, `internal/events`, `main.go`): run `make bindings` and commit `frontend/bindings` — the CI fails when they are stale. | 37 | +- **a Go service or an event payload** (`internal/app`, `internal/events`, `main.go`): run `make bindings` and commit `frontend/bindings` — `make verify` fails when they are stale. |
| 38 | - **the configuration format**: update `schema/config.schema.json`, `internal/config`, the testdata and the [configuration reference](../reference/configuration.md). | 38 | - **the configuration format**: update `schema/config.schema.json`, `internal/config`, the testdata and the [configuration reference](../reference/configuration.md). |
| 39 | - **a package or its imports**: update `docs/diagrams/packages.drawio` (its generator is described in the [architecture explanation](../explanation/architecture.md)). | 39 | - **a package or its imports**: update `docs/diagrams/packages.drawio` (its generator is described in the [architecture explanation](../explanation/architecture.md)). |
| 40 | - **any source file you create**: start it with the licence header (`make lint-headers` checks it). | 40 | - **any source file you create**: start it with the licence header (`make lint-headers` checks it). |
modified
docs/en/how-to/run-the-tests.md +2 -2 | @@ -2,7 +2,7 @@ | ||
| 2 | 2 | |
| 3 | 3 | This guide shows how to check the project before you commit or open a merge request. It assumes the development prerequisites are installed (see [How to develop the application](develop-the-application.md)) and a terminal at the root of the repository. |
| 4 | 4 | |
| 5 | -## Run what the CI runs | |
| 5 | +## Run every test | |
| 6 | 6 | |
| 7 | 7 | ```bash |
| 8 | 8 | make check |
| @@ -15,7 +15,7 @@ It runs the linters (`make lint`), then every test that needs no real agent, no | ||
| 15 | 15 | all licence header tests passed |
| 16 | 16 | ``` |
| 17 | 17 | |
| 18 | -The CI (`.github/workflows/ci.yml`) runs the same command, plus `make bindings-check`. | |
| 18 | +Before merging, `make verify` runs it plus the bindings check: see [How to check a change before merging it](check-before-merging.md). | |
| 19 | 19 | |
| 20 | 20 | ## Run one part |
| 21 | 21 | |
| @@ -2,7 +2,7 @@ | |||
| 2 | 2 | ||
| 3 | This guide shows how to check the project before you commit or open a merge request. It assumes the development prerequisites are installed (see [How to develop the application](develop-the-application.md)) and a terminal at the root of the repository. | 3 | This guide shows how to check the project before you commit or open a merge request. It assumes the development prerequisites are installed (see [How to develop the application](develop-the-application.md)) and a terminal at the root of the repository. |
| 4 | 4 | ||
| 5 | -## Run what the CI runs | 5 | +## Run every test |
| 6 | 6 | ||
| 7 | ```bash | 7 | ```bash |
| 8 | make check | 8 | make check |
| @@ -15,7 +15,7 @@ It runs the linters (`make lint`), then every test that needs no real agent, no | |||
| 15 | all licence header tests passed | 15 | all licence header tests passed |
| 16 | ``` | 16 | ``` |
| 17 | 17 | ||
| 18 | -The CI (`.github/workflows/ci.yml`) runs the same command, plus `make bindings-check`. | 18 | +Before merging, `make verify` runs it plus the bindings check: see [How to check a change before merging it](check-before-merging.md). |
| 19 | 19 | ||
| 20 | ## Run one part | 20 | ## Run one part |
| 21 | 21 | ||
modified
docs/en/reference/commands.md +3 -5 | @@ -32,6 +32,8 @@ The order is detailed in the [configuration reference](configuration.md#location | ||
| 32 | 32 | | `package-macos` | `scripts/package.sh macos`: universal `.dmg` and `.zip` (arm64 + amd64, signed ad hoc), into `dist/`. macOS only. | |
| 33 | 33 | | `install-test-config` | `scripts/install-test-config.sh`: writes `examples/test-agents.yaml` at the default configuration location with absolute paths to the repository: each agent is `mm -acp -config agent.yaml` started in its folder, with `afterStop: [<repo>/scripts/agents.sh, unload, <agent>]` to unload its model when it stops, `mm` written with its absolute path (`MM_BIN`, or the one in `PATH`), and the current `PATH` in each agent's `env`; an existing file is kept as `config.yaml.<date>.bak`. | |
| 34 | 34 | | `check` | `lint` then `test`. | |
| 35 | +| `verify` | `check` then `bindings-check`: what to run before merging (there is no CI). | | |
| 36 | +| `check-linux` | `scripts/check-linux.sh`: `make check` in the Linux container of `scripts/linux-packages.Dockerfile` (`LINUX_ARCH`, default the Mac's architecture), the repository mounted at `/src`. Needs Docker. | | |
| 35 | 37 | | `test` | `test-go`, `test-frontend`, `test-scripts`. | |
| 36 | 38 | | `test-go` | `go test ./...` (builds `frontend/dist` first if missing). | |
| 37 | 39 | | `test-frontend` | `vitest run` in `frontend/`. | |
| @@ -41,7 +43,7 @@ The order is detailed in the [configuration reference](configuration.md#location | ||
| 41 | 43 | | `lint-go` | golangci-lint v2.14.0 (`tools/go.mod`), configuration `.golangci.yml`. | |
| 42 | 44 | | `lint-frontend` | `svelte-check`. | |
| 43 | 45 | | `lint-headers` | `scripts/check-license-headers.sh`. | |
| 44 | -| `bindings-check` | `bindings`, then fails if `frontend/bindings` differs from the committed version. | | |
| 46 | +| `bindings-check` | `bindings`, then fails if `frontend/bindings` differs from the index (`git diff`) or holds files git does not know. | | |
| 45 | 47 | |
| 46 | 48 | ## `scripts/check-license-headers.sh` |
| 47 | 49 | |
| @@ -87,10 +89,6 @@ scripts/tag-release.sh [--remote <name>] [--no-push] | ||
| 87 | 89 | |
| 88 | 90 | Creates the annotated tag `v<version>` (`info.version` of `build/config.yml`, message `Sidekicks <version>`) and pushes it to `--remote` (default `origin`). Refuses when tracked files have changes, when the current branch is not `main`, when `main` differs from `<remote>/main` after a fetch, or when the tag exists locally. Warns, without refusing, when `dist/` misses a package of the version or `SHA256SUMS`. `--no-push` tags locally only. |
| 89 | 91 | |
| 90 | -## CI | |
| 91 | - | |
| 92 | -`.github/workflows/ci.yml`, on every push and merge request, in an `ubuntu:26.04` container (GTK ≥ 4.10): installs git, a C compiler, the GTK 4 / WebKitGTK 6 build packages, Node and npm from apt, Go from go.dev (version of `go.mod`), pnpm (version of `frontend/package.json`) and the Wails CLI, then runs `make bindings-check` and `make check`. | |
| 93 | - | |
| 94 | 92 | ## Release workflow |
| 95 | 93 | |
| 96 | 94 | `.github/workflows/release.yml`, on the push of a tag `v*`, with `permissions: contents: write`: fails when the tag is not `v` + `info.version` of `build/config.yml`, then creates the release `<tag>` named `Sidekicks <tag>` (`softprops/action-gh-release@v2`, through Rickub's GitHub-compatible API behind `GITHUB_API_URL`), with notes giving the commit, the install guides and the table of the files to expect (from `scripts/package.sh names`). It attaches no file: the packages are attached by hand. |
| @@ -32,6 +32,8 @@ The order is detailed in the [configuration reference](configuration.md#location | |||
| 32 | | `package-macos` | `scripts/package.sh macos`: universal `.dmg` and `.zip` (arm64 + amd64, signed ad hoc), into `dist/`. macOS only. | | 32 | | `package-macos` | `scripts/package.sh macos`: universal `.dmg` and `.zip` (arm64 + amd64, signed ad hoc), into `dist/`. macOS only. | |
| 33 | | `install-test-config` | `scripts/install-test-config.sh`: writes `examples/test-agents.yaml` at the default configuration location with absolute paths to the repository: each agent is `mm -acp -config agent.yaml` started in its folder, with `afterStop: [<repo>/scripts/agents.sh, unload, <agent>]` to unload its model when it stops, `mm` written with its absolute path (`MM_BIN`, or the one in `PATH`), and the current `PATH` in each agent's `env`; an existing file is kept as `config.yaml.<date>.bak`. | | 33 | | `install-test-config` | `scripts/install-test-config.sh`: writes `examples/test-agents.yaml` at the default configuration location with absolute paths to the repository: each agent is `mm -acp -config agent.yaml` started in its folder, with `afterStop: [<repo>/scripts/agents.sh, unload, <agent>]` to unload its model when it stops, `mm` written with its absolute path (`MM_BIN`, or the one in `PATH`), and the current `PATH` in each agent's `env`; an existing file is kept as `config.yaml.<date>.bak`. | |
| 34 | | `check` | `lint` then `test`. | | 34 | | `check` | `lint` then `test`. | |
| 35 | +| `verify` | `check` then `bindings-check`: what to run before merging (there is no CI). | | ||
| 36 | +| `check-linux` | `scripts/check-linux.sh`: `make check` in the Linux container of `scripts/linux-packages.Dockerfile` (`LINUX_ARCH`, default the Mac's architecture), the repository mounted at `/src`. Needs Docker. | | ||
| 35 | | `test` | `test-go`, `test-frontend`, `test-scripts`. | | 37 | | `test` | `test-go`, `test-frontend`, `test-scripts`. | |
| 36 | | `test-go` | `go test ./...` (builds `frontend/dist` first if missing). | | 38 | | `test-go` | `go test ./...` (builds `frontend/dist` first if missing). | |
| 37 | | `test-frontend` | `vitest run` in `frontend/`. | | 39 | | `test-frontend` | `vitest run` in `frontend/`. | |
| @@ -41,7 +43,7 @@ The order is detailed in the [configuration reference](configuration.md#location | |||
| 41 | | `lint-go` | golangci-lint v2.14.0 (`tools/go.mod`), configuration `.golangci.yml`. | | 43 | | `lint-go` | golangci-lint v2.14.0 (`tools/go.mod`), configuration `.golangci.yml`. | |
| 42 | | `lint-frontend` | `svelte-check`. | | 44 | | `lint-frontend` | `svelte-check`. | |
| 43 | | `lint-headers` | `scripts/check-license-headers.sh`. | | 45 | | `lint-headers` | `scripts/check-license-headers.sh`. | |
| 44 | -| `bindings-check` | `bindings`, then fails if `frontend/bindings` differs from the committed version. | | 46 | +| `bindings-check` | `bindings`, then fails if `frontend/bindings` differs from the index (`git diff`) or holds files git does not know. | |
| 45 | 47 | ||
| 46 | ## `scripts/check-license-headers.sh` | 48 | ## `scripts/check-license-headers.sh` |
| 47 | 49 | ||
| @@ -87,10 +89,6 @@ scripts/tag-release.sh [--remote <name>] [--no-push] | |||
| 87 | 89 | ||
| 88 | Creates the annotated tag `v<version>` (`info.version` of `build/config.yml`, message `Sidekicks <version>`) and pushes it to `--remote` (default `origin`). Refuses when tracked files have changes, when the current branch is not `main`, when `main` differs from `<remote>/main` after a fetch, or when the tag exists locally. Warns, without refusing, when `dist/` misses a package of the version or `SHA256SUMS`. `--no-push` tags locally only. | 90 | Creates the annotated tag `v<version>` (`info.version` of `build/config.yml`, message `Sidekicks <version>`) and pushes it to `--remote` (default `origin`). Refuses when tracked files have changes, when the current branch is not `main`, when `main` differs from `<remote>/main` after a fetch, or when the tag exists locally. Warns, without refusing, when `dist/` misses a package of the version or `SHA256SUMS`. `--no-push` tags locally only. |
| 89 | 91 | ||
| 90 | -## CI | ||
| 91 | - | ||
| 92 | -`.github/workflows/ci.yml`, on every push and merge request, in an `ubuntu:26.04` container (GTK ≥ 4.10): installs git, a C compiler, the GTK 4 / WebKitGTK 6 build packages, Node and npm from apt, Go from go.dev (version of `go.mod`), pnpm (version of `frontend/package.json`) and the Wails CLI, then runs `make bindings-check` and `make check`. | ||
| 93 | - | ||
| 94 | ## Release workflow | 92 | ## Release workflow |
| 95 | 93 | ||
| 96 | `.github/workflows/release.yml`, on the push of a tag `v*`, with `permissions: contents: write`: fails when the tag is not `v` + `info.version` of `build/config.yml`, then creates the release `<tag>` named `Sidekicks <tag>` (`softprops/action-gh-release@v2`, through Rickub's GitHub-compatible API behind `GITHUB_API_URL`), with notes giving the commit, the install guides and the table of the files to expect (from `scripts/package.sh names`). It attaches no file: the packages are attached by hand. | 94 | `.github/workflows/release.yml`, on the push of a tag `v*`, with `permissions: contents: write`: fails when the tag is not `v` + `info.version` of `build/config.yml`, then creates the release `<tag>` named `Sidekicks <tag>` (`softprops/action-gh-release@v2`, through Rickub's GitHub-compatible API behind `GITHUB_API_URL`), with notes giving the commit, the install guides and the table of the files to expect (from `scripts/package.sh names`). It attaches no file: the packages are attached by hand. |
modified
docs/fr/README.md +1 -1 | @@ -7,7 +7,7 @@ Cette documentation suit la méthode [Diátaxis](https://diataxis.fr) : choisiss | ||
| 7 | 7 | | Vous voulez… | Section | Pages | |
| 8 | 8 | | --- | --- | --- | |
| 9 | 9 | | **apprendre** en pratiquant | Tutoriels | [Votre premier agent, sans écrire de configuration](tutorials/premier-agent.md) · [Un channel avec deux agents](tutorials/premier-channel.md) · [Votre première conversation avec un agent](tutorials/premiere-conversation.md) · [Votre premier lancement de Sidekicks](tutorials/premier-lancement.md) · [Votre premier échange ACP avec un agent de test](tutorials/premier-echange-acp.md) | |
| 10 | -| **réaliser** une tâche précise | Guides pratiques | [Installer Sidekicks](how-to/installer-sidekicks.md) · [Ajouter un agent](how-to/ajouter-un-agent.md) · [Travailler avec les fichiers et le terminal d'un agent](how-to/fichiers-et-terminal-d-un-agent.md) · [Lancer un agent dans un conteneur Docker](how-to/lancer-un-agent-dans-docker.md) · [Lancer un agent dans une sandbox sbx](how-to/lancer-un-agent-dans-une-sandbox.md) · [Gérer les channels et leurs agents](how-to/gerer-les-channels.md) · [Modifier ou changer la configuration](how-to/modifier-ou-changer-la-configuration.md) · [Repartir de zéro](how-to/repartir-de-zero.md) · [Développer l'application](how-to/developper-l-application.md) · [Lancer les tests](how-to/lancer-les-tests.md) · [Lancer un agent de test](how-to/lancer-un-agent-de-test.md) · [Dérouler les scénarios de bout en bout (v0.1)](how-to/derouler-les-scenarios-de-bout-en-bout.md) · [Publier une release](how-to/publier-une-release.md) · [Tester la milestone M4 sous macOS](how-to/tester-la-milestone-m4-sous-macos.md) · [Tester la milestone M3 sous macOS](how-to/tester-la-milestone-m3-sous-macos.md) · [Tester la milestone M2 sous macOS](how-to/tester-la-milestone-m2-sous-macos.md) · [Tester la milestone M1 sous macOS](how-to/tester-la-milestone-m1-sous-macos.md) · [Tester la milestone Initialize sous macOS](how-to/tester-la-milestone-initialize-sous-macos.md) | | |
| 10 | +| **réaliser** une tâche précise | Guides pratiques | [Installer Sidekicks](how-to/installer-sidekicks.md) · [Ajouter un agent](how-to/ajouter-un-agent.md) · [Travailler avec les fichiers et le terminal d'un agent](how-to/fichiers-et-terminal-d-un-agent.md) · [Lancer un agent dans un conteneur Docker](how-to/lancer-un-agent-dans-docker.md) · [Lancer un agent dans une sandbox sbx](how-to/lancer-un-agent-dans-une-sandbox.md) · [Gérer les channels et leurs agents](how-to/gerer-les-channels.md) · [Modifier ou changer la configuration](how-to/modifier-ou-changer-la-configuration.md) · [Repartir de zéro](how-to/repartir-de-zero.md) · [Développer l'application](how-to/developper-l-application.md) · [Lancer les tests](how-to/lancer-les-tests.md) · [Vérifier une modification avant de la fusionner](how-to/verifier-avant-de-fusionner.md) · [Lancer un agent de test](how-to/lancer-un-agent-de-test.md) · [Dérouler les scénarios de bout en bout (v0.1)](how-to/derouler-les-scenarios-de-bout-en-bout.md) · [Publier une release](how-to/publier-une-release.md) · [Tester la milestone M4 sous macOS](how-to/tester-la-milestone-m4-sous-macos.md) · [Tester la milestone M3 sous macOS](how-to/tester-la-milestone-m3-sous-macos.md) · [Tester la milestone M2 sous macOS](how-to/tester-la-milestone-m2-sous-macos.md) · [Tester la milestone M1 sous macOS](how-to/tester-la-milestone-m1-sous-macos.md) · [Tester la milestone Initialize sous macOS](how-to/tester-la-milestone-initialize-sous-macos.md) | | |
| 11 | 11 | | **consulter** un détail exact | Référence | [Le fichier de configuration](reference/configuration.md) · [Raccourcis clavier](reference/raccourcis-clavier.md) · [Agents, channels et événements](reference/agents-et-evenements.md) · [Commandes](reference/commandes.md) · [scripts/agents.sh](reference/script-agents.md) | |
| 12 | 12 | | **comprendre** le pourquoi | Explications | [Workspaces et terminaux](explanation/workspaces-et-terminaux.md) · [Les channels et ce que sait chaque agent](explanation/channels-et-contexte.md) · [Permissions et confiance](explanation/permissions-et-confiance.md) · [Pourquoi ACP](explanation/pourquoi-acp.md) · [La stack de l'interface](explanation/stack-interface.md) · [Architecture](explanation/architecture.md) · [Mémoire et modèles locaux](explanation/memoire-et-modeles-locaux.md) | |
| 13 | 13 | |
| @@ -7,7 +7,7 @@ Cette documentation suit la méthode [Diátaxis](https://diataxis.fr) : choisiss | |||
| 7 | | Vous voulez… | Section | Pages | | 7 | | Vous voulez… | Section | Pages | |
| 8 | | --- | --- | --- | | 8 | | --- | --- | --- | |
| 9 | | **apprendre** en pratiquant | Tutoriels | [Votre premier agent, sans écrire de configuration](tutorials/premier-agent.md) · [Un channel avec deux agents](tutorials/premier-channel.md) · [Votre première conversation avec un agent](tutorials/premiere-conversation.md) · [Votre premier lancement de Sidekicks](tutorials/premier-lancement.md) · [Votre premier échange ACP avec un agent de test](tutorials/premier-echange-acp.md) | | 9 | | **apprendre** en pratiquant | Tutoriels | [Votre premier agent, sans écrire de configuration](tutorials/premier-agent.md) · [Un channel avec deux agents](tutorials/premier-channel.md) · [Votre première conversation avec un agent](tutorials/premiere-conversation.md) · [Votre premier lancement de Sidekicks](tutorials/premier-lancement.md) · [Votre premier échange ACP avec un agent de test](tutorials/premier-echange-acp.md) | |
| 10 | -| **réaliser** une tâche précise | Guides pratiques | [Installer Sidekicks](how-to/installer-sidekicks.md) · [Ajouter un agent](how-to/ajouter-un-agent.md) · [Travailler avec les fichiers et le terminal d'un agent](how-to/fichiers-et-terminal-d-un-agent.md) · [Lancer un agent dans un conteneur Docker](how-to/lancer-un-agent-dans-docker.md) · [Lancer un agent dans une sandbox sbx](how-to/lancer-un-agent-dans-une-sandbox.md) · [Gérer les channels et leurs agents](how-to/gerer-les-channels.md) · [Modifier ou changer la configuration](how-to/modifier-ou-changer-la-configuration.md) · [Repartir de zéro](how-to/repartir-de-zero.md) · [Développer l'application](how-to/developper-l-application.md) · [Lancer les tests](how-to/lancer-les-tests.md) · [Lancer un agent de test](how-to/lancer-un-agent-de-test.md) · [Dérouler les scénarios de bout en bout (v0.1)](how-to/derouler-les-scenarios-de-bout-en-bout.md) · [Publier une release](how-to/publier-une-release.md) · [Tester la milestone M4 sous macOS](how-to/tester-la-milestone-m4-sous-macos.md) · [Tester la milestone M3 sous macOS](how-to/tester-la-milestone-m3-sous-macos.md) · [Tester la milestone M2 sous macOS](how-to/tester-la-milestone-m2-sous-macos.md) · [Tester la milestone M1 sous macOS](how-to/tester-la-milestone-m1-sous-macos.md) · [Tester la milestone Initialize sous macOS](how-to/tester-la-milestone-initialize-sous-macos.md) | | 10 | +| **réaliser** une tâche précise | Guides pratiques | [Installer Sidekicks](how-to/installer-sidekicks.md) · [Ajouter un agent](how-to/ajouter-un-agent.md) · [Travailler avec les fichiers et le terminal d'un agent](how-to/fichiers-et-terminal-d-un-agent.md) · [Lancer un agent dans un conteneur Docker](how-to/lancer-un-agent-dans-docker.md) · [Lancer un agent dans une sandbox sbx](how-to/lancer-un-agent-dans-une-sandbox.md) · [Gérer les channels et leurs agents](how-to/gerer-les-channels.md) · [Modifier ou changer la configuration](how-to/modifier-ou-changer-la-configuration.md) · [Repartir de zéro](how-to/repartir-de-zero.md) · [Développer l'application](how-to/developper-l-application.md) · [Lancer les tests](how-to/lancer-les-tests.md) · [Vérifier une modification avant de la fusionner](how-to/verifier-avant-de-fusionner.md) · [Lancer un agent de test](how-to/lancer-un-agent-de-test.md) · [Dérouler les scénarios de bout en bout (v0.1)](how-to/derouler-les-scenarios-de-bout-en-bout.md) · [Publier une release](how-to/publier-une-release.md) · [Tester la milestone M4 sous macOS](how-to/tester-la-milestone-m4-sous-macos.md) · [Tester la milestone M3 sous macOS](how-to/tester-la-milestone-m3-sous-macos.md) · [Tester la milestone M2 sous macOS](how-to/tester-la-milestone-m2-sous-macos.md) · [Tester la milestone M1 sous macOS](how-to/tester-la-milestone-m1-sous-macos.md) · [Tester la milestone Initialize sous macOS](how-to/tester-la-milestone-initialize-sous-macos.md) | |
| 11 | | **consulter** un détail exact | Référence | [Le fichier de configuration](reference/configuration.md) · [Raccourcis clavier](reference/raccourcis-clavier.md) · [Agents, channels et événements](reference/agents-et-evenements.md) · [Commandes](reference/commandes.md) · [scripts/agents.sh](reference/script-agents.md) | | 11 | | **consulter** un détail exact | Référence | [Le fichier de configuration](reference/configuration.md) · [Raccourcis clavier](reference/raccourcis-clavier.md) · [Agents, channels et événements](reference/agents-et-evenements.md) · [Commandes](reference/commandes.md) · [scripts/agents.sh](reference/script-agents.md) | |
| 12 | | **comprendre** le pourquoi | Explications | [Workspaces et terminaux](explanation/workspaces-et-terminaux.md) · [Les channels et ce que sait chaque agent](explanation/channels-et-contexte.md) · [Permissions et confiance](explanation/permissions-et-confiance.md) · [Pourquoi ACP](explanation/pourquoi-acp.md) · [La stack de l'interface](explanation/stack-interface.md) · [Architecture](explanation/architecture.md) · [Mémoire et modèles locaux](explanation/memoire-et-modeles-locaux.md) | | 12 | | **comprendre** le pourquoi | Explications | [Workspaces et terminaux](explanation/workspaces-et-terminaux.md) · [Les channels et ce que sait chaque agent](explanation/channels-et-contexte.md) · [Permissions et confiance](explanation/permissions-et-confiance.md) · [Pourquoi ACP](explanation/pourquoi-acp.md) · [La stack de l'interface](explanation/stack-interface.md) · [Architecture](explanation/architecture.md) · [Mémoire et modèles locaux](explanation/memoire-et-modeles-locaux.md) | |
| 13 | 13 | ||
modified
docs/fr/how-to/developper-l-application.md +1 -1 | @@ -34,7 +34,7 @@ Les paquets de release vont dans `dist/` : `make package-macos`, `make package-l | ||
| 34 | 34 | |
| 35 | 35 | ## Quand vous modifiez… |
| 36 | 36 | |
| 37 | -- **un service Go ou une charge d'événement** (`internal/app`, `internal/events`, `main.go`) : lancez `make bindings` et commitez `frontend/bindings` — la CI échoue s'ils ne sont pas à jour. | |
| 37 | +- **un service Go ou une charge d'événement** (`internal/app`, `internal/events`, `main.go`) : lancez `make bindings` et commitez `frontend/bindings` — `make verify` échoue s'ils ne sont pas à jour. | |
| 38 | 38 | - **le format de configuration** : mettez à jour `schema/config.schema.json`, `internal/config`, les données de test et la [référence de la configuration](../reference/configuration.md). |
| 39 | 39 | - **un package ou ses imports** : mettez à jour `docs/diagrams/packages.drawio` (son générateur est décrit dans l'[explication de l'architecture](../explanation/architecture.md)). |
| 40 | 40 | - **tout fichier source que vous créez** : commencez-le par l'en-tête de licence (`make lint-headers` le vérifie). |
| @@ -34,7 +34,7 @@ Les paquets de release vont dans `dist/` : `make package-macos`, `make package-l | |||
| 34 | 34 | ||
| 35 | ## Quand vous modifiez… | 35 | ## Quand vous modifiez… |
| 36 | 36 | ||
| 37 | -- **un service Go ou une charge d'événement** (`internal/app`, `internal/events`, `main.go`) : lancez `make bindings` et commitez `frontend/bindings` — la CI échoue s'ils ne sont pas à jour. | 37 | +- **un service Go ou une charge d'événement** (`internal/app`, `internal/events`, `main.go`) : lancez `make bindings` et commitez `frontend/bindings` — `make verify` échoue s'ils ne sont pas à jour. |
| 38 | - **le format de configuration** : mettez à jour `schema/config.schema.json`, `internal/config`, les données de test et la [référence de la configuration](../reference/configuration.md). | 38 | - **le format de configuration** : mettez à jour `schema/config.schema.json`, `internal/config`, les données de test et la [référence de la configuration](../reference/configuration.md). |
| 39 | - **un package ou ses imports** : mettez à jour `docs/diagrams/packages.drawio` (son générateur est décrit dans l'[explication de l'architecture](../explanation/architecture.md)). | 39 | - **un package ou ses imports** : mettez à jour `docs/diagrams/packages.drawio` (son générateur est décrit dans l'[explication de l'architecture](../explanation/architecture.md)). |
| 40 | - **tout fichier source que vous créez** : commencez-le par l'en-tête de licence (`make lint-headers` le vérifie). | 40 | - **tout fichier source que vous créez** : commencez-le par l'en-tête de licence (`make lint-headers` le vérifie). |
modified
docs/fr/how-to/lancer-les-tests.md +2 -2 | @@ -2,7 +2,7 @@ | ||
| 2 | 2 | |
| 3 | 3 | Ce guide montre comment vérifier le projet avant un commit ou une merge request. Il suppose les prérequis de développement installés (voir [Comment développer l'application](developper-l-application.md)) et un terminal ouvert à la racine du dépôt. |
| 4 | 4 | |
| 5 | -## Lancer ce que lance la CI | |
| 5 | +## Lancer tous les tests | |
| 6 | 6 | |
| 7 | 7 | ```bash |
| 8 | 8 | make check |
| @@ -15,7 +15,7 @@ La commande lance les linters (`make lint`), puis tous les tests qui n'ont besoi | ||
| 15 | 15 | all licence header tests passed |
| 16 | 16 | ``` |
| 17 | 17 | |
| 18 | -La CI (`.github/workflows/ci.yml`) lance la même commande, plus `make bindings-check`. | |
| 18 | +Avant de fusionner, `make verify` la lance avec la vérification des bindings : voir [Vérifier une modification avant de la fusionner](verifier-avant-de-fusionner.md). | |
| 19 | 19 | |
| 20 | 20 | ## Lancer une partie |
| 21 | 21 | |
| @@ -2,7 +2,7 @@ | |||
| 2 | 2 | ||
| 3 | Ce guide montre comment vérifier le projet avant un commit ou une merge request. Il suppose les prérequis de développement installés (voir [Comment développer l'application](developper-l-application.md)) et un terminal ouvert à la racine du dépôt. | 3 | Ce guide montre comment vérifier le projet avant un commit ou une merge request. Il suppose les prérequis de développement installés (voir [Comment développer l'application](developper-l-application.md)) et un terminal ouvert à la racine du dépôt. |
| 4 | 4 | ||
| 5 | -## Lancer ce que lance la CI | 5 | +## Lancer tous les tests |
| 6 | 6 | ||
| 7 | ```bash | 7 | ```bash |
| 8 | make check | 8 | make check |
| @@ -15,7 +15,7 @@ La commande lance les linters (`make lint`), puis tous les tests qui n'ont besoi | |||
| 15 | all licence header tests passed | 15 | all licence header tests passed |
| 16 | ``` | 16 | ``` |
| 17 | 17 | ||
| 18 | -La CI (`.github/workflows/ci.yml`) lance la même commande, plus `make bindings-check`. | 18 | +Avant de fusionner, `make verify` la lance avec la vérification des bindings : voir [Vérifier une modification avant de la fusionner](verifier-avant-de-fusionner.md). |
| 19 | 19 | ||
| 20 | ## Lancer une partie | 20 | ## Lancer une partie |
| 21 | 21 | ||
added
docs/fr/how-to/verifier-avant-de-fusionner.md +49 -0 | new file mode 100644 | ||
| @@ -0,0 +1,49 @@ | ||
| 1 | +# Vérifier une modification avant de la fusionner | |
| 2 | + | |
| 3 | +Sidekicks n'a pas de CI : les vérifications se font sur votre machine. Ce guide montre quoi lancer avant de fusionner une branche dans `main`. Il suppose les outils de [Développer l'application](developper-l-application.md) et un terminal ouvert à la racine du dépôt. | |
| 4 | + | |
| 5 | +## Étapes | |
| 6 | + | |
| 7 | +1. **Indexez ou commitez votre modification**, bindings compris (`git add -A`). La vérification des bindings compare les bindings régénérés à ce que git connaît, pas à votre copie de travail. | |
| 8 | +2. **Lancez toutes les vérifications** : | |
| 9 | + | |
| 10 | + ```bash | |
| 11 | + make verify | |
| 12 | + ``` | |
| 13 | + | |
| 14 | + La commande lance `make check` — golangci-lint, svelte-check, les en-têtes de licence, puis les tests Go, frontend et shell — puis `make bindings-check` : les bindings TypeScript sont régénérés et doivent être identiques à ceux indexés. Un passage réussi se termine par : | |
| 15 | + | |
| 16 | + ```text | |
| 17 | + all tag-release tests passed | |
| 18 | + ``` | |
| 19 | + | |
| 20 | + sans sortie de `git diff`. | |
| 21 | +3. **Si la vérification des bindings échoue** : les services ou les événements ont changé sans `make bindings`. La régénération vient de mettre à jour `frontend/bindings` : indexez-les (`git add frontend/bindings`) et relancez `make verify`. | |
| 22 | +4. **Vérifiez aussi sous Linux**, depuis le Mac, quand la modification touche les terminaux, les workspaces, les scripts shell ou le build : | |
| 23 | + | |
| 24 | + ```bash | |
| 25 | + make check-linux | |
| 26 | + ``` | |
| 27 | + | |
| 28 | + La commande lance `make check` dans un conteneur ubuntu:26.04 avec GTK 4 et WebKitGTK 6 (Docker doit tourner ; le premier lancement construit l'image, environ 2,6 Go). | |
| 29 | +5. **Fusionnez** dans `main`. | |
| 30 | + | |
| 31 | +## Variantes | |
| 32 | + | |
| 33 | +- **La modification touche ACP, les agents ou les channels** : lancez aussi les tests avec les vrais agents, `make test-real` (demande `mm` et llmman ; voir [Lancer les tests](lancer-les-tests.md#lancer-les-tests-avec-les-vrais-agents)). | |
| 34 | +- **La modification se voit dans l'interface** : `make dev` et essayez-la ; pour une release, les [scénarios de bout en bout](derouler-les-scenarios-de-bout-en-bout.md). | |
| 35 | +- **Vérifier automatiquement avant chaque push** : installez une fois un hook git — | |
| 36 | + | |
| 37 | + ```bash | |
| 38 | + printf '#!/bin/sh\nexec make verify\n' > .git/hooks/pre-push && chmod +x .git/hooks/pre-push | |
| 39 | + ``` | |
| 40 | + | |
| 41 | + `git push --no-verify` le saute au besoin (pour pousser un tag, par exemple). | |
| 42 | +- **Linux x86-64 depuis un Mac Apple Silicon** : `LINUX_ARCH=amd64 make check-linux` (émulé, donc plus lent). | |
| 43 | +- **Sous Linux** : `make verify` suffit ; `make check-linux` est pour le Mac. | |
| 44 | + | |
| 45 | +## Voir aussi | |
| 46 | + | |
| 47 | +- [Lancer les tests](lancer-les-tests.md) — partie par partie, vrais agents, conteneurs | |
| 48 | +- [Référence : commandes](../reference/commandes.md) — toutes les cibles `make` | |
| 49 | +- [RELEASING.fr.md](../../../RELEASING.fr.md) — une fois `main` prête à être publiée | |
| new file mode 100644 | |||
| @@ -0,0 +1,49 @@ | |||
| 1 | +# Vérifier une modification avant de la fusionner | ||
| 2 | + | ||
| 3 | +Sidekicks n'a pas de CI : les vérifications se font sur votre machine. Ce guide montre quoi lancer avant de fusionner une branche dans `main`. Il suppose les outils de [Développer l'application](developper-l-application.md) et un terminal ouvert à la racine du dépôt. | ||
| 4 | + | ||
| 5 | +## Étapes | ||
| 6 | + | ||
| 7 | +1. **Indexez ou commitez votre modification**, bindings compris (`git add -A`). La vérification des bindings compare les bindings régénérés à ce que git connaît, pas à votre copie de travail. | ||
| 8 | +2. **Lancez toutes les vérifications** : | ||
| 9 | + | ||
| 10 | + ```bash | ||
| 11 | + make verify | ||
| 12 | + ``` | ||
| 13 | + | ||
| 14 | + La commande lance `make check` — golangci-lint, svelte-check, les en-têtes de licence, puis les tests Go, frontend et shell — puis `make bindings-check` : les bindings TypeScript sont régénérés et doivent être identiques à ceux indexés. Un passage réussi se termine par : | ||
| 15 | + | ||
| 16 | + ```text | ||
| 17 | + all tag-release tests passed | ||
| 18 | + ``` | ||
| 19 | + | ||
| 20 | + sans sortie de `git diff`. | ||
| 21 | +3. **Si la vérification des bindings échoue** : les services ou les événements ont changé sans `make bindings`. La régénération vient de mettre à jour `frontend/bindings` : indexez-les (`git add frontend/bindings`) et relancez `make verify`. | ||
| 22 | +4. **Vérifiez aussi sous Linux**, depuis le Mac, quand la modification touche les terminaux, les workspaces, les scripts shell ou le build : | ||
| 23 | + | ||
| 24 | + ```bash | ||
| 25 | + make check-linux | ||
| 26 | + ``` | ||
| 27 | + | ||
| 28 | + La commande lance `make check` dans un conteneur ubuntu:26.04 avec GTK 4 et WebKitGTK 6 (Docker doit tourner ; le premier lancement construit l'image, environ 2,6 Go). | ||
| 29 | +5. **Fusionnez** dans `main`. | ||
| 30 | + | ||
| 31 | +## Variantes | ||
| 32 | + | ||
| 33 | +- **La modification touche ACP, les agents ou les channels** : lancez aussi les tests avec les vrais agents, `make test-real` (demande `mm` et llmman ; voir [Lancer les tests](lancer-les-tests.md#lancer-les-tests-avec-les-vrais-agents)). | ||
| 34 | +- **La modification se voit dans l'interface** : `make dev` et essayez-la ; pour une release, les [scénarios de bout en bout](derouler-les-scenarios-de-bout-en-bout.md). | ||
| 35 | +- **Vérifier automatiquement avant chaque push** : installez une fois un hook git — | ||
| 36 | + | ||
| 37 | + ```bash | ||
| 38 | + printf '#!/bin/sh\nexec make verify\n' > .git/hooks/pre-push && chmod +x .git/hooks/pre-push | ||
| 39 | + ``` | ||
| 40 | + | ||
| 41 | + `git push --no-verify` le saute au besoin (pour pousser un tag, par exemple). | ||
| 42 | +- **Linux x86-64 depuis un Mac Apple Silicon** : `LINUX_ARCH=amd64 make check-linux` (émulé, donc plus lent). | ||
| 43 | +- **Sous Linux** : `make verify` suffit ; `make check-linux` est pour le Mac. | ||
| 44 | + | ||
| 45 | +## Voir aussi | ||
| 46 | + | ||
| 47 | +- [Lancer les tests](lancer-les-tests.md) — partie par partie, vrais agents, conteneurs | ||
| 48 | +- [Référence : commandes](../reference/commandes.md) — toutes les cibles `make` | ||
| 49 | +- [RELEASING.fr.md](../../../RELEASING.fr.md) — une fois `main` prête à être publiée | ||
modified
docs/fr/reference/commandes.md +3 -5 | @@ -32,6 +32,8 @@ L'ordre est détaillé dans la [référence de la configuration](configuration.m | ||
| 32 | 32 | | `package-macos` | `scripts/package.sh macos` : `.dmg` et `.zip` universels (arm64 + amd64, signés ad hoc), dans `dist/`. macOS seulement. | |
| 33 | 33 | | `install-test-config` | `scripts/install-test-config.sh` : écrit `examples/test-agents.yaml` à l'emplacement par défaut de la configuration, avec des chemins absolus vers le dépôt : chaque agent est `mm -acp -config agent.yaml` lancé dans son dossier, avec `afterStop: [<dépôt>/scripts/agents.sh, unload, <agent>]` pour décharger son modèle à l'arrêt, `mm` écrit avec son chemin absolu (`MM_BIN`, ou celui du `PATH`), et le `PATH` courant dans l'`env` de chaque agent ; un fichier existant est gardé sous `config.yaml.<date>.bak`. | |
| 34 | 34 | | `check` | `lint` puis `test`. | |
| 35 | +| `verify` | `check` puis `bindings-check` : ce qu'il faut lancer avant de fusionner (il n'y a pas de CI). | | |
| 36 | +| `check-linux` | `scripts/check-linux.sh` : `make check` dans le conteneur Linux de `scripts/linux-packages.Dockerfile` (`LINUX_ARCH`, par défaut l'architecture du Mac), le dépôt monté sur `/src`. Demande Docker. | | |
| 35 | 37 | | `test` | `test-go`, `test-frontend`, `test-scripts`. | |
| 36 | 38 | | `test-go` | `go test ./...` (construit `frontend/dist` d'abord s'il manque). | |
| 37 | 39 | | `test-frontend` | `vitest run` dans `frontend/`. | |
| @@ -41,7 +43,7 @@ L'ordre est détaillé dans la [référence de la configuration](configuration.m | ||
| 41 | 43 | | `lint-go` | golangci-lint v2.14.0 (`tools/go.mod`), configuration `.golangci.yml`. | |
| 42 | 44 | | `lint-frontend` | `svelte-check`. | |
| 43 | 45 | | `lint-headers` | `scripts/check-license-headers.sh`. | |
| 44 | -| `bindings-check` | `bindings`, puis échoue si `frontend/bindings` diffère de la version commitée. | | |
| 46 | +| `bindings-check` | `bindings`, puis échoue si `frontend/bindings` diffère de l'index (`git diff`) ou contient des fichiers que git ne connaît pas. | | |
| 45 | 47 | |
| 46 | 48 | ## `scripts/check-license-headers.sh` |
| 47 | 49 | |
| @@ -87,10 +89,6 @@ scripts/tag-release.sh [--remote <nom>] [--no-push] | ||
| 87 | 89 | |
| 88 | 90 | Crée le tag annoté `v<version>` (`info.version` de `build/config.yml`, message `Sidekicks <version>`) et le pousse sur `--remote` (par défaut `origin`). Refuse si des fichiers suivis sont modifiés, si la branche courante n'est pas `main`, si `main` diffère de `<remote>/main` après un fetch, ou si le tag existe en local. Avertit, sans refuser, s'il manque dans `dist/` un paquet de la version ou `SHA256SUMS`. `--no-push` tague en local seulement. |
| 89 | 91 | |
| 90 | -## CI | |
| 91 | - | |
| 92 | -`.github/workflows/ci.yml`, à chaque push et merge request, dans un conteneur `ubuntu:26.04` (GTK ≥ 4.10) : installe git, un compilateur C, les paquets de build GTK 4 / WebKitGTK 6, Node et npm depuis apt, Go depuis go.dev (version de `go.mod`), pnpm (version de `frontend/package.json`) et la CLI Wails, puis lance `make bindings-check` et `make check`. | |
| 93 | - | |
| 94 | 92 | ## Workflow de release |
| 95 | 93 | |
| 96 | 94 | `.github/workflows/release.yml`, au push d'un tag `v*`, avec `permissions: contents: write` : échoue si le tag n'est pas `v` + `info.version` de `build/config.yml`, puis crée la release `<tag>` nommée `Sidekicks <tag>` (`softprops/action-gh-release@v2`, via l'API compatible GitHub de Rickub derrière `GITHUB_API_URL`), avec des notes qui donnent le commit, les guides d'installation et le tableau des fichiers attendus (tirés de `scripts/package.sh names`). Il n'attache aucun fichier : les paquets sont attachés à la main. |
| @@ -32,6 +32,8 @@ L'ordre est détaillé dans la [référence de la configuration](configuration.m | |||
| 32 | | `package-macos` | `scripts/package.sh macos` : `.dmg` et `.zip` universels (arm64 + amd64, signés ad hoc), dans `dist/`. macOS seulement. | | 32 | | `package-macos` | `scripts/package.sh macos` : `.dmg` et `.zip` universels (arm64 + amd64, signés ad hoc), dans `dist/`. macOS seulement. | |
| 33 | | `install-test-config` | `scripts/install-test-config.sh` : écrit `examples/test-agents.yaml` à l'emplacement par défaut de la configuration, avec des chemins absolus vers le dépôt : chaque agent est `mm -acp -config agent.yaml` lancé dans son dossier, avec `afterStop: [<dépôt>/scripts/agents.sh, unload, <agent>]` pour décharger son modèle à l'arrêt, `mm` écrit avec son chemin absolu (`MM_BIN`, ou celui du `PATH`), et le `PATH` courant dans l'`env` de chaque agent ; un fichier existant est gardé sous `config.yaml.<date>.bak`. | | 33 | | `install-test-config` | `scripts/install-test-config.sh` : écrit `examples/test-agents.yaml` à l'emplacement par défaut de la configuration, avec des chemins absolus vers le dépôt : chaque agent est `mm -acp -config agent.yaml` lancé dans son dossier, avec `afterStop: [<dépôt>/scripts/agents.sh, unload, <agent>]` pour décharger son modèle à l'arrêt, `mm` écrit avec son chemin absolu (`MM_BIN`, ou celui du `PATH`), et le `PATH` courant dans l'`env` de chaque agent ; un fichier existant est gardé sous `config.yaml.<date>.bak`. | |
| 34 | | `check` | `lint` puis `test`. | | 34 | | `check` | `lint` puis `test`. | |
| 35 | +| `verify` | `check` puis `bindings-check` : ce qu'il faut lancer avant de fusionner (il n'y a pas de CI). | | ||
| 36 | +| `check-linux` | `scripts/check-linux.sh` : `make check` dans le conteneur Linux de `scripts/linux-packages.Dockerfile` (`LINUX_ARCH`, par défaut l'architecture du Mac), le dépôt monté sur `/src`. Demande Docker. | | ||
| 35 | | `test` | `test-go`, `test-frontend`, `test-scripts`. | | 37 | | `test` | `test-go`, `test-frontend`, `test-scripts`. | |
| 36 | | `test-go` | `go test ./...` (construit `frontend/dist` d'abord s'il manque). | | 38 | | `test-go` | `go test ./...` (construit `frontend/dist` d'abord s'il manque). | |
| 37 | | `test-frontend` | `vitest run` dans `frontend/`. | | 39 | | `test-frontend` | `vitest run` dans `frontend/`. | |
| @@ -41,7 +43,7 @@ L'ordre est détaillé dans la [référence de la configuration](configuration.m | |||
| 41 | | `lint-go` | golangci-lint v2.14.0 (`tools/go.mod`), configuration `.golangci.yml`. | | 43 | | `lint-go` | golangci-lint v2.14.0 (`tools/go.mod`), configuration `.golangci.yml`. | |
| 42 | | `lint-frontend` | `svelte-check`. | | 44 | | `lint-frontend` | `svelte-check`. | |
| 43 | | `lint-headers` | `scripts/check-license-headers.sh`. | | 45 | | `lint-headers` | `scripts/check-license-headers.sh`. | |
| 44 | -| `bindings-check` | `bindings`, puis échoue si `frontend/bindings` diffère de la version commitée. | | 46 | +| `bindings-check` | `bindings`, puis échoue si `frontend/bindings` diffère de l'index (`git diff`) ou contient des fichiers que git ne connaît pas. | |
| 45 | 47 | ||
| 46 | ## `scripts/check-license-headers.sh` | 48 | ## `scripts/check-license-headers.sh` |
| 47 | 49 | ||
| @@ -87,10 +89,6 @@ scripts/tag-release.sh [--remote <nom>] [--no-push] | |||
| 87 | 89 | ||
| 88 | Crée le tag annoté `v<version>` (`info.version` de `build/config.yml`, message `Sidekicks <version>`) et le pousse sur `--remote` (par défaut `origin`). Refuse si des fichiers suivis sont modifiés, si la branche courante n'est pas `main`, si `main` diffère de `<remote>/main` après un fetch, ou si le tag existe en local. Avertit, sans refuser, s'il manque dans `dist/` un paquet de la version ou `SHA256SUMS`. `--no-push` tague en local seulement. | 90 | Crée le tag annoté `v<version>` (`info.version` de `build/config.yml`, message `Sidekicks <version>`) et le pousse sur `--remote` (par défaut `origin`). Refuse si des fichiers suivis sont modifiés, si la branche courante n'est pas `main`, si `main` diffère de `<remote>/main` après un fetch, ou si le tag existe en local. Avertit, sans refuser, s'il manque dans `dist/` un paquet de la version ou `SHA256SUMS`. `--no-push` tague en local seulement. |
| 89 | 91 | ||
| 90 | -## CI | ||
| 91 | - | ||
| 92 | -`.github/workflows/ci.yml`, à chaque push et merge request, dans un conteneur `ubuntu:26.04` (GTK ≥ 4.10) : installe git, un compilateur C, les paquets de build GTK 4 / WebKitGTK 6, Node et npm depuis apt, Go depuis go.dev (version de `go.mod`), pnpm (version de `frontend/package.json`) et la CLI Wails, puis lance `make bindings-check` et `make check`. | ||
| 93 | - | ||
| 94 | ## Workflow de release | 92 | ## Workflow de release |
| 95 | 93 | ||
| 96 | `.github/workflows/release.yml`, au push d'un tag `v*`, avec `permissions: contents: write` : échoue si le tag n'est pas `v` + `info.version` de `build/config.yml`, puis crée la release `<tag>` nommée `Sidekicks <tag>` (`softprops/action-gh-release@v2`, via l'API compatible GitHub de Rickub derrière `GITHUB_API_URL`), avec des notes qui donnent le commit, les guides d'installation et le tableau des fichiers attendus (tirés de `scripts/package.sh names`). Il n'attache aucun fichier : les paquets sont attachés à la main. | 94 | `.github/workflows/release.yml`, au push d'un tag `v*`, avec `permissions: contents: write` : échoue si le tag n'est pas `v` + `info.version` de `build/config.yml`, puis crée la release `<tag>` nommée `Sidekicks <tag>` (`softprops/action-gh-release@v2`, via l'API compatible GitHub de Rickub derrière `GITHUB_API_URL`), avec des notes qui donnent le commit, les guides d'installation et le tableau des fichiers attendus (tirés de `scripts/package.sh names`). Il n'attache aucun fichier : les paquets sont attachés à la main. |
modified
scripts/build-release.sh +4 -1 | @@ -51,9 +51,12 @@ if ! skipped linux; then | ||
| 51 | 51 | docker build --quiet --platform "linux/$arch" \ |
| 52 | 52 | --build-arg "GO_VERSION=$go_version" --build-arg "PNPM=$pnpm" \ |
| 53 | 53 | -t "$image" -f scripts/linux-packages.Dockerfile scripts >/dev/null |
| 54 | - # The Go module cache survives from one release to the next. | |
| 54 | + # The Go module cache survives from one release to the next. The | |
| 55 | + # container has its own frontend/node_modules (a volume): its pnpm | |
| 56 | + # install never touches the Mac's, whose store it cannot see. | |
| 55 | 57 | docker run --rm --platform "linux/$arch" \ |
| 56 | 58 | -v "$root:/src" -v "sidekicks-gomod-$arch:/root/go/pkg/mod" \ |
| 59 | + -v "sidekicks-node-modules-$arch:/src/frontend/node_modules" \ | |
| 57 | 60 | -e "HOST_UID=$(id -u)" -e "HOST_GID=$(id -g)" \ |
| 58 | 61 | "$image" bash -c 'scripts/package.sh linux && chown -R "$HOST_UID:$HOST_GID" dist bin frontend/dist' |
| 59 | 62 | done |
| @@ -51,9 +51,12 @@ if ! skipped linux; then | |||
| 51 | docker build --quiet --platform "linux/$arch" \ | 51 | docker build --quiet --platform "linux/$arch" \ |
| 52 | --build-arg "GO_VERSION=$go_version" --build-arg "PNPM=$pnpm" \ | 52 | --build-arg "GO_VERSION=$go_version" --build-arg "PNPM=$pnpm" \ |
| 53 | -t "$image" -f scripts/linux-packages.Dockerfile scripts >/dev/null | 53 | -t "$image" -f scripts/linux-packages.Dockerfile scripts >/dev/null |
| 54 | - # The Go module cache survives from one release to the next. | 54 | + # The Go module cache survives from one release to the next. The |
| 55 | + # container has its own frontend/node_modules (a volume): its pnpm | ||
| 56 | + # install never touches the Mac's, whose store it cannot see. | ||
| 55 | docker run --rm --platform "linux/$arch" \ | 57 | docker run --rm --platform "linux/$arch" \ |
| 56 | -v "$root:/src" -v "sidekicks-gomod-$arch:/root/go/pkg/mod" \ | 58 | -v "$root:/src" -v "sidekicks-gomod-$arch:/root/go/pkg/mod" \ |
| 59 | + -v "sidekicks-node-modules-$arch:/src/frontend/node_modules" \ | ||
| 57 | -e "HOST_UID=$(id -u)" -e "HOST_GID=$(id -g)" \ | 60 | -e "HOST_UID=$(id -u)" -e "HOST_GID=$(id -g)" \ |
| 58 | "$image" bash -c 'scripts/package.sh linux && chown -R "$HOST_UID:$HOST_GID" dist bin frontend/dist' | 61 | "$image" bash -c 'scripts/package.sh linux && chown -R "$HOST_UID:$HOST_GID" dist bin frontend/dist' |
| 59 | done | 62 | done |
added
scripts/check-linux.sh +37 -0 | new file mode 100755 | ||
| @@ -0,0 +1,37 @@ | ||
| 1 | +#!/usr/bin/env bash | |
| 2 | +# Copyright (c) 2026 Philippe Charrière — Sidekicks Source-Available License 1.0, see LICENSE | |
| 3 | +# | |
| 4 | +# Runs `make check` on Linux from the Mac, in the container of | |
| 5 | +# scripts/linux-packages.Dockerfile (ubuntu:26.04, GTK 4, WebKitGTK 6): the | |
| 6 | +# Linux side of the application (pty, GTK build, shell scripts) is checked | |
| 7 | +# without a CI. Needs Docker running. | |
| 8 | +# | |
| 9 | +# scripts/check-linux.sh # the Mac's architecture | |
| 10 | +# LINUX_ARCH=amd64 scripts/check-linux.sh | |
| 11 | +set -euo pipefail | |
| 12 | + | |
| 13 | +root="$(cd "$(dirname "$0")/.." && pwd)" | |
| 14 | +cd "$root" | |
| 15 | + | |
| 16 | +command -v docker >/dev/null && docker info >/dev/null 2>&1 || { echo "check-linux.sh: Docker is not running" >&2; exit 1; } | |
| 17 | +case "$(uname -m)" in | |
| 18 | + arm64 | aarch64) default_arch=arm64 ;; | |
| 19 | + *) default_arch=amd64 ;; | |
| 20 | +esac | |
| 21 | +arch="${LINUX_ARCH:-$default_arch}" | |
| 22 | +image="sidekicks-linux-packages:$arch" | |
| 23 | + | |
| 24 | +docker build --quiet --platform "linux/$arch" \ | |
| 25 | + --build-arg "GO_VERSION=$(awk '/^go /{print $2}' go.mod)" \ | |
| 26 | + --build-arg "PNPM=$(node -p "require('./frontend/package.json').packageManager")" \ | |
| 27 | + -t "$image" -f scripts/linux-packages.Dockerfile scripts >/dev/null | |
| 28 | +# The container has its own frontend/node_modules (a volume): a pnpm | |
| 29 | +# install in it never touches the Mac's node_modules, whose store it cannot | |
| 30 | +# see (its own store lands in .pnpm-store/, ignored by git). The tests run | |
| 31 | +# as root: what they write is given back to the Mac's user, as by | |
| 32 | +# build-release.sh. | |
| 33 | +docker run --rm --platform "linux/$arch" \ | |
| 34 | + -v "$root:/src" -v "sidekicks-gomod-$arch:/root/go/pkg/mod" \ | |
| 35 | + -v "sidekicks-node-modules-$arch:/src/frontend/node_modules" \ | |
| 36 | + -e "HOST_UID=$(id -u)" -e "HOST_GID=$(id -g)" \ | |
| 37 | + "$image" bash -c 'status=0; rm -f bin/sidekicks; make check || status=$?; chown -R "$HOST_UID:$HOST_GID" bin frontend/dist 2>/dev/null; exit $status' | |
| new file mode 100755 | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | +#!/usr/bin/env bash | ||
| 2 | +# Copyright (c) 2026 Philippe Charrière — Sidekicks Source-Available License 1.0, see LICENSE | ||
| 3 | +# | ||
| 4 | +# Runs `make check` on Linux from the Mac, in the container of | ||
| 5 | +# scripts/linux-packages.Dockerfile (ubuntu:26.04, GTK 4, WebKitGTK 6): the | ||
| 6 | +# Linux side of the application (pty, GTK build, shell scripts) is checked | ||
| 7 | +# without a CI. Needs Docker running. | ||
| 8 | +# | ||
| 9 | +# scripts/check-linux.sh # the Mac's architecture | ||
| 10 | +# LINUX_ARCH=amd64 scripts/check-linux.sh | ||
| 11 | +set -euo pipefail | ||
| 12 | + | ||
| 13 | +root="$(cd "$(dirname "$0")/.." && pwd)" | ||
| 14 | +cd "$root" | ||
| 15 | + | ||
| 16 | +command -v docker >/dev/null && docker info >/dev/null 2>&1 || { echo "check-linux.sh: Docker is not running" >&2; exit 1; } | ||
| 17 | +case "$(uname -m)" in | ||
| 18 | + arm64 | aarch64) default_arch=arm64 ;; | ||
| 19 | + *) default_arch=amd64 ;; | ||
| 20 | +esac | ||
| 21 | +arch="${LINUX_ARCH:-$default_arch}" | ||
| 22 | +image="sidekicks-linux-packages:$arch" | ||
| 23 | + | ||
| 24 | +docker build --quiet --platform "linux/$arch" \ | ||
| 25 | + --build-arg "GO_VERSION=$(awk '/^go /{print $2}' go.mod)" \ | ||
| 26 | + --build-arg "PNPM=$(node -p "require('./frontend/package.json').packageManager")" \ | ||
| 27 | + -t "$image" -f scripts/linux-packages.Dockerfile scripts >/dev/null | ||
| 28 | +# The container has its own frontend/node_modules (a volume): a pnpm | ||
| 29 | +# install in it never touches the Mac's node_modules, whose store it cannot | ||
| 30 | +# see (its own store lands in .pnpm-store/, ignored by git). The tests run | ||
| 31 | +# as root: what they write is given back to the Mac's user, as by | ||
| 32 | +# build-release.sh. | ||
| 33 | +docker run --rm --platform "linux/$arch" \ | ||
| 34 | + -v "$root:/src" -v "sidekicks-gomod-$arch:/root/go/pkg/mod" \ | ||
| 35 | + -v "sidekicks-node-modules-$arch:/src/frontend/node_modules" \ | ||
| 36 | + -e "HOST_UID=$(id -u)" -e "HOST_GID=$(id -g)" \ | ||
| 37 | + "$image" bash -c 'status=0; rm -f bin/sidekicks; make check || status=$?; chown -R "$HOST_UID:$HOST_GID" bin frontend/dist 2>/dev/null; exit $status' | ||
modified
scripts/linux-packages.Dockerfile +7 -4 | @@ -1,8 +1,11 @@ | ||
| 1 | 1 | # Copyright (c) 2026 Philippe Charrière — Sidekicks Source-Available License 1.0, see LICENSE |
| 2 | 2 | # |
| 3 | -# The image scripts/build-release.sh uses to build the Linux packages from | |
| 4 | -# macOS (Wails needs GTK 4 and WebKitGTK 6, which macOS cannot link): the | |
| 5 | -# repository is mounted at /src and `scripts/package.sh linux` runs in it. | |
| 3 | +# The Linux image of the Mac: scripts/build-release.sh builds the Linux | |
| 4 | +# packages in it (Wails needs GTK 4 and WebKitGTK 6, which macOS cannot link) | |
| 5 | +# and scripts/check-linux.sh runs `make check` in it. The repository is | |
| 6 | +# mounted at /src. jq and procps are for the tests of scripts/agents.sh; | |
| 7 | +# binutils-gold because Go links cgo programs with -fuse-ld=gold on arm64 | |
| 8 | +# (golangci-lint failed with "cannot find 'ld'" without it). | |
| 6 | 9 | # ubuntu:26.04, like the CI: GTK >= 4.10. The AppImage's GTK plugin copies |
| 7 | 10 | # folders that only these packages create: the GTK 4 modules (ibus-gtk4, |
| 8 | 11 | # input methods) and the image loaders (librsvg2-common, SVG). |
| @@ -19,7 +22,7 @@ RUN apt-get update -qq \ | ||
| 19 | 22 | && apt-get install -y -qq --no-install-recommends \ |
| 20 | 23 | ca-certificates curl git nodejs npm build-essential pkg-config \ |
| 21 | 24 | libgtk-4-dev libwebkitgtk-6.0-dev file rpm zip \ |
| 22 | - ibus-gtk4 librsvg2-common \ | |
| 25 | + ibus-gtk4 librsvg2-common jq procps binutils-gold \ | |
| 23 | 26 | && rm -rf /var/lib/apt/lists/* |
| 24 | 27 | |
| 25 | 28 | RUN curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-$(dpkg --print-architecture).tar.gz" | tar -C /usr/local -xz |
| @@ -1,8 +1,11 @@ | |||
| 1 | # Copyright (c) 2026 Philippe Charrière — Sidekicks Source-Available License 1.0, see LICENSE | 1 | # Copyright (c) 2026 Philippe Charrière — Sidekicks Source-Available License 1.0, see LICENSE |
| 2 | # | 2 | # |
| 3 | -# The image scripts/build-release.sh uses to build the Linux packages from | 3 | +# The Linux image of the Mac: scripts/build-release.sh builds the Linux |
| 4 | -# macOS (Wails needs GTK 4 and WebKitGTK 6, which macOS cannot link): the | 4 | +# packages in it (Wails needs GTK 4 and WebKitGTK 6, which macOS cannot link) |
| 5 | -# repository is mounted at /src and `scripts/package.sh linux` runs in it. | 5 | +# and scripts/check-linux.sh runs `make check` in it. The repository is |
| 6 | +# mounted at /src. jq and procps are for the tests of scripts/agents.sh; | ||
| 7 | +# binutils-gold because Go links cgo programs with -fuse-ld=gold on arm64 | ||
| 8 | +# (golangci-lint failed with "cannot find 'ld'" without it). | ||
| 6 | # ubuntu:26.04, like the CI: GTK >= 4.10. The AppImage's GTK plugin copies | 9 | # ubuntu:26.04, like the CI: GTK >= 4.10. The AppImage's GTK plugin copies |
| 7 | # folders that only these packages create: the GTK 4 modules (ibus-gtk4, | 10 | # folders that only these packages create: the GTK 4 modules (ibus-gtk4, |
| 8 | # input methods) and the image loaders (librsvg2-common, SVG). | 11 | # input methods) and the image loaders (librsvg2-common, SVG). |
| @@ -19,7 +22,7 @@ RUN apt-get update -qq \ | |||
| 19 | && apt-get install -y -qq --no-install-recommends \ | 22 | && apt-get install -y -qq --no-install-recommends \ |
| 20 | ca-certificates curl git nodejs npm build-essential pkg-config \ | 23 | ca-certificates curl git nodejs npm build-essential pkg-config \ |
| 21 | libgtk-4-dev libwebkitgtk-6.0-dev file rpm zip \ | 24 | libgtk-4-dev libwebkitgtk-6.0-dev file rpm zip \ |
| 22 | - ibus-gtk4 librsvg2-common \ | 25 | + ibus-gtk4 librsvg2-common jq procps binutils-gold \ |
| 23 | && rm -rf /var/lib/apt/lists/* | 26 | && rm -rf /var/lib/apt/lists/* |
| 24 | 27 | ||
| 25 | RUN curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-$(dpkg --print-architecture).tar.gz" | tar -C /usr/local -xz | 28 | RUN curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-$(dpkg --print-architecture).tar.gz" | tar -C /usr/local -xz |