@noodleseed/agent-kit 0.67.0 → 0.69.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.
Files changed (50) hide show
  1. package/manifest.json +285 -269
  2. package/package.json +1 -1
  3. package/skills/claude-code/SKILL.md +1 -1
  4. package/skills/claude-code/authoring-mcp-servers/SKILL.md +1 -1
  5. package/skills/claude-code/building-mcp-apps/SKILL.md +1 -1
  6. package/skills/claude-code/connecting-apis-to-mcp/SKILL.md +1 -1
  7. package/skills/claude-code/creating-product-agent-guides/SKILL.md +1 -1
  8. package/skills/claude-code/debugging-mcp-delivery/SKILL.md +1 -1
  9. package/skills/claude-code/deploying-mcp-services/SKILL.md +1 -1
  10. package/skills/claude-code/designing-mcp-products/SKILL.md +1 -1
  11. package/skills/claude-code/embedding-mcp-assistants/SKILL.md +1 -1
  12. package/skills/claude-code/examples/acme-discovery/README.md +2 -2
  13. package/skills/claude-code/examples/food-ordering/README.md +37 -1
  14. package/skills/claude-code/examples/food-ordering/src/agent-guide.ts +48 -0
  15. package/skills/claude-code/examples/food-ordering/src/server.ts +86 -0
  16. package/skills/claude-code/examples/food-ordering/test/server.test.ts +25 -0
  17. package/skills/claude-code/executing-noodle-plans/SKILL.md +1 -1
  18. package/skills/claude-code/publishing-mcp-integrations/SKILL.md +1 -1
  19. package/skills/claude-code/references/cli-commands.md +1 -1
  20. package/skills/claude-code/references/embedded-assistant.md +4 -2
  21. package/skills/claude-code/references/product-agent-guides.md +2 -2
  22. package/skills/claude-code/references/publishing.md +14 -1
  23. package/skills/claude-code/references/sdk-surface.md +1 -1
  24. package/skills/claude-code/reporting-noodle-feedback/SKILL.md +1 -1
  25. package/skills/claude-code/verifying-mcp-delivery/SKILL.md +1 -1
  26. package/skills/claude-code/wrapping-existing-applications/SKILL.md +1 -1
  27. package/skills/codex/SKILL.md +1 -1
  28. package/skills/codex/authoring-mcp-servers/SKILL.md +1 -1
  29. package/skills/codex/building-mcp-apps/SKILL.md +1 -1
  30. package/skills/codex/connecting-apis-to-mcp/SKILL.md +1 -1
  31. package/skills/codex/creating-product-agent-guides/SKILL.md +1 -1
  32. package/skills/codex/debugging-mcp-delivery/SKILL.md +1 -1
  33. package/skills/codex/deploying-mcp-services/SKILL.md +1 -1
  34. package/skills/codex/designing-mcp-products/SKILL.md +1 -1
  35. package/skills/codex/embedding-mcp-assistants/SKILL.md +1 -1
  36. package/skills/codex/examples/acme-discovery/README.md +2 -2
  37. package/skills/codex/examples/food-ordering/README.md +37 -1
  38. package/skills/codex/examples/food-ordering/src/agent-guide.ts +48 -0
  39. package/skills/codex/examples/food-ordering/src/server.ts +86 -0
  40. package/skills/codex/examples/food-ordering/test/server.test.ts +25 -0
  41. package/skills/codex/executing-noodle-plans/SKILL.md +1 -1
  42. package/skills/codex/publishing-mcp-integrations/SKILL.md +1 -1
  43. package/skills/codex/references/cli-commands.md +1 -1
  44. package/skills/codex/references/embedded-assistant.md +4 -2
  45. package/skills/codex/references/product-agent-guides.md +2 -2
  46. package/skills/codex/references/publishing.md +14 -1
  47. package/skills/codex/references/sdk-surface.md +1 -1
  48. package/skills/codex/reporting-noodle-feedback/SKILL.md +1 -1
  49. package/skills/codex/verifying-mcp-delivery/SKILL.md +1 -1
  50. package/skills/codex/wrapping-existing-applications/SKILL.md +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noodleseed/agent-kit",
3
- "version": "0.67.0",
3
+ "version": "0.69.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",
@@ -3,7 +3,7 @@ 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
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:13ddce01769caae4 -->
6
+ <!-- noodle-skill version:0.69.0 hash:13ddce01769caae4 -->
7
7
 
8
8
  # Noodle Seed
9
9
 
@@ -3,7 +3,7 @@ name: authoring-mcp-servers
3
3
  description: "Use when creating or extending a headless Noodle Seed MCP server, tool, resource, prompt, or typed model-facing capability."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:11523cb33b9473c0 -->
6
+ <!-- noodle-skill version:0.69.0 hash:11523cb33b9473c0 -->
7
7
 
8
8
  # authoring-mcp-servers
9
9
 
@@ -3,7 +3,7 @@ name: building-mcp-apps
3
3
  description: "Use when a Noodle Seed MCP App, widget, interactive card, visual interaction, or host-visible UI is the primary requested outcome."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:9fd67d4d24328e15 -->
6
+ <!-- noodle-skill version:0.69.0 hash:9fd67d4d24328e15 -->
7
7
 
8
8
  # building-mcp-apps
9
9
 
@@ -3,7 +3,7 @@ name: connecting-apis-to-mcp
3
3
  description: "Use when all four API-evidence inputs exist—and only then: API base URL, authentication scheme, representative safe read, and observed response."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:21bbd3ec441ffd30 -->
6
+ <!-- noodle-skill version:0.69.0 hash:21bbd3ec441ffd30 -->
7
7
 
8
8
  # connecting-apis-to-mcp
9
9
 
@@ -3,7 +3,7 @@ name: creating-product-agent-guides
3
3
  description: "Use when a Noodle Seed MCP server needs a new or revised product agent guide, App Package skill, or explicit product-skill regeneration."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:0fa48a82fe836cf0 -->
6
+ <!-- noodle-skill version:0.69.0 hash:0fa48a82fe836cf0 -->
7
7
 
8
8
  # creating-product-agent-guides
9
9
 
@@ -3,7 +3,7 @@ name: debugging-mcp-delivery
3
3
  description: "Use when an existing Noodle Seed MCP project has a concrete validation, runtime, connector, App, host, deployment, or production failure."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:aa715bae12041d7c -->
6
+ <!-- noodle-skill version:0.69.0 hash:aa715bae12041d7c -->
7
7
 
8
8
  # debugging-mcp-delivery
9
9
 
@@ -3,7 +3,7 @@ name: deploying-mcp-services
3
3
  description: "Use when the user explicitly requests a Noodle Seed hosted link, configuration write, deployment, access change, rollback, or connection write."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:93e735b7ffb45df1 -->
6
+ <!-- noodle-skill version:0.69.0 hash:93e735b7ffb45df1 -->
7
7
 
8
8
  # deploying-mcp-services
9
9
 
@@ -3,7 +3,7 @@ name: designing-mcp-products
3
3
  description: "Use when a Noodle Seed MCP product idea needs conversational fit, user benefit, scope, interaction, or evidence design before implementation."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:78a6f181b61f92f1 -->
6
+ <!-- noodle-skill version:0.69.0 hash:78a6f181b61f92f1 -->
7
7
 
8
8
  # designing-mcp-products
9
9
 
@@ -3,7 +3,7 @@ name: embedding-mcp-assistants
3
3
  description: "Use when embedding a Noodle assistant into an existing SaaS or web application with browser, identity, session, and credential boundaries."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:cc54a67f21c0ecdb -->
6
+ <!-- noodle-skill version:0.69.0 hash:cc54a67f21c0ecdb -->
7
7
 
8
8
  # embedding-mcp-assistants
9
9
 
@@ -27,8 +27,8 @@ There is no second tool set and no second app — one `server.ts`, projected ont
27
27
  `capabilities` is the entire externally reachable surface, so it stays short enough to review at a glance
28
28
  and closed by default: a tool added to this server later is unreachable from the website until someone
29
29
  lists it. A tool that needed a signed-in user could not be listed here at all (the compiler rejects it);
30
- serving those to visitors means `publicWebsite({ ..., signIn: true })`, which lets a visitor sign in
31
- mid-conversation through Acme's own login.
30
+ serve those from `authenticatedWebsite({ origins })` instead, where Acme's own backend proves who the
31
+ visitor is, or add `signIn: true` so visitors sign in mid-conversation through Acme own login.
32
32
 
33
33
  ## Design spec (write this before the code)
34
34
 
@@ -3,7 +3,7 @@
3
3
  **Owns:** The flagship consumer ordering MCP App example: React view authoring, app-only helper tools,
4
4
  caller-scoped cart state handles, invocation context, model-visible widget state/lifecycle, packaged image
5
5
  assets, portable structured elicitation, checkout handoff policy, host actions, CSP/permissions metadata,
6
- and widget preview coverage.
6
+ product-agent guidance, host-neutral distribution metadata, and widget preview coverage.
7
7
 
8
8
  Food Ordering is a generic, synthetic version of a live marketplace ordering app. It lets a user search
9
9
  stores, browse menus, customize an item, build a multi-line cart, review the order, and hand off checkout to
@@ -15,6 +15,7 @@ private customer data.
15
15
  | Capability | Example |
16
16
  | :--- | :--- |
17
17
  | Public entry tool | `open_ordering` returns structured fallback content and renders the React widget |
18
+ | Product and distribution projections | `agentGuide` supplies grounded cross-capability guidance; `distribution` supplies listing, publisher, legal, image, and review facts separately from the runtime manifest |
18
19
  | App-only helper tools | `search_stores`, `load_menu`, `load_item`, `read_cart`, `sync_cart`, `prepare_checkout`; mutating widget-owned helpers use `confirm: false` (equivalent to omission) and execute directly because action hints alone never gate |
19
20
  | Durable cart state | `server(..., { state: { handles: { cart } }, use: { state } })` with caller scope and revision checks |
20
21
  | React app runtime kit | `@noodleseed/one/react` supplies app flow, shell/nav/view, async state, form, quantity, choice, and handoff primitives |
@@ -47,6 +48,11 @@ noodle test
47
48
  noodle dev
48
49
  ```
49
50
 
51
+ The same `server.ts` declares `distribution` metadata for host adapters. It references real packaged images
52
+ and keeps listing copy, support/legal URLs, and positive/negative review scenarios outside the canonical App
53
+ Package and Runtime Artifact. The OpenAI adapter can now project those facts and the generated product skill
54
+ into separate local-testing or public-submission archives. A Claude package remains a separate adapter.
55
+
50
56
  In another terminal:
51
57
 
52
58
  ```sh
@@ -71,6 +77,34 @@ For Apps metadata conformance, start `noodle dev`, copy the loopback MCP endpoin
71
77
  npx @mcpjam/cli@latest apps conformance --url http://127.0.0.1:<port>/o/demo/food-ordering/mcp --quiet --format json
72
78
  ```
73
79
 
80
+ ## Export an OpenAI plugin
81
+
82
+ This flagship includes the guided workflows, listing metadata, review cases, and image assets needed to test
83
+ OpenAI export. See the public [product-agent guide](https://docs.noodleseed.dev/docs/guides/product-agent-guides#export-an-openai-package)
84
+ for the current package workflow and boundaries.
85
+
86
+ Against its deployed MCP URL, generate the Food Ordering submission candidate with:
87
+
88
+ ```sh
89
+ noodle export plugin openai \
90
+ --state submission \
91
+ --mcp-url https://food-ordering.noodleseed.app/mcp \
92
+ --category "Food & Drink" \
93
+ --output food-ordering-openai.zip
94
+ ```
95
+
96
+ After registering that same URL in ChatGPT developer mode, substitute its real technical ID to generate the
97
+ Food Ordering local test package:
98
+
99
+ ```sh
100
+ noodle export plugin openai \
101
+ --state local \
102
+ --mcp-url https://food-ordering.noodleseed.app/mcp \
103
+ --category "Food & Drink" \
104
+ --registered-app-id plugin_asdk_app_0123456789abcdef0123456789abcdef \
105
+ --output food-ordering-openai-local.zip
106
+ ```
107
+
74
108
  ## Client Setup
75
109
 
76
110
  Use the CLI to print the exact setup flow for your MCP client:
@@ -106,6 +140,8 @@ Image sources:
106
140
  [`photo-1510431198580-7727c9fa1e3a`](https://images.unsplash.com/photo-1510431198580-7727c9fa1e3a), downloaded from Unsplash.
107
141
  - `assets/mint-lemonade.jpg` — Unsplash photo
108
142
  [`X7Nx327NtuA`](https://unsplash.com/photos/X7Nx327NtuA) by Imad 786.
143
+ - `assets/lentil-soup-openai.png` and `assets/mint-lemonade-openai.png` — PNG screenshot renditions
144
+ produced from the two corresponding Unsplash references for OpenAI plugin packaging.
109
145
 
110
146
  Unsplash photos are free to use under the [Unsplash License](https://unsplash.com/license); attribution is
111
147
  not required, but source notes are kept here for provenance.
@@ -0,0 +1,48 @@
1
+ import type { AgentGuideSource } from '@noodleseed/one';
2
+
3
+ /** Product guidance for the model-visible ordering and planning workflows. */
4
+ export const FOOD_ORDERING_AGENT_GUIDE = {
5
+ description:
6
+ 'Use Food Ordering to browse synthetic local options, build a reviewable cart, and hand checkout to the user.',
7
+ useWhen: [
8
+ 'The user wants to browse nearby food or assemble an order.',
9
+ 'The user wants a structured pickup or delivery plan before ordering.',
10
+ ],
11
+ workflows: [
12
+ {
13
+ id: 'build_order',
14
+ title: 'Browse and build an order',
15
+ steps: [
16
+ {
17
+ capability: { kind: 'tool', name: 'open_ordering' },
18
+ guidance:
19
+ 'Open the ordering app so the user can choose a store, review the cart, and control checkout handoff.',
20
+ },
21
+ ],
22
+ },
23
+ {
24
+ id: 'summarize_options',
25
+ title: 'Summarize available options',
26
+ steps: [{ capability: { kind: 'tool', name: 'summarize_ordering_options' } }],
27
+ },
28
+ {
29
+ id: 'plan_fulfilment',
30
+ title: 'Plan pickup or delivery',
31
+ steps: [
32
+ {
33
+ capability: { kind: 'tool', name: 'plan_order' },
34
+ guidance: 'Collect the user’s fulfilment preference without claiming to place an order.',
35
+ },
36
+ ],
37
+ },
38
+ ],
39
+ boundaries: [
40
+ 'Treat every store, menu item, price, and service area in this example as synthetic.',
41
+ 'Never claim checkout or payment completed; the final order happens only after the external handoff.',
42
+ ],
43
+ examples: [
44
+ { prompt: 'Help me put together a noodle order.', workflow: 'build_order' },
45
+ { prompt: 'What food options are available?', workflow: 'summarize_options' },
46
+ { prompt: 'Plan a delivery for Friday.', workflow: 'plan_fulfilment' },
47
+ ],
48
+ } as const satisfies AgentGuideSource;
@@ -1,6 +1,9 @@
1
1
  import { annotations, asset, connector, resource, server, tool, z } from '@noodleseed/one';
2
+ import { FOOD_ORDERING_AGENT_GUIDE } from './agent-guide.js';
2
3
 
3
4
  const heroImage = asset('assets/noodle-bowl.jpg');
5
+ const menuScreenshot = asset('assets/lentil-soup-openai.png');
6
+ const cartScreenshot = asset('assets/mint-lemonade-openai.png');
4
7
 
5
8
  const state = connector('noodle_state')
6
9
  .version('1.0.0')
@@ -202,6 +205,89 @@ export default server(
202
205
  {
203
206
  title: 'Food Ordering',
204
207
  version: '1.0.0',
208
+ agentGuide: FOOD_ORDERING_AGENT_GUIDE,
209
+ distribution: {
210
+ listing: {
211
+ summary: 'Browse local food, build a cart, and review checkout in conversation.',
212
+ description:
213
+ 'Food Ordering is a synthetic MCP App that demonstrates store discovery, menu browsing, a caller-scoped cart, fulfilment planning, and explicit checkout handoff.',
214
+ keywords: ['food', 'ordering', 'delivery'],
215
+ },
216
+ publisher: {
217
+ name: 'Noodle Seed Examples',
218
+ websiteUrl: 'https://noodleseed.com',
219
+ },
220
+ support: {
221
+ documentationUrl: 'https://docs.noodleseed.com/examples/food-ordering',
222
+ supportUrl: 'https://noodleseed.com/support',
223
+ },
224
+ legal: {
225
+ privacyPolicyUrl: 'https://noodleseed.com/privacy',
226
+ termsOfServiceUrl: 'https://noodleseed.com/terms',
227
+ },
228
+ assets: {
229
+ icon: { source: heroImage, alt: 'Food Ordering noodle bowl' },
230
+ screenshots: [
231
+ { source: menuScreenshot, alt: 'A featured lentil soup menu item' },
232
+ { source: cartScreenshot, alt: 'A mint lemonade shown with the order' },
233
+ ],
234
+ },
235
+ review: {
236
+ instructions:
237
+ 'Use the synthetic menu and guest cart. No account or reviewer credential is required.',
238
+ scenarios: [
239
+ {
240
+ id: 'build_order',
241
+ prompt: 'Help me build a noodle order for pickup.',
242
+ expected:
243
+ 'The ordering app opens with stores and menu items; checkout remains a handoff.',
244
+ shouldInvoke: true,
245
+ },
246
+ {
247
+ id: 'browse_menu',
248
+ prompt: 'Show me vegetarian menu options nearby.',
249
+ expected: 'The app shows matching stores and bounded menu choices.',
250
+ shouldInvoke: true,
251
+ },
252
+ {
253
+ id: 'compare_options',
254
+ prompt: 'Compare the quickest open food options for me.',
255
+ expected: 'The app grounds its comparison in the synthetic store data.',
256
+ shouldInvoke: true,
257
+ },
258
+ {
259
+ id: 'plan_pickup',
260
+ prompt: 'Plan a pickup order for Friday.',
261
+ expected: 'The app collects the missing fulfilment details before planning the order.',
262
+ shouldInvoke: true,
263
+ },
264
+ {
265
+ id: 'review_checkout',
266
+ prompt: 'Review my cart before I continue to checkout.',
267
+ expected: 'The app shows the cart and keeps payment on the explicit external handoff.',
268
+ shouldInvoke: true,
269
+ },
270
+ {
271
+ id: 'unrelated_weather',
272
+ prompt: 'Will it rain tomorrow?',
273
+ expected: 'Food Ordering is not invoked.',
274
+ shouldInvoke: false,
275
+ },
276
+ {
277
+ id: 'unrelated_email',
278
+ prompt: 'Draft an email to my manager.',
279
+ expected: 'Food Ordering is not invoked.',
280
+ shouldInvoke: false,
281
+ },
282
+ {
283
+ id: 'unrelated_travel',
284
+ prompt: 'Book me a flight to Lisbon.',
285
+ expected: 'Food Ordering is not invoked.',
286
+ shouldInvoke: false,
287
+ },
288
+ ],
289
+ },
290
+ },
205
291
  use: { state },
206
292
  context: {
207
293
  defaults: { locale: 'en-US', timeZone: 'America/New_York' },
@@ -10,6 +10,7 @@ describe('food-ordering example', () => {
10
10
  const manifest = (await app.toManifest()) as {
11
11
  server: {
12
12
  name: string;
13
+ agentGuide?: unknown;
13
14
  context?: {
14
15
  defaults?: { locale?: string; timeZone?: string };
15
16
  ambient?: {
@@ -36,6 +37,8 @@ describe('food-ordering example', () => {
36
37
  };
37
38
 
38
39
  expect(manifest.server.name).toBe('food_ordering');
40
+ expect(manifest.server.agentGuide).toBeDefined();
41
+ expect(manifest.server).not.toHaveProperty('distribution');
39
42
  expect(manifest.server.context).toMatchObject({
40
43
  defaults: { locale: 'en-US', timeZone: 'America/New_York' },
41
44
  ambient: {
@@ -101,4 +104,26 @@ describe('food-ordering example', () => {
101
104
  });
102
105
  expect(manifest.widgets?.map((widget) => widget.name)).toContain('capabilities_card');
103
106
  });
107
+
108
+ it('projects host distribution metadata separately from the runtime manifest', () => {
109
+ const distribution = app.toDistributionMetadata();
110
+ expect(distribution).toMatchObject({
111
+ schemaVersion: 1,
112
+ listing: { summary: expect.stringContaining('Browse local food') },
113
+ assets: { icon: { alt: 'Food Ordering noodle bowl' }, screenshots: expect.any(Array) },
114
+ });
115
+ const scenarios = distribution?.review.scenarios ?? [];
116
+ expect(scenarios.filter(({ shouldInvoke }) => shouldInvoke).map(({ id }) => id)).toEqual([
117
+ 'build_order',
118
+ 'browse_menu',
119
+ 'compare_options',
120
+ 'plan_pickup',
121
+ 'review_checkout',
122
+ ]);
123
+ expect(scenarios.filter(({ shouldInvoke }) => !shouldInvoke).map(({ id }) => id)).toEqual([
124
+ 'unrelated_weather',
125
+ 'unrelated_email',
126
+ 'unrelated_travel',
127
+ ]);
128
+ });
104
129
  });
@@ -3,7 +3,7 @@ name: executing-noodle-plans
3
3
  description: "Use when the user asks to execute an approved, decision-complete implementation plan for a Noodle Seed project task by task with test-first changes, review, recovery, and final verification."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:6a9f132ddb79352e -->
6
+ <!-- noodle-skill version:0.69.0 hash:6a9f132ddb79352e -->
7
7
 
8
8
  # Execute a Noodle Seed implementation plan
9
9
 
@@ -3,7 +3,7 @@ name: publishing-mcp-integrations
3
3
  description: "Use when preparing, reviewing, or submitting a Noodle Seed MCP integration to a host or app directory."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:efffbf82007f935d -->
6
+ <!-- noodle-skill version:0.69.0 hash:efffbf82007f935d -->
7
7
 
8
8
  # publishing-mcp-integrations
9
9
 
@@ -25,7 +25,7 @@ Developer-facing `noodle` commands, grouped by area. Local authoring commands (`
25
25
  | `noodle docs` | Export docs in an LLM-readable format. |
26
26
  | `noodle connect` | Print connection setup for an agent host (Claude Code, Codex, Cursor, etc.). |
27
27
  | `noodle import` | Import an OpenAPI spec into a starter `server.ts`. |
28
- | `noodle export` | Compile locally and write the portable manifest JSON (no service). |
28
+ | `noodle export` | Compile locally and write a portable manifest or target host-plugin archive (no service). |
29
29
  | `noodle validate` | Author-time compile/schema/connector check; no service (`--json`, `--fix-prompt`). |
30
30
  | `noodle check` | Check tool design (`tool_design_*`) and MCP Apps/widget readiness; no service. `--min-severity warn` shows only what needs fixing. |
31
31
  | `noodle test` | Local compile plus a loopback MCP smoke. |
@@ -86,7 +86,7 @@ A public surface **must** declare `capabilities`: the exact positive allowlist i
86
86
 
87
87
  ### Mixed surfaces: let a visitor sign in mid-conversation
88
88
 
89
- Add `signIn: true` to a public surface when some capabilities need a signed-in user. The surface becomes `mixed`: anonymous visitors start immediately, and an identity-dependent capability becomes a **sign-in trigger** rather than a compile error the same shape ChatGPT and Claude use for connectors that work with or without a linked account.
89
+ Add `signIn: true` to a public surface when some capabilities need a signed-in visitor. The surface becomes `mixed`: anonymous visitors start immediately, an identity-dependent capability stays **visible** so the assistant can offer it, and reaching for it raises a sign-in prompt instead of executing.
90
90
 
91
91
  ```ts
92
92
  access: publicWebsite({
@@ -96,7 +96,9 @@ access: publicWebsite({
96
96
  }),
97
97
  ```
98
98
 
99
- Elevation runs through the **host application’s own login**, never a Noodle-operated one: the page signs the visitor in and its backend exchanges that verified user for an elevated session on the same conversation. Do not build a second identity provider for this.
99
+ Elevation runs through the **host application own login**, never a Noodle-operated one. The widget raises `assistant-sign-in-requested` with a single-use `continuation`; the page signs the visitor in as it already does, then its backend POSTs that continuation to the session exchange **with its own client credentials**. Possession of the continuation alone elevates nothing, and the service checks the client tenant owns that conversation.
100
+
101
+ The conversation is kept: same history, new token, the anonymous one dead. Do not build a second identity provider for this.
100
102
 
101
103
  A connector-backed side effect needs **two** independent declarations to be reachable from a public or mixed surface: inclusion in `capabilities` **and** `{ confirm: true }` on the operation. Signing in proves who the visitor is; it does not pre-authorize an effect, so confirmation still applies on a mixed surface. Confirmation is never authentication or business authorization — the customer backend still owns payload validation, abuse controls, and idempotency. Local or session-only widget state needs no confirmation.
102
104
 
@@ -8,7 +8,7 @@ Do not wait for the user to name `agentGuide`. During every MCP server or App bu
8
8
 
9
9
  Author a guide when any of these conditions applies:
10
10
 
11
- - A request for an App Package or app product skill requires one. A marketplace plugin or customer-agent distribution would also need this source, but those per-app distribution surfaces are not available in this foundation.
11
+ - A request for an App Package or app product skill requires one. A marketplace plugin or customer-agent distribution also needs this product source in addition to separate listing metadata.
12
12
  - Multiple capabilities participate in one user workflow, especially when order or purpose matters.
13
13
  - Safe or useful operation depends on product-specific ordering, grounding, clarification, boundaries, or representative examples that capability descriptions cannot express.
14
14
 
@@ -20,7 +20,7 @@ Make the judgment from the user’s stated outcome and grounded product evidence
20
20
 
21
21
  Noodle workflow skills teach a coding agent how to build and operate Noodle projects. The generated app product skill is team-local guidance for using one product. A marketplace plugin is a separate host distribution bundle.
22
22
 
23
- Per-app marketplace plugin generation and customer-agent distribution are not available in this foundation. If the user asks for either, explain the boundary and stop at the local App Package and product-skill workflow. Do not claim a listing, submission bundle, hosted distribution, or customer-agent projection.
23
+ A host-neutral distribution metadata and archive framework now exists, but per-app marketplace plugin generation is not available until a target adapter lands, and customer-agent distribution is not available. If the user asks for either, explain the boundary and stop at the proven local App Package, product-skill, and metadata work. Do not claim a target bundle, submission, hosted distribution, or customer-agent projection.
24
24
 
25
25
  ## Creation workflow
26
26
 
@@ -7,6 +7,7 @@ Directory requirements evolve. Identify the requested directory first and verify
7
7
  ## Contents
8
8
 
9
9
  - Shared readiness gate
10
+ - Distribution metadata source
10
11
  - Directory-specific evidence
11
12
  - Submission boundary
12
13
 
@@ -18,6 +19,18 @@ Use `references/app-directory-compliance.md` as this route’s canonical shared
18
19
 
19
20
  Prepare evidence for a reachable production MCP endpoint, accurate capability descriptions and schemas, useful fallback behavior, realistic positive and negative tests, data minimization, privacy disclosures, support ownership, and any interactive surface the directory will review.
20
21
 
22
+ ## Distribution metadata source
23
+
24
+ When the user explicitly prepares host packaging, author the host-neutral `distribution` option in the same `server.ts`; do not add it during an ordinary build that has no distribution goal. It contains listing, publisher, support, legal, assets, and review facts that cannot be derived safely from MCP capability descriptions.
25
+
26
+ Reference real packaged images with `asset(...)`, write useful alt text, and include realistic positive and negative review scenarios. Keep reviewer credentials, tokens, secrets, personal data, and test-account passwords out of metadata and source control; supply any authorized reviewer credential out of band.
27
+
28
+ `distribution` is projected separately. It leaves the canonical App Package and Runtime Artifact unchanged, so editing listing copy cannot change deployment execution or product-skill identity. A product package still needs the separately judged `agentGuide`; do not duplicate capability schemas or workflow truth in listing metadata.
29
+
30
+ The shared framework can validate metadata and resolved image bytes, run an available target adapter, and create a reproducible archive. Target-specific availability and exact flags live in `references/cli-commands.md` and the live command catalog (`noodle commands --json`); never invent an unlisted target, bundle, filename, or acceptance claim.
31
+
32
+ Local or repository testing and public-directory submission are distinct packaging states with distinct required inputs. An export command only compiles local source and writes the requested archive. It does not deploy, register, upload, submit, review, or publish the package.
33
+
21
34
  ## Directory-specific evidence
22
35
 
23
36
  Read the selected directory’s current official submission documentation at review time. Record each additional requirement separately from the shared checklist, including listing fields, identity verification, test credentials, screenshots, policy declarations, review limits, and appeal or resubmission steps. Never project one directory’s requirements onto another.
@@ -26,4 +39,4 @@ When a requirement cannot be verified from the selected directory’s current do
26
39
 
27
40
  ## Submission boundary
28
41
 
29
- Preparation is read-only. Deployment, access changes, directory registration, and final submission each require explicit authorization for the exact target. Report remaining evidence gaps and stop when that authority or required directory access is absent.
42
+ Preparation is read-only. Reverify current official requirements immediately before public submission. Deployment, access changes, directory registration, credential entry, final submission, and publication each remain separate human-operated mutations that require explicit authorization for the exact target. Report remaining evidence gaps and stop when that authority or required directory access is absent.
@@ -65,7 +65,7 @@ Platform helper connectors are explicit subpath imports from `@noodleseed/one/pl
65
65
 
66
66
  ## Authoring signatures
67
67
 
68
- - `server(name, options, definitions)` — `options` commonly includes `title`, `version`, `instructions`, `branding`, `auth`, `use`, `provides`, `state`, and `handoff`; `definitions` is the array of tools/resources/prompts.
68
+ - `server(name, options, definitions)` — `options` commonly includes `title`, `version`, `instructions`, `agentGuide`, `distribution`, `branding`, `auth`, `use`, `provides`, `state`, and `handoff`; `definitions` is the array of tools/resources/prompts.
69
69
  - `tool(name, { description, input, output, annotations?, visibility?, view?, fulfil })` — `input`/`output` are Zod schemas; `fulfil({ input, connectors, user })` returns data matching `output`. Add `view: { component, entry }` for a React widget; use `visibility: ["app"]` for an app-only helper.
70
70
  - `resource(name, { uri, description?, mimeType?, fulfil })` and `prompt(name, { description?, arguments?, fulfil })` expose MCP resources/prompts.
71
71
  - View metadata (`viewTitle`, `viewDescription`, `csp`, `domain`, `permissions`) belongs on the tool that renders it; `asset("./path")` packages local files.
@@ -3,7 +3,7 @@ name: reporting-noodle-feedback
3
3
  description: "Use when a Noodle Seed bug, misleading instruction, missing capability, or concrete product improvement should be proposed to the user."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:0f404109f4845683 -->
6
+ <!-- noodle-skill version:0.69.0 hash:0f404109f4845683 -->
7
7
 
8
8
  # reporting-noodle-feedback
9
9
 
@@ -3,7 +3,7 @@ name: verifying-mcp-delivery
3
3
  description: "Use when proving a Noodle Seed MCP project works at a named compile, local, connector, App, host, deployment, or production evidence level."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:6ef6ef551e26b78e -->
6
+ <!-- noodle-skill version:0.69.0 hash:6ef6ef551e26b78e -->
7
7
 
8
8
  # verifying-mcp-delivery
9
9
 
@@ -3,7 +3,7 @@ name: wrapping-existing-applications
3
3
  description: "Use when an existing application has no stable usable API and needs a read-only, identity-first Noodle Seed integration plan before implementation."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:eccc3c158dcafba8 -->
6
+ <!-- noodle-skill version:0.69.0 hash:eccc3c158dcafba8 -->
7
7
 
8
8
  # wrapping-existing-applications
9
9
 
@@ -3,7 +3,7 @@ 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
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:13ddce01769caae4 -->
6
+ <!-- noodle-skill version:0.69.0 hash:13ddce01769caae4 -->
7
7
 
8
8
  # Noodle Seed
9
9
 
@@ -3,7 +3,7 @@ name: authoring-mcp-servers
3
3
  description: "Use when creating or extending a headless Noodle Seed MCP server, tool, resource, prompt, or typed model-facing capability."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:11523cb33b9473c0 -->
6
+ <!-- noodle-skill version:0.69.0 hash:11523cb33b9473c0 -->
7
7
 
8
8
  # authoring-mcp-servers
9
9
 
@@ -3,7 +3,7 @@ name: building-mcp-apps
3
3
  description: "Use when a Noodle Seed MCP App, widget, interactive card, visual interaction, or host-visible UI is the primary requested outcome."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:9fd67d4d24328e15 -->
6
+ <!-- noodle-skill version:0.69.0 hash:9fd67d4d24328e15 -->
7
7
 
8
8
  # building-mcp-apps
9
9
 
@@ -3,7 +3,7 @@ name: connecting-apis-to-mcp
3
3
  description: "Use when all four API-evidence inputs exist—and only then: API base URL, authentication scheme, representative safe read, and observed response."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:21bbd3ec441ffd30 -->
6
+ <!-- noodle-skill version:0.69.0 hash:21bbd3ec441ffd30 -->
7
7
 
8
8
  # connecting-apis-to-mcp
9
9
 
@@ -3,7 +3,7 @@ name: creating-product-agent-guides
3
3
  description: "Use when a Noodle Seed MCP server needs a new or revised product agent guide, App Package skill, or explicit product-skill regeneration."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:0fa48a82fe836cf0 -->
6
+ <!-- noodle-skill version:0.69.0 hash:0fa48a82fe836cf0 -->
7
7
 
8
8
  # creating-product-agent-guides
9
9
 
@@ -3,7 +3,7 @@ name: debugging-mcp-delivery
3
3
  description: "Use when an existing Noodle Seed MCP project has a concrete validation, runtime, connector, App, host, deployment, or production failure."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:aa715bae12041d7c -->
6
+ <!-- noodle-skill version:0.69.0 hash:aa715bae12041d7c -->
7
7
 
8
8
  # debugging-mcp-delivery
9
9
 
@@ -3,7 +3,7 @@ name: deploying-mcp-services
3
3
  description: "Use when the user explicitly requests a Noodle Seed hosted link, configuration write, deployment, access change, rollback, or connection write."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:93e735b7ffb45df1 -->
6
+ <!-- noodle-skill version:0.69.0 hash:93e735b7ffb45df1 -->
7
7
 
8
8
  # deploying-mcp-services
9
9
 
@@ -3,7 +3,7 @@ name: designing-mcp-products
3
3
  description: "Use when a Noodle Seed MCP product idea needs conversational fit, user benefit, scope, interaction, or evidence design before implementation."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:78a6f181b61f92f1 -->
6
+ <!-- noodle-skill version:0.69.0 hash:78a6f181b61f92f1 -->
7
7
 
8
8
  # designing-mcp-products
9
9
 
@@ -3,7 +3,7 @@ name: embedding-mcp-assistants
3
3
  description: "Use when embedding a Noodle assistant into an existing SaaS or web application with browser, identity, session, and credential boundaries."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.67.0 hash:cc54a67f21c0ecdb -->
6
+ <!-- noodle-skill version:0.69.0 hash:cc54a67f21c0ecdb -->
7
7
 
8
8
  # embedding-mcp-assistants
9
9
 
@@ -27,8 +27,8 @@ There is no second tool set and no second app — one `server.ts`, projected ont
27
27
  `capabilities` is the entire externally reachable surface, so it stays short enough to review at a glance
28
28
  and closed by default: a tool added to this server later is unreachable from the website until someone
29
29
  lists it. A tool that needed a signed-in user could not be listed here at all (the compiler rejects it);
30
- serving those to visitors means `publicWebsite({ ..., signIn: true })`, which lets a visitor sign in
31
- mid-conversation through Acme's own login.
30
+ serve those from `authenticatedWebsite({ origins })` instead, where Acme's own backend proves who the
31
+ visitor is, or add `signIn: true` so visitors sign in mid-conversation through Acme own login.
32
32
 
33
33
  ## Design spec (write this before the code)
34
34