From 70feec578ef4b4fb1e810848212b8cb613bebc65 Mon Sep 17 00:00:00 2001 From: abrichr Date: Tue, 1 Sep 2026 20:12:57 -0400 Subject: [PATCH] docs: rewrite README as a calling-agent landing page The old README dumped MCP flags and mailbox internals before a stranger knew why they would install. Identity now matches the product: OpenAdapt compiles programs; this package invokes them over MCP (96 chars, shared with copy.py, server.json, llms.txt, and the skill frontmatter). --- README.md | 264 +++++++++------------------- docs/DESIGN.md | 2 +- docs/DISTRIBUTION.md | 2 +- llms.txt | 2 +- server.json | 2 +- skills/openadapt-gui-write/SKILL.md | 4 +- src/openadapt_agent/copy.py | 4 +- tests/test_distribution.py | 4 + 8 files changed, 98 insertions(+), 186 deletions(-) diff --git a/README.md b/README.md index 6846a52..74dc351 100644 --- a/README.md +++ b/README.md @@ -5,17 +5,17 @@ `mcp-name: io.github.OpenAdaptAI/openadapt-agent` -OpenAdapt is a compiled program for GUI writes with no API. This package invokes it over MCP. +OpenAdapt compiles demonstrated GUI workflows into programs. This package invokes them over MCP. -This package is the default runtime interface for a calling agent. The CLI remains. Headless does not mean the UI is gone. +`pip install openadapt` includes this package. Point a local MCP client at `openadapt-agent serve --allow-run` and the calling agent can invoke a compiled GUI program on this computer. Healthy runs make no model calls. Flow still runs the program. Policy, identity, verification, pauses, repair, and audit stay in [`openadapt-flow`](https://github.com/OpenAdaptAI/openadapt-flow). `--allow-run` is an explicit opt-in. Admission stays fail-closed. -Three roles: the calling agent operates; a named human is authority; compliance samples seals. Computer-use agents are the user of OpenAdapt. They are not the executor inside OpenAdapt. +The calling agent operates. A named human is authority. Compliance samples Seals, and that is a different job than running the program. Computer-use agents are the user of OpenAdapt. They are not the executor inside OpenAdapt. -Flow still runs the program. Policy, identity, verification, pauses, repair, and audit stay in [`openadapt-flow`](https://github.com/OpenAdaptAI/openadapt-flow). A healthy call goes through Flow's governed `run`. HALTED, refused, timeout, and error come back as those outcomes. Don't summarize any of them as success. Never summarize halt as success. +Don't name this skill computer use. ## Install -Claude Code / Cursor, three lines. The server generates the public synthetic tutorial at serve time. It is not in the wheel. +Python 3.10 through 3.12. Local Claude Code, Cursor, Codex, and Grok CLI speak stdio MCP. Author in the chat you already use. ```bash claude mcp add openadapt -- \ @@ -23,11 +23,7 @@ claude mcp add openadapt -- \ serve --allow-run ``` -`--allow-run` is an explicit opt-in. Admission stays fail-closed. - -The halt demo is `openadapt quickstart --break-it`. After the verified run, the same certified bundle hits a backend that paints a success banner and rejects the write. An independent system-of-record read catches the lie. The record did not change. - -Local unsigned replay is free. If the tool returns unsigned success, treat it as failure. Production success without a Seal is failure. Don't name this skill "computer use". +The server generates the public synthetic tutorial at serve time. It isn't in the wheel. ```bash python -m pip install --upgrade openadapt @@ -35,18 +31,11 @@ openadapt quickstart openadapt-agent serve --allow-run ``` -Python 3.10 through 3.12. `pip install openadapt` now includes this package. `pip install openadapt-agent` is the library install if you already have a private compiled bundle. The halt demo is still `openadapt quickstart --break-it`. - -```bash -uvx openadapt-agent serve --bundles /path/to/bundles # read-only -uvx openadapt-agent serve --bundles /path/to/bundles --allow-run -``` +`openadapt quickstart --break-it` is the halt demo. After the verified run, the same certified bundle hits a backend that paints a success banner and rejects the write. An independent system-of-record read catches the lie. The record did not change. -## Author a first demo (Claude Code) +Local unsigned replay is free. If the tool returns unsigned success, treat it as failure. Production success without a Seal is failure. HALTED does not mint a Seal. -Local Claude Code (or Cursor, Codex, Grok CLI) is the first authoring UI -over stdio. Hosted ChatGPT.com / Claude.ai cannot talk to localhost; they -need the outbound mailbox client below, not `serve --authoring`. +A first demo over stdio uses a second MCP server. `--authoring` does not enable run tools. ```bash claude mcp add openadapt-authoring -- \ @@ -54,78 +43,92 @@ claude mcp add openadapt-authoring -- \ serve --authoring ``` -`--bundles` is omitted. Probe tools are `observe`, `start_record`, `click`, -and `halt`. `--authoring` does not enable run tools. This process stays -stdio. Pass `--url` to pin a fresh Playwright Chromium with empty cookies. -Windows native, Citrix, and RDP are coach-only in v1. +`--bundles` is omitted. Probe tools are `observe`, `start_record`, `click`, and `halt`. This process stays stdio. Pass `--url` to pin a fresh Playwright Chromium with empty cookies. Windows native, Citrix, and RDP stay coach-only here, as does any macOS or Linux session without a unique frontmost window. + +Private customer bundles still use `--bundles`. Those stay on the operator's disk and are never shipped here. + +```bash +uvx openadapt-agent serve --bundles /path/to/bundles +uvx openadapt-agent serve --bundles /path/to/bundles --allow-run +``` -## Connect this computer (ChatGPT.com / Claude.ai) +## ChatGPT.com and Claude.ai -OpenAdapt is installed on this computer, so an agent can drive only through -OpenAdapt. +Hosted ChatGPT.com and Claude.ai can't talk to localhost stdio. Don't tell those tabs to run `openadapt-agent serve`. -Desktop: the tray is already running. **Connect this computer** on the job -page (`openadapt://runner`) just works. +On the job page `https://openadapt.ai/j/{id}`, Desktop **Connect this computer** claims `openadapt://runner`. Copy from that page and paste into the chat. Don't send them to `/start`. -Pip: after `pip install openadapt`, start the same mailbox client: +Pip users start the mailbox client: ```bash openadapt-agent authoring connect \ 'openadapt://runner?pack=p.…&bind=oab_…&origin=https://openadapt.ai' ``` -That claims `oab_`, polls `/j/{id}/runner/poll` with `wait_seconds: 0`, -prints Allow (`y/n`) per chat account, and on pause prints `Sign in in -the app, then press Enter`. Continue records with `record_observed`. It -never types your password. Pass `--url` for a fresh Playwright Chromium -with empty cookies. +That claims `oab_`, polls `/j/{id}/runner/poll` with `wait_seconds: 0`, prints Allow (`y/n`) per chat account, and on pause prints `Sign in in the app, then press Enter`. Continue records with `record_observed`. It never types your password. Credentials stay on the user's computer. Don't paste a login into a vendor VM. + +The job page should offer `openadapt connect ` next to Open OpenAdapt. This repo implements `openadapt-agent authoring connect`. Overlay chrome, launchd, the OS URL handler, and Keychain lease persistence stay Desktop-only. See [`docs/MAILBOX_CLI.md`](docs/MAILBOX_CLI.md). + +## Outcomes + +Every `run_workflow_` call returns one of `success`, `halt`, `refused`, `timeout`, or `error`. + +| `status` | Meaning | +| --- | --- | +| `success` | The process exited successfully and the persisted report records `execution_outcome: VERIFIED`. Legacy reports must record `success: true`. | +| `halt` | Execution halted, completed without enough verification, or completed a rollback. Not a verified success. If `execution_outcome` is `HALTED`, tell the user the record did not change. Protected evidence stays local. | +| `refused` | A governed admission gate refused the bundle before execution. Nothing ran. | +| `timeout` | The process exceeded its deadline. The target may be partly executed. Inspect it before retrying. | +| `error` | The CLI, report, or other execution infrastructure was inconsistent. | + +Don't summarize any of them as success. + +A timeout isn't a rollback. Don't retry until you've looked at the durable run. + +`get_run_report` returns a PHI-safe status and a count-only summary for a run this server created. The persisted report stays in the local operator experience unless you enabled protected export. + +## Trust boundary + +Don't expose this process's stdin and stdout as an unauthenticated network service. It inherits the local user's OS permissions, and Flow records that OS account as the operator for attended decisions. + +By default every MCP response is safe to render outside the protected workflow-data boundary. Labels, recorded values, paths, raw reports, observed text, stdout, stderr, and local exception messages stay on the OpenAdapt machine. The client gets opaque IDs, fixed outcome copy, declared parameter names and types, and count or boolean metrics. + +`--allow-protected-export` sends raw local metadata and evidence to the MCP client. Use it only when that client is trusted and inside the same protected data boundary. + +`--allow-synthetic-recorded-defaults` lets omitted parameters reuse recorded values. It requires `--allow-run`. Synthetic demonstrations only. Production runs require every declared parameter so a wrong-record action cannot hide in a default. -The job page should offer `openadapt connect ` next to Open -OpenAdapt (meta-package alias; this repo implements -`openadapt-agent authoring connect`). Overlay chrome, launchd, and the -OS URL handler stay Desktop-only. See [`docs/MAILBOX_CLI.md`](docs/MAILBOX_CLI.md). +Remote transport, account identity, tenant isolation, fleet policy, and managed execution belong to OpenAdapt Cloud. They aren't duplicated here. + +The complete contract is in [docs/DESIGN.md](docs/DESIGN.md). ## Serve a bundle -`--allow-run` with no `--bundles` records, compiles, and certifies the -synthetic MockMed workflow, then keeps that app up so a governed run can hit -a live system of record. `--tutorial` is the same path without implying run -tools. Private customer bundles still use `--bundles`. Those stay on the -operator's disk and are never shipped in this package. +`--allow-run` with no `--bundles` records and compiles the synthetic MockMed workflow, certifies it, then keeps that app up so a governed run can hit a live system of record. `--tutorial` is the same path without implying run tools. ```bash openadapt-agent serve --allow-run --runs-dir /tmp/openadapt-runs ``` -The client gets `list_workflows`, `get_workflow`, `get_run_report`, -`list_needs_attention`, and `get_attention_item`. Those are read-only until -`--allow-run`. The synthetic tutorial registers `run_local_quickstart`. - -Add `--allow-run` and the server registers one typed `run_workflow_` -tool per loadable bundle. Declared parameters are required. Recorded -demonstration values never appear in the schema and are not reused unless you -ask for that. +The client gets `list_workflows`, `get_workflow`, `get_run_report`, `list_needs_attention`, and `get_attention_item`. Those are read-only until `--allow-run`. The synthetic tutorial registers `run_local_quickstart`. Add `--allow-run` and the server registers one typed `run_workflow_` tool per loadable bundle. Declared parameters are required. Recorded demonstration values never appear in the schema and are not reused unless you ask for that. -By default every MCP response is safe to render outside the protected -workflow-data boundary. Labels, recorded values, paths, raw reports, observed -text, stdout, stderr, and local exception messages stay on the OpenAdapt -machine. The client gets opaque IDs, fixed outcome copy, declared parameter -names and types, and count or boolean metrics. - -Two development switches, kept apart on purpose: +| Tool | Registration | +| --- | --- | +| `list_workflows` | Always | +| `get_workflow` | Always | +| `get_run_report` | Always | +| `list_needs_attention` | Always | +| `get_attention_item` | Always | +| `run_workflow_` | `--allow-run` | +| `run_local_quickstart` | `--allow-run` with no `--bundles` | +| `reject_attention`, `teach_attention`, `escalate_attention` | `--allow-attended-actions` | +| `continue_attention`, `skip_attention` | `--allow-attended-actions` plus a qualified deployment `--config` | +| `observe`, `start_record`, `click`, `halt` | `--authoring` | -- `--allow-protected-export` sends raw local metadata and evidence to the MCP - client. Use it only when that client is trusted and inside the same - protected data boundary. -- `--allow-synthetic-recorded-defaults` lets omitted parameters reuse recorded - values. It requires `--allow-run`. Synthetic demonstrations only. Production - runs require every declared parameter so a wrong-record action cannot hide - in a default. +`--headed` keeps the attended web session visible. The MCP server is stdio. The target app still has a window. -## Finish a halt from the same server +## Finish a halt -Point the server at Flow's qualified deployment config if a local operator -needs to finish an exception and continue the same durable run: +`continue_attention` does not perform the paused action again. Point the server at Flow's qualified deployment config if a local operator needs to finish an exception and continue the same durable run: ```bash openadapt-agent serve \ @@ -137,9 +140,7 @@ openadapt-agent serve \ --headed ``` -The queue summary is safe to show in an agent UI: opaque IDs, typed -categories, counts, and signed-capability metadata. No observed text, no -workflow values, no reports, no local paths. +The queue summary is safe to show in an agent UI. It carries opaque IDs, typed categories, counts, and signed-capability metadata. Observed text, workflow values, reports, and local paths stay off that surface. | Tool | What happens | | --- | --- | @@ -149,16 +150,9 @@ workflow values, no reports, no local paths. | `teach_attention` | Records an audited request for a corrective demonstration. Flow's revision and regression gates decide what can be promoted. | | `escalate_attention` | Records an audited escalation and leaves the exact durable pause intact. | -Every mutation needs the opaque queue-item ID, the item's current capability -digest, a caller-stable idempotency key, and an action-specific `true` -confirmation. Before the server submits that to Flow, it opens an MCP form -elicitation and the local operator has to accept it. That's a host-mediated -confirmation, not cryptographic proof of who clicked. Flow records the -effective local OS account as the operator. +Every mutation needs the opaque queue-item ID, the item's current capability digest, a caller-stable idempotency key, and an action-specific `true` confirmation. Before the server submits that to Flow, it opens an MCP form elicitation and the local operator has to accept it. That's a host-mediated confirmation, not cryptographic proof of who clicked. Flow records the effective local OS account as the operator. -Clients without form elicitation cannot execute attended actions through this -bridge. The same Continue, Skip, Reject, Teach, and Escalate capabilities stay -available through Flow's attended console: +Clients without form elicitation cannot execute attended actions through this bridge. The same Continue, Skip, Reject, Teach, and Escalate capabilities stay available through Flow's attended console: ```bash openadapt-flow console \ @@ -170,124 +164,38 @@ openadapt-flow console \ --headed ``` -Flow rechecks the signed capability, run identity, bundle version, checkpoint -lineage, authorization, live state, and effect evidence at decision time. -Stale capabilities and uncertain delivery are refused. The same idempotency -key returns the prior terminal decision instead of repeating it. - -`--allow-attended-actions` without `--config` still registers Reject, Teach, -and Escalate. Continue and Skip wait until Flow can construct the -deployment-bound live verifier and backend. `--headed` is required for web -Continue and Skip. - -## MCP tools - -| Tool | Registration | -| --- | --- | -| `list_workflows` | Always | -| `get_workflow` | Always | -| `get_run_report` | Always | -| `list_needs_attention` | Always | -| `get_attention_item` | Always | -| `run_workflow_` | `--allow-run` | -| `run_local_quickstart` | `--allow-run` with no `--bundles` | -| `reject_attention`, `teach_attention`, `escalate_attention` | `--allow-attended-actions` | -| `continue_attention`, `skip_attention` | `--allow-attended-actions` plus a qualified deployment `--config` | -| `observe`, `start_record`, `click`, `halt` | `--authoring` | - -## Run outcomes - -Every `run_workflow_` call returns one of these: - -| `status` | Meaning | -| --- | --- | -| `success` | The process exited successfully and the persisted report records `execution_outcome: VERIFIED`. Legacy reports must record `success: true`. | -| `halt` | Execution halted, completed without enough verification, or completed a rollback. Not a verified success. If `execution_outcome` is `HALTED`, tell the user the record did not change. Protected evidence stays local. | -| `refused` | A governed admission gate refused the bundle before execution. Nothing ran. | -| `timeout` | The process exceeded its deadline. The target may be partly executed. Inspect it before retrying. | -| `error` | The CLI, report, or other execution infrastructure was inconsistent. | - -`get_run_report` returns a PHI-safe status and a count-only summary for a run -this server created. The persisted report stays in the local operator -experience unless you enabled protected export. A client must never summarize -`halt`, `refused`, `timeout`, or `error` as success. - -A timeout isn't a rollback. Don't retry until you've looked at the durable run. +`--allow-attended-actions` without `--config` still registers Reject, Teach, and Escalate, and it withholds Continue and Skip until Flow can construct the deployment-bound live verifier and backend. `--headed` is required for web Continue and Skip. ## Emit an Agent Skill +`openadapt-agent emit-skill` wraps Flow's own skill emitter and writes a folder you can drop in `~/.claude/skills`. + ```bash openadapt-agent emit-skill \ /tmp/openadapt-agent-demo/bundle \ --out ~/.claude/skills ``` -This wraps Flow's own skill emitter, keeps its portable bundle, and adds MCP -invocation, Needs Attention, and result-handling guidance. The frontmatter -description is the same sentence as `server.json` and `llms.txt`. The skill -is named from the workflow slug, never "computer use". If the tool returns -HALTED, tell the user the record did not change. - -A first-party copy lives at [`skills/openadapt-gui-write/SKILL.md`](skills/openadapt-gui-write/SKILL.md). -A folder emitted from a private bundle isn't a sanitized derivative. It -includes the compiled bundle. Treat that as protected workflow data. +The wrapper keeps Flow's portable bundle and appends MCP invocation, halt handling, Needs Attention, and attended-action guidance. The frontmatter description is the same sentence as `server.json` and `llms.txt`. The skill is named from the workflow slug, never "computer use". If the tool returns HALTED, tell the user the record did not change. -## Trust boundary - -This is a local stdio bridge. It inherits the local user's OS permissions, and -that user is recorded as the operator for attended decisions. Don't expose its -stdin and stdout as an unauthenticated network service. - -Remote transport, account identity, tenant isolation, fleet policy, and -managed execution belong to OpenAdapt Cloud. They aren't duplicated here. - -Other fixed boundaries: - -- Run tools and attended mutations stay off until you enable them at start. -- Target, deployment policy, timeout, and model-egress posture are fixed at - server start, not supplied per MCP call. -- Parameters go through a mode-`0600` temporary file, not process arguments. -- Workflow and run IDs are opaque on the default MCP surface. -- Recorded parameter values never enter tool schemas, unless you put the - server in synthetic-default demo mode. -- Protected reports, names, values, paths, subprocess output, and exception - text stay local unless you enable protected export for a trusted client in - the same data boundary. -- Attended action schemas accept no free-text challenge answers. -- Attended mutations require protocol-native form elicitation. A boolean from - an autonomous tool caller is not enough on its own. - -The complete contract is in [docs/DESIGN.md](docs/DESIGN.md). +A first-party copy lives at [`skills/openadapt-gui-write/SKILL.md`](skills/openadapt-gui-write/SKILL.md). A folder emitted from a private bundle isn't a sanitized derivative. It includes the compiled bundle, so it's protected workflow data. ## Product state -An exact Agent release enters Production only through an active signed, -expiring, and revocable release admission. A missing, expired, revoked, -mismatched, or unverifiable admission produces **not actively admitted**. The -validator doesn't restore an older admission or assign a fallback lifecycle -label. Check the -[current signed Production record](https://docs.openadapt.ai/production-lifecycle.json). +An exact Agent release enters Production only through an active signed admission. That admission expires and can be revoked. A missing, expired, revoked, mismatched, or unverifiable admission produces **not actively admitted**. The validator doesn't restore an older admission or assign a fallback lifecycle label. Check the [current signed Production record](https://docs.openadapt.ai/production-lifecycle.json). ## Package history -Before v2 this repository wrapped model-driven GUI agents. That execution path -now lives in `openadapt-flow`. The current name stays because the package -bridges MCP and Agent Skills. It isn't an MCP-only package. +Before v2 this repository wrapped model-driven GUI agents. That was the wrong product. The execution path now lives in `openadapt-flow`. The current name stays because the package bridges MCP and Agent Skills. -The public capability is the server. `serve --allow-run` generates the -synthetic MockMed bundle at serve time; it is not vendored. A user's compiled -workflow is their private artifact, supplied at launch with `--bundles` and -never embedded in the package or a registry listing. See -[`docs/DISTRIBUTION.md`](docs/DISTRIBUTION.md). +A user's compiled workflow is their private artifact. Supply it at launch with `--bundles`. It is never embedded in the package or a registry listing. See [`docs/DISTRIBUTION.md`](docs/DISTRIBUTION.md). -Machine-readable launch manifests sit at the repo root: -[`server.json`](server.json) (MCP registry), -[`manifest.json`](manifest.json) (MCPB / Smithery), -[`llms.txt`](llms.txt) (assistants). Registry-launched installs start -read-only. Execution tools wait for `--allow-run`. +The MCP registry reads [`server.json`](server.json). Smithery packs from [`manifest.json`](manifest.json). [`llms.txt`](llms.txt) exists because hosted assistants scrape a file, not this README. Registry-launched installs start read-only. Execution tools wait for `--allow-run`. ## Development +`pytest -q` covers README identity and the MCP registry manifests. It also pins the PHI-safe default. + ```bash pip install -e ".[dev]" ruff check src tests scripts diff --git a/docs/DESIGN.md b/docs/DESIGN.md index a361a05..5faa2e5 100644 --- a/docs/DESIGN.md +++ b/docs/DESIGN.md @@ -5,7 +5,7 @@ admission record. A missing, expired, revoked, mismatched, or unverifiable admission means **not actively admitted**. The validator doesn't restore an older admission or assign a fallback lifecycle label. -OpenAdapt is a compiled program for GUI writes with no API. This package invokes it over MCP. +OpenAdapt compiles demonstrated GUI workflows into programs. This package invokes them over MCP. `openadapt-agent` is the default runtime interface for a calling agent. It is not a second workflow engine, and it is not "OpenAdapt the agent." Flow diff --git a/docs/DISTRIBUTION.md b/docs/DISTRIBUTION.md index 130fcd9..f1a8e2a 100644 --- a/docs/DISTRIBUTION.md +++ b/docs/DISTRIBUTION.md @@ -58,7 +58,7 @@ and [`../manifest.json`](../manifest.json). - **Display name:** OpenAdapt Agent (openadapt-flow bridge) - **PyPI package:** `openadapt-agent` - **Version:** `2.0.2` (staged in this repository; `2.0.1` is the newest version published to PyPI) -- **Description:** OpenAdapt is a compiled program for GUI writes with no API. This package invokes it over MCP. +- **Description:** OpenAdapt compiles demonstrated GUI workflows into programs. This package invokes them over MCP. - **Homepage / docs:** https://docs.openadapt.ai - **Repository:** https://github.com/OpenAdaptAI/openadapt-agent - **License:** MIT diff --git a/llms.txt b/llms.txt index 877d068..edabc22 100644 --- a/llms.txt +++ b/llms.txt @@ -1,6 +1,6 @@ # openadapt-agent -> OpenAdapt is a compiled program for GUI writes with no API. This package invokes it over MCP. +> OpenAdapt compiles demonstrated GUI workflows into programs. This package invokes them over MCP. Default runtime interface for a calling agent. Computer-use agents are the user of OpenAdapt. They are not the executor inside it. Never summarize halt as success. Roles: operator (calling agent), authority (named human), auditor (samples seals). diff --git a/server.json b/server.json index 13047dd..5d71e74 100644 --- a/server.json +++ b/server.json @@ -2,7 +2,7 @@ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json", "name": "io.github.OpenAdaptAI/openadapt-agent", "title": "OpenAdapt Agent (openadapt-flow bridge)", - "description": "OpenAdapt is a compiled program for GUI writes with no API. This package invokes it over MCP.", + "description": "OpenAdapt compiles demonstrated GUI workflows into programs. This package invokes them over MCP.", "websiteUrl": "https://docs.openadapt.ai", "repository": { "url": "https://github.com/OpenAdaptAI/openadapt-agent", diff --git a/skills/openadapt-gui-write/SKILL.md b/skills/openadapt-gui-write/SKILL.md index 493104f..b3e59ef 100644 --- a/skills/openadapt-gui-write/SKILL.md +++ b/skills/openadapt-gui-write/SKILL.md @@ -1,6 +1,6 @@ --- name: openadapt-gui-write -description: "OpenAdapt is a compiled program for GUI writes with no API. This package invokes it over MCP." +description: "OpenAdapt compiles demonstrated GUI workflows into programs. This package invokes them over MCP." --- # OpenAdapt GUI write @@ -9,7 +9,7 @@ When the user needs a repeating GUI write with no API and must prove persistence Never summarize halt, refused, timeout, or error as success. A local unsigned replay may complete. If the tool returns unsigned success, treat it as failure. Production success without a Seal is failure. -The MCP server is this package. The program is OpenAdapt. The skill name is openadapt-gui-write. +The MCP server is this package. OpenAdapt compiles the program. The skill name is openadapt-gui-write. Serve the public synthetic tutorial with: diff --git a/src/openadapt_agent/copy.py b/src/openadapt_agent/copy.py index ae564ac..26f803c 100644 --- a/src/openadapt_agent/copy.py +++ b/src/openadapt_agent/copy.py @@ -7,8 +7,8 @@ from __future__ import annotations IDENTITY_SENTENCE = ( - "OpenAdapt is a compiled program for GUI writes with no API. " - "This package invokes it over MCP." + "OpenAdapt compiles demonstrated GUI workflows into programs. " + "This package invokes them over MCP." ) SKILL_WHEN_TO_USE = ( diff --git a/tests/test_distribution.py b/tests/test_distribution.py index eb09199..f67544b 100644 --- a/tests/test_distribution.py +++ b/tests/test_distribution.py @@ -254,6 +254,10 @@ def _readme_first_paragraph() -> str: def test_identity_sentence_is_shared() -> None: + # Contracts, not marketing copy: MCP registry namespace via the PyPI + # readme, the 100-char identity sentence shared with server.json / llms.txt + # / skill frontmatter, the findable install commands, Seal/unsigned honesty, + # and the ban on naming the skill "computer use". # MCP registry server.json description maxLength is 100. assert len(IDENTITY_SENTENCE) <= 100 assert _readme_first_paragraph() == IDENTITY_SENTENCE