Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
},
"metadata": {
"description": "Structured agent-user communication: validated forms, decision cards with recommendations, structured pushback, and progress reports \u2014 batch questions instead of asking one at a time.",
"version": "0.9.0"
"version": "0.9.1"
},
"plugins": [
{
"name": "attune-forms",
"description": "The communication grammar for AI agents: batch independent questions into ONE validated form; offer recommendations as decision cards with rationales and per-option tradeoffs; disagree constructively via pushback cards; report multi-step progress with a blocked-item picker. Renders rich HTML where the host supports widgets and degrades cleanly to plain questions everywhere else. Powered by the attune-forms PyPI package via a bundled MCP server.",
"source": "./plugin",
"version": "0.9.0",
"version": "0.9.1",
"author": {
"name": "Smart AI Memory",
"email": "admin@smartaimemory.com"
Expand Down
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,21 @@ follow [SemVer](https://semver.org/).

## [Unreleased]

## [0.9.1] — 2026-08-29

### Added
- **Bound workspace action round trips** — optional workspace id,
revision, contract hash, and one-render nonce context is preserved by
widget and Markdown renderers. The strict collector accepts only an
action defined by the rendered view, requires explicit confirmation
where declared, and rejects stale or fabricated context without
authorizing or executing the action.
- **Workspace dictionary and MCP boundaries** —
`workspace_from_dict` rejects unknown keys throughout the closed view
grammar. `elicitation_render_workspace` and
`elicitation_collect_workspace_action` expose the same render/collect
pattern as forms, with a non-mocked stdio round-trip receipt.

## [0.9.0] — 2026-08-29

### Added
Expand Down
12 changes: 10 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,10 @@ claude plugin install attune-forms@attune-forms
```

The plugin teaches the session the forms discipline (the `forms` skill)
and serves four MCP tools — `elicitation_render_form`,
and serves six MCP tools — `elicitation_render_form`,
`elicitation_render_widget`, `elicitation_collect_response`,
`elicitation_ask` — from this package via `uvx`. Decision cards,
`elicitation_ask`, `elicitation_render_workspace`, and
`elicitation_collect_workspace_action` — from this package via `uvx`. Decision cards,
pushback cards, progress forms, deliberation cards, triage boards,
confirm gates, ranking lists, and assumption reviews work out of the
box; rich HTML renders where the host
Expand Down Expand Up @@ -120,6 +121,13 @@ if select_form_surface(form) == "widget":
- **Validation** — `form_from_dict` refuses malformed definitions;
`collect_form_response` refuses malformed answers (required fields,
option membership) with field-level problems.
- **Command workspaces** — `workspace_from_dict` validates a closed,
non-executable document grammar for intake, preview, execution, and
receipt views. `workspace_to_widget_html` and
`workspace_to_markdown` render the same action contract;
`collect_workspace_action` rejects unknown, stale, or mismatched
action envelopes. Optional revision/hash/nonce bindings are echoed
for the host to authorize and consume — the UI never grants authority.
- **Intake templates** — `FormTemplate` + `FieldSlot` generate a
workflow's intake form at ask-time from named candidate providers
(`PROVIDERS`): tools describe what they need once, and the form
Expand Down
2 changes: 1 addition & 1 deletion plugin/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "attune-forms",
"version": "0.9.0",
"version": "0.9.1",
"description": "Structured agent-user communication \u2014 validated forms, decision cards, pushback, progress reports, deliberation, triage boards, confirm gates, rankings, and assumption reviews via the attune-forms MCP server.",
"author": {
"name": "Smart AI Memory",
Expand Down
10 changes: 9 additions & 1 deletion plugin/skills/forms/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,20 @@ argument-hint: "<what needs deciding, e.g. 'deployment options' or 'this refacto
> **Forms** — Gathering the independent dimensions of this decision as
> one validated form instead of asking one question at a time.

This skill drives the four `attune-forms` MCP tools:
This skill drives the six `attune-forms` MCP tools:

- `elicitation_render_widget` — form dict → interactive HTML (rich surface).
- `elicitation_render_form` — form dict → batched plain-question payloads.
- `elicitation_collect_response` — form + answers → validated response.
- `elicitation_ask` — native MCP elicitation dialog, where supported.
- `elicitation_render_workspace` — validated workspace view → widget + markdown.
- `elicitation_collect_workspace_action` — view + action envelope → validated action.

Command workspaces compose forms with typed evidence, progress, receipt,
and action blocks. For consequential actions, render a host-generated
revision/hash/nonce binding and validate the returned envelope before
the host authorizes anything. A successful collection proves only that
the action belongs to that rendered view; it never executes the action.

## When to use a multi-field form (the batching rule)

Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"

[project]
name = "attune-forms"
version = "0.9.0"
description = "Dynamic forms library: declarative FormSchema, multi-surface renderers (widget HTML, AskUserQuestion, MCP elicitation), and template-driven intake generation"
version = "0.9.1"
description = "Dynamic forms and command workspaces: validated multi-surface interaction documents for AI agents"
readme = "README.md"
requires-python = ">=3.10"
license = {file = "LICENSE"}
Expand Down
10 changes: 10 additions & 0 deletions src/attune_forms/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,14 +87,19 @@
from attune_forms.widget import WIDGET_RESPONSE_MARKER, form_to_widget_html
from attune_forms.workspace import (
WorkspaceAction,
WorkspaceActionBinding,
WorkspaceActionIntent,
WorkspaceActionResponse,
WorkspaceBlock,
WorkspaceBlockKind,
WorkspaceItem,
WorkspaceSection,
WorkspaceTone,
WorkspaceValidationError,
WorkspaceView,
WorkspaceViewId,
collect_workspace_action,
workspace_from_dict,
workspace_to_markdown,
workspace_to_widget_html,
)
Expand Down Expand Up @@ -139,14 +144,19 @@
"set_keyboard_mode",
"token",
"WorkspaceAction",
"WorkspaceActionBinding",
"WorkspaceActionIntent",
"WorkspaceActionResponse",
"WorkspaceBlock",
"WorkspaceBlockKind",
"WorkspaceItem",
"WorkspaceSection",
"WorkspaceTone",
"WorkspaceView",
"WorkspaceViewId",
"WorkspaceValidationError",
"collect_workspace_action",
"workspace_from_dict",
"workspace_to_markdown",
"workspace_to_widget_html",
"ASSUMPTION_RULINGS",
Expand Down
Loading
Loading