@noodleseed/agent-kit 0.25.0 → 0.26.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 CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
- "packageVersion": "0.25.0",
2
+ "packageVersion": "0.26.0",
3
3
  "files": [
4
4
  {
5
5
  "path": "skills/codex/SKILL.md",
6
- "sha256": "16692acb9bc49afa05c81356a46dcf005bcae810089a596d32f59d241abc84f2",
6
+ "sha256": "49a9f988ee0abf92640cc2bcb27204e6eff3a042378a4bf1a38c93671b72d943",
7
7
  "agentTarget": "codex"
8
8
  },
9
9
  {
@@ -38,7 +38,7 @@
38
38
  },
39
39
  {
40
40
  "path": "skills/codex/references/connect-an-api.md",
41
- "sha256": "497221256ebb78300b5e4055daff3f222052a7b78fb829fd24171668dd7fc0fa",
41
+ "sha256": "982b5652635706793bf20b0d2b6abb7887302e3ab39886002b23f09d1515ac26",
42
42
  "agentTarget": "codex"
43
43
  },
44
44
  {
@@ -353,7 +353,7 @@
353
353
  },
354
354
  {
355
355
  "path": "skills/codex/examples/weather/README.md",
356
- "sha256": "59dd103ae387b4ef0f32e155dbe9a11d79e260310a07c0f266a16add2e8e31bd",
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": "728ddf5381fc4acce82d749565628f73b1164ece57319a6d50e287f3d99d1113",
381
+ "sha256": "b8ab63da424b86234affee76b69c470d2f68d7fc820d50399014bd5130e36619",
382
382
  "agentTarget": "claude-code"
383
383
  },
384
384
  {
@@ -413,7 +413,7 @@
413
413
  },
414
414
  {
415
415
  "path": "skills/claude-code/references/connect-an-api.md",
416
- "sha256": "497221256ebb78300b5e4055daff3f222052a7b78fb829fd24171668dd7fc0fa",
416
+ "sha256": "982b5652635706793bf20b0d2b6abb7887302e3ab39886002b23f09d1515ac26",
417
417
  "agentTarget": "claude-code"
418
418
  },
419
419
  {
@@ -728,7 +728,7 @@
728
728
  },
729
729
  {
730
730
  "path": "skills/claude-code/examples/weather/README.md",
731
- "sha256": "59dd103ae387b4ef0f32e155dbe9a11d79e260310a07c0f266a16add2e8e31bd",
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.25.0",
3
+ "version": "0.26.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",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: noodle-seed
3
3
  description: Use when building, validating, testing, deploying, or operating a local or hosted Noodle Seed MCP server or app authored in TypeScript with the noodle CLI.
4
- version: 0.25.0
4
+ version: 0.26.0
5
5
  hash: b4fc528d406e2149
6
6
  ---
7
7
 
@@ -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`):
@@ -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 request body is authored as `request: { field: '${input.x}' }` the `request` object **is** the JSON body (do not nest it under `body`), and URL query params are the operation-level `query: [...]` array.
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',
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: noodle-seed
3
3
  description: Use when building, validating, testing, deploying, or operating a local or hosted Noodle Seed MCP server or app authored in TypeScript with the noodle CLI.
4
- version: 0.25.0
4
+ version: 0.26.0
5
5
  hash: cd25535e1d6dbf4f
6
6
  ---
7
7
 
@@ -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`):
@@ -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 request body is authored as `request: { field: '${input.x}' }` the `request` object **is** the JSON body (do not nest it under `body`), and URL query params are the operation-level `query: [...]` array.
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',