cargo-hauler 0.8.7 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +13 -12
  3. package/dist/.claude-plugin/marketplace.json +1 -1
  4. package/dist/.claude-plugin/plugin.json +1 -1
  5. package/dist/.codex-plugin/plugin.json +1 -1
  6. package/dist/.cursor-plugin/plugin.json +1 -1
  7. package/dist/INSTALL.md +1 -1
  8. package/dist/README.md +13 -12
  9. package/dist/agent-bundle.compile-evidence.json +1 -1
  10. package/dist/agent-bundle.manifest.json +1 -1
  11. package/dist/agent-bundle.package-compile-evidence.json +1 -1
  12. package/dist/bin/cargo-hauler-flight.mjs +194 -267
  13. package/dist/bin/cargo-hauler-install.js +377 -374
  14. package/dist/bin/cargo-hauler.mjs +301 -372
  15. package/dist/bin/hauler.js +347 -427
  16. package/dist/hooks/event-route-session-start.claude.mjs +47 -47
  17. package/dist/hooks/event-route-session-start.codex.mjs +47 -47
  18. package/dist/hooks/event-route-session-start.cursor.mjs +47 -47
  19. package/dist/hooks/event-route-stop.claude.mjs +47 -47
  20. package/dist/hooks/event-route-stop.codex.mjs +47 -47
  21. package/dist/hooks/event-route-stop.cursor.mjs +47 -47
  22. package/dist/hooks/event-route-tool-after.claude.execute.mjs +47 -47
  23. package/dist/hooks/event-route-tool-after.claude.mjs +120 -511
  24. package/dist/hooks/event-route-tool-after.codex.execute.mjs +47 -47
  25. package/dist/hooks/event-route-tool-after.codex.mjs +120 -511
  26. package/dist/hooks/event-route-tool-after.cursor.execute.mjs +47 -47
  27. package/dist/hooks/event-route-tool-after.cursor.mjs +120 -511
  28. package/dist/hooks/event-route-tool-before.claude.execute.mjs +47 -47
  29. package/dist/hooks/event-route-tool-before.claude.mjs +111 -488
  30. package/dist/hooks/event-route-tool-before.codex.execute.mjs +47 -47
  31. package/dist/hooks/event-route-tool-before.codex.mjs +111 -488
  32. package/dist/hooks/event-route-tool-before.cursor.execute.mjs +47 -47
  33. package/dist/hooks/event-route-tool-before.cursor.mjs +111 -488
  34. package/dist/hooks/hooks-flight.mjs +197 -276
  35. package/dist/install.mjs +19 -9
  36. package/dist/mcp/mcp-hauler-2b8242f9-flight.mjs +242 -323
  37. package/dist/mcp/mcp-hauler-2b8242f9.mjs +267 -324
  38. package/dist/mcp-apps/dashboard.html +6 -6
  39. package/dist/package.json +3 -3
  40. package/dist/plugin.json +1 -1
  41. package/dist/scripts/hauler.mjs +347 -427
  42. package/dist/skills/hauler-dashboard/SKILL.md +1 -1
  43. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.9.1
4
+
5
+ ### Patch Changes
6
+
7
+ - cc5540b: Preserve complete inventories when generated plugin installers inspect existing copies.
8
+
9
+ ## 0.9.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 29a84e7: Require explicit wire-protocol identity, with a one-time daemon stop or restart after upgrading from 0.7.1–0.7.3; remove the `hauler daemon stop --force` alias and stop probing pre-hardening daemon socket paths (#243).
14
+
3
15
  ## 0.8.7
4
16
 
5
17
  ### Patch Changes
package/README.md CHANGED
@@ -86,7 +86,7 @@ The CLI is `hauler` on PATH from `npm i -g cargo-hauler`. Never run
86
86
  | `hauler result <ticket> [--full]` | A stored ticket in full: the settled 16 KiB output tail, or the whole live in-memory tail while it runs (not the status preview). The document names the full on-disk output log (`Full output: <path> (size)`) and `--json` carries it as `request.outputPath`; `--full` prints that whole log instead of the tail (the last ~768 KiB when it does not fit, with the path for the rest). |
87
87
  | `hauler kill <ticket>` | Stop a ticket: drop it from the queue or SIGTERM (then SIGKILL) its cargo process group, freeing the lane. Riders return to their lane or fail with it. |
88
88
  | `hauler request [--session ID] [--host HOST] [--cwd DIR] [--after TICKET …] -- <cargo …>` | Submit a background request and return its ticket, with where it landed in its lane (`queued behind cc-3281 (~13m)`, `waiting for cc-3281`, or `attached to cc-3281`). `--cwd` overrides the current CLI workspace; `--after` works as for `exec`. |
89
- | `hauler daemon <run\|start\|stop\|status\|restart>` | Manage the daemon lifecycle. `stop` records its typed `shutdown` outcome in JSON and exits `0` only after a `shutting-down` acknowledgement followed by the original pid's exit, or when the daemon was already absent. Refusal, timeout, protocol error, disconnect before acknowledgement, and an acknowledged daemon still alive after 5 s exit `1`; `running` remains `true` when the original pid is alive and `null` when liveness could not be established. `restart` is the explicit replacement path: it sends the graceful stop, waits up to 5 s for the old pid to exit, then starts a daemon from this install and prints both (`restarted: pid 741314 (0.6.0) → pid 742001 (0.6.1)`). Tickets in flight are not handed over: the old daemon settles them itself as it shuts down — `killed`, error `daemon shutdown` — and callers resubmit. Automatic upgrades are gentler: read-only commands and MCP/dashboard reads never retire a daemon; a protocol-compatible older daemon serves them directly. Submission commands replace an older daemon only after an idle status check; daemons from 0.7.4 onward hold admission closed while confirming that state, while 0.7.1–0.7.3 receive a client preflight. A busy or slow-to-retire daemon keeps serving the submission and emits one line such as `daemon 0.7.1 will be replaced by 0.7.3 when idle`. A truly incompatible daemon is reported with its pid and version instead of having its payload parsed. |
89
+ | `hauler daemon <run\|start\|stop\|status\|restart>` | Manage the daemon lifecycle. `stop` records its typed `shutdown` outcome in JSON and exits `0` only after a `shutting-down` acknowledgement followed by the original pid's exit, or when the daemon was already absent. Refusal, timeout, protocol error, disconnect before acknowledgement, and an acknowledged daemon still alive after 5 s exit `1`; `running` remains `true` when the original pid is alive and `null` when liveness could not be established. `restart` is the explicit replacement path: it sends the graceful stop, waits up to 5 s for the old pid to exit, then starts a daemon from this install and prints both (`restarted: pid 741314 (0.8.5) → pid 742001 (0.8.6)`). Tickets in flight are not handed over: the old daemon settles them itself as it shuts down — `killed`, error `daemon shutdown` — and callers resubmit. Automatic upgrades are gentler: read-only commands and MCP/dashboard reads never retire a daemon; a protocol-compatible older or newer daemon serves them directly. Submission commands replace a protocol-compatible older daemon only after its atomic idle check. A busy or slow-to-retire daemon keeps serving the submission and emits one line such as `daemon 0.8.5 will be replaced by 0.8.6 when idle`. A daemon that does not advertise the current wire protocol is reported with its pid and version instead of having its payload parsed; after upgrading from 0.7.1–0.7.3, stop that daemon once with `hauler daemon stop` or replace it with `hauler daemon restart` from the new install. |
90
90
  | `hauler install-shim [--dir DIR] [--real-cargo PATH] [--force]` | Install the optional PATH shim. |
91
91
  | `hauler web [--port N] [--no-open]` | Open the dashboard from the checkout, npm package, or installed plugin. Agent Bundle's generated web command serves the built App against the plugin's own `hauler` server, opens it populated by `hauler_dashboard`, and stays in the foreground until Ctrl-C. In an MCP host, call `hauler_dashboard` instead. |
92
92
 
@@ -460,10 +460,8 @@ daemon. How a ticket ends depends on how the daemon went. A graceful stop —
460
460
  an idle older daemon by the next `hauler exec`, `hauler request`, hook
461
461
  submission, or `hauler daemon start` — is the shutdown request. Automatic
462
462
  replacement checks for queued, running, executing, or attached work first;
463
- 0.7.4 and later daemons hold admission closed through that decision, while
464
- 0.7.1–0.7.3 receive the compatible client's status preflight. When a stop does
465
- proceed, the old daemon settles every queued, running, and attached ticket
466
- itself as it exits:
463
+ the daemon holds admission closed through that decision. When a stop does
464
+ proceed, the old daemon settles every queued, running, and attached ticket itself as it exits:
467
465
  its cargo processes are terminated (SIGTERM, then SIGKILL after
468
466
  `CARGO_HAULER_KILL_GRACE_MS`) and each row is marked `killed` with the error
469
467
  `daemon shutdown`, so `hauler result cc-N` shows the ticket `killed` with
@@ -721,10 +719,14 @@ it from the umask:
721
719
  the control socket moves to a `cargo-hauler-<uid>` directory (mode `0700`)
722
720
  under `XDG_RUNTIME_DIR`, `TMPDIR`, or the system temporary directory —
723
721
  never directly into a shared temporary root. Two accounts sharing one
724
- temporary root get separate directories. A daemon from an earlier install
725
- still listening at the previous relocated path is considered only by a
726
- daemon-starting submission, never by a read; `hauler daemon stop` asks it
727
- too before reporting nothing running.
722
+ temporary root get separate directories.
723
+ - If upgrading directly from 0.7.2 or earlier with a deeply nested state
724
+ directory leaves the old daemon on its former relocated socket, stop that
725
+ daemon from the old install (or terminate its recorded pid) before starting
726
+ the current version.
727
+ - Daemons from 0.7.1–0.7.3 do not advertise their wire protocol. For an old
728
+ daemon still serving the current socket, run `hauler daemon stop` or
729
+ `hauler daemon restart` once from the new install after upgrading.
728
730
 
729
731
  Windows has neither POSIX modes nor uids, and its control endpoint is a
730
732
  named pipe rather than a filesystem entry, so none of the above applies
@@ -1024,10 +1026,9 @@ origin until Ctrl-C — so the data is the daemon's own. `pnpm run dev` and the
1024
1026
  Workbench's MCP page preview the same App with live rebuilds. The repository
1025
1027
  ships no preview harness of its own.
1026
1028
 
1027
- agent-bundle does not yet have an npm release; this repository pins the
1029
+ This repository pins the
1028
1030
  [pkg.pr.new](https://pkg.pr.new) preview of Agent Bundle main commit
1029
- [`62ffe40`](https://github.com/ScriptedAlchemy/agent-bundle/commit/62ffe403c5af73499fe7f5767c6d60be26e250db),
1030
- through [Agent Bundle PR #794](https://github.com/ScriptedAlchemy/agent-bundle/pull/794),
1031
+ [`57a9196`](https://github.com/ScriptedAlchemy/agent-bundle/commit/57a9196caf2590ece001799eaeed92613352bc21),
1031
1032
  for `agent-bundle`, `@agent-bundle/runtime`, and their paired
1032
1033
  `rsc-markdown-stream` preview. This pin emits manifest v6. `inspect` reports the
1033
1034
  `agent` component kind as unavailable on every host (agent-bundle G5
@@ -1 +1 @@
1
- {"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","name":"cargo-hauler-marketplace","owner":{"name":"cargo-hauler"},"plugins":[{"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","source":"./","version":"0.8.7"}]}
1
+ {"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","name":"cargo-hauler-marketplace","owner":{"name":"cargo-hauler"},"plugins":[{"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","source":"./","version":"0.9.1"}]}
@@ -1 +1 @@
1
- {"author":{"name":"cargo-hauler"},"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","name":"cargo-hauler","version":"0.8.7"}
1
+ {"author":{"name":"cargo-hauler"},"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","name":"cargo-hauler","version":"0.9.1"}
@@ -1 +1 @@
1
- {"author":{"name":"cargo-hauler"},"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","hooks":"./.codex-plugin/hooks.json","interface":{"capabilities":["mcp","hooks","skills"],"category":"Productivity","defaultPrompt":["Help me use cargo-hauler."],"developerName":"cargo-hauler","displayName":"cargo-hauler","longDescription":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","shortDescription":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks."},"keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","mcpServers":"./.codex-plugin/mcp.json","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","skills":"./skills/","version":"0.8.7"}
1
+ {"author":{"name":"cargo-hauler"},"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","hooks":"./.codex-plugin/hooks.json","interface":{"capabilities":["mcp","hooks","skills"],"category":"Productivity","defaultPrompt":["Help me use cargo-hauler."],"developerName":"cargo-hauler","displayName":"cargo-hauler","longDescription":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","shortDescription":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks."},"keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","mcpServers":"./.codex-plugin/mcp.json","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","skills":"./skills/","version":"0.9.1"}
@@ -1 +1 @@
1
- {"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","displayName":"cargo-hauler","hooks":"./.cursor-plugin/hooks.json","keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","mcpServers":"./.cursor-plugin/mcp.json","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","skills":"./skills/","version":"0.8.7"}
1
+ {"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","displayName":"cargo-hauler","hooks":"./.cursor-plugin/hooks.json","keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","mcpServers":"./.cursor-plugin/mcp.json","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","skills":"./skills/","version":"0.9.1"}
package/dist/INSTALL.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.
4
4
 
5
- Version: `0.8.7`
5
+ Version: `0.9.1`
6
6
 
7
7
  Run these commands from this bundle directory. The bundle is self-contained: every command below is
8
8
  a host command or the bundled installer, and nothing requires the `agent-bundle` CLI. Where that CLI is
package/dist/README.md CHANGED
@@ -86,7 +86,7 @@ The CLI is `hauler` on PATH from `npm i -g cargo-hauler`. Never run
86
86
  | `hauler result <ticket> [--full]` | A stored ticket in full: the settled 16 KiB output tail, or the whole live in-memory tail while it runs (not the status preview). The document names the full on-disk output log (`Full output: <path> (size)`) and `--json` carries it as `request.outputPath`; `--full` prints that whole log instead of the tail (the last ~768 KiB when it does not fit, with the path for the rest). |
87
87
  | `hauler kill <ticket>` | Stop a ticket: drop it from the queue or SIGTERM (then SIGKILL) its cargo process group, freeing the lane. Riders return to their lane or fail with it. |
88
88
  | `hauler request [--session ID] [--host HOST] [--cwd DIR] [--after TICKET …] -- <cargo …>` | Submit a background request and return its ticket, with where it landed in its lane (`queued behind cc-3281 (~13m)`, `waiting for cc-3281`, or `attached to cc-3281`). `--cwd` overrides the current CLI workspace; `--after` works as for `exec`. |
89
- | `hauler daemon <run\|start\|stop\|status\|restart>` | Manage the daemon lifecycle. `stop` records its typed `shutdown` outcome in JSON and exits `0` only after a `shutting-down` acknowledgement followed by the original pid's exit, or when the daemon was already absent. Refusal, timeout, protocol error, disconnect before acknowledgement, and an acknowledged daemon still alive after 5 s exit `1`; `running` remains `true` when the original pid is alive and `null` when liveness could not be established. `restart` is the explicit replacement path: it sends the graceful stop, waits up to 5 s for the old pid to exit, then starts a daemon from this install and prints both (`restarted: pid 741314 (0.6.0) → pid 742001 (0.6.1)`). Tickets in flight are not handed over: the old daemon settles them itself as it shuts down — `killed`, error `daemon shutdown` — and callers resubmit. Automatic upgrades are gentler: read-only commands and MCP/dashboard reads never retire a daemon; a protocol-compatible older daemon serves them directly. Submission commands replace an older daemon only after an idle status check; daemons from 0.7.4 onward hold admission closed while confirming that state, while 0.7.1–0.7.3 receive a client preflight. A busy or slow-to-retire daemon keeps serving the submission and emits one line such as `daemon 0.7.1 will be replaced by 0.7.3 when idle`. A truly incompatible daemon is reported with its pid and version instead of having its payload parsed. |
89
+ | `hauler daemon <run\|start\|stop\|status\|restart>` | Manage the daemon lifecycle. `stop` records its typed `shutdown` outcome in JSON and exits `0` only after a `shutting-down` acknowledgement followed by the original pid's exit, or when the daemon was already absent. Refusal, timeout, protocol error, disconnect before acknowledgement, and an acknowledged daemon still alive after 5 s exit `1`; `running` remains `true` when the original pid is alive and `null` when liveness could not be established. `restart` is the explicit replacement path: it sends the graceful stop, waits up to 5 s for the old pid to exit, then starts a daemon from this install and prints both (`restarted: pid 741314 (0.8.5) → pid 742001 (0.8.6)`). Tickets in flight are not handed over: the old daemon settles them itself as it shuts down — `killed`, error `daemon shutdown` — and callers resubmit. Automatic upgrades are gentler: read-only commands and MCP/dashboard reads never retire a daemon; a protocol-compatible older or newer daemon serves them directly. Submission commands replace a protocol-compatible older daemon only after its atomic idle check. A busy or slow-to-retire daemon keeps serving the submission and emits one line such as `daemon 0.8.5 will be replaced by 0.8.6 when idle`. A daemon that does not advertise the current wire protocol is reported with its pid and version instead of having its payload parsed; after upgrading from 0.7.1–0.7.3, stop that daemon once with `hauler daemon stop` or replace it with `hauler daemon restart` from the new install. |
90
90
  | `hauler install-shim [--dir DIR] [--real-cargo PATH] [--force]` | Install the optional PATH shim. |
91
91
  | `hauler web [--port N] [--no-open]` | Open the dashboard from the checkout, npm package, or installed plugin. Agent Bundle's generated web command serves the built App against the plugin's own `hauler` server, opens it populated by `hauler_dashboard`, and stays in the foreground until Ctrl-C. In an MCP host, call `hauler_dashboard` instead. |
92
92
 
@@ -460,10 +460,8 @@ daemon. How a ticket ends depends on how the daemon went. A graceful stop —
460
460
  an idle older daemon by the next `hauler exec`, `hauler request`, hook
461
461
  submission, or `hauler daemon start` — is the shutdown request. Automatic
462
462
  replacement checks for queued, running, executing, or attached work first;
463
- 0.7.4 and later daemons hold admission closed through that decision, while
464
- 0.7.1–0.7.3 receive the compatible client's status preflight. When a stop does
465
- proceed, the old daemon settles every queued, running, and attached ticket
466
- itself as it exits:
463
+ the daemon holds admission closed through that decision. When a stop does
464
+ proceed, the old daemon settles every queued, running, and attached ticket itself as it exits:
467
465
  its cargo processes are terminated (SIGTERM, then SIGKILL after
468
466
  `CARGO_HAULER_KILL_GRACE_MS`) and each row is marked `killed` with the error
469
467
  `daemon shutdown`, so `hauler result cc-N` shows the ticket `killed` with
@@ -721,10 +719,14 @@ it from the umask:
721
719
  the control socket moves to a `cargo-hauler-<uid>` directory (mode `0700`)
722
720
  under `XDG_RUNTIME_DIR`, `TMPDIR`, or the system temporary directory —
723
721
  never directly into a shared temporary root. Two accounts sharing one
724
- temporary root get separate directories. A daemon from an earlier install
725
- still listening at the previous relocated path is considered only by a
726
- daemon-starting submission, never by a read; `hauler daemon stop` asks it
727
- too before reporting nothing running.
722
+ temporary root get separate directories.
723
+ - If upgrading directly from 0.7.2 or earlier with a deeply nested state
724
+ directory leaves the old daemon on its former relocated socket, stop that
725
+ daemon from the old install (or terminate its recorded pid) before starting
726
+ the current version.
727
+ - Daemons from 0.7.1–0.7.3 do not advertise their wire protocol. For an old
728
+ daemon still serving the current socket, run `hauler daemon stop` or
729
+ `hauler daemon restart` once from the new install after upgrading.
728
730
 
729
731
  Windows has neither POSIX modes nor uids, and its control endpoint is a
730
732
  named pipe rather than a filesystem entry, so none of the above applies
@@ -1024,10 +1026,9 @@ origin until Ctrl-C — so the data is the daemon's own. `pnpm run dev` and the
1024
1026
  Workbench's MCP page preview the same App with live rebuilds. The repository
1025
1027
  ships no preview harness of its own.
1026
1028
 
1027
- agent-bundle does not yet have an npm release; this repository pins the
1029
+ This repository pins the
1028
1030
  [pkg.pr.new](https://pkg.pr.new) preview of Agent Bundle main commit
1029
- [`62ffe40`](https://github.com/ScriptedAlchemy/agent-bundle/commit/62ffe403c5af73499fe7f5767c6d60be26e250db),
1030
- through [Agent Bundle PR #794](https://github.com/ScriptedAlchemy/agent-bundle/pull/794),
1031
+ [`57a9196`](https://github.com/ScriptedAlchemy/agent-bundle/commit/57a9196caf2590ece001799eaeed92613352bc21),
1031
1032
  for `agent-bundle`, `@agent-bundle/runtime`, and their paired
1032
1033
  `rsc-markdown-stream` preview. This pin emits manifest v6. `inspect` reports the
1033
1034
  `agent` component kind as unavailable on every host (agent-bundle G5