You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Release v0.5.2 — full feature parity, 14 types, security hardening
Version bump to 0.5.2 across Rust, Python, JS, Go, docs, and metadata.
Since v0.5.1:
- 14 built-in types (added msf_options, credential_file, duration, regex_match)
- Custom types via toolclad.toml with base type inheritance
- Real timeout enforcement with process group kill (Rust)
- Output parsers: json, jsonl, csv, xml, text (all 4 languages)
- HTTP body JSON-escaping to prevent request injection
- HTTP error semantics: 4xx client_error, 5xx server_error
- Platform-aware evidence directories (no hardcoded /tmp)
- Rich MCP schema generation with format/pattern/min/max constraints
- command section optional for HTTP/MCP-only manifests
- Full feature parity across Rust, Python, JavaScript, Go
- Scope validation aligned across all implementations
- String type rejects shell metacharacters by default
- Unknown arg types fail closed
Copy file name to clipboardExpand all lines: README.md
+7-4Lines changed: 7 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -44,7 +44,7 @@ type = "object"
44
44
type = "string"
45
45
```
46
46
47
-
The agent fills typed parameters. The executor validates, constructs the command, executes with timeout, and returns structured JSON. The agent never sees or generates a shell command.
47
+
The agent fills typed parameters. The executor validates, constructs the command, executes with timeout, and returns structured JSON. The agent never sees or generates a shell command. The `[command]` section is optional for HTTP-only or MCP-only manifests.
48
48
49
49
## Security Model
50
50
@@ -62,6 +62,9 @@ The dangerous action cannot be expressed because the interface doesn't permit it
62
62
-**Process group isolation**: Tools spawned in new PGID; timeout kills entire process group (no zombies)
63
63
-**Absolute path blocking**: `path` type rejects `/etc/shadow`, `C:\...` style paths
64
64
-**Newline injection blocking**: `\n` and `\r` rejected in all string-based types
65
+
-**HTTP body JSON-escaping**: Values interpolated into HTTP body templates are JSON-escaped to prevent injection
Copy file name to clipboardExpand all lines: SKILL.md
+8-2Lines changed: 8 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,7 +2,7 @@
2
2
name: toolclad
3
3
title: ToolClad
4
4
description: Declarative tool interface contracts for agentic runtimes — oneshot CLI, interactive session (PTY), and browser (CDP/Playwright) modes with typed parameters, per-interaction Cedar gating, evidence envelopes
5
-
version: 0.5.1
5
+
version: 0.5.2
6
6
---
7
7
8
8
# ToolClad Development Skills Guide
@@ -20,7 +20,7 @@ ToolClad is a declarative manifest format (`.clad.toml`) that defines the comple
20
20
-**Browser**: Maintain a governed headless browser session where navigation, clicks, form submission, and JS execution are typed, scoped, and policy-gated via CDP/Playwright.
21
21
22
22
All three modes share:
23
-
-**Typed Parameters**: 10 built-in types with injection sanitization
23
+
-**Typed Parameters**: 14 built-in types (10 core + 4 extended) with injection sanitization, plus custom types via `toolclad.toml`
24
24
-**Per-Interaction Cedar Gating**: Every command/action evaluated against policies
25
25
-**Evidence Envelopes**: Every execution wrapped in JSON with scan_id, timestamps, SHA-256 hash
26
26
-**Scope Enforcement**: URL/target scope checking against allow-lists
Validate a single argument value against its type definition, resolving custom types from a loaded `toolclad.toml`. If the type is not a built-in type, it is looked up in `custom_types` and validated against the base type with any additional constraints.
Construct the command argument array from a manifest and validated arguments. Does not execute. Returns the argv array that would be passed to `execve`.
Array-based execution means that even if a metacharacter somehow passed validation (it cannot, but defense in depth), the shell would never interpret it. There is no shell.
48
48
49
+
## HTTP Body JSON-Escaping
50
+
51
+
When values are interpolated into HTTP body templates (`[http].body_template`), they are JSON-escaped before substitution. This prevents injection attacks where an agent-supplied value could break out of a JSON string field and alter the structure of the request body. Quotes, backslashes, newlines, and control characters are all escaped.
52
+
53
+
## Platform-Aware Evidence Directories
54
+
55
+
Evidence output directories use platform-appropriate temporary directories (`/tmp` on Linux/macOS, `%TEMP%` on Windows) when no explicit `output_dir` is configured. This ensures evidence capture works correctly across operating systems without hardcoded paths.
56
+
57
+
## HTTP Error Semantics
58
+
59
+
HTTP backend responses are classified by status code:
60
+
61
+
-**2xx**: `success` status in the evidence envelope
62
+
-**4xx**: `client_error` status -- the request was malformed or unauthorized
63
+
-**5xx**: `server_error` status -- the upstream service failed
64
+
65
+
This classification gives LLM agents actionable error semantics for self-correction.
66
+
49
67
## Process Group Kill
50
68
51
69
Tools are spawned in a new process group (PGID). When a timeout fires, the executor kills the entire process group, not just the top-level process. This prevents:
0 commit comments