@noodleseed/agent-kit 0.25.0 → 0.27.0
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.
- package/manifest.json +13 -13
- package/package.json +1 -1
- package/skills/claude-code/SKILL.md +1 -1
- package/skills/claude-code/examples/food-ordering/README.md +4 -0
- package/skills/claude-code/examples/weather/README.md +27 -0
- package/skills/claude-code/references/compile-errors.md +2 -0
- package/skills/claude-code/references/connect-an-api.md +17 -1
- package/skills/claude-code/references/widgets-and-apps.md +2 -0
- package/skills/codex/SKILL.md +1 -1
- package/skills/codex/examples/food-ordering/README.md +4 -0
- package/skills/codex/examples/weather/README.md +27 -0
- package/skills/codex/references/compile-errors.md +2 -0
- package/skills/codex/references/connect-an-api.md +17 -1
- package/skills/codex/references/widgets-and-apps.md +2 -0
package/manifest.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"packageVersion": "0.
|
|
2
|
+
"packageVersion": "0.27.0",
|
|
3
3
|
"files": [
|
|
4
4
|
{
|
|
5
5
|
"path": "skills/codex/SKILL.md",
|
|
6
|
-
"sha256": "
|
|
6
|
+
"sha256": "85902e1189172c389d0811b5f07d0ead7a686b9099f4f1eb48858c57f15b6ae8",
|
|
7
7
|
"agentTarget": "codex"
|
|
8
8
|
},
|
|
9
9
|
{
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
25
|
"path": "skills/codex/references/compile-errors.md",
|
|
26
|
-
"sha256": "
|
|
26
|
+
"sha256": "f3e791d3eb7b95641791b9e63efd03852aa517d9b29e535f447fed3080fd61e4",
|
|
27
27
|
"agentTarget": "codex"
|
|
28
28
|
},
|
|
29
29
|
{
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
40
|
"path": "skills/codex/references/connect-an-api.md",
|
|
41
|
-
"sha256": "
|
|
41
|
+
"sha256": "982b5652635706793bf20b0d2b6abb7887302e3ab39886002b23f09d1515ac26",
|
|
42
42
|
"agentTarget": "codex"
|
|
43
43
|
},
|
|
44
44
|
{
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
50
|
"path": "skills/codex/references/widgets-and-apps.md",
|
|
51
|
-
"sha256": "
|
|
51
|
+
"sha256": "921d05b7f7a8044f4b9c4f8816972839eb792499b99f095ff1fbcda89a2b48b3",
|
|
52
52
|
"agentTarget": "codex"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
@@ -278,7 +278,7 @@
|
|
|
278
278
|
},
|
|
279
279
|
{
|
|
280
280
|
"path": "skills/codex/examples/food-ordering/README.md",
|
|
281
|
-
"sha256": "
|
|
281
|
+
"sha256": "41fdd5b9ca345a5f0daf4633cb53e65f11d1f211f283f6ba902db3366f872809",
|
|
282
282
|
"agentTarget": "codex"
|
|
283
283
|
},
|
|
284
284
|
{
|
|
@@ -353,7 +353,7 @@
|
|
|
353
353
|
},
|
|
354
354
|
{
|
|
355
355
|
"path": "skills/codex/examples/weather/README.md",
|
|
356
|
-
"sha256": "
|
|
356
|
+
"sha256": "43ee8447a0a3f9fdcce30544c5ef3801a93eb6b9fe5e2e8791e65a6587a65545",
|
|
357
357
|
"agentTarget": "codex"
|
|
358
358
|
},
|
|
359
359
|
{
|
|
@@ -378,7 +378,7 @@
|
|
|
378
378
|
},
|
|
379
379
|
{
|
|
380
380
|
"path": "skills/claude-code/SKILL.md",
|
|
381
|
-
"sha256": "
|
|
381
|
+
"sha256": "5e0ca0a074ddfa6c839cc8d8233d20a0a11e3991bb0f9972539b9896b6072bbf",
|
|
382
382
|
"agentTarget": "claude-code"
|
|
383
383
|
},
|
|
384
384
|
{
|
|
@@ -398,7 +398,7 @@
|
|
|
398
398
|
},
|
|
399
399
|
{
|
|
400
400
|
"path": "skills/claude-code/references/compile-errors.md",
|
|
401
|
-
"sha256": "
|
|
401
|
+
"sha256": "f3e791d3eb7b95641791b9e63efd03852aa517d9b29e535f447fed3080fd61e4",
|
|
402
402
|
"agentTarget": "claude-code"
|
|
403
403
|
},
|
|
404
404
|
{
|
|
@@ -413,7 +413,7 @@
|
|
|
413
413
|
},
|
|
414
414
|
{
|
|
415
415
|
"path": "skills/claude-code/references/connect-an-api.md",
|
|
416
|
-
"sha256": "
|
|
416
|
+
"sha256": "982b5652635706793bf20b0d2b6abb7887302e3ab39886002b23f09d1515ac26",
|
|
417
417
|
"agentTarget": "claude-code"
|
|
418
418
|
},
|
|
419
419
|
{
|
|
@@ -423,7 +423,7 @@
|
|
|
423
423
|
},
|
|
424
424
|
{
|
|
425
425
|
"path": "skills/claude-code/references/widgets-and-apps.md",
|
|
426
|
-
"sha256": "
|
|
426
|
+
"sha256": "921d05b7f7a8044f4b9c4f8816972839eb792499b99f095ff1fbcda89a2b48b3",
|
|
427
427
|
"agentTarget": "claude-code"
|
|
428
428
|
},
|
|
429
429
|
{
|
|
@@ -653,7 +653,7 @@
|
|
|
653
653
|
},
|
|
654
654
|
{
|
|
655
655
|
"path": "skills/claude-code/examples/food-ordering/README.md",
|
|
656
|
-
"sha256": "
|
|
656
|
+
"sha256": "41fdd5b9ca345a5f0daf4633cb53e65f11d1f211f283f6ba902db3366f872809",
|
|
657
657
|
"agentTarget": "claude-code"
|
|
658
658
|
},
|
|
659
659
|
{
|
|
@@ -728,7 +728,7 @@
|
|
|
728
728
|
},
|
|
729
729
|
{
|
|
730
730
|
"path": "skills/claude-code/examples/weather/README.md",
|
|
731
|
-
"sha256": "
|
|
731
|
+
"sha256": "43ee8447a0a3f9fdcce30544c5ef3801a93eb6b9fe5e2e8791e65a6587a65545",
|
|
732
732
|
"agentTarget": "claude-code"
|
|
733
733
|
},
|
|
734
734
|
{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noodleseed/agent-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.27.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Self-checking, self-updating agent skills for the Noodle Seed CLI. Authored in this repo by @noodle-borg/agent-kit; this is the published, independently-versioned canonical skills artifact the CLI fetches and verifies.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -32,6 +32,10 @@ error/retry, and success states must remain readable without nested vertical scr
|
|
|
32
32
|
|
|
33
33
|
Like the comprehensive default `noodle init my-app` scaffold, this flagship keeps the server feature-rich
|
|
34
34
|
while making each individual widget view focused; server capability breadth and screen density are separate.
|
|
35
|
+
The compiled initial widget should normally remain under the 1 MiB performance recommendation; Noodle Seed's
|
|
36
|
+
hard ceilings are 10 MiB per compiled widget and 20 MiB across one deployment. Run `noodle check` to see raw
|
|
37
|
+
and gzip-estimated sizes, and keep menu images or large live datasets in assets/resources and app-only tools
|
|
38
|
+
rather than embedding them into the initial HTML bundle.
|
|
35
39
|
|
|
36
40
|
## Local Author Loop
|
|
37
41
|
|
|
@@ -33,6 +33,33 @@ It exercises, in one TypeScript-authored app:
|
|
|
33
33
|
- **Sandboxed compute** (no network/fs/env/clock) turning raw numbers into conditions + advice.
|
|
34
34
|
- **Typed input/output schemas** emitted as JSON Schema 2020-12.
|
|
35
35
|
|
|
36
|
+
## APIs that require form-urlencoded search bodies
|
|
37
|
+
|
|
38
|
+
The live Open-Meteo calls above are GET requests. For APIs whose search endpoint is a POST expecting
|
|
39
|
+
`application/x-www-form-urlencoded`, keep authoring a request object and select the encoding explicitly:
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
search_quotes: {
|
|
43
|
+
type: 'read',
|
|
44
|
+
method: 'POST',
|
|
45
|
+
path: '/quotes/search',
|
|
46
|
+
requestEncoding: 'form-urlencoded',
|
|
47
|
+
input: z.object({
|
|
48
|
+
fromAirportId: z.string(),
|
|
49
|
+
categories: z.array(z.string()),
|
|
50
|
+
}),
|
|
51
|
+
request: {
|
|
52
|
+
'from airport id': '${args.fromAirportId}',
|
|
53
|
+
'aircraft[categories]': '${args.categories}',
|
|
54
|
+
},
|
|
55
|
+
// output and response mapping omitted
|
|
56
|
+
},
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Noodle builds a `URLSearchParams` body: spaces and punctuation in field names are encoded normally, while
|
|
60
|
+
each array or nested object is JSON-stringified into its individual form field. Do not pre-encode the body
|
|
61
|
+
or set `Content-Type` manually; the connector owns both.
|
|
62
|
+
|
|
36
63
|
## Run it locally
|
|
37
64
|
|
|
38
65
|
From the repo root, with the workspace built (`pnpm build`):
|
|
@@ -51,6 +51,8 @@ Run `noodle validate` (add `--json` for the machine-readable envelope, `--fix-pr
|
|
|
51
51
|
| `duplicate_widget_tool` | A tool is bound to more than one widget; bind each tool to a single widget. |
|
|
52
52
|
| `invalid_widget_binding` | Fix the `data-bind`/binding expression in the widget; it does not resolve against the tool output. |
|
|
53
53
|
| `invalid_widget_state_handle` | Correct the state handle reference; declare it under `server(..., { state: { handles } })` and reference it by its declared name. |
|
|
54
|
+
| `widget_html_too_large` | Reduce the compiled widget below 10 MiB UTF-8 (or raw HTML below 256 KiB) by moving large media and dynamic data into hosted resources or bounded app-only tools. |
|
|
55
|
+
| `widget_html_total_too_large` | Reduce aggregate widget HTML below 20 MiB UTF-8; share or externalize large payloads instead of duplicating them across initial widget resources. |
|
|
54
56
|
| `invalid_asset` | Fix the `asset("./path")` reference; the file must exist and be a supported asset type. |
|
|
55
57
|
| `invalid_capability_requirement` | Correct the declared capability/permission requirement to a supported value. |
|
|
56
58
|
| `state_secret_field` | Remove the secret-shaped field from widget/handle state; secrets must never be stored in state or sent to widgets. |
|
|
@@ -90,9 +90,25 @@ response: { tasks: '${response.items}' },
|
|
|
90
90
|
## Create, update, delete
|
|
91
91
|
|
|
92
92
|
Pair the read/list with the mutations your intent tools need:
|
|
93
|
-
- **Create / update** — `method: 'POST'` / `'PATCH'`; the
|
|
93
|
+
- **Create / update** — `method: 'POST'` / `'PATCH'`; author the body as `request: { field: '${input.x}' }` (do not nest it under `body`). It is JSON by default; use `requestEncoding: 'form-urlencoded'` only when the API requires a URLSearchParams body. URL query params remain the operation-level `query: [...]` array.
|
|
94
94
|
- **Delete / close** — many endpoints return `204 No Content`. Set `responseType: 'empty'`, which enforces the status and binds `{}` (there is no body to map).
|
|
95
95
|
|
|
96
|
+
```ts
|
|
97
|
+
search_quotes: {
|
|
98
|
+
type: 'read', method: 'POST', path: '/quotes/search',
|
|
99
|
+
requestEncoding: 'form-urlencoded',
|
|
100
|
+
request: {
|
|
101
|
+
'from airport id': '${args.fromAirportId}',
|
|
102
|
+
'aircraft[categories]': '${args.categories}', // arrays become one JSON field
|
|
103
|
+
},
|
|
104
|
+
// input / output / response omitted
|
|
105
|
+
},
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
`form-urlencoded` accepts a request object, not a pre-encoded string. Noodle preserves field order,
|
|
109
|
+
omits `undefined`, stringifies primitive values, JSON-stringifies arrays/nested objects into one
|
|
110
|
+
field each, and owns the exact `application/x-www-form-urlencoded;charset=UTF-8` content type.
|
|
111
|
+
|
|
96
112
|
```ts
|
|
97
113
|
close_task: {
|
|
98
114
|
type: 'action', method: 'POST', path: '/tasks/{id}/close',
|
|
@@ -22,6 +22,8 @@ Generated widgets, official examples, and agent-authored MCP Apps must start wit
|
|
|
22
22
|
|
|
23
23
|
The default composition rule is: build the smallest useful conversational surface. Inline has one purpose, one primary action, and at most two visible actions. Use progressive disclosure or a later conversational turn for secondary detail; request fullscreen only when the user asks or the task genuinely needs it. Never use nested scrolling. At 280px and wider, the widget must remain one-column, readable, touch-safe, and free of horizontal overflow. Remove secondary chrome before shrinking essential content.
|
|
24
24
|
|
|
25
|
+
Treat 1 MiB of uncompressed UTF-8 HTML as the recommended initial React-widget budget, not a compatibility wall. Noodle Seed accepts up to 10 MiB per compiled widget and 20 MiB across a deployment; `noodle check` reports raw and gzip-estimated sizes. Keep large media and dynamic datasets in hosted assets/resources or bounded app-only tool responses instead of inflating the initial widget resource.
|
|
26
|
+
|
|
25
27
|
Every production widget handles loading, empty, partial, stale, error, retry, and success states. Prefill fields from known tool results and choose safe, reversible defaults; preserve the user’s work across rerenders, and never preselect a consequential action. Use public React primitives and branding tokens. Never author against `ns-*`, `nsr-*`, or example-local `--nw-*` classes/tokens; those are implementation details, not alternate design systems.
|
|
26
28
|
|
|
27
29
|
## React hook surface
|
package/skills/codex/SKILL.md
CHANGED
|
@@ -32,6 +32,10 @@ error/retry, and success states must remain readable without nested vertical scr
|
|
|
32
32
|
|
|
33
33
|
Like the comprehensive default `noodle init my-app` scaffold, this flagship keeps the server feature-rich
|
|
34
34
|
while making each individual widget view focused; server capability breadth and screen density are separate.
|
|
35
|
+
The compiled initial widget should normally remain under the 1 MiB performance recommendation; Noodle Seed's
|
|
36
|
+
hard ceilings are 10 MiB per compiled widget and 20 MiB across one deployment. Run `noodle check` to see raw
|
|
37
|
+
and gzip-estimated sizes, and keep menu images or large live datasets in assets/resources and app-only tools
|
|
38
|
+
rather than embedding them into the initial HTML bundle.
|
|
35
39
|
|
|
36
40
|
## Local Author Loop
|
|
37
41
|
|
|
@@ -33,6 +33,33 @@ It exercises, in one TypeScript-authored app:
|
|
|
33
33
|
- **Sandboxed compute** (no network/fs/env/clock) turning raw numbers into conditions + advice.
|
|
34
34
|
- **Typed input/output schemas** emitted as JSON Schema 2020-12.
|
|
35
35
|
|
|
36
|
+
## APIs that require form-urlencoded search bodies
|
|
37
|
+
|
|
38
|
+
The live Open-Meteo calls above are GET requests. For APIs whose search endpoint is a POST expecting
|
|
39
|
+
`application/x-www-form-urlencoded`, keep authoring a request object and select the encoding explicitly:
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
search_quotes: {
|
|
43
|
+
type: 'read',
|
|
44
|
+
method: 'POST',
|
|
45
|
+
path: '/quotes/search',
|
|
46
|
+
requestEncoding: 'form-urlencoded',
|
|
47
|
+
input: z.object({
|
|
48
|
+
fromAirportId: z.string(),
|
|
49
|
+
categories: z.array(z.string()),
|
|
50
|
+
}),
|
|
51
|
+
request: {
|
|
52
|
+
'from airport id': '${args.fromAirportId}',
|
|
53
|
+
'aircraft[categories]': '${args.categories}',
|
|
54
|
+
},
|
|
55
|
+
// output and response mapping omitted
|
|
56
|
+
},
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Noodle builds a `URLSearchParams` body: spaces and punctuation in field names are encoded normally, while
|
|
60
|
+
each array or nested object is JSON-stringified into its individual form field. Do not pre-encode the body
|
|
61
|
+
or set `Content-Type` manually; the connector owns both.
|
|
62
|
+
|
|
36
63
|
## Run it locally
|
|
37
64
|
|
|
38
65
|
From the repo root, with the workspace built (`pnpm build`):
|
|
@@ -51,6 +51,8 @@ Run `noodle validate` (add `--json` for the machine-readable envelope, `--fix-pr
|
|
|
51
51
|
| `duplicate_widget_tool` | A tool is bound to more than one widget; bind each tool to a single widget. |
|
|
52
52
|
| `invalid_widget_binding` | Fix the `data-bind`/binding expression in the widget; it does not resolve against the tool output. |
|
|
53
53
|
| `invalid_widget_state_handle` | Correct the state handle reference; declare it under `server(..., { state: { handles } })` and reference it by its declared name. |
|
|
54
|
+
| `widget_html_too_large` | Reduce the compiled widget below 10 MiB UTF-8 (or raw HTML below 256 KiB) by moving large media and dynamic data into hosted resources or bounded app-only tools. |
|
|
55
|
+
| `widget_html_total_too_large` | Reduce aggregate widget HTML below 20 MiB UTF-8; share or externalize large payloads instead of duplicating them across initial widget resources. |
|
|
54
56
|
| `invalid_asset` | Fix the `asset("./path")` reference; the file must exist and be a supported asset type. |
|
|
55
57
|
| `invalid_capability_requirement` | Correct the declared capability/permission requirement to a supported value. |
|
|
56
58
|
| `state_secret_field` | Remove the secret-shaped field from widget/handle state; secrets must never be stored in state or sent to widgets. |
|
|
@@ -90,9 +90,25 @@ response: { tasks: '${response.items}' },
|
|
|
90
90
|
## Create, update, delete
|
|
91
91
|
|
|
92
92
|
Pair the read/list with the mutations your intent tools need:
|
|
93
|
-
- **Create / update** — `method: 'POST'` / `'PATCH'`; the
|
|
93
|
+
- **Create / update** — `method: 'POST'` / `'PATCH'`; author the body as `request: { field: '${input.x}' }` (do not nest it under `body`). It is JSON by default; use `requestEncoding: 'form-urlencoded'` only when the API requires a URLSearchParams body. URL query params remain the operation-level `query: [...]` array.
|
|
94
94
|
- **Delete / close** — many endpoints return `204 No Content`. Set `responseType: 'empty'`, which enforces the status and binds `{}` (there is no body to map).
|
|
95
95
|
|
|
96
|
+
```ts
|
|
97
|
+
search_quotes: {
|
|
98
|
+
type: 'read', method: 'POST', path: '/quotes/search',
|
|
99
|
+
requestEncoding: 'form-urlencoded',
|
|
100
|
+
request: {
|
|
101
|
+
'from airport id': '${args.fromAirportId}',
|
|
102
|
+
'aircraft[categories]': '${args.categories}', // arrays become one JSON field
|
|
103
|
+
},
|
|
104
|
+
// input / output / response omitted
|
|
105
|
+
},
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
`form-urlencoded` accepts a request object, not a pre-encoded string. Noodle preserves field order,
|
|
109
|
+
omits `undefined`, stringifies primitive values, JSON-stringifies arrays/nested objects into one
|
|
110
|
+
field each, and owns the exact `application/x-www-form-urlencoded;charset=UTF-8` content type.
|
|
111
|
+
|
|
96
112
|
```ts
|
|
97
113
|
close_task: {
|
|
98
114
|
type: 'action', method: 'POST', path: '/tasks/{id}/close',
|
|
@@ -22,6 +22,8 @@ Generated widgets, official examples, and agent-authored MCP Apps must start wit
|
|
|
22
22
|
|
|
23
23
|
The default composition rule is: build the smallest useful conversational surface. Inline has one purpose, one primary action, and at most two visible actions. Use progressive disclosure or a later conversational turn for secondary detail; request fullscreen only when the user asks or the task genuinely needs it. Never use nested scrolling. At 280px and wider, the widget must remain one-column, readable, touch-safe, and free of horizontal overflow. Remove secondary chrome before shrinking essential content.
|
|
24
24
|
|
|
25
|
+
Treat 1 MiB of uncompressed UTF-8 HTML as the recommended initial React-widget budget, not a compatibility wall. Noodle Seed accepts up to 10 MiB per compiled widget and 20 MiB across a deployment; `noodle check` reports raw and gzip-estimated sizes. Keep large media and dynamic datasets in hosted assets/resources or bounded app-only tool responses instead of inflating the initial widget resource.
|
|
26
|
+
|
|
25
27
|
Every production widget handles loading, empty, partial, stale, error, retry, and success states. Prefill fields from known tool results and choose safe, reversible defaults; preserve the user’s work across rerenders, and never preselect a consequential action. Use public React primitives and branding tokens. Never author against `ns-*`, `nsr-*`, or example-local `--nw-*` classes/tokens; those are implementation details, not alternate design systems.
|
|
26
28
|
|
|
27
29
|
## React hook surface
|