Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
90cd6bb
feat(sdk): define RawPlugin + RawHostApi stabby FFI traits
markovejnovic May 23, 2026
2740b38
feat(sdk): async user-facing traits + PluginContext
markovejnovic May 23, 2026
44ecfc9
fix(sdk): remove stale wasm32-wasip1 reference and orphaned manifest.rs
markovejnovic May 23, 2026
82aae20
fix(sdk): use typed ArchiveId and StdStream in PluginContext
markovejnovic May 23, 2026
9129422
feat(sdk): hm_plugin! proc macro for stabby FFI code generation
markovejnovic May 23, 2026
01376e4
fix(sdk): store capability instances in __HmPluginImpl instead of per…
markovejnovic May 23, 2026
045ab6c
feat(host): rewrite plugin loading for stabby native dylibs
markovejnovic May 23, 2026
db3fac0
fix(host): delete stale pool/host_fns/signal modules, remove extism dep
markovejnovic May 23, 2026
c4d36de
fix(host): address code quality review items
markovejnovic May 23, 2026
2c3f620
feat: migrate output-json plugin to stabby native dylib
markovejnovic May 23, 2026
14a38c6
feat: migrate output-human plugin to stabby native dylib
markovejnovic May 23, 2026
4ba500f
feat: migrate docker plugin to stabby — uses bollard directly
markovejnovic May 23, 2026
ed730b1
feat: migrate cloud plugin to stabby — uses reqwest/axum directly
markovejnovic May 23, 2026
089d373
feat: migrate test fixtures to tests/fixtures/ as stabby native dylibs
markovejnovic May 23, 2026
43236f1
fix: update integration tests and callers for stabby plugin API
markovejnovic May 23, 2026
e8e2b98
refactor(protocol): remove WASM-era host_abi types + manifest fields
markovejnovic May 23, 2026
187b38f
chore: remove extism deps, dead WASM refs, update docs for stabby
markovejnovic May 23, 2026
6122722
merge: origin/main into refactor/plugin-system
markovejnovic May 23, 2026
ff49315
refactor: move first-party plugins into crates/hm/plugins/
markovejnovic May 23, 2026
26c40df
feat(output): move build event formatting into core binary
markovejnovic May 23, 2026
182000d
refactor(orchestrator): output subscriber uses direct formatting, not…
markovejnovic May 23, 2026
74e571d
fix(output): use RunContext for color/tty detection, update stale docs
markovejnovic May 23, 2026
71003c1
refactor: remove OutputFormatter capability from plugin system
markovejnovic May 23, 2026
08bb19b
chore: fix stale output-formatter references in comments
markovejnovic May 23, 2026
a51e78b
chore: delete output formatter plugin crates
markovejnovic May 23, 2026
e2a75d7
refactor(cli): --format flag uses enum instead of string
markovejnovic May 23, 2026
c7b6552
merge: origin/main (hm-util crate + CancellationToken modernization)
markovejnovic May 23, 2026
4d3028a
feat(plugin-runtime): create hm-plugin-runtime crate with extracted m…
markovejnovic May 23, 2026
29a440f
refactor: wire HmError to wrap RuntimeError, delete original plugin s…
markovejnovic May 23, 2026
5f420cd
chore: remove stabby/libloading from binary crate (moved to plugin-ru…
markovejnovic May 23, 2026
f80a691
docs: update CLAUDE.md for plugin-runtime extraction
markovejnovic May 23, 2026
6445f19
fix: route all RuntimeError imports through plugin re-export shim
markovejnovic May 23, 2026
a9ee8ec
refactor: move ManifestError + validate into PluginManifest, move plu…
markovejnovic May 23, 2026
81605db
refactor: replace validate wrapper with From<ManifestError> impl
markovejnovic May 23, 2026
c360616
refactor: add plugin_discovery_dirs() iterator, simplify registry loop
markovejnovic May 23, 2026
2fc233c
refactor: make index_capabilities a pure function using Entry API
markovejnovic May 23, 2026
a58bb82
docs: document public functions in registry.rs
markovejnovic May 23, 2026
9d845a0
fmt
markovejnovic May 23, 2026
49b39f6
refactor: consolidate plugin paths into hm_util::dirs, delete paths.rs
markovejnovic May 23, 2026
0671e3b
Merge remote-tracking branch 'origin/main' into refactor/plugin-system
markovejnovic May 23, 2026
6579628
refactor: replace manual Default impl with SmartDefault derive
markovejnovic May 23, 2026
793046a
docs: implementation plan for deep subcommand injection
markovejnovic May 23, 2026
7e7dee6
feat(protocol): replace ClapJson with typed ArgSpec schema
markovejnovic May 23, 2026
cc329a6
feat(runtime): clap_bridge — build Command from SubcommandSpec, extra…
markovejnovic May 23, 2026
e7b4481
feat(cli): inject plugin subcommands into clap, host-side arg parsing
markovejnovic May 24, 2026
247e5ae
feat(cloud): consume parsed args from host instead of raw argv
markovejnovic May 24, 2026
1902cf2
feat(sdk): spec_from_command — generate SubcommandSpec from clap Command
markovejnovic May 24, 2026
da554be
refactor(cloud): generate SubcommandSpec from clap derives via SDK he…
markovejnovic May 24, 2026
5686dd2
feat(runtime): make PluginRegistry::load async with parallel dylib lo…
markovejnovic May 24, 2026
e088f66
refactor(cli): move helpers to natural homes, introspect builtins
markovejnovic May 24, 2026
6cb7ad2
docs: implementation plan for stabby FFI types
markovejnovic May 24, 2026
cb36047
feat(protocol): add stabby dep and FfiValue dynamic type
markovejnovic May 24, 2026
1395a4b
Revert "feat(protocol): add stabby dep and FfiValue dynamic type"
markovejnovic May 24, 2026
f3ed8fa
docs: implementation plan for borsh FFI serialization
markovejnovic May 24, 2026
b100ae1
feat(protocol): add borsh derives and Value enum to protocol types
markovejnovic May 24, 2026
4cecf01
fix(protocol): code quality fixes for borsh Task 1
markovejnovic May 24, 2026
ac2a7aa
feat(macros): switch generated FFI code from serde_json to borsh
markovejnovic May 24, 2026
1cb8830
feat(runtime): switch host-side FFI dispatch from serde_json to borsh
markovejnovic May 24, 2026
ab23015
feat(sdk): switch context and host API from serde_json to borsh
markovejnovic May 24, 2026
a17dc49
refactor(docker): add borsh dep for macro-generated FFI code
markovejnovic May 24, 2026
e2905d3
refactor(cloud): add borsh dep for macro-generated FFI code
markovejnovic May 24, 2026
86be079
refactor(fixtures): add borsh dep to all test fixture plugins
markovejnovic May 24, 2026
ea9d0fc
chore: remove serde_json from FFI paths, clean up deps
markovejnovic May 24, 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
4 changes: 0 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ jobs:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
# build.rs cross-compiles hm-plugin-* wasm artifacts.
targets: wasm32-wasip1
components: clippy
- uses: Swatinem/rust-cache@v2

Expand Down Expand Up @@ -63,8 +61,6 @@ jobs:
path: harmont-py

- uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-wasip1
- uses: Swatinem/rust-cache@v2
with:
workspaces: harmont-cli
Expand Down
11 changes: 2 additions & 9 deletions .github/workflows/examples.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,20 +43,13 @@ jobs:
build-hm:
needs: validate-matrix
runs-on: ubuntu-latest
# Debug build only — examples just need a working `hm` binary;
# release-mode LTO/codegen on wasmtime+cranelift can't finish in
# GH's 6h cap on a 2-vCPU runner. Debug builds in ~10 minutes
# cold, ~1 minute warm.
# Debug build only — examples just need a working `hm` binary.
# Debug builds in ~10 minutes cold, ~1 minute warm.
timeout-minutes: 30
steps:
- uses: actions/checkout@v4

- uses: dtolnay/rust-toolchain@stable
with:
# crates/hm/build.rs cross-compiles hm-plugin-docker as a wasm
# plugin embedded into the binary, so the target must be on
# the toolchain.
targets: wasm32-wasip1

- uses: Swatinem/rust-cache@v2
with:
Expand Down
26 changes: 1 addition & 25 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,6 @@ jobs:
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
# crates/hm/build.rs cross-compiles hm-plugin-docker as a wasm
# plugin embedded into the binary, so the target must be on
# the toolchain for the `cargo check` in the next step.
targets: wasm32-wasip1
- uses: Swatinem/rust-cache@v2

- name: Set version from tag
Expand All @@ -37,7 +32,7 @@ jobs:
# is what consumers will receive).
sed -i "s|hm-plugin-protocol = { path = \"crates/hm-plugin-protocol\", version = \"0.0.0-dev\" }|hm-plugin-protocol = { path = \"crates/hm-plugin-protocol\", version = \"$VERSION\" }|" Cargo.toml
sed -i "s|hm-plugin-sdk = { path = \"crates/hm-plugin-sdk\", version = \"0.0.0-dev\" }|hm-plugin-sdk = { path = \"crates/hm-plugin-sdk\", version = \"$VERSION\" }|" Cargo.toml
cargo check --workspace --exclude hm-fixtures
cargo check --workspace

- name: Publish hm-plugin-protocol
run: |
Expand All @@ -61,25 +56,6 @@ jobs:
- name: Wait for crates.io index
run: sleep 30

- name: Build embedded WASM plugins
# The harmont-cli build.rs prefers crates/hm/embedded/*.wasm
# over the in-workspace cross-compile. Stage them here so the
# `cargo publish -p harmont-cli` verify-build (which runs in
# target/package/harmont-cli-<ver>/ without the sibling plugin
# crates) and any downstream `cargo install harmont-cli` both
# find the wasms already cooked. The include = [...] in
# crates/hm/Cargo.toml carries them into the tarball.
run: |
set -euo pipefail
for crate in hm-plugin-docker hm-plugin-output-human hm-plugin-output-json hm-plugin-cloud; do
cargo build --target wasm32-wasip1 -p "$crate" --release
done
mkdir -p crates/hm/embedded
for name in hm_plugin_docker hm_plugin_output_human hm_plugin_output_json hm_plugin_cloud; do
cp "target/wasm32-wasip1/release/$name.wasm" "crates/hm/embedded/$name.wasm"
done
ls -la crates/hm/embedded/

- name: Publish harmont-cli
run: |
if curl -sf -A "harmont-release-ci (github-actions)" "https://crates.io/api/v1/crates/harmont-cli/$VERSION" > /dev/null 2>&1; then
Expand Down
13 changes: 7 additions & 6 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
The `cli/` directory is a Cargo workspace.
The `crates/` directory holds a Cargo workspace rooted at the repo root.

- `crates/hm/` — the `hm` binary (today's CLI body).
- `crates/hm-util/` — shared OS and filesystem utilities.
- `crates/hm-plugin-protocol/` — wire types (serde structs only).
- `crates/hm-plugin-sdk/` — authoring SDK for plugin writers.
- `crates/hm-fixtures/` — test-only WASM plugins; compiled to
`target/wasm32-wasip1/debug/` by the test harness.
- `crates/hm-plugin-sdk/` — authoring SDK for plugin writers; exposes the stabby-based FFI traits.
- `crates/hm-plugin-macros/` — proc-macro crate powering `register_plugin!`.
- `crates/hm-plugin-runtime/` — plugin loading, discovery, host-API runtime. Owns `LoadedPlugin`, `PluginRegistry`, `HostApiImpl`.
- `crates/hm-plugin-docker/`, `crates/hm-plugin-cloud/` — bundled plugins (native cdylib dylibs).
- `tests/fixtures/` — test-only cdylib crates (`noop-executor`, `recording-hook`, etc.) built via `cargo build` as native shared libraries.

Run `cargo build` from the workspace root. Plugin fixtures need the
`wasm32-wasip1` target; install with `rustup target add wasm32-wasip1`.
Run `cargo build` from the workspace root. Run `cargo test --workspace` to exercise all crates.

For cross-cutting doctrine see [PRINCIPLES.md](../PRINCIPLES.md).
Loading