Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
b8a0200
Update Git
Jordonbc Feb 13, 2026
807d7bd
Removed functions.exec
Jordonbc Feb 13, 2026
0da05ed
update
Jordonbc Feb 13, 2026
8d68290
update
Jordonbc Feb 13, 2026
d691068
Update Git
Jordonbc Feb 13, 2026
4a171e8
Update
Jordonbc Feb 13, 2026
18c8921
Update
Jordonbc Feb 13, 2026
9432358
Update component_instance.rs
Jordonbc Feb 13, 2026
cb206ca
Update
Jordonbc Feb 13, 2026
07abed8
Update
Jordonbc Feb 13, 2026
2a20681
Update
Jordonbc Feb 13, 2026
67cf723
Update
Jordonbc Feb 13, 2026
9190fa7
Update
Jordonbc Feb 13, 2026
7d7051e
Update AGENTS.md
Jordonbc Feb 13, 2026
4747723
Update
Jordonbc Feb 14, 2026
0c6a5c7
Update Git
Jordonbc Feb 14, 2026
140227e
Update component_instance.rs
Jordonbc Feb 14, 2026
cd5ef2a
Update
Jordonbc Feb 14, 2026
29ae880
Add ScreenShots
Jordonbc Feb 14, 2026
8838797
Merge branch 'Dev' into PluginAPI
Jordonbc Feb 14, 2026
ebf5a15
Update AGENTS.md
Jordonbc Feb 15, 2026
edd7d88
Update Git
Jordonbc Feb 15, 2026
8043085
Update plugin architecture.md
Jordonbc Feb 15, 2026
48e3938
Update plugin architecture.md
Jordonbc Feb 15, 2026
15490a3
Update plugin architecture.md
Jordonbc Feb 15, 2026
4d56250
Update Cargo.toml
Jordonbc Feb 15, 2026
c1a8e74
Update Cargo.lock
Jordonbc Feb 15, 2026
16112d0
Update AGENTS.md
Jordonbc Feb 16, 2026
a7bfbb5
Update documentation
Jordonbc Feb 16, 2026
a79162c
Update compiles
Jordonbc Feb 16, 2026
b1da418
Added code comments
Jordonbc Feb 16, 2026
1b46bc0
Added code comments
Jordonbc Feb 16, 2026
33433a7
Update
Jordonbc Feb 16, 2026
d5d0c61
Update
Jordonbc Feb 17, 2026
20a40c3
Improve logging
Jordonbc Feb 17, 2026
4e22ebb
Update logging.rs
Jordonbc Feb 17, 2026
2c4fd20
Update logging
Jordonbc Feb 17, 2026
a979486
Added more logging
Jordonbc Feb 17, 2026
942997c
Update logging.rs
Jordonbc Feb 18, 2026
07d9656
Update
Jordonbc Feb 18, 2026
f173326
Update
Jordonbc Feb 18, 2026
e261932
Update
Jordonbc Feb 18, 2026
c21c4eb
Update settings.ts
Jordonbc Feb 18, 2026
3528177
Update settings.ts
Jordonbc Feb 18, 2026
49f9599
Added logging to backend
Jordonbc Feb 18, 2026
246ebd8
Update manager.rs
Jordonbc Feb 18, 2026
d5eacc2
Update settings.ts
Jordonbc Feb 18, 2026
4b29cdf
Fix issues
Jordonbc Feb 18, 2026
e6c1950
Update
Jordonbc Feb 18, 2026
05e37ad
Update docs
Jordonbc Feb 19, 2026
dc4433e
Update AGENTS.md
Jordonbc Feb 19, 2026
05c6817
Update Git
Jordonbc Feb 19, 2026
bdd628d
Update plugins.md
Jordonbc Feb 19, 2026
db70609
Update staus
Jordonbc Feb 19, 2026
bda5789
Update
Jordonbc Feb 19, 2026
b7b2832
Update plugins.rs
Jordonbc Feb 19, 2026
634c0fe
Update
Jordonbc Feb 21, 2026
79401ce
Update
Jordonbc Feb 21, 2026
19d5640
updates
Jordonbc Feb 21, 2026
5f479c3
Update Settings
Jordonbc Feb 21, 2026
0389864
Add permission button
Jordonbc Feb 21, 2026
d2a2235
Update
Jordonbc Feb 21, 2026
f1b94e4
Update
Jordonbc Feb 21, 2026
dbf2fef
Updates
Jordonbc Feb 21, 2026
ad0a672
Improve buttons
Jordonbc Feb 21, 2026
0b0fa1d
Update button
Jordonbc Feb 21, 2026
57a016f
Update
Jordonbc Feb 21, 2026
ec12f80
Update
Jordonbc Feb 21, 2026
b705ddf
Update settings.ts
Jordonbc Feb 21, 2026
65353e2
Update plugin status icons
Jordonbc Feb 21, 2026
644babd
Update
Jordonbc Feb 21, 2026
d51a770
Delete openvcs.official-themes.ovcsp
Jordonbc Feb 21, 2026
c218b2b
Delete openvcs.git.ovcsp
Jordonbc Feb 21, 2026
0ad5e73
Update
Jordonbc Feb 21, 2026
44320d3
Update
Jordonbc Feb 22, 2026
01c1d13
Update
Jordonbc Feb 22, 2026
07ec3b4
Update functions
Jordonbc Feb 22, 2026
c80f6c7
Improve Settings menu button
Jordonbc Feb 22, 2026
749b041
Update
Jordonbc Feb 22, 2026
c09f9c3
Update plugins.md
Jordonbc Feb 22, 2026
60c027c
Update plugin architecture.md
Jordonbc Feb 22, 2026
c088983
Update branches.rs
Jordonbc Feb 22, 2026
4e1d663
Update component_instance.rs
Jordonbc Feb 22, 2026
9e624d2
Update
Jordonbc Feb 27, 2026
dd4b4c1
Added opencode workflow
Jordonbc Mar 1, 2026
c5a816b
Update Git
Jordonbc Mar 1, 2026
eadd396
Update opencode.yml
Jordonbc Mar 1, 2026
3745710
Update opencode.yml
Jordonbc Mar 1, 2026
292abd3
Create opencode-review.yml
Jordonbc Mar 1, 2026
587d2fd
Update
Jordonbc Mar 1, 2026
71e8741
Update Git
Jordonbc Mar 1, 2026
29a75e7
Fix issues with plugins
Jordonbc Mar 1, 2026
c010358
Update architecture
Jordonbc Mar 1, 2026
480fc76
Update submodule
Jordonbc Mar 1, 2026
b60582f
Updated agents file
Jordonbc Mar 1, 2026
468cc81
Fix issues
Jordonbc Mar 15, 2026
dbc69b6
Remove extra separater from file context menu
Jordonbc Mar 15, 2026
1cb3848
Merge branch 'Dev' into PluginAPI
Jordonbc Mar 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -176,9 +176,6 @@ jobs:
with:
components: rustfmt, clippy

- name: Add WASI target
run: rustup target add wasm32-wasip1

- name: Setup sccache
uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9

Expand Down
7 changes: 4 additions & 3 deletions .github/workflows/opencode-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,14 @@ jobs:
permissions:
id-token: write
contents: read
pull-requests: read
issues: read
pull-requests: write
issues: write
steps:
- uses: actions/checkout@v6
with:
persist-credentials: false
- uses: anomalyco/opencode/github@latest
# Pinned to an immutable commit for CodeQL (tag: github-v1.2.17)
- uses: anomalyco/opencode/github@2410593023d2c61f05123c9b0faf189a28dfbeee
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand Down
7 changes: 4 additions & 3 deletions .github/workflows/opencode.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,17 @@ jobs:
permissions:
id-token: write
contents: read
pull-requests: read
issues: read
pull-requests: write
issues: write
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
persist-credentials: false

- name: Run opencode
uses: anomalyco/opencode/github@latest
# Pinned to an immutable commit for CodeQL (tag: github-v1.2.17)
uses: anomalyco/opencode/github@2410593023d2c61f05123c9b0faf189a28dfbeee
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
with:
Expand Down
3 changes: 0 additions & 3 deletions .github/workflows/publish-stable.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,6 @@ jobs:
with:
components: rustfmt, clippy

- name: Add WASI target
run: rustup target add wasm32-wasip1

- name: Setup sccache
uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9

Expand Down
222 changes: 179 additions & 43 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,45 +1,181 @@
# Repository Guidelines

## Project Structure & Module Organization
- `Backend/`: Rust + Tauri application code (`src/`), commands (`src/tauri_commands/`), and plugin runtime.
- `Backend/built-in-plugins/`: git submodules for bundled plugins; initialize/update with `git submodule update --init --recursive`.
- `Frontend/`: TypeScript + Vite UI (`src/scripts/`, `src/styles/`, `src/modals/`), with Vitest tests colocated as `*.test.ts`.
- `docs/`: architecture and plugin docs plus UI assets.
- `packaging/flatpak/`: Flatpak manifests and packaging notes.
- Root files: workspace `Cargo.toml`, `Justfile`, and project docs (`README.md`, `ARCHITECTURE.md`, `SECURITY.md`).

## Build, Test, and Development Commands
- `just build` (or `just build client|plugins`): build frontend, backend, and plugin bundles.
- `git submodule update --init --recursive`: fetch submodule content (required before plugin builds/tests).
- `just test`: workspace Rust tests + frontend TypeScript check + Vitest run.
- `just fix`: run `cargo fmt`, `cargo clippy --fix`, and frontend typecheck.
- `cargo tauri dev`: run the desktop app in development mode.
- `npm --prefix Frontend run dev`: run frontend-only Vite dev server.
- `just tauri-build`: production Tauri build wrapper.

## Coding Style & Naming Conventions
- Rust: format with `cargo fmt --all`; keep clippy-clean (`cargo clippy --all-targets -- -D warnings`).
- TypeScript: 2-space indentation, ES modules, and small feature-focused files under `Frontend/src/scripts/features/`.
- Tests: name frontend tests `*.test.ts` near the implementation (example: `Frontend/src/scripts/lib/dom.test.ts`).
- Naming: use `snake_case` for Rust modules/functions and `camelCase` for TypeScript variables/functions.

# ExecPlans

When writing complex features or significant refactors, use an ExecPlan (as described in .agent/PLANS.md) from design to implementation.

## Testing Guidelines
- Run full checks before opening a PR: `just test`.
- For frontend-only work, run `cd Frontend && npm test` and `npm exec tsc -- -p tsconfig.json --noEmit`.
- Add or update tests for behavior changes; prefer focused unit tests over broad snapshots.

## Commit & Pull Request Guidelines
- Follow existing commit style: short imperative subject, optional scope prefix (examples: `backend: fix tauri precommands`, `ci: add wasm32-wasip1 target`, `chore(deps): bump @types/node`).
- Keep commits logically scoped; avoid mixing frontend/backend refactors unless required.
- Do not directly modify plugin code under `Backend/built-in-plugins/`; only update submodule pointers in this repository when explicitly requested.
- PRs should include: summary of behavior changes, linked issue(s), test evidence (command output), and screenshots for UI changes.
- Target the `Dev` branch for normal development work.

## Security & Configuration Tips
- Review `SECURITY.md` before changing update, plugin, or network-related code paths.
- Do not commit secrets; keep local overrides in files like `.env.tauri.local`.
- Do not directly edit code inside git submodules (including `Backend/built-in-plugins/*`) unless the task explicitly requires a submodule update; treat submodule changes as pointer-only updates in this repo.
## Project structure & module organization

- `Backend/`: Rust + Tauri backend (`src/`), commands (`src/tauri_commands/`), plugin runtime (`src/plugin_runtime/`), and bundled plugin support (`src/plugin_runtime`, `scripts/`).
- `Backend/built-in-plugins/`: local copies of bundled plugins (do not edit their code unless explicitly requested; update submodule pointers instead).
- `Frontend/`: TypeScript + Vite UI code (`src/scripts/`, `src/styles/`, `src/modals/`), with Vitest tests colocated as `*.test.ts` files.
- `docs/`: UX docs, plugin architecture notes, and plugin/theme packaging guides referenced by contributors.
- `packaging/flatpak/`: Flatpak manifests and Flatpak-specific build notes.
- Supporting files at the repo root include the workspace `Cargo.toml`, `Justfile`, `README.md`, `ARCHITECTURE.md`, `SECURITY.md`, and installer scripts.

## Build, test, and development commands

### Full builds
- `just build` (or `just build client|plugins`): builds the backend, frontend, and plugin bundles from the workspace Justfile.
- `just tauri-build`: production Tauri build wrapper (AppImage/Flatpak). `git submodule update --init --recursive` is required before building bundled plugins.

### Running tests

**All tests:**
- `just test`: runs workspace Rust tests plus frontend type-check + Vitest via the Justfile.

**Frontend (Vitest):**
- `npm --prefix Frontend test`: run all tests
- `npm --prefix Frontend test run`: run tests once (non-watch mode)
- `npm --prefix Frontend test -- --run`: explicit non-watch mode
- `npm --prefix Frontend test -- src/scripts/lib/dom.test.ts`: run single test file
- `npm --prefix Frontend test -- --run -t "qs and qsa"`: run single test by name pattern
- `npm --prefix Frontend test -- --watch`: watch mode for development

**Backend (Rust):**
- `cargo test --workspace`: run all Rust tests
- `cargo test`: run tests for current crate
- `cargo test --package openvcs_lib`: test specific crate
- `cargo test --lib`: run only library tests (not integration tests)
- `cargo test --lib -- branch`: run tests matching "branch" in name
- `cargo test --lib -- --test-threads=1`: run tests sequentially (for flaky tests)

### Linting and formatting

- `just fix`: formatter/lint quick fixes (runs `cargo fmt`, `cargo clippy --fix`, and frontend type-check).
- `cargo fmt --all`: format Rust code
- `cargo clippy --all-targets -- -D warnings`: check Rust for issues
- `cargo clippy --fix --all-targets --allow-dirty`: auto-fix clippy issues
- `npm --prefix Frontend exec tsc -- -p tsconfig.json --noEmit`: TypeScript type-check

### Development servers

- `cargo tauri dev`: run the desktop app in dev mode (`Backend/` directory).
- `npm --prefix Frontend run dev`: run the frontend-only Vite dev server.

## Plugin runtime & host expectations

- Plugin components live under `Backend/built-in-plugins/` and follow the manifest format in `openvcs.plugin.json`. Built-in bundles ship with the AppImage/Flatpak and are also built by the SDK (`cargo openvcs dist`).
- The backend loads plugin modules as Node.js runtime scripts (`*.mjs|*.js|*.cjs`) via `Backend/src/plugin_runtime/node_instance.rs`.
- The canonical host/plugin contract is JSON-RPC over stdio with method names in `Backend/src/plugin_runtime/protocol.rs`.
- When changing host APIs or runtime behavior, update protocol constants and runtime logic in `Backend/src/plugin_runtime`.

## Coding style & conventions

### Rust

**Formatting:**
- Run `cargo fmt --all` before committing
- Use default Rust formatting (4-space indentation, etc.)
- Keep lines under ~100 characters when reasonable

**Naming:**
- `snake_case` for modules, functions, and variables
- `PascalCase` for structs, enums, and trait names
- Prefix private fields with underscore (e.g., `self._field`)
- Use descriptive names; avoid single letters except in tight loops

**Imports:**
- Group imports: std library first, then external crates, then local modules
- Use `use` statements for frequently used items
- Prefer absolute paths from crate root (`crate::module::Item`)

**Error handling:**
- Use `Result<T, E>` for fallible operations; avoid `panic!` in library code
- Use `?` operator for propagating errors
- Include context in error messages: `some_func().context("failed to load config")?`
- Log warnings for recoverable errors with `log::warn`
- Use `anyhow` for application code (commands, main) when context is needed

**Types & patterns:**
- Prefer `Arc<T>` for shared ownership across threads
- Use `tokio` async runtime for I/O-bound async operations
- Use `parking_lot` mutexes (faster than std)
- Derive `Clone`, `Debug`, `Serialize`, `Deserialize` as needed

### Documentation

- **ALL code must be documented**, not just public APIs. This includes:
- Rust: Use doc comments (`///` for items, `//!` for modules) for all functions, structs, enums, traits, and fields.
- TypeScript: Use JSDoc comments (`/** ... */`) for all functions, classes, interfaces, and types.
- All functions must include documentation comments.
- All code files MUST be no more than 1000 lines; split files before they exceed this limit.
- When you change behavior, workflows, commands, paths, config, or plugin/runtime expectations, ALWAYS update the relevant documentation in the same change, even if the user does not explicitly ask.
- Include usage examples for complex functions.
- Keep README files in sync with code changes.
- Document configuration options and environment variables.
- All new files must include the following copyright header:

```rust
// Copyright © 2025-2026 OpenVCS Contributors
// SPDX-License-Identifier: GPL-3.0-or-later
```

```typescript
// Copyright © 2025-2026 OpenVCS Contributors
// SPDX-License-Identifier: GPL-3.0-or-later
```

### TypeScript

**Formatting:**
- 2-space indentation (no tabs)
- Use ES modules (`import`/`export`)
- Keep lines under ~100 characters when reasonable
- Use semicolons at statement ends

**Naming:**
- `camelCase` for variables, functions, and methods
- `PascalCase` for classes, types, and interfaces
- Prefix private class members with underscore (e.g., `this._field`)
- Use descriptive names; avoid abbreviations except common ones (e.g., `btn`, `cfg`)

**Imports:**
- Use absolute imports from project root when possible
- Group imports: external libs, then relative `./` paths, then `../` paths
- Prefer named imports: `import { foo, bar } from './module'`
- Use type-only imports (`import type { Foo }`) when only using types

**Types:**
- Use explicit types for function parameters and return values
- Prefer interfaces for object shapes, types for unions/intersections
- Use `null` for "intentionally empty", `undefined` for "not yet set"
- Avoid `any`; use `unknown` when type is truly unknown

**Error handling:**
- Use try/catch for async operations; always handle or re-throw
- Use `Promise.catch(() => {})` for fire-and-forget async calls
- Show user-facing errors via `notify()` from `lib/notify`
- Log internal errors with console for debugging

**UI patterns:**
- Use `qs<T>('#id')` for single element queries from `lib/dom`
- Use `qsa('.class')` for multiple elements
- Use event delegation for list items
- Keep feature modules focused and small (<200 lines when possible)
- Colocate tests as `*.test.ts` next to the source file

### Testing

- Run `just test` before PRs
- Frontend-only work: run `npm --prefix Frontend exec tsc -- -p tsconfig.json --noEmit` and `npm --prefix Frontend test`
- Use Vitest's `describe`/`it`/`expect` for frontend tests
- Use descriptive test names: `it('finds elements by selector')`
- Use `beforeEach` to reset DOM state in DOM tests

## ExecPlans

- For multi-component features or refactors, create/update an ExecPlan (`Client/PLANS.md`). Outline design, component impacts, and how the plugin runtime is exercised.

## Testing guidelines

- Run `just test` before PRs; frontend-only work should at least cover `npm --prefix Frontend exec tsc -- -p tsconfig.json --noEmit` and `npm --prefix Frontend test`.
- Use `cargo tauri dev` to verify runtime plugin interactions (especially when touching `Backend/src/plugin_runtime/`), and make sure `docs/plugin architecture.md` stays aligned with behavior.

## Commit & PR guidelines

- Use short, imperative commit subjects (optionally scoped, e.g., `backend: refresh plugin runtime config`). Keep changelist focused; avoid mixing UI and backend refactors unless necessary.
- PRs should target the `Dev` branch, include a summary, issue links, commands/tests run, and highlight architecture implications (host API/protocol changes and security decisions).
- Do not modify plugin code inside submodules unless explicitly asked; treat submodule updates as pointer bumps after upstream changes.
- Keep this AGENTS (and other module-level copies you rely on) current whenever workflows, tooling, or responsibilities change so future contributors can find accurate guidance.

## Security & configuration notes

- Review `SECURITY.md` before making plugin, plugin-install, or network-related changes.
- Keep secrets out of the repo; use `.env.tauri.local` for local overrides and do not check them in. If new config flags are introduced, document them in `docs/` and update relevant settings screens/logs.
12 changes: 5 additions & 7 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ Primary flow:
Frontend:
- `Frontend/src/scripts/main.ts`: UI bootstrap and feature wiring.
- `Frontend/src/scripts/lib/tauri.ts`: minimal bridge wrapper for `invoke`/`listen`.
- `Frontend/src/scripts/plugins.ts`: UI plugin runtime and plugin-contributed UI hooks.
- `Frontend/src/scripts/features/`: feature modules grouped by domain.
- `Frontend/src/styles/`: tokens, layout, modal, and component styles.

Expand All @@ -32,8 +31,8 @@ Backend:
- `Backend/src/state.rs`: app config, repo state, recents, output log.
- `Backend/src/repo.rs`: repository handle wrapper around `Arc<dyn Vcs>`.
- `Backend/src/plugin_vcs_backends.rs`: backend discovery and open logic.
- `Backend/src/plugin_bundles.rs`: `.ovcsp` install/index/component resolution.
- `Backend/src/plugin_runtime/stdio_rpc.rs`: plugin process spawn, RPC transport, restarts/timeouts.
- `Backend/src/plugin_bundles.rs`: `.ovcsp` install/index/runtime resolution.
- `Backend/src/plugin_runtime/node_instance.rs`: plugin process lifecycle and JSON-RPC calls.
- `Backend/src/plugin_runtime/vcs_proxy.rs`: `Vcs` trait proxy over plugin RPC.
- `Backend/src/plugins.rs`: plugin discovery/manifest summarization for UI.

Expand All @@ -44,23 +43,22 @@ Backend:
- Command boundary:
Feature-facing backend API lives under `Backend/src/tauri_commands/`.
- Backend/plugin boundary:
Backend communicates with plugin components over stdio JSON-RPC, not in-process APIs.
Backend communicates with plugin processes over JSON-RPC over stdio.
- Settings boundary:
Backend persists/loads app configuration and mediates environment application.

## Architecture Invariants

- Active repo backend is treated as dynamic availability; stale handles are rejected when backend disappears.
- Plugin components that request capabilities require approval before execution.
- Frontend plugin scripts can extend UI, but repository operations still route through backend commands.
- Plugin modules require approval before execution.
- Output/log/progress signaling is centralized through backend event emission.

## Cross-Cutting Concerns

- State lifecycle:
Startup config load, optional reopen-last-repo, runtime config updates.
- Plugin lifecycle:
Built-in/user plugin discovery, install/uninstall, capability approvals.
Built-in/user plugin discovery, install/uninstall, and approval gating.
- Reliability:
RPC timeout handling, respawn backoff, and auto-disable after repeated crashes.
- UX:
Expand Down
6 changes: 3 additions & 3 deletions Backend/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,12 @@ serde_json = "1.0"
default = []

[dependencies]
openvcs-core = { version = "0.1", features = ["plugin-protocol", "vcs"] }
openvcs-core = { path = "../../Core", features = ["vcs"] }

tauri = { version = "2.9", features = [] }
tauri-plugin-opener = "2.5"
serde = { version = "1", features = ["derive"] }
notify = "6"
tauri-plugin-dialog = "2.5"
tauri-plugin-updater = "2.9"
tokio = { version = "1.49", features = ["io-util", "process", "rt", "sync", "time"] }
Expand All @@ -49,8 +50,7 @@ shlex = "1.2"
sha2 = "0.10"
hex = "0.4"
os_pipe = "1.2"
wasmtime = "41"
wasmtime-wasi = "41"
base64 = "0.22"

[dev-dependencies]
tempfile = "3"
Loading
Loading