@noodleseed/agent-kit 0.32.0 → 0.34.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/README.md CHANGED
@@ -8,10 +8,8 @@ into a project's `.agents/` and `.claude/` skill directories via `noodle agents
8
8
 
9
9
  ## Contents
10
10
 
11
- - `skills/codex/` — the Codex (Codex CLI / AGENTS.md) skill: a `SKILL.md` router plus fourteen
12
- `references/*.md` files (sdk-surface, cli-commands, agent-contract, compile-errors,
13
- authoring-workflow, connect-an-api, experience-design, widgets-and-apps, test-in-hosts,
14
- troubleshooting, deploy-and-ops, publishing, chatgpt-compliance, examples).
11
+ - `skills/codex/` — the Codex (Codex CLI / AGENTS.md) skill: a `SKILL.md` router plus versioned
12
+ `references/*.md` guidance for the SDK, CLI, workflow, UX, testing, deployment, governance, and examples.
15
13
  - `skills/claude-code/` — the Claude Code skill, same hierarchical tree.
16
14
  - `manifest.json` — `{ packageVersion, files: [{ path, sha256, agentTarget }] }`. The CLI verifies every
17
15
  file's sha256 against this manifest before writing it into a user's project; a mismatch refuses the
package/manifest.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
- "packageVersion": "0.32.0",
2
+ "packageVersion": "0.34.0",
3
3
  "files": [
4
4
  {
5
5
  "path": "skills/codex/SKILL.md",
6
- "sha256": "5f2acbe3b06a5bb88629267f361331c3644378ebd90741db7a1c6c1ce0a257df",
6
+ "sha256": "6b00524e90bc7ddc31e615ff1ebb90836aead8503ed711bbd3fab45e9ac115fc",
7
7
  "agentTarget": "codex"
8
8
  },
9
9
  {
@@ -13,7 +13,7 @@
13
13
  },
14
14
  {
15
15
  "path": "skills/codex/references/cli-commands.md",
16
- "sha256": "8d3a9aa1d68b7d5edc72605cc1f2b33e63b938ce768531fcc43cf681a264921e",
16
+ "sha256": "f5adf195aab7ebf4c9de84e21feb99d6d5e9f0c8034fb44ef53d2ed24bd58b63",
17
17
  "agentTarget": "codex"
18
18
  },
19
19
  {
@@ -23,17 +23,17 @@
23
23
  },
24
24
  {
25
25
  "path": "skills/codex/references/compile-errors.md",
26
- "sha256": "f3e791d3eb7b95641791b9e63efd03852aa517d9b29e535f447fed3080fd61e4",
26
+ "sha256": "1c9c3e58f1263838484d033ef9aa4a0efd6a1696091fd5c1b41686e1b87ac41a",
27
27
  "agentTarget": "codex"
28
28
  },
29
29
  {
30
30
  "path": "skills/codex/references/authoring-workflow.md",
31
- "sha256": "719b5ba7b04ce8c96129ac00809683889552b1bb56cba3a2ce11b9f9466ae672",
31
+ "sha256": "5e64b735675bacdff9e893c03c6a30751844325854540e8952a1092cf57b1b98",
32
32
  "agentTarget": "codex"
33
33
  },
34
34
  {
35
35
  "path": "skills/codex/references/embedded-assistant.md",
36
- "sha256": "ae70a4fdac98b74c59897f16691d3655c94bdd0b06510329b84b651b2333d33a",
36
+ "sha256": "5147837446ccde5937da5deee2a19d54c207858e02e18db919105a9fcbe0dc68",
37
37
  "agentTarget": "codex"
38
38
  },
39
39
  {
@@ -48,7 +48,7 @@
48
48
  },
49
49
  {
50
50
  "path": "skills/codex/references/widgets-and-apps.md",
51
- "sha256": "921d05b7f7a8044f4b9c4f8816972839eb792499b99f095ff1fbcda89a2b48b3",
51
+ "sha256": "a5fd322a6428c02763524cc004f8f28560f228e60cca7dd3cd419ce0ecee8fe5",
52
52
  "agentTarget": "codex"
53
53
  },
54
54
  {
@@ -63,7 +63,7 @@
63
63
  },
64
64
  {
65
65
  "path": "skills/codex/references/deploy-and-ops.md",
66
- "sha256": "17d56c27d31caf3792e16d8462986b4624335480d22a2e1483fe21745d0bd56c",
66
+ "sha256": "d7e69158ba8e2b92cccea183c55cb42b1be091516a5a4ea9af94c900d285aa15",
67
67
  "agentTarget": "codex"
68
68
  },
69
69
  {
@@ -83,7 +83,7 @@
83
83
  },
84
84
  {
85
85
  "path": "skills/codex/references/feedback.md",
86
- "sha256": "114e6825123a0a0496b4909d9898f539fd2706af806c5882b10d0a941835a1c8",
86
+ "sha256": "890bb6d9af2a150ef243728f310036fb76c3c27e420a0d7c5feb62fa456b4f00",
87
87
  "agentTarget": "codex"
88
88
  },
89
89
  {
@@ -383,7 +383,7 @@
383
383
  },
384
384
  {
385
385
  "path": "skills/claude-code/SKILL.md",
386
- "sha256": "5c4f947b83e99e5b0c536ed243ba6702041e7f93d3aff091405b8f4109779a9e",
386
+ "sha256": "fe1c89cb5087de6dd67a02754a7b7553d42c26501b795ec243659e66c0585c7d",
387
387
  "agentTarget": "claude-code"
388
388
  },
389
389
  {
@@ -393,7 +393,7 @@
393
393
  },
394
394
  {
395
395
  "path": "skills/claude-code/references/cli-commands.md",
396
- "sha256": "8d3a9aa1d68b7d5edc72605cc1f2b33e63b938ce768531fcc43cf681a264921e",
396
+ "sha256": "f5adf195aab7ebf4c9de84e21feb99d6d5e9f0c8034fb44ef53d2ed24bd58b63",
397
397
  "agentTarget": "claude-code"
398
398
  },
399
399
  {
@@ -403,17 +403,17 @@
403
403
  },
404
404
  {
405
405
  "path": "skills/claude-code/references/compile-errors.md",
406
- "sha256": "f3e791d3eb7b95641791b9e63efd03852aa517d9b29e535f447fed3080fd61e4",
406
+ "sha256": "1c9c3e58f1263838484d033ef9aa4a0efd6a1696091fd5c1b41686e1b87ac41a",
407
407
  "agentTarget": "claude-code"
408
408
  },
409
409
  {
410
410
  "path": "skills/claude-code/references/authoring-workflow.md",
411
- "sha256": "719b5ba7b04ce8c96129ac00809683889552b1bb56cba3a2ce11b9f9466ae672",
411
+ "sha256": "5e64b735675bacdff9e893c03c6a30751844325854540e8952a1092cf57b1b98",
412
412
  "agentTarget": "claude-code"
413
413
  },
414
414
  {
415
415
  "path": "skills/claude-code/references/embedded-assistant.md",
416
- "sha256": "ae70a4fdac98b74c59897f16691d3655c94bdd0b06510329b84b651b2333d33a",
416
+ "sha256": "5147837446ccde5937da5deee2a19d54c207858e02e18db919105a9fcbe0dc68",
417
417
  "agentTarget": "claude-code"
418
418
  },
419
419
  {
@@ -428,7 +428,7 @@
428
428
  },
429
429
  {
430
430
  "path": "skills/claude-code/references/widgets-and-apps.md",
431
- "sha256": "921d05b7f7a8044f4b9c4f8816972839eb792499b99f095ff1fbcda89a2b48b3",
431
+ "sha256": "a5fd322a6428c02763524cc004f8f28560f228e60cca7dd3cd419ce0ecee8fe5",
432
432
  "agentTarget": "claude-code"
433
433
  },
434
434
  {
@@ -443,7 +443,7 @@
443
443
  },
444
444
  {
445
445
  "path": "skills/claude-code/references/deploy-and-ops.md",
446
- "sha256": "17d56c27d31caf3792e16d8462986b4624335480d22a2e1483fe21745d0bd56c",
446
+ "sha256": "d7e69158ba8e2b92cccea183c55cb42b1be091516a5a4ea9af94c900d285aa15",
447
447
  "agentTarget": "claude-code"
448
448
  },
449
449
  {
@@ -463,7 +463,7 @@
463
463
  },
464
464
  {
465
465
  "path": "skills/claude-code/references/feedback.md",
466
- "sha256": "114e6825123a0a0496b4909d9898f539fd2706af806c5882b10d0a941835a1c8",
466
+ "sha256": "890bb6d9af2a150ef243728f310036fb76c3c27e420a0d7c5feb62fa456b4f00",
467
467
  "agentTarget": "claude-code"
468
468
  },
469
469
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noodleseed/agent-kit",
3
- "version": "0.32.0",
3
+ "version": "0.34.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,10 +1,10 @@
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.32.0
5
- hash: 9e69b4cf0440dc2d
6
4
  ---
7
5
 
6
+ <!-- noodle-skill version:0.34.0 hash:a26379cb2c3369a6 -->
7
+
8
8
  # Noodle Seed
9
9
 
10
10
  Build, validate, test, deploy, and operate Noodle Seed MCP servers and apps authored in TypeScript with the `noodle` CLI. Author from the configured entrypoint (usually `server.ts`); keep the authoring surface TypeScript-only.
@@ -51,11 +51,11 @@ Scan all of these during discovery; open in full the ones your task touches:
51
51
  - `references/publishing.md` — submit to the ChatGPT apps directory and Claude connectors directory.
52
52
  - `references/chatgpt-compliance.md` — the OpenAI Apps SDK pre-submission checklist (beyond the metadata gate): conversational value, helpful-UI-only, in-chat completion, UI guidelines, domain guardrails, privacy.
53
53
  - `references/examples.md` — flagship example index and a canonical `server.ts`.
54
- - `references/feedback.md` — send sanitized product feedback to the Noodle Seed team with `noodle feedback`, proactively, whenever you discover a bug, gap, or improvement.
54
+ - `references/feedback.md` — draft sanitized product feedback, show the user the exact command, and submit only after explicit user approval.
55
55
 
56
56
  ## Product feedback
57
57
 
58
- When you discover a bug, missing capability, misleading doc, or improvement idea in the CLI, SDK, or any part of Noodle Seed, send it in the moment with `noodle feedback` sanitized per `references/feedback.md` (never customer code, secrets, or personal data), one submission per finding.
58
+ When you discover a bug, missing capability, misleading doc, or improvement idea, draft one sanitized `noodle feedback` command per finding. Show the user the exact command and ask for explicit user approval. Do not run or submit it until approval is given. Follow `references/feedback.md`; never include customer code, secrets, personal data, or identifying project details.
59
59
 
60
60
  ## Safety
61
61
 
@@ -233,7 +233,7 @@ The model never sees a task id from the user; `find_tasks` returns `{ id, title
233
233
 
234
234
  ## Invocation context
235
235
 
236
- Every executable invocation receives one immutable server-authoritative temporal snapshot. Canonical TypeScript authoring emits Core v2 and does not create a hidden context tool. Use `server(..., { context })` for locale/time-zone defaults and trusted ambient facts, and designate one normal zero-input tool with `contextProvider: true` when the model needs portable application context. The embedded host preloads it per turn; Claude, ChatGPT, and other MCP hosts call it normally.
236
+ Every executable invocation receives one immutable server-authoritative temporal snapshot. TypeScript authoring does not create a hidden context tool. Use `server(..., { context })` for locale/time-zone defaults and trusted ambient facts, and designate one normal zero-input tool with `contextProvider: true` when the model needs portable application context. The embedded host preloads it per turn; Claude, ChatGPT, and other MCP hosts call it normally.
237
237
 
238
238
  ```ts
239
239
  context: {
@@ -251,7 +251,7 @@ context: {
251
251
  },
252
252
  ```
253
253
 
254
- Ambient providers are recorded as fulfilment data at author time, may call read-only connector operations only, and have a declared output schema. Later fulfilments read `${context.temporal.localDate}`, `${context.temporal.timeZone}`, `${context.ambient.defaultTeamId}`, and `${context.ambientStatus}`. If ambient resolution fails, the status is `unavailable`; never invent the missing business facts. Core-v1 `server.context` keeps the reserved `noodle_context` adapter; Core v2 never reserves it. Ambient/model-visible context is capped at 16 KiB serialized JSON, depth 8, and 128 entries per container; credential-shaped keys are rejected.
254
+ Ambient providers are recorded as fulfilment data at author time, may call read-only connector operations only, and have a declared output schema. Later fulfilments read `${context.temporal.localDate}`, `${context.temporal.timeZone}`, `${context.ambient.defaultTeamId}`, and `${context.ambientStatus}`. If ambient resolution fails, the status is `unavailable`; never invent the missing business facts. Ambient/model-visible context is capped at 16 KiB serialized JSON, depth 8, and 128 entries per container; credential-shaped keys are rejected.
255
255
 
256
256
  ## Ask for structured missing input
257
257
 
@@ -1,6 +1,6 @@
1
1
  # noodle CLI commands
2
2
 
3
- Every `noodle` command, grouped by area. Local authoring commands (`validate`, `test`, `dev`, `tools`, `resources`, `prompts`) need no login or link.
3
+ Developer-facing `noodle` commands, grouped by area. Local authoring commands (`validate`, `test`, `dev`, `tools`, `resources`, `prompts`) need no login or link. Discover the exact command surface for the installed release with `noodle commands --json`.
4
4
 
5
5
  ## Contents
6
6
 
@@ -11,7 +11,6 @@ Every `noodle` command, grouped by area. Local authoring commands (`validate`, `
11
11
  - Managed config
12
12
  - Governance & observability
13
13
  - CLI maintenance
14
- - Deprecated
15
14
 
16
15
  ## Authoring & validation
17
16
 
@@ -64,7 +63,6 @@ Every `noodle` command, grouped by area. Local authoring commands (`validate`, `
64
63
  | `noodle logout` | Clear saved credentials. |
65
64
  | `noodle whoami` | Print the current authenticated user. |
66
65
  | `noodle feedback` | Send sanitized product feedback (bug, idea, docs gap) to the Noodle Seed team. |
67
- | `noodle list` | Removed — promoted to `deployments list` (prints the recovery pointer and exits 2). |
68
66
  | `noodle github` | Connect, inspect, or disconnect the GitHub repository behind an app’s GitHub-native deploys (`connect`/`status`/`disconnect`; `connect` opens a browser install, `--repo` for headless). |
69
67
  | `noodle target` | Show or set the deployment target (local\|cloud\|other). |
70
68
 
@@ -87,7 +85,6 @@ Every `noodle` command, grouped by area. Local authoring commands (`validate`, `
87
85
  | Command | What it does |
88
86
  | :-- | :-- |
89
87
  | `noodle audit` | Operator governance audit status and event queries. |
90
- | `noodle billing` | Super-admin preview of the explicit legacy billing-account migration without writing data (`billing migration preview`). |
91
88
  | `noodle logs` | View service/deployment logs. |
92
89
  | `noodle metrics` | MCP analytics for a deployed server (volume, sessions, latency percentiles, two-tier errors, tools, clients). Agents: `noodle metrics --agent-output` for a health verdict + next actions. |
93
90
  | `noodle events` | The per-request MCP event stream with status/tool/client filters; `--session <id>` replays one session in order. Agents: add `--json` and filter (`--status tool_error\|mcp_error`) when debugging. |
@@ -102,10 +99,4 @@ Every `noodle` command, grouped by area. Local authoring commands (`validate`, `
102
99
  | `noodle version` | Print the installed CLI version. |
103
100
  | `noodle commands` | Print the machine-readable command catalog (`--json`) or a compact human list. Agents: `noodle commands --json` for every command, subcommand, flag, and exit code without reading source. |
104
101
  | `noodle features` | Print the versioned Claude, ChatGPT, and Embedded compatibility registry (`--json` or `--markdown`). |
105
- | `noodle update` | Check for, install, or safely repair the CLI update. Agents: `noodle update --check --json`, then `noodle update --yes --json`; add `--repair` only when the check reports `repairSafe: true`. |
106
-
107
- ## Deprecated
108
-
109
- | Command | What it does |
110
- | :-- | :-- |
111
- | `noodle keys` | Removed: this command no longer exists; hosted access is identity-based. |
102
+ | `noodle update` | Check for, install, or safely repair the CLI update. Agents: `noodle update --check --json`, then `noodle update --yes --json`; add `--repair` only when the check reports `repairSafe: true`. |
@@ -13,12 +13,12 @@ Run `noodle validate` (add `--json` for the machine-readable envelope, `--fix-pr
13
13
 
14
14
  | Code | Fix |
15
15
  | :-- | :-- |
16
- | `invalid_context_provider` | Designate at most one normal Core-v2 tool with `contextProvider: true`, and give it an empty object input schema. |
16
+ | `invalid_context_provider` | Designate at most one normal tool with `contextProvider: true`, and give it an empty object input schema. |
17
17
  | `yaml_parse_error` | Author in TypeScript; this means the compiled manifest was malformed — re-run from server.ts, do not hand-edit manifest data. |
18
18
  | `invalid_shape` | A field has the wrong type or structure; match the shape the compiler reports under `path` against the SDK builder you used. |
19
19
  | `invalid_name` | Rename the identifier to match the allowed pattern (lowercase, no spaces/reserved characters) cited at `path`. |
20
20
  | `duplicate_name` | Two tools/components share a name; give each a unique name at the cited `path`. |
21
- | `reserved_name` | For Core v1 with `server.context`, rename `noodle_context`; Core v2 does not reserve it and uses an explicit context-provider tool. |
21
+ | `reserved_name` | Rename the reserved identifier and use one explicit zero-input tool with `contextProvider: true` when the model needs application context. |
22
22
  | `unsupported_manifest_version` | Update the SDK/CLI so the emitted manifest version is supported; do not pin an old manifest shape. |
23
23
  | `reserved_for_future_version` | The verb at `path` (currently `compute` as a flow step) is reserved for a future core version; express the step with `use` (a connector operation), `map` (a pure mapping), or the shipped `ctx.elicit` input primitive instead. |
24
24
  | `invalid_operation_ref` | Fix the connector operation reference to `alias.operation` for an operation that exists on that connector. |
@@ -64,10 +64,6 @@ Once deployed, register the server as a tool in a host with `noodle connect <hos
64
64
 
65
65
  Manage runtime config with `noodle secrets` / `noodle variables` (scoped org/app/env). Operators use `noodle logs`, `noodle audit`, and `noodle policy` for logs, governance audit, and policy.
66
66
 
67
- ## Billing migration preview
68
-
69
- `noodle billing migration preview [--file <mapping.json>]` is a super-admin, read-only inventory and validation command for legacy organizations. It never creates billing accounts, links organizations, or changes entitlements, and there is no apply command. Keep real mapping files outside the repository. The versioned file must classify production apps for every organization: `linkState: "unlinked"` selects a current owner subject under the fixed hosted issuer `https://accounts.google.com`, while `linkState: "linked"` asserts the exact current billing-account ID and link version. Inventory apps with `noodle apps list --archived --json` so archive state is visible. A blocked preview exits 1 even though the JSON response is a successful preview envelope; inspect `data.preview.blockers` and resolve every blocker before a future cutover workflow exists.
70
-
71
67
  ## Agent-safe CLI recipes
72
68
 
73
69
  Use explicit flags in headless runs so commands never wait for a prompt:
@@ -83,7 +79,6 @@ noodle validate --json
83
79
  noodle test --json
84
80
  noodle deploy --json
85
81
  noodle smoke --json
86
- noodle billing migration preview --json
87
82
  noodle agents doctor --json
88
83
  ```
89
84
 
@@ -180,7 +180,7 @@ context: {
180
180
  },
181
181
  ```
182
182
 
183
- The callback records declarative fulfilment at author time; the shared runtime executes only read-only connector operations, validates the declared output, and freezes one snapshot for the whole invocation and any accepted interaction. Tools/resources/prompts read `context.temporal`, `context.ambient`, and `context.ambientStatus`. The embedded assistant receives the same snapshot in trusted platform context. For model-visible application context in every host, designate one normal zero-input tool with `contextProvider: true`; the embedded host preloads it per turn and external hosts call it normally. Core-v1 `server.context` retains the legacy reserved `noodle_context` adapter, while canonical Core-v2 TypeScript authoring does not create or reserve it. Keep ambient facts compact: the platform caps serialized JSON at 16 KiB, depth 8, and 128 entries per container, and rejects credential-shaped keys.
183
+ The callback records declarative fulfilment at author time; the shared runtime executes only read-only connector operations, validates the declared output, and freezes one snapshot for the whole invocation and any accepted interaction. Tools/resources/prompts read `context.temporal`, `context.ambient`, and `context.ambientStatus`. The embedded assistant receives the same snapshot in trusted platform context. For model-visible application context in every host, designate one normal zero-input tool with `contextProvider: true`; the embedded host preloads it per turn and external hosts call it normally. Keep ambient facts compact: the platform caps serialized JSON at 16 KiB, depth 8, and 128 entries per container, and rejects credential-shaped keys.
184
184
 
185
185
  ## Structured missing input
186
186
 
@@ -304,7 +304,7 @@ if (pendingId) {
304
304
  - Signed-out session exchange returns `401`.
305
305
  - The browser network/DOM/storage contains no client secret or model key.
306
306
  - The local and production origins match `allowedOrigins` character-for-character.
307
- - At the manifest/runtime boundary and in TypeScript action helpers, only `confirm: true` enables confirmation; omitted or `false` preserves Core-v1 direct execution. Action hints alone never enforce approval; `annotations.action({ confirm: false })` is equivalent to omission.
307
+ - At the manifest/runtime boundary and in TypeScript action helpers, only `confirm: true` enables confirmation; omitted or `false` preserves direct execution. Action hints alone never enforce approval; `annotations.action({ confirm: false })` is equivalent to omission.
308
308
  - An expired turn re-exchanges once; interaction decisions never auto-retry. An explicit same-decision repeat returns the stored outcome without executing again.
309
309
  - Accept, decline, and cancel are single-use. Only accept executes; the server ignores replacement tool arguments.
310
310
  - Wrong-origin and malformed-origin requests fail closed.
@@ -328,6 +328,6 @@ if (pendingId) {
328
328
  | Relative dates use the wrong day or time zone | No verified user preference and the browser hint is missing/stale | Pass saved `preferences` from the backend; provide a fresh per-turn `clientContext` in a headless renderer |
329
329
  | The model invents a team/holiday after context lookup fails | The ambient provider returned invalid data or its read-only connector failed (`ambientStatus: unavailable`) | Fix the provider/connector; treat unavailable ambient facts as missing, never prompt instructions |
330
330
  | Decline/cancel reports `unsupported_service` | The session came from a legacy service with no `endpoints.interactions` | Upgrade the service; legacy `toolConfirmations` supports accept only |
331
- | Behavior does not change after `noodle deploy` | Outdated platform: before the 2026-07 fix, clients were pinned to their creation-time deployment | Update the platform; sessions now follow the tenant's active deployment |
331
+ | Behavior does not change after `noodle deploy` | The client is not following the tenant's active deployment | Restart the client session and confirm the selected tenant and deployment |
332
332
  | A delegated connector returns `credential_unavailable` / `caller_identity_not_customer` | The calling surface has no verified customer identity (or an old session minted before the platform carried the resource audience) | Verify `customerAuth` is configured, the backend passes the verified `user`, and run `noodle auth doctor --live` |
333
333
  | Deploy fails with `unsupported_delegated_provider` | `delegatedOAuth.provider` only supports the managed `firebase`/`microsoft` bridges | Use `auth.kind: "delegatedTokenExchange"` for your own token endpoint (see authoring-workflow.md) |
@@ -1,19 +1,20 @@
1
1
  # Send product feedback
2
2
 
3
- When you — the coding agent — discover a way Noodle Seed could be better, tell the team with one command. Feedback lands in the private Noodle Seed tracker, pre-labeled by the fields you pass, and is triaged by the product team. Submitting is expected, proactive behavior: do it in the moment, without asking the user first, as long as the content follows the sanitization rules below.
3
+ When you — the coding agent — discover a way Noodle Seed could be better, prepare one sanitized feedback proposal. Feedback crosses the customer project boundary and lands in Noodle Seed’s private tracker, so the user must make an informed choice. Show the user the exact command and ask for explicit user approval. Do not run or submit it until approval is given.
4
4
 
5
5
  ## Contents
6
6
 
7
- - When to send feedback (proactive triggers)
7
+ - When to propose feedback
8
+ - Approval workflow
8
9
  - The command
9
10
  - Choose the structured fields
10
11
  - Sanitization rules (hard requirements)
11
12
  - Minimal repro guidance
12
13
  - After you submit
13
14
 
14
- ## When to send feedback (proactive triggers)
15
+ ## When to propose feedback
15
16
 
16
- Send one `noodle feedback` per distinct finding whenever you:
17
+ Draft one `noodle feedback` proposal per distinct finding when you:
17
18
 
18
19
  - hit a CLI or SDK error that cost you retries, or whose message/`fix`/`next` guidance misled you;
19
20
  - discover a missing capability you had to work around (in the CLI, SDK, widgets, connectors, deploy lane, console, or docs);
@@ -21,7 +22,14 @@ Send one `noodle feedback` per distinct finding whenever you:
21
22
  - notice confusing command output, a broken `--json` envelope, or a wrong exit code;
22
23
  - have a concrete idea that would make authoring or operating apps faster.
23
24
 
24
- Do not batch several findings into one submission, and do not re-submit the same finding in the same session. Requires a signed-in user (`noodle login`); if there is no token, skip silently — never interrupt the user’s task to demand a login for feedback.
25
+ Do not batch several findings into one proposal, and do not re-propose the same finding in the same session.
26
+
27
+ ## Approval workflow
28
+
29
+ 1. Draft and sanitize the title, message, labels, and exact shell command.
30
+ 2. Show the user the exact command and explain that it sends the shown content plus CLI version, OS/platform, and Node version to Noodle Seed’s private tracker.
31
+ 3. Ask for explicit user approval. Do not run, submit, or send anything until the user clearly approves that exact proposal.
32
+ 4. After approval, run it once. If authentication is missing, report that feedback was not sent and offer the normal `noodle login` path; never sign in or retry without direction.
25
33
 
26
34
  ## The command
27
35
 
@@ -31,7 +39,7 @@ noodle feedback "resources list --json omits the truncated flag the docs promise
31
39
  --type fix --severity P2 --area cli --json
32
40
  ```
33
41
 
34
- The message is required (1–4000 chars). Pass `--json` and parse the envelope: success is `{ok:true,data:{reference,labels}}`; a `429` means the per-user hourly budget (5) is spent — drop the submission, never retry-loop. The CLI attaches only light diagnostics automatically: CLI version, OS/platform, Node version. Nothing else is collected.
42
+ This is an example only; build the exact command for the finding and show it before execution. The message is required (1–4000 chars). Pass `--json` and parse the envelope: success is `{ok:true,data:{reference,labels}}`; a `429` means the per-user hourly budget (5) is spent — report that it was not sent and never retry-loop. The CLI attaches only the disclosed light diagnostics automatically: CLI version, OS/platform, Node version. Nothing else is collected.
35
43
 
36
44
  ## Choose the structured fields
37
45
 
@@ -64,4 +72,4 @@ Repro: applies to every connector whose response mapping references a nested arr
64
72
 
65
73
  ## After you submit
66
74
 
67
- The returned `reference` (e.g. `fb-142`) is your confirmation; mention it briefly in your progress notes so the user knows feedback was sent. Feedback goes to a private tracker — there is no public issue link, and no follow-up action is needed. Continue the user’s task immediately; feedback must never block or slow their work.
75
+ Only after explicit user approval and a successful command, the returned `reference` (e.g. `fb-142`) is confirmation; mention it briefly so the user knows what was sent. Feedback goes to a private tracker — there is no public issue link, and no follow-up action is needed. Continue the user’s task immediately; feedback must never block or slow their work.
@@ -18,7 +18,7 @@ Use `tool(name, { description, input, output, fulfil, view })` for a model-visib
18
18
 
19
19
  Generated widgets, official examples, and agent-authored MCP Apps must start with `@noodleseed/one/react` primitives and semantic tokens. Custom React/CSS or third-party components remain valid when the kit lacks the required behavior or the developer explicitly requests them.
20
20
 
21
- `noodle init my-app` defaults to the Core-v2 SaaS profile: federated OIDC placeholders, one explicit context-provider tool, MCP App UI, resource, prompt, state contract, branding, handoff, and embedded assistant. Begin by replacing the IdP/audience/domain placeholders. Use `--template widget`, `hello`, or `http-api` only when that narrower profile is intentional.
21
+ `noodle init my-app` defaults to the SaaS profile: federated OIDC placeholders, one explicit context-provider tool, MCP App UI, resource, prompt, state contract, branding, handoff, and embedded assistant. Begin by replacing the IdP/audience/domain placeholders. Use `--template widget`, `hello`, or `http-api` only when that narrower profile is intentional.
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
 
@@ -1,10 +1,10 @@
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.32.0
5
- hash: 7228bf705097483b
6
4
  ---
7
5
 
6
+ <!-- noodle-skill version:0.34.0 hash:25832eb0ac3cd277 -->
7
+
8
8
  # Noodle Seed
9
9
 
10
10
  Build, validate, test, deploy, and operate Noodle Seed MCP servers and apps authored in TypeScript with the `noodle` CLI. Author from the configured entrypoint (usually `server.ts`); keep the authoring surface TypeScript-only.
@@ -51,11 +51,11 @@ Scan all of these during discovery; open in full the ones your task touches:
51
51
  - `references/publishing.md` — submit to the ChatGPT apps directory and Claude connectors directory.
52
52
  - `references/chatgpt-compliance.md` — the OpenAI Apps SDK pre-submission checklist (beyond the metadata gate): conversational value, helpful-UI-only, in-chat completion, UI guidelines, domain guardrails, privacy.
53
53
  - `references/examples.md` — flagship example index and a canonical `server.ts`.
54
- - `references/feedback.md` — send sanitized product feedback to the Noodle Seed team with `noodle feedback`, proactively, whenever you discover a bug, gap, or improvement.
54
+ - `references/feedback.md` — draft sanitized product feedback, show the user the exact command, and submit only after explicit user approval.
55
55
 
56
56
  ## Product feedback
57
57
 
58
- When you discover a bug, missing capability, misleading doc, or improvement idea in the CLI, SDK, or any part of Noodle Seed, send it in the moment with `noodle feedback` sanitized per `references/feedback.md` (never customer code, secrets, or personal data), one submission per finding.
58
+ When you discover a bug, missing capability, misleading doc, or improvement idea, draft one sanitized `noodle feedback` command per finding. Show the user the exact command and ask for explicit user approval. Do not run or submit it until approval is given. Follow `references/feedback.md`; never include customer code, secrets, personal data, or identifying project details.
59
59
 
60
60
  ## Safety
61
61
 
@@ -233,7 +233,7 @@ The model never sees a task id from the user; `find_tasks` returns `{ id, title
233
233
 
234
234
  ## Invocation context
235
235
 
236
- Every executable invocation receives one immutable server-authoritative temporal snapshot. Canonical TypeScript authoring emits Core v2 and does not create a hidden context tool. Use `server(..., { context })` for locale/time-zone defaults and trusted ambient facts, and designate one normal zero-input tool with `contextProvider: true` when the model needs portable application context. The embedded host preloads it per turn; Claude, ChatGPT, and other MCP hosts call it normally.
236
+ Every executable invocation receives one immutable server-authoritative temporal snapshot. TypeScript authoring does not create a hidden context tool. Use `server(..., { context })` for locale/time-zone defaults and trusted ambient facts, and designate one normal zero-input tool with `contextProvider: true` when the model needs portable application context. The embedded host preloads it per turn; Claude, ChatGPT, and other MCP hosts call it normally.
237
237
 
238
238
  ```ts
239
239
  context: {
@@ -251,7 +251,7 @@ context: {
251
251
  },
252
252
  ```
253
253
 
254
- Ambient providers are recorded as fulfilment data at author time, may call read-only connector operations only, and have a declared output schema. Later fulfilments read `${context.temporal.localDate}`, `${context.temporal.timeZone}`, `${context.ambient.defaultTeamId}`, and `${context.ambientStatus}`. If ambient resolution fails, the status is `unavailable`; never invent the missing business facts. Core-v1 `server.context` keeps the reserved `noodle_context` adapter; Core v2 never reserves it. Ambient/model-visible context is capped at 16 KiB serialized JSON, depth 8, and 128 entries per container; credential-shaped keys are rejected.
254
+ Ambient providers are recorded as fulfilment data at author time, may call read-only connector operations only, and have a declared output schema. Later fulfilments read `${context.temporal.localDate}`, `${context.temporal.timeZone}`, `${context.ambient.defaultTeamId}`, and `${context.ambientStatus}`. If ambient resolution fails, the status is `unavailable`; never invent the missing business facts. Ambient/model-visible context is capped at 16 KiB serialized JSON, depth 8, and 128 entries per container; credential-shaped keys are rejected.
255
255
 
256
256
  ## Ask for structured missing input
257
257
 
@@ -1,6 +1,6 @@
1
1
  # noodle CLI commands
2
2
 
3
- Every `noodle` command, grouped by area. Local authoring commands (`validate`, `test`, `dev`, `tools`, `resources`, `prompts`) need no login or link.
3
+ Developer-facing `noodle` commands, grouped by area. Local authoring commands (`validate`, `test`, `dev`, `tools`, `resources`, `prompts`) need no login or link. Discover the exact command surface for the installed release with `noodle commands --json`.
4
4
 
5
5
  ## Contents
6
6
 
@@ -11,7 +11,6 @@ Every `noodle` command, grouped by area. Local authoring commands (`validate`, `
11
11
  - Managed config
12
12
  - Governance & observability
13
13
  - CLI maintenance
14
- - Deprecated
15
14
 
16
15
  ## Authoring & validation
17
16
 
@@ -64,7 +63,6 @@ Every `noodle` command, grouped by area. Local authoring commands (`validate`, `
64
63
  | `noodle logout` | Clear saved credentials. |
65
64
  | `noodle whoami` | Print the current authenticated user. |
66
65
  | `noodle feedback` | Send sanitized product feedback (bug, idea, docs gap) to the Noodle Seed team. |
67
- | `noodle list` | Removed — promoted to `deployments list` (prints the recovery pointer and exits 2). |
68
66
  | `noodle github` | Connect, inspect, or disconnect the GitHub repository behind an app’s GitHub-native deploys (`connect`/`status`/`disconnect`; `connect` opens a browser install, `--repo` for headless). |
69
67
  | `noodle target` | Show or set the deployment target (local\|cloud\|other). |
70
68
 
@@ -87,7 +85,6 @@ Every `noodle` command, grouped by area. Local authoring commands (`validate`, `
87
85
  | Command | What it does |
88
86
  | :-- | :-- |
89
87
  | `noodle audit` | Operator governance audit status and event queries. |
90
- | `noodle billing` | Super-admin preview of the explicit legacy billing-account migration without writing data (`billing migration preview`). |
91
88
  | `noodle logs` | View service/deployment logs. |
92
89
  | `noodle metrics` | MCP analytics for a deployed server (volume, sessions, latency percentiles, two-tier errors, tools, clients). Agents: `noodle metrics --agent-output` for a health verdict + next actions. |
93
90
  | `noodle events` | The per-request MCP event stream with status/tool/client filters; `--session <id>` replays one session in order. Agents: add `--json` and filter (`--status tool_error\|mcp_error`) when debugging. |
@@ -102,10 +99,4 @@ Every `noodle` command, grouped by area. Local authoring commands (`validate`, `
102
99
  | `noodle version` | Print the installed CLI version. |
103
100
  | `noodle commands` | Print the machine-readable command catalog (`--json`) or a compact human list. Agents: `noodle commands --json` for every command, subcommand, flag, and exit code without reading source. |
104
101
  | `noodle features` | Print the versioned Claude, ChatGPT, and Embedded compatibility registry (`--json` or `--markdown`). |
105
- | `noodle update` | Check for, install, or safely repair the CLI update. Agents: `noodle update --check --json`, then `noodle update --yes --json`; add `--repair` only when the check reports `repairSafe: true`. |
106
-
107
- ## Deprecated
108
-
109
- | Command | What it does |
110
- | :-- | :-- |
111
- | `noodle keys` | Removed: this command no longer exists; hosted access is identity-based. |
102
+ | `noodle update` | Check for, install, or safely repair the CLI update. Agents: `noodle update --check --json`, then `noodle update --yes --json`; add `--repair` only when the check reports `repairSafe: true`. |
@@ -13,12 +13,12 @@ Run `noodle validate` (add `--json` for the machine-readable envelope, `--fix-pr
13
13
 
14
14
  | Code | Fix |
15
15
  | :-- | :-- |
16
- | `invalid_context_provider` | Designate at most one normal Core-v2 tool with `contextProvider: true`, and give it an empty object input schema. |
16
+ | `invalid_context_provider` | Designate at most one normal tool with `contextProvider: true`, and give it an empty object input schema. |
17
17
  | `yaml_parse_error` | Author in TypeScript; this means the compiled manifest was malformed — re-run from server.ts, do not hand-edit manifest data. |
18
18
  | `invalid_shape` | A field has the wrong type or structure; match the shape the compiler reports under `path` against the SDK builder you used. |
19
19
  | `invalid_name` | Rename the identifier to match the allowed pattern (lowercase, no spaces/reserved characters) cited at `path`. |
20
20
  | `duplicate_name` | Two tools/components share a name; give each a unique name at the cited `path`. |
21
- | `reserved_name` | For Core v1 with `server.context`, rename `noodle_context`; Core v2 does not reserve it and uses an explicit context-provider tool. |
21
+ | `reserved_name` | Rename the reserved identifier and use one explicit zero-input tool with `contextProvider: true` when the model needs application context. |
22
22
  | `unsupported_manifest_version` | Update the SDK/CLI so the emitted manifest version is supported; do not pin an old manifest shape. |
23
23
  | `reserved_for_future_version` | The verb at `path` (currently `compute` as a flow step) is reserved for a future core version; express the step with `use` (a connector operation), `map` (a pure mapping), or the shipped `ctx.elicit` input primitive instead. |
24
24
  | `invalid_operation_ref` | Fix the connector operation reference to `alias.operation` for an operation that exists on that connector. |
@@ -64,10 +64,6 @@ Once deployed, register the server as a tool in a host with `noodle connect <hos
64
64
 
65
65
  Manage runtime config with `noodle secrets` / `noodle variables` (scoped org/app/env). Operators use `noodle logs`, `noodle audit`, and `noodle policy` for logs, governance audit, and policy.
66
66
 
67
- ## Billing migration preview
68
-
69
- `noodle billing migration preview [--file <mapping.json>]` is a super-admin, read-only inventory and validation command for legacy organizations. It never creates billing accounts, links organizations, or changes entitlements, and there is no apply command. Keep real mapping files outside the repository. The versioned file must classify production apps for every organization: `linkState: "unlinked"` selects a current owner subject under the fixed hosted issuer `https://accounts.google.com`, while `linkState: "linked"` asserts the exact current billing-account ID and link version. Inventory apps with `noodle apps list --archived --json` so archive state is visible. A blocked preview exits 1 even though the JSON response is a successful preview envelope; inspect `data.preview.blockers` and resolve every blocker before a future cutover workflow exists.
70
-
71
67
  ## Agent-safe CLI recipes
72
68
 
73
69
  Use explicit flags in headless runs so commands never wait for a prompt:
@@ -83,7 +79,6 @@ noodle validate --json
83
79
  noodle test --json
84
80
  noodle deploy --json
85
81
  noodle smoke --json
86
- noodle billing migration preview --json
87
82
  noodle agents doctor --json
88
83
  ```
89
84
 
@@ -180,7 +180,7 @@ context: {
180
180
  },
181
181
  ```
182
182
 
183
- The callback records declarative fulfilment at author time; the shared runtime executes only read-only connector operations, validates the declared output, and freezes one snapshot for the whole invocation and any accepted interaction. Tools/resources/prompts read `context.temporal`, `context.ambient`, and `context.ambientStatus`. The embedded assistant receives the same snapshot in trusted platform context. For model-visible application context in every host, designate one normal zero-input tool with `contextProvider: true`; the embedded host preloads it per turn and external hosts call it normally. Core-v1 `server.context` retains the legacy reserved `noodle_context` adapter, while canonical Core-v2 TypeScript authoring does not create or reserve it. Keep ambient facts compact: the platform caps serialized JSON at 16 KiB, depth 8, and 128 entries per container, and rejects credential-shaped keys.
183
+ The callback records declarative fulfilment at author time; the shared runtime executes only read-only connector operations, validates the declared output, and freezes one snapshot for the whole invocation and any accepted interaction. Tools/resources/prompts read `context.temporal`, `context.ambient`, and `context.ambientStatus`. The embedded assistant receives the same snapshot in trusted platform context. For model-visible application context in every host, designate one normal zero-input tool with `contextProvider: true`; the embedded host preloads it per turn and external hosts call it normally. Keep ambient facts compact: the platform caps serialized JSON at 16 KiB, depth 8, and 128 entries per container, and rejects credential-shaped keys.
184
184
 
185
185
  ## Structured missing input
186
186
 
@@ -304,7 +304,7 @@ if (pendingId) {
304
304
  - Signed-out session exchange returns `401`.
305
305
  - The browser network/DOM/storage contains no client secret or model key.
306
306
  - The local and production origins match `allowedOrigins` character-for-character.
307
- - At the manifest/runtime boundary and in TypeScript action helpers, only `confirm: true` enables confirmation; omitted or `false` preserves Core-v1 direct execution. Action hints alone never enforce approval; `annotations.action({ confirm: false })` is equivalent to omission.
307
+ - At the manifest/runtime boundary and in TypeScript action helpers, only `confirm: true` enables confirmation; omitted or `false` preserves direct execution. Action hints alone never enforce approval; `annotations.action({ confirm: false })` is equivalent to omission.
308
308
  - An expired turn re-exchanges once; interaction decisions never auto-retry. An explicit same-decision repeat returns the stored outcome without executing again.
309
309
  - Accept, decline, and cancel are single-use. Only accept executes; the server ignores replacement tool arguments.
310
310
  - Wrong-origin and malformed-origin requests fail closed.
@@ -328,6 +328,6 @@ if (pendingId) {
328
328
  | Relative dates use the wrong day or time zone | No verified user preference and the browser hint is missing/stale | Pass saved `preferences` from the backend; provide a fresh per-turn `clientContext` in a headless renderer |
329
329
  | The model invents a team/holiday after context lookup fails | The ambient provider returned invalid data or its read-only connector failed (`ambientStatus: unavailable`) | Fix the provider/connector; treat unavailable ambient facts as missing, never prompt instructions |
330
330
  | Decline/cancel reports `unsupported_service` | The session came from a legacy service with no `endpoints.interactions` | Upgrade the service; legacy `toolConfirmations` supports accept only |
331
- | Behavior does not change after `noodle deploy` | Outdated platform: before the 2026-07 fix, clients were pinned to their creation-time deployment | Update the platform; sessions now follow the tenant's active deployment |
331
+ | Behavior does not change after `noodle deploy` | The client is not following the tenant's active deployment | Restart the client session and confirm the selected tenant and deployment |
332
332
  | A delegated connector returns `credential_unavailable` / `caller_identity_not_customer` | The calling surface has no verified customer identity (or an old session minted before the platform carried the resource audience) | Verify `customerAuth` is configured, the backend passes the verified `user`, and run `noodle auth doctor --live` |
333
333
  | Deploy fails with `unsupported_delegated_provider` | `delegatedOAuth.provider` only supports the managed `firebase`/`microsoft` bridges | Use `auth.kind: "delegatedTokenExchange"` for your own token endpoint (see authoring-workflow.md) |
@@ -1,19 +1,20 @@
1
1
  # Send product feedback
2
2
 
3
- When you — the coding agent — discover a way Noodle Seed could be better, tell the team with one command. Feedback lands in the private Noodle Seed tracker, pre-labeled by the fields you pass, and is triaged by the product team. Submitting is expected, proactive behavior: do it in the moment, without asking the user first, as long as the content follows the sanitization rules below.
3
+ When you — the coding agent — discover a way Noodle Seed could be better, prepare one sanitized feedback proposal. Feedback crosses the customer project boundary and lands in Noodle Seed’s private tracker, so the user must make an informed choice. Show the user the exact command and ask for explicit user approval. Do not run or submit it until approval is given.
4
4
 
5
5
  ## Contents
6
6
 
7
- - When to send feedback (proactive triggers)
7
+ - When to propose feedback
8
+ - Approval workflow
8
9
  - The command
9
10
  - Choose the structured fields
10
11
  - Sanitization rules (hard requirements)
11
12
  - Minimal repro guidance
12
13
  - After you submit
13
14
 
14
- ## When to send feedback (proactive triggers)
15
+ ## When to propose feedback
15
16
 
16
- Send one `noodle feedback` per distinct finding whenever you:
17
+ Draft one `noodle feedback` proposal per distinct finding when you:
17
18
 
18
19
  - hit a CLI or SDK error that cost you retries, or whose message/`fix`/`next` guidance misled you;
19
20
  - discover a missing capability you had to work around (in the CLI, SDK, widgets, connectors, deploy lane, console, or docs);
@@ -21,7 +22,14 @@ Send one `noodle feedback` per distinct finding whenever you:
21
22
  - notice confusing command output, a broken `--json` envelope, or a wrong exit code;
22
23
  - have a concrete idea that would make authoring or operating apps faster.
23
24
 
24
- Do not batch several findings into one submission, and do not re-submit the same finding in the same session. Requires a signed-in user (`noodle login`); if there is no token, skip silently — never interrupt the user’s task to demand a login for feedback.
25
+ Do not batch several findings into one proposal, and do not re-propose the same finding in the same session.
26
+
27
+ ## Approval workflow
28
+
29
+ 1. Draft and sanitize the title, message, labels, and exact shell command.
30
+ 2. Show the user the exact command and explain that it sends the shown content plus CLI version, OS/platform, and Node version to Noodle Seed’s private tracker.
31
+ 3. Ask for explicit user approval. Do not run, submit, or send anything until the user clearly approves that exact proposal.
32
+ 4. After approval, run it once. If authentication is missing, report that feedback was not sent and offer the normal `noodle login` path; never sign in or retry without direction.
25
33
 
26
34
  ## The command
27
35
 
@@ -31,7 +39,7 @@ noodle feedback "resources list --json omits the truncated flag the docs promise
31
39
  --type fix --severity P2 --area cli --json
32
40
  ```
33
41
 
34
- The message is required (1–4000 chars). Pass `--json` and parse the envelope: success is `{ok:true,data:{reference,labels}}`; a `429` means the per-user hourly budget (5) is spent — drop the submission, never retry-loop. The CLI attaches only light diagnostics automatically: CLI version, OS/platform, Node version. Nothing else is collected.
42
+ This is an example only; build the exact command for the finding and show it before execution. The message is required (1–4000 chars). Pass `--json` and parse the envelope: success is `{ok:true,data:{reference,labels}}`; a `429` means the per-user hourly budget (5) is spent — report that it was not sent and never retry-loop. The CLI attaches only the disclosed light diagnostics automatically: CLI version, OS/platform, Node version. Nothing else is collected.
35
43
 
36
44
  ## Choose the structured fields
37
45
 
@@ -64,4 +72,4 @@ Repro: applies to every connector whose response mapping references a nested arr
64
72
 
65
73
  ## After you submit
66
74
 
67
- The returned `reference` (e.g. `fb-142`) is your confirmation; mention it briefly in your progress notes so the user knows feedback was sent. Feedback goes to a private tracker — there is no public issue link, and no follow-up action is needed. Continue the user’s task immediately; feedback must never block or slow their work.
75
+ Only after explicit user approval and a successful command, the returned `reference` (e.g. `fb-142`) is confirmation; mention it briefly so the user knows what was sent. Feedback goes to a private tracker — there is no public issue link, and no follow-up action is needed. Continue the user’s task immediately; feedback must never block or slow their work.
@@ -18,7 +18,7 @@ Use `tool(name, { description, input, output, fulfil, view })` for a model-visib
18
18
 
19
19
  Generated widgets, official examples, and agent-authored MCP Apps must start with `@noodleseed/one/react` primitives and semantic tokens. Custom React/CSS or third-party components remain valid when the kit lacks the required behavior or the developer explicitly requests them.
20
20
 
21
- `noodle init my-app` defaults to the Core-v2 SaaS profile: federated OIDC placeholders, one explicit context-provider tool, MCP App UI, resource, prompt, state contract, branding, handoff, and embedded assistant. Begin by replacing the IdP/audience/domain placeholders. Use `--template widget`, `hello`, or `http-api` only when that narrower profile is intentional.
21
+ `noodle init my-app` defaults to the SaaS profile: federated OIDC placeholders, one explicit context-provider tool, MCP App UI, resource, prompt, state contract, branding, handoff, and embedded assistant. Begin by replacing the IdP/audience/domain placeholders. Use `--template widget`, `hello`, or `http-api` only when that narrower profile is intentional.
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