Skip to content

Commit cc210bb

Browse files
committed
feat: Update CONTRIBUTING.md with CI runner guidelines and desktop tray approval file management; enhance TASK.md with progress on Tauri integration and agent harness documentation; improve VS Code extension with new command for writing harness summaries; refine CLI with local HTTP fixture for integration testing
1 parent 381fabe commit cc210bb

17 files changed

Lines changed: 272 additions & 21 deletions

File tree

.bench/README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Benchmark harness (placeholder)
2+
3+
This directory is reserved for **SWE-bench**, **Terminal-Bench**, or other external task slices.
4+
5+
- Local baseline: `./scripts/phase5-smoke.sh` (set `CANTRIK_BENCH_HARNESS=1` when wiring a runner).
6+
- CI: see [`.github/workflows/benchmark-harness.yml`](../.github/workflows/benchmark-harness.yml) (`workflow_dispatch`, does not gate the main Rust job).
7+
- Upstream SWE-bench: clone or submodule [https://github.com/princeton-nlp/SWE-bench](https://github.com/princeton-nlp/SWE-bench) into a subdirectory here in a follow-up iteration.
8+
9+
Do not commit large datasets to this repo without an explicit maintainer decision.

.github/workflows/benchmark-harness.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,15 @@ jobs:
1717
echo "# Bench placeholder — replace with submodule or fetch of SWE-bench / Terminal-Bench slice." > .bench/minimal/README.md
1818
test -f .bench/minimal/README.md
1919
20+
- name: Bench policy (repo docs)
21+
run: test -f .bench/README.md && sed -n '1,12p' .bench/README.md
22+
2023
- name: Document local baseline
2124
run: |
2225
echo "Local baseline: ./scripts/phase5-smoke.sh"
2326
echo "Optional env when wiring an external runner: CANTRIK_BENCH_HARNESS=1"
2427
echo "Full cantrik build + bench execution belongs here in a follow-up iteration."
2528
2629
- name: Success
27-
run: echo "benchmark-harness: placeholder OK (exit 0)"
30+
run: |
31+
echo "benchmark-harness: placeholder OK (exit 0)"
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Regression smoke: `cantrik fix --approve --fetch` against a local HTTP fixture (no LLM).
2+
name: SWE E2E smoke
3+
4+
on:
5+
workflow_dispatch:
6+
pull_request:
7+
paths:
8+
- "crates/cantrik-cli/**"
9+
- "crates/cantrik-core/**"
10+
- ".github/workflows/swe-e2e-smoke.yml"
11+
12+
jobs:
13+
fix-fetch-fixture:
14+
runs-on: ubuntu-latest
15+
steps:
16+
- uses: actions/checkout@v4
17+
18+
- uses: dtolnay/rust-toolchain@stable
19+
20+
- name: Install protoc + bubblewrap + ripgrep
21+
run: sudo apt-get update && sudo apt-get install -y protobuf-compiler bubblewrap ripgrep
22+
23+
- uses: Swatinem/rust-cache@v2
24+
25+
- name: Run fix fetch integration test
26+
run: cargo test -p cantrik-cli fetch_integration::fix_approve_fetch_reaches_local_http -- --exact --nocapture

CONTRIBUTING.md

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,15 @@ Untuk menambah entri di [`apps/cantrik-site/static/registry/recipes.json`](apps/
8181
- Set `sandbox.level = "container"` **hanya** jika operator siap: butuh biner `runsc` dan kebijakan host.
8282
- Set env `CANTRIK_RUNSC_BIN` ke path `runsc`. Opsional: `CANTRIK_RUNSC_RUN_ARGS` — token dipisah spasi yang disisipkan setelah `runsc run` (contoh: `--network=none` jika didukung setup Anda).
8383
- Tanpa env tersebut, level `container` gagal dengan pesan jelas (lebih aman daripada mengeksekusi tanpa isolasi yang dimaksud).
84+
- **CI:** runner GitHub Actions default tidak menyediakan `runsc` atau izin privileged; gunakan runner self-hosted atau abaikan job khusus sampai kebijakan infra jelas. Validasi lokal dengan `CANTRIK_RUNSC_BIN` tetap menjadi tanggung jawab operator.
85+
86+
### Desktop tray (Tauri) — file flag approval
87+
88+
Companion [`apps/cantrik-tauri`](apps/cantrik-tauri/) memantau file yang sama dengan daemon/tray Rust:
89+
90+
- Default: `data_local_dir()/cantrik/approval-pending.flag` (biasanya `~/.local/share/cantrik/approval-pending.flag` pada Linux).
91+
- Override penuh: env `CANTRIK_APPROVAL_FLAG_PATH` (path absolut atau relatif ke cwd proses tray).
92+
- Agar selaras dengan merge config CLI: set `CANTRIK_PROJECT_ROOT` ke root repo; Tauri membaca `~/.config/cantrik/config.toml` lalu `.cantrik/cantrik.toml` untuk field `[background].approval_flag_path` (proyek menimpa global).
8493

8594
### Self-improvement (safe profile)
8695

@@ -90,6 +99,7 @@ Menjalankan Cantrik pada **repo Cantrik sendiri** untuk saran perbaikan:
9099
- Anggap biaya API dan risiko prompt injection dari konten repo; dokumentasikan asumsi di issue/PR.
91100
- Otomatisasi penuh “self-rewrite” tetap di backlog hingga ada gate produk (tes, approval, rollback).
92101
- **Dry-run skrip:** [`scripts/self-improve-dry-run.sh`](scripts/self-improve-dry-run.sh) menjalankan satu `cantrik ask` read-only pada repo (tanpa `--approve`); gunakan sebagai langkah manual sebelum otomasi patch.
102+
- **Gate sebelum otomasi patch (MVP):** wajibkan dry-run + review manusia pada diff; batasi konteks/token di config; otomasi PR hanya dari **fork** atau branch eksperimen; tidak ada loop tanpa henti tanpa human-in-the-loop.
93103

94104
### SWE constrained workflow (manual checklist)
95105

@@ -100,15 +110,15 @@ Alur terbatas untuk satu issue publik + satu repo lokal:
100110
3. Opsional: `--experiment` — masih membutuhkan `--approve`; menjalankan mode experiment (writes + tes + revert) — review diff sebelum commit.
101111
4. `cantrik pr create --approve` atau alur Git manual; tidak ada jaminan “high reliability” sampai ada tes integrasi produk.
102112

103-
**Kebijakan / QA produk (rantai `fix`):** flag `--run-agents` / `--run-experiment` wajib dipasangkan dengan `--approve` dan `--fetch`; invariant ini dites di unit test (`fix_cmd::validate_fix_flags`). Tes integrasi jaringan penuh tetap manual / backlog hingga ada fixture otomatis.
113+
**Kebijakan / QA produk (rantai `fix`):** flag `--run-agents` / `--run-experiment` wajib dipasangkan dengan `--approve` dan `--fetch`; invariant ini dites di unit test (`fix_cmd::validate_fix_flags`). Tes integrasi **tanpa LLM**: `fix_cmd::fetch_integration::fix_approve_fetch_reaches_local_http` (wiremock) + workflow [`.github/workflows/swe-e2e-smoke.yml`](.github/workflows/swe-e2e-smoke.yml).
104114

105115
**Definisi “high reliability” (SWE otonom penuh):** lihat template issue [SWE E2E reliability](.github/ISSUE_TEMPLATE/swe_e2e_reliability.md) — minimal satu skenario E2E terotomatisasi sebelum mengklaim item backlog terkait selesai.
106116

107117
### Phase 5 triage (contributors)
108118

109119
- **Tree-sitter:** lihat [`docs/tree-sitter-language-extensions.md`](docs/tree-sitter-language-extensions.md) (kompatibilitas grammar vs versi `tree-sitter` workspace); satu bahasa per PR.
110120
- **Sandbox enterprise (gVisor / Firecracker):** titik masuk ada di `crates/cantrik-core/src/tool_system/sandbox.rs`; butuh desain admin + CI khusus.
111-
- **Hybrid SSH / cloud executor:** RFC [`docs/rfc-hybrid-ssh-executor.md`](docs/rfc-hybrid-ssh-executor.md); implementasi setelah threat model disetujui.
121+
- **Hybrid SSH / cloud executor:** RFC [`docs/rfc-hybrid-ssh-executor.md`](docs/rfc-hybrid-ssh-executor.md); MVP CLI: `cantrik exec --remote` + `[remote_exec]`. **Sync workspace (manual dulu):** gunakan `rsync`/`scp` dengan `--dry-run` lalu review; setelah tree remote cocok, jalankan `cantrik exec --remote --approve -- …` di host tujuan. Otomatisasi sync dengan `--approve` = backlog terpisah (RFC).
112122
- **Benchmark SWE-bench / Terminal-Bench:** skrip baseline [`scripts/phase5-smoke.sh`](scripts/phase5-smoke.sh) (quality gates + hook `CANTRIK_BENCH_HARNESS=1`); demo alur terbatas [`scripts/swe-fix-demo.sh`](scripts/swe-fix-demo.sh) dengan `ISSUE_URL=…`.
113123
- **`cantrik fix` / agents:** `cantrik fix URL --approve --fetch --run-agents` (+ timeout `CANTRIK_FIX_AGENT_TIMEOUT_SEC`); `--run-experiment` merantai mode experiment; `cantrik agents "…" --reflect` = satu putaran reviewer LLM.
114124
- **Agent harness artefak:** `cantrik status --write-harness-summary` menulis `.cantrik/session-harness-summary.json` (payload job + `generated_at_unix`) untuk di-attach ke CI atau dashboard eksternal.

TASK.md

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -371,42 +371,49 @@ default_model = "llama-3.3-70b-versatile"
371371
- [x] **Enterprise / air-gap audit** — checklist di [CONTRIBUTING.md](CONTRIBUTING.md) § *Enterprise release checklist* + template issue [`.github/ISSUE_TEMPLATE/release_audit.md`](.github/ISSUE_TEMPLATE/release_audit.md).
372372
- [x] **Distribusi matang** (MVP proses) — instruksi maintainer per tag: PKGBUILD / winget di [CONTRIBUTING.md](CONTRIBUTING.md) § *Distribusi*; `winget validate` di CI; **Nix** = DoD devShell-only ([`packaging/nix/README.md`](packaging/nix/README.md), tanpa derivasi `nix build` penuh sampai iterasi flake).
373373
- [x] **VS Code polish** — perintah *Run in workspace* (`cantrik.runInWorkspace``doctor` dengan cwd folder); `cantrik.executablePath` dipakai untuk status bar + perintah palette.
374-
- [x] **Tauri + approval UX** — polling `approval-pending.flag` di `data_local_dir/cantrik/` sama dengan [`cantrik-tray`](apps/cantrik-tray/) ([`apps/cantrik-tauri`](apps/cantrik-tauri/)). **Follow-up:** baca `[background].approval_flag_path` dari config di companion (bukan hanya default path).
374+
- [x] **Tauri + approval UX** — polling flag; baca `CANTRIK_APPROVAL_FLAG_PATH`, lalu `[background].approval_flag_path` dari `~/.config/cantrik/config.toml` + opsional `CANTRIK_PROJECT_ROOT``.cantrik/cantrik.toml` ([`apps/cantrik-tauri`](apps/cantrik-tauri/)); fallback share dir sama [`cantrik-tray`](apps/cantrik-tray/).
375375
- [x] **Health mendalam**`cantrik health --sarif` (keluaran SARIF 2.1.0 ke stdout); gate CI terpisah tidak wajib (opsional bila tim butuh).
376376

377377
### Phase 5 — Maturity & Excellence
378378

379379
- [ ] **Full autonomous SWE-agent** — end-to-end fix GitHub issues dengan reliabilitas tinggi
380380
- [x] Alur terbatas: `cantrik fix URL --approve --fetch --run-agents` + timeout agents (`CANTRIK_FIX_AGENT_TIMEOUT_SEC`); demo [`scripts/swe-fix-demo.sh`](scripts/swe-fix-demo.sh); checklist manual [CONTRIBUTING.md](CONTRIBUTING.md) § *SWE constrained workflow*.
381-
- [ ] Otomatisasi penuh + tes regresi produk template lintasan: [`.github/ISSUE_TEMPLATE/swe_e2e_reliability.md`](.github/ISSUE_TEMPLATE/swe_e2e_reliability.md).
381+
- [x] Regresi otomatis tanpa LLM: tes `fix_cmd::fetch_integration::fix_approve_fetch_reaches_local_http` + workflow [`.github/workflows/swe-e2e-smoke.yml`](.github/workflows/swe-e2e-smoke.yml). **Ditunda:** otomasi penuh “high reliability” + fixture skala produk (template [`.github/ISSUE_TEMPLATE/swe_e2e_reliability.md`](.github/ISSUE_TEMPLATE/swe_e2e_reliability.md)).
382382
- [ ] **Agent harness** (refleksi, re-plan, dashboard)
383383
- [x] Refleksi: `cantrik agents … --reflect`.
384384
- [x] Dashboard statis: [`/dashboard`](apps/cantrik-site/src/routes/dashboard/+page.svelte); `cantrik status --json`.
385385
- [x] Re-plan terkonfigurasi: `[planning] max_replan_cycles` / `stuck_threshold_attempts`; ringkasan `plan --run``.cantrik/plan-run-summary.json`.
386-
- [x] Agregat multi-sesi (MVP): `cantrik status --write-harness-summary``.cantrik/session-harness-summary.json`. **Ditunda:** UI kaya di luar JSON statis.
386+
- [x] Agregat multi-sesi (MVP): `cantrik status --write-harness-summary``.cantrik/session-harness-summary.json`.
387+
- [x] Dokumentasi hub: [`/docs/agent-harness`](apps/cantrik-site/src/routes/docs/agent-harness/+page.svelte); VS Code: `cantrik.writeHarnessSummary`. **Ditunda:** UI kaya interaktif di luar JSON statis.
387388
- [ ] **Self-improvement pada repo Cantrik**
388389
- [x] MVP dokumen: profil aman + etika/biaya ([CONTRIBUTING.md](CONTRIBUTING.md) § *Self-improvement (safe profile)*).
389-
- [x] Skrip dry-run read-only: [`scripts/self-improve-dry-run.sh`](scripts/self-improve-dry-run.sh). **Ditunda:** otomatisasi saran patch dengan gate produk penuh.
390+
- [x] Skrip dry-run read-only: [`scripts/self-improve-dry-run.sh`](scripts/self-improve-dry-run.sh).
391+
- [x] Gate dokumentasi (fork / review / batas token): [CONTRIBUTING.md](CONTRIBUTING.md) § *Self-improvement*. **Ditunda:** otomatisasi saran patch dengan gate produk penuh di CI.
390392
- [ ] **Benchmark formal** (SWE-bench / Terminal-Bench)
391393
- [x] Baseline: [`scripts/phase5-smoke.sh`](scripts/phase5-smoke.sh); hook `CANTRIK_BENCH_HARNESS=1`.
392-
- [x] Job workflow_dispatch + langkah placeholder + dataset mini ([`.github/workflows/benchmark-harness.yml`](.github/workflows/benchmark-harness.yml)); sambungan repo harness eksternal = follow-up.
393-
- [ ] **Recipes & templates di cantrik.dev**
394+
- [x] Job workflow_dispatch + langkah placeholder + dataset mini + kebijakan [.bench/README.md](.bench/README.md) ([`.github/workflows/benchmark-harness.yml`](.github/workflows/benchmark-harness.yml)). **Ditunda:** submodule / clone SWE-bench slice + runner terukur.
395+
- [x] **Recipes & templates di cantrik.dev** (MVP registry)
394396
- [x] JSON [`static/registry/recipes.json`](apps/cantrik-site/static/registry/recipes.json).
395397
- [x] Halaman [`/registry/recipes`](apps/cantrik-site/src/routes/registry/recipes/+page.svelte).
396-
- [x] Panduan PR + skema minimal + validasi CI ([CONTRIBUTING.md](CONTRIBUTING.md) § *Registry recipes*, [`scripts/validate-recipes-registry.py`](scripts/validate-recipes-registry.py)).
398+
- [x] Panduan PR + skema minimal + validasi CI ([CONTRIBUTING.md](CONTRIBUTING.md) § *Registry recipes*, [`scripts/validate-recipes-registry.py`](scripts/validate-recipes-registry.py)).
399+
- [ ] Kurasi editorial / moderasi komunitas skala besar (di luar validasi skema).
397400
- [ ] **Hybrid SSH / cloud executor**
398401
- [x] RFC desain: [`docs/rfc-hybrid-ssh-executor.md`](docs/rfc-hybrid-ssh-executor.md).
399-
- [x] MVP CLI: `[remote_exec]` + `cantrik exec --remote` (dry-run) / `--approve` menjalankan `ssh` ([RFC](docs/rfc-hybrid-ssh-executor.md)). **Ditunda:** sync workspace, approval UI khusus, sandbox di sisi remote.
402+
- [x] MVP CLI: `[remote_exec]` + `cantrik exec --remote` (dry-run) / `--approve` menjalankan `ssh` ([RFC](docs/rfc-hybrid-ssh-executor.md)).
403+
- [x] Dokumentasi sync manual (`rsync`/`scp` + dry-run) di [CONTRIBUTING.md](CONTRIBUTING.md) § Phase 5 triage. **Ditunda:** sync terotomatisasi dengan `--approve`, approval UI khusus, sandbox di sisi remote.
400404
- [ ] **Tree-sitter tambahan** (Kotlin, Swift, …)
401405
- [x] Catatan kompatibilitas grammar vs `tree-sitter` workspace: [`docs/tree-sitter-language-extensions.md`](docs/tree-sitter-language-extensions.md).
402-
- [x] Bash / shell: `tree-sitter-bash` + indeks `.sh`/`.bash` ([`chunk.rs`](crates/cantrik-core/src/indexing/chunk.rs)). **Ditunda:** Kotlin, Swift, … per PR terpisah.
406+
- [x] Bash / shell: `tree-sitter-bash` + indeks `.sh`/`.bash` ([`chunk.rs`](crates/cantrik-core/src/indexing/chunk.rs)).
407+
- [x] CSS: `tree-sitter-css` + indeks `.css`. **Ditunda:** Kotlin, Swift, … per PR terpisah (grammar harus kompatibel TS 0.26+).
403408
- [x] **TUI split pane** — selesai Sprint 18 (`[ui] tui_split_pane`, TASK § Sprint 18). **Ditunda:** panel semantic diff / approval penuh (§6 Enhancement PRD).
404409
- [ ] **`cantrik fix` penuh**
405410
- [x] `--approve --fetch`, `--run-agents`, `--experiment` (rantai eksperimental, approval eksplisit).
406-
- [x] Kebijakan + invariant flag di [CONTRIBUTING.md](CONTRIBUTING.md) + unit test `fix_cmd::validate_fix_flags` / `is_github_issue_url`. **Ditunda:** integrasi jaringan otomatis tanpa LLM fixture.
411+
- [x] Kebijakan + invariant flag di [CONTRIBUTING.md](CONTRIBUTING.md) + unit test `fix_cmd::validate_fix_flags` / `is_github_issue_url`.
412+
- [x] Integrasi HTTP lokal tanpa LLM: `fix_cmd::fetch_integration` (wiremock). **Ditunda:** skenario fetch terhadap host nyata terpantau / katalog fixture besar.
407413
- [ ] **Sandbox enterprise** (gVisor / Firecracker)
408414
- [x] Dokumentasi + arah di [`sandbox.rs`](crates/cantrik-core/src/tool_system/sandbox.rs); level `container` = placeholder.
409-
- [x] Hook `CANTRIK_RUNSC_BIN` / opsional `CANTRIK_RUNSC_RUN_ARGS` untuk `sandbox.level = "container"` + dokumentasi admin ([CONTRIBUTING.md](CONTRIBUTING.md)). **Ditunda:** CI dengan runsc, micro-VM penuh.
415+
- [x] Hook `CANTRIK_RUNSC_BIN` / opsional `CANTRIK_RUNSC_RUN_ARGS` untuk `sandbox.level = "container"` + dokumentasi admin ([CONTRIBUTING.md](CONTRIBUTING.md)).
416+
- [x] Catatan CI GitHub Actions vs runsc (self-hosted) di CONTRIBUTING. **Ditunda:** job CI runsc otomatis, micro-VM penuh.
410417

411418
---
412419

apps/cantrik-site/src/routes/+layout.svelte

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
<a class="text-ash hover:text-gold" href={resolve('/registry')}>Plugin registry</a>
2929
<a class="text-ash hover:text-gold" href={resolve('/registry/recipes')}>Recipes</a>
3030
<a class="text-ash hover:text-gold" href={resolve('/dashboard')}>Dashboard</a>
31+
<a class="text-ash hover:text-gold" href={resolve('/docs/agent-harness')}>Harness</a>
3132
<a
3233
class="text-ash hover:text-gold"
3334
href="https://github.com/sangkan-dev/cantrik"

apps/cantrik-site/src/routes/docs/+page.svelte

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@
3030
rel="noreferrer">Contributing</a
3131
>
3232
</li>
33+
<li>
34+
<a class="text-gold hover:text-gold-bright" href={resolve('/docs/agent-harness')}
35+
>Agent harness (JSON / CI)</a
36+
>
37+
</li>
3338
</ul>
3439
<p class="mt-10 font-mono text-sm">
3540
<a class="text-gold hover:text-gold-bright" href={resolve('/')}>Back home</a>
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<script lang="ts">
2+
import { resolve } from '$app/paths';
3+
</script>
4+
5+
<main class="mx-auto max-w-3xl px-6 py-16">
6+
<h1 class="font-heading text-3xl font-semibold text-gold-bright">Agent harness (CI artefak)</h1>
7+
<p class="mt-4 font-mono text-sm text-ash">
8+
Gunakan keluaran JSON Cantrik untuk dashboard eksternal atau job CI — tanpa backend dinamis di site ini.
9+
</p>
10+
11+
<h2 class="mt-10 font-heading text-xl font-semibold text-gold-bright">1. Status job lokal</h2>
12+
<pre class="mt-3 overflow-x-auto rounded bg-andesite-lighter p-4 font-mono text-xs text-ash">cantrik status --json</pre>
13+
<p class="mt-2 font-mono text-sm text-ash">
14+
Di VS Code, panel webview memanggil perintah ini pada root workspace (lihat extension Cantrik).
15+
</p>
16+
17+
<h2 class="mt-10 font-heading text-xl font-semibold text-gold-bright">2. Ringkasan berkas untuk CI</h2>
18+
<pre class="mt-3 overflow-x-auto rounded bg-andesite-lighter p-4 font-mono text-xs text-ash">cantrik status --write-harness-summary</pre>
19+
<p class="mt-2 font-mono text-sm text-ash">
20+
Menulis <code class="text-gold">.cantrik/session-harness-summary.json</code> (daftar job + timestamp Unix). Unggah artefak
21+
ini dari workflow GitHub Actions dengan <code class="text-gold">actions/upload-artifact</code>.
22+
</p>
23+
24+
<h2 class="mt-10 font-heading text-xl font-semibold text-gold-bright">3. Plan run summary</h2>
25+
<p class="mt-2 font-mono text-sm text-ash">
26+
Alur <code class="text-gold">cantrik plan --run</code> menghasilkan
27+
<code class="text-gold">.cantrik/plan-run-summary.json</code> — cocok untuk metrik re-plan di pipeline terpisah.
28+
</p>
29+
30+
<p class="mt-12 font-mono text-sm">
31+
<a class="text-gold hover:text-gold-bright" href={resolve('/docs')}>← Docs</a>
32+
·
33+
<a class="text-gold hover:text-gold-bright" href={resolve('/dashboard')}>Dashboard</a>
34+
</p>
35+
</main>

apps/cantrik-tauri/src-tauri/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,5 @@ tauri-build = { version = "2", features = [] }
1616
tauri = { version = "2", features = ["tray-icon"] }
1717
dirs = "6.0.0"
1818
notify-rust = "4.11"
19+
serde = { version = "1.0", features = ["derive"] }
20+
toml = "0.8"

0 commit comments

Comments
 (0)