bots-garden/sidekickspublic Fork
⑂ f95c2c9
Commits
⬇ Clone ▾
git clone https://git.rickub.com/bots-garden/sidekicks.git
git clone ssh://git@rickub.com/bots-garden/sidekicks.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Download ZIP

📦️ Create a release.

k33g committed 2026-10-30T13:55:05+01:00 Browse files
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 @@
188188 - **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).
189189 - **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.
190190 - **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:
1515
1616 - `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`.
1717 - `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`.
1919
2020 ## Decisions in force
2121
@@ -37,11 +37,11 @@ What exists:
3737
3838 | | |
3939 | --- | --- |
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` |
4141 | Tests only | `make test` (Go + vitest + shell) · real agents: `make test-real` |
4242 | Run | `SIDEKICKS_CONFIG="$PWD/examples/test-agents.yaml" make dev` · build `make build` · macOS app `make package` |
4343 | 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 |
4545 | Test agents | `scripts/agents.sh run alice` · `ps` · `unload --all` (`MM_BIN`, llmman on 127.0.0.1 or host.docker.internal:17434) |
4646 | Headless UI check (sandbox) | `Xvfb :97`, `GDK_BACKEND=x11 WEBKIT_DISABLE_DMABUF_RENDERER=1 dbus-launch bin/sidekicks --config …`, `xdotool`, `import -window root` |
4747 | 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 force20 ## 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
77 PNPM := pnpm --dir frontend
88
99 .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 \
1111 lint lint-go lint-frontend lint-headers bindings-check
1212
1313 help: ## List the available targets
@@ -57,7 +57,12 @@ install-test-config: ## Write the test agents configuration at the default locat
5757
5858 # ---------------------------------------------------------------- tests
5959
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
6166
6267 test: test-go test-frontend test-scripts ## Run all the tests (no real agent, no network)
6368
@@ -90,5 +95,6 @@ lint-frontend: ## svelte-check (types and Svelte warnings)
9095 lint-headers: ## Check the licence header of every source file
9196 @scripts/check-license-headers.sh
9297
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
9499 @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 frontend7 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-check11 lint lint-go lint-frontend lint-headers bindings-check
12 12
13 help: ## List the available targets13 help: ## List the available targets
@@ -57,7 +57,12 @@ install-test-config: ## Write the test agents configuration at the default locat
57 57
58 # ---------------------------------------------------------------- tests58 # ---------------------------------------------------------------- tests
59 59
60-check: lint test ## Everything the CI runs: lint, then all the tests60+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 file95 lint-headers: ## Check the licence header of every source file
91 @scripts/check-license-headers.sh96 @scripts/check-license-headers.sh
92 97
93-bindings-check: bindings ## Fail when the committed bindings are not up to date98+bindings-check: bindings ## Fail when the staged or committed bindings are not up to date
94 @git diff --exit-code -- frontend/bindings99 @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
2222 ```bash
2323 make install # frontend dependencies (macOS and Linux binaries side by side)
2424 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)
2627 make package # macOS: bin/sidekicks.app
2728 make package-linux # release packages into dist/ (also package-windows, package-macos)
2829 make help # every target
@@ -34,7 +35,7 @@ Run it with the four test agents of `agents/` (they need [mm](https://rickub.com
3435 SIDEKICKS_CONFIG="$PWD/examples/test-agents.yaml" make dev # or: bin/sidekicks --config examples/test-agents.yaml
3536 ```
3637
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).
3839
3940 ## Layout
4041
@@ -22,7 +22,8 @@ Prerequisites: Go ≥ 1.26, Node ≥ 20, pnpm 12.11.2 (`npm install -g pnpm@12.1
22 ```bash22 ```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 reload24 make dev # run the application with hot reload
25-make check # lint + every test, as the CI does25+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.app27 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 target29 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.yaml35 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 ## Layout40 ## 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
1616
1717 1. Dans `build/config.yml`, réglez `info.version` (par exemple `"0.2.0"`).
1818 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`.
2020
2121 ## 1. Construire
2222
@@ -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. Construire21 ## 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
1616
1717 1. In `build/config.yml`, set `info.version` (e.g. `"0.2.0"`).
1818 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`.
2020
2121 ## 1. Build
2222
@@ -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. Build21 ## 1. Build
22 22
modified build/linux/desktop +4 -1
@@ -2,9 +2,12 @@
22 Version=1.0
33 Name=Sidekicks
44 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
67 Terminal=false
78 Type=Application
89 Icon=sidekicks
910 Categories=Utility;
1011 StartupWMClass=sidekicks
12+
13+
@@ -2,9 +2,12 @@
2 Version=1.02 Version=1.0
3 Name=Sidekicks3 Name=Sidekicks
4 Comment=Converse with AI agents in channels4 Comment=Converse with AI agents in channels
5-Exec=sidekicks5+# The Exec line includes %u to pass the URL to the application
6+Exec=/usr/local/bin/sidekicks %u
6 Terminal=false7 Terminal=false
7 Type=Application8 Type=Application
8 Icon=sidekicks9 Icon=sidekicks
9 Categories=Utility;10 Categories=Utility;
10 StartupWMClass=sidekicks11 StartupWMClass=sidekicks
12+
13+
modified build/linux/nfpm/nfpm.yaml +4 -6
@@ -9,20 +9,18 @@ platform: "linux"
99 version: "0.1.0"
1010 section: "default"
1111 priority: "extra"
12-maintainer: "Philippe Charrière"
12+maintainer: ${GIT_COMMITTER_NAME} <${GIT_COMMITTER_EMAIL}>
1313 description: "Converse with AI agents in channels"
1414 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"
1717 release: "1"
1818
1919 contents:
2020 - src: "./bin/sidekicks"
2121 dst: "/usr/local/bin/sidekicks"
22- - src: "./build/appicon.svg"
23- dst: "/usr/share/icons/hicolor/scalable/apps/sidekicks.svg"
2422 - src: "./build/appicon.png"
25- dst: "/usr/share/pixmaps/sidekicks.png"
23+ dst: "/usr/share/icons/hicolor/128x128/apps/sidekicks.png"
2624 - src: "./build/linux/sidekicks.desktop"
2725 dst: "/usr/share/applications/sidekicks.desktop"
2826
@@ -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
77 | You want to… | Section | Pages |
88 | --- | --- | --- |
99 | **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) |
1111 | **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) |
1212 | **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) |
1313
@@ -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
3434
3535 ## When you change…
3636
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.
3838 - **the configuration format**: update `schema/config.schema.json`, `internal/config`, the testdata and the [configuration reference](../reference/configuration.md).
3939 - **a package or its imports**: update `docs/diagrams/packages.drawio` (its generator is described in the [architecture explanation](../explanation/architecture.md)).
4040 - **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 @@
22
33 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.
44
5-## Run what the CI runs
5+## Run every test
66
77 ```bash
88 make check
@@ -15,7 +15,7 @@ It runs the linters (`make lint`), then every test that needs no real agent, no
1515 all licence header tests passed
1616 ```
1717
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).
1919
2020 ## Run one part
2121
@@ -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 runs5+## Run every test
6 6
7 ```bash7 ```bash
8 make check8 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 passed15 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 part20 ## 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
3232 | `package-macos` | `scripts/package.sh macos`: universal `.dmg` and `.zip` (arm64 + amd64, signed ad hoc), into `dist/`. macOS only. |
3333 | `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`. |
3434 | `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. |
3537 | `test` | `test-go`, `test-frontend`, `test-scripts`. |
3638 | `test-go` | `go test ./...` (builds `frontend/dist` first if missing). |
3739 | `test-frontend` | `vitest run` in `frontend/`. |
@@ -41,7 +43,7 @@ The order is detailed in the [configuration reference](configuration.md#location
4143 | `lint-go` | golangci-lint v2.14.0 (`tools/go.mod`), configuration `.golangci.yml`. |
4244 | `lint-frontend` | `svelte-check`. |
4345 | `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. |
4547
4648 ## `scripts/check-license-headers.sh`
4749
@@ -87,10 +89,6 @@ scripts/tag-release.sh [--remote <name>] [--no-push]
8789
8890 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.
8991
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-
9492 ## Release workflow
9593
9694 `.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 workflow92 ## 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
77 | Vous voulez… | Section | Pages |
88 | --- | --- | --- |
99 | **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) |
1111 | **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) |
1212 | **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) |
1313
@@ -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
3434
3535 ## Quand vous modifiez…
3636
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.
3838 - **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).
3939 - **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)).
4040 - **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 @@
22
33 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.
44
5-## Lancer ce que lance la CI
5+## Lancer tous les tests
66
77 ```bash
88 make check
@@ -15,7 +15,7 @@ La commande lance les linters (`make lint`), puis tous les tests qui n'ont besoi
1515 all licence header tests passed
1616 ```
1717
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).
1919
2020 ## Lancer une partie
2121
@@ -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 CI5+## Lancer tous les tests
6 6
7 ```bash7 ```bash
8 make check8 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 passed15 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 partie20 ## 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
3232 | `package-macos` | `scripts/package.sh macos` : `.dmg` et `.zip` universels (arm64 + amd64, signés ad hoc), dans `dist/`. macOS seulement. |
3333 | `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`. |
3434 | `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. |
3537 | `test` | `test-go`, `test-frontend`, `test-scripts`. |
3638 | `test-go` | `go test ./...` (construit `frontend/dist` d'abord s'il manque). |
3739 | `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
4143 | `lint-go` | golangci-lint v2.14.0 (`tools/go.mod`), configuration `.golangci.yml`. |
4244 | `lint-frontend` | `svelte-check`. |
4345 | `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. |
4547
4648 ## `scripts/check-license-headers.sh`
4749
@@ -87,10 +89,6 @@ scripts/tag-release.sh [--remote <nom>] [--no-push]
8789
8890 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.
8991
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-
9492 ## Workflow de release
9593
9694 `.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 release92 ## 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
5151 docker build --quiet --platform "linux/$arch" \
5252 --build-arg "GO_VERSION=$go_version" --build-arg "PNPM=$pnpm" \
5353 -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.
5557 docker run --rm --platform "linux/$arch" \
5658 -v "$root:/src" -v "sidekicks-gomod-$arch:/root/go/pkg/mod" \
59+ -v "sidekicks-node-modules-$arch:/src/frontend/node_modules" \
5760 -e "HOST_UID=$(id -u)" -e "HOST_GID=$(id -g)" \
5861 "$image" bash -c 'scripts/package.sh linux && chown -R "$HOST_UID:$HOST_GID" dist bin frontend/dist'
5962 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/null53 -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 done62 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 @@
11 # Copyright (c) 2026 Philippe Charrière — Sidekicks Source-Available License 1.0, see LICENSE
22 #
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).
69 # ubuntu:26.04, like the CI: GTK >= 4.10. The AppImage's GTK plugin copies
710 # folders that only these packages create: the GTK 4 modules (ibus-gtk4,
811 # input methods) and the image loaders (librsvg2-common, SVG).
@@ -19,7 +22,7 @@ RUN apt-get update -qq \
1922 && apt-get install -y -qq --no-install-recommends \
2023 ca-certificates curl git nodejs npm build-essential pkg-config \
2124 libgtk-4-dev libwebkitgtk-6.0-dev file rpm zip \
22- ibus-gtk4 librsvg2-common \
25+ ibus-gtk4 librsvg2-common jq procps binutils-gold \
2326 && rm -rf /var/lib/apt/lists/*
2427
2528 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 LICENSE1 # 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 from3+# 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): the4+# 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 copies9 # 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 -xz28 RUN curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-$(dpkg --print-architecture).tar.gz" | tar -C /usr/local -xz