@noodleseed/one 0.193.4 → 0.194.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.
|
@@ -39,7 +39,7 @@ export const BUNDLED_EXAMPLE_FILES = [
|
|
|
39
39
|
{ relPath: "examples/hello/README.md", content: "# hello — minimal TypeScript quickstart\n\nThe smallest deployable Noodle app: a single `greet` tool authored in TypeScript with no\nconnectors, secrets, flows, widgets, or handoff policy. It still uses the current server options form\nso new authors see where server-level branding belongs. Use it for a local read or first deploy.\nFor a new project, `noodle init --template hello` also supplies isolated behavior tests: compilation,\ntool discovery, an expected greeting and invalid-input rejection. Init installs pinned local tooling and runs\nthose checks; use `npm run agent:check` after edits. `--no-install` prepares files without verified readiness.\nIf setup fails, repair its reported stage and repeat the safe resume command; do not overwrite your edits.\n\nProtocol negotiation deliberately does not appear in `src/server.ts` or `noodle.json`. MCP versions\nare platform-owned: the same deployed app automatically serves compatible legacy clients and modern\nclients from its existing endpoint, without an app setting or redeploy.\n\nWhen an installed Noodle Developer plugin drives this example, its skill performs mapped lifecycle\nsteps through the supported `noodle-readiness` tools and reports only stable public `noodle ...`\ncommands as recovery text. Do not install or update a global CLI: the coding agent writes and tests\nthis source while Noodle guides and operates the validate, preview, deploy, inspect, and debug workflow.\nPlugin sign-in uses one compact consent for the Developer MCP resource; it does not ask the user to\nchoose organizations or environments. For remote inspection, the agent calls `get_context`, resolves\nthe intended organization from the request or this project, and passes that explicit `org` to every\nscoped tool. The local CLI may keep its own default organization for command convenience.\nFor an approved implementation plan, follow the project's own development workflow and the\nrelevant Noodle authoring or verification skill.\nIf that agent discovers a Noodle Seed product gap while working, the installed skill prepares a\nsanitized `noodle feedback` proposal, discovers current fields from `noodle commands --json`, and\npreviews the exact normalized submission, diagnostics, and private destination through the typed\nplugin function or `--dry-run --json`. It includes its known `--agent` and `--model` identity without\nguessing unavailable values, keeps those fields structured, and submits once only after explicit user\napproval of that exact preview; it never composes a shell wrapper, auto-logs in, or retry-loops.\nEvery `--json` command writes its canonical success or failure envelope to stdout and leaves stderr\nempty. One-shot commands write one envelope; streaming commands write NDJSON snapshot, event, and\nterminal-failure envelopes so agents can parse each line independently.\n\n```sh\nnoodle test examples/hello/src/server.ts --tool greet --args '{\"name\":\"Ada\"}' --json\nnoodle dev examples/hello/src/server.ts --app hello\nnoodle deploy examples/hello/src/server.ts --org acme --app hello\n```\n\n`noodle export manifest examples/hello/src/server.ts` compiles the same entrypoint locally and prints\nthe portable, vendor-neutral manifest JSON — the eject path: your `server.ts` plus this manifest is\nthe whole app, yours to read, diff, and keep.\n\nIt is also the fixture for `pnpm smoke:dev` and the e2e harness, so keep its tool surface stable.\n" },
|
|
40
40
|
{ relPath: "examples/hello/noodle.json", content: "{\n \"entrypoint\": \"src/server.ts\",\n \"name\": \"hello\",\n \"template\": \"hello\"\n}\n" },
|
|
41
41
|
{ relPath: "examples/hello/package.json", content: "{\n \"name\": \"hello\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"test\": \"vitest run --dir test\",\n \"validate\": \"noodle validate\",\n \"dev\": \"noodle dev\",\n \"deploy\": \"noodle deploy\"\n },\n \"devDependencies\": {\n \"@noodleseed/one\": \"latest\",\n \"vitest\": \"^4.1.8\"\n }\n}\n" },
|
|
42
|
-
{ relPath: "examples/hello/src/server.ts", content: "import { annotations, server, tool, z } from '@noodleseed/one';\n\n// Customer apps
|
|
42
|
+
{ relPath: "examples/hello/src/server.ts", content: "import { annotations, server, tool, z } from '@noodleseed/one';\n\n// Customer apps import only the public SDK, @noodleseed/one; Noodle's internal packages are runtime details.\n\nexport default server(\n 'hello',\n {\n title: 'Hello',\n version: '1.0.0',\n branding: {\n name: 'Hello',\n accent: '#1D9E75',\n radius: 'md',\n density: 'comfortable',\n },\n },\n [\n tool('greet', {\n // Every model-visible tool declares a title: hosts show it in tool pickers and confirmation\n // prompts, and both consumer directories reject tools without one.\n title: 'Greet someone',\n description: 'Greet someone by name.',\n input: z.object({\n // Defaults are advertised to the model and applied at runtime when the argument is omitted.\n name: z.string().default('world'),\n }),\n output: z.object({\n message: z.string(),\n }),\n // Read-only, closed-world: assistant surfaces run this without a consent prompt.\n annotations: annotations.readOnly(),\n fulfil: ({ input }) => {\n return { message: `Hello, ${input.name}!` };\n },\n }),\n ],\n);\n" },
|
|
43
43
|
{ relPath: "examples/hello/test/server.test.ts", content: "import { describe, expect, it } from 'vitest';\nimport app from '../src/server.js';\n\ndescribe('hello example', () => {\n it('exports a Noodle server definition', () => {\n expect(typeof app.toManifest).toBe('function');\n });\n\n it('advertises the greet default and keeps the argument optional', async () => {\n const manifest = await app.toManifest();\n const greet = manifest.tools?.find((tool) => tool.name === 'greet');\n const schema = greet?.inputSchema as {\n properties?: { name?: { default?: unknown } };\n required?: string[];\n };\n expect(schema.properties?.name?.default).toBe('world');\n expect(schema.required ?? []).not.toContain('name');\n });\n});\n" },
|
|
44
44
|
{ relPath: "examples/shopify-storefront/README.md", content: "# Noodle Seed for Shopify\n\n**Owns:** The reusable Shopify commerce flagship: live Shopify search, curated Storefront MCP policy/FAQ,\nNoodle-owned conversational views, published store knowledge, a public embedded assistant, one-item checkout\nreview, one `cartCreate`, and safe hosted-checkout handoff.\n**Read when:** You are deploying one Noodle Seed application for one or many Shopify businesses without\ncopying their catalogs or editing source per store.\n**Do not put here:** Real storefront tokens, Shopify cart IDs, customer credentials, payment data, private\ncustomer implementation details, a tenant-specific origin, or a product synchronization layer.\n**Update when:** The Storefront API version, GraphQL queries, tool or mini-widget surface,\nmanaged-origin boundary, assistant projection, checkout boundary, or capability slot changes.\n\nCapability slot: **reusable live Shopify discovery → knowledge → checkout**. One `server.ts` serves every\nShopify business. The deployment operator supplies an exact storefront origin and private Storefront API\ntoken for each environment; no merchant forks the source.\n\nFor Shopify's dated, factual MCP/UCP surface inventory—not this example's implementation contract—see\n[Shopify MCP / UCP capabilities](documentation/shopify-mcp-ucp-capabilities.md).\n\nFor another upstream MCP API, use the [connector import guide](https://docs.noodleseed.dev/docs/guides/connectors#upstream-mcp-connectors)\nin a separate project. Its generated `src/server.ts` and offline test establish a contract, not this\nflagship's reviewed live commerce behavior; do not import over the curated Shopify implementation.\n\n## What ships out of the box\n\n| Shopper need | Noodle Seed capability |\n| :-- | :-- |\n| Clarify broad requests | The assistant asks one natural-language question with no tool or widget, preserving the conversation instead of forcing a generic menu. |\n| Find products | `search_products` uses Shopify's native natural-language relevance and partial-prefix behavior. It tries one concise query and, only after no relevant result, one materially different rewrite; one final `show_product_recommendations` call re-fetches and renders at most three live matches. |\n| Review a product | `get_product` verifies details headlessly; `show_product` renders only one selected product and its explicit next step. |\n| Compare named products | `get_product` verifies each item; the assistant compares only the requested criteria in concise prose with product links instead of showing ordinary recommendation cards. |\n| Ask store questions | The embedded assistant has one `ask_store` knowledge tool. It selects the shop profile, one exact canonical policy kind, FAQ-first answer, or explicit guide path through typed input instead of choosing between adjacent tools. Direct MCP clients retain `get_store_information`. |\n| Ask a natural-language store question | For ordinary questions, `ask_store` checks Shopify's headless FAQ answer first, then deterministically searches published pages and articles only when that source returns `not_found`. |\n| Search published guides | The assistant calls `ask_store` with `source: \"published_guides\"` for explicit guide, care, sizing, brand, page, or article searches. Direct MCP clients can still call the lower-level `search_published_guides` tool independently. |\n| Shop conversationally | The same reviewed tools are projected into a public embedded assistant on the merchant's exact origin. |\n| Continue safely | After the shopper chooses one variant and reviews its quantity, one confirmed `create_checkout` call returns Shopify-authoritative totals and an exact allowlisted checkout URL. |\n\nThe solution does not need a shadow catalog, sync job, vector database, or Shopify Admin API. Shopify stays\nauthoritative for products, publication, search behavior, availability, price, policies, cart validation,\ndiscounts, tax, shipping, payment, and checkout.\n\nThe current implementation keeps Storefront GraphQL as the one product-retrieval path. Do not add a second\nUCP search pass or blend two result sets. Reconsider Shopify UCP Catalog only after the same live prompt matrix\nshows a material relevance gap and a single UCP path proves equal or better hard-constraint fidelity, required\nproduct/variant fields, bounded latency, pagination, tenant isolation, and operational simplicity. The dated\n[MCP/UCP capability reference](documentation/shopify-mcp-ucp-capabilities.md) owns the factual surface; this\nexample owns the implementation choice.\n\n## Configure one merchant environment\n\nFollow the complete [Shopify guide](https://docs.noodleseed.dev/docs/guides/shopify-checkout) to install the\nShopify Headless sales channel, create a storefront, grant the minimum Storefront scopes, publish products,\nand copy the private server-side Storefront access token.\n\nLink the reusable app, then bind the merchant rather than editing `src/shopify-config.ts`:\n\n```sh\nnoodle link --org <org> --app shopify --env dev\nnoodle variables set SHOPIFY_STORE_ORIGIN --scope env \\\n --value https://your-shop.myshopify.com\nnoodle variables set SHOPIFY_STOREFRONT_MCP_ENDPOINT --scope env \\\n --value https://your-shop.myshopify.com/api/mcp\nnoodle secrets set SHOPIFY_STOREFRONT_PRIVATE_TOKEN --scope env\n```\n\n`SHOPIFY_STORE_ORIGIN` must be one canonical bare HTTPS origin—no path, trailing slash, credentials, or\nwildcard. That one value drives connector egress, assistant origin checks, checkout handoff authority, and\nwidget redirect metadata. Deployment fails closed if it is missing or malformed.\n\nThe source selects `noodleManaged()`, so merchants do not configure or receive a provider endpoint, model\nidentifier, or model key. Hosted inference fails closed until Noodle enrolls the exact org/app/environment;\nthat enrollment is operator state rather than a source or merchant binding.\n\nFor local development, put only the values—not source edits—in an ignored project-root `.env`:\n\n```dotenv\nSHOPIFY_STORE_ORIGIN=https://your-shop.myshopify.com\nSHOPIFY_STOREFRONT_MCP_ENDPOINT=https://your-shop.myshopify.com/api/mcp\nSHOPIFY_STOREFRONT_PRIVATE_TOKEN=replace-with-your-private-storefront-token\n```\n\n## Local author loop\n\n```sh\npnpm test\nnoodle validate\nnoodle check --min-severity warn\nnoodle dev\n```\n\nIn Devtools, call `search_products` with:\n\n```json\n{\"query\":\"gifts\",\"first\":12,\"unavailableProducts\":\"HIDE\"}\n```\n\nVerify the three-result visual cap, natural conversational clarification, Shopify-native natural-language\nrelevance and price ordering, partial-prefix search, at most one distinct zero-result rewrite, availability handling, selected-product details, policy/page/article answers,\nvariant completeness, cursor pagination, light and dark themes, unavailable merchandise, checkout\nconfirmation/errors, and final allowlisted handoff. Product discovery must not call Shopify `cartCreate`;\nthe final explicit checkout action creates exactly one cart. Any number of headless search pages must still\nproduce exactly one recommendation widget. Clarification stays in prose and calls no tool; recommendation\nand single-product views permit only their documented one-sentence action cue. Summaries, tool narration,\nrepeated view contents, generic priority menus, and internal prompt language fail.\nNamed comparisons also fail if they render a recommendation widget without explaining the requested\ndifferences.\n\nFor a repeatable live assistant proof, use the current CLI login to create and revoke one temporary client:\n\n```sh\npnpm smoke:shopify:semantic -- \\\n --service <deployed-noodle-service-url> \\\n --origin https://your-shop.myshopify.com \\\n --org <org> --app shopify --env dev\n```\n\nThe runner gives every case a fresh session and checks general no-tool answers, semantic product discovery,\nexact-name zero results, one-tool canonical policy routing, deterministic FAQ-to-content composition, explicit content search, the two-search\nceiling, the single recommendation view, and the absence of checkout calls. It prints only a bounded JSON\nsummary. Use `--expectations <ignored-private-json>` to add exact live product-title expectations without\ncommitting store-specific data; the file contains merchant data and must remain private. Use\n`--client-credentials-file <0600-json>` to reuse a pre-provisioned client.\n\nFor a top-three result that Shopify's selected sort order already proves, request three products and stop\nafter the first page. Do not call `get_product` for routine recommendation lists: the presentation tool\nre-fetches the final IDs authoritatively. Reserve detail fetches and pagination for claims or client-side\nconstraints that truly require them.\n\nThe public guide owns the complete\n[answer-quality golden prompt matrix](https://docs.noodleseed.dev/docs/guides/shopify-checkout#answer-quality-golden-prompts).\nTreat one unsupported product or policy claim as a failed answer even when the prose is fluent.\n\nFor four independent prospective-customer deployments from this exact source, follow the\n[four-store rollout runbook](documentation/four-store-rollout.md). Store-specific values stay in operator\nbindings; no customer receives a source fork.\n\n## Deploy\n\nStart owner-only for the live-store smoke test:\n\n```sh\nnoodle deploy --access owner-only\nnoodle open\n```\n\nInstall the exact one-line assistant snippet printed by `noodle deploy` immediately before `</body>` in the\nactive Shopify theme's `layout/theme.liquid`. The complete\n[Shopify guide](https://docs.noodleseed.dev/docs/guides/shopify-checkout#9-deploy-safely) owns the merchant\ninstallation and verification steps.\n\nAfter the catalog, policy, assistant, and checkout smoke tests pass, review store traffic expectations,\nabuse controls, product publication, privacy copy, and customer-facing access before widening exposure.\n\n## Security and non-goals\n\n- The private Storefront token is brokered server-side and never reaches the widget or model.\n- Shopify's standard Storefront MCP endpoint is unauthenticated, but it is still constrained to the exact\n operator-bound store origin; runtime never runs `tools/list` or forwards Shopify `_meta`/widgets.\n- A Shopify cart ID contains a secret key. The mutation never selects it, the normalizer drops unknown\n upstream fields, and tests prove an injected cart ID cannot reach tool output.\n- Widget state contains only the selected variant ID and quantity.\n- Checkout URLs open only on the operator-bound exact storefront origin.\n- Customer login, orders, Admin API writes, persistent/resumable carts, a separate semantic catalog index, and\n marketplace installation are deliberate extensions, not hidden setup requirements.\n\nResumable carts require an encrypted server-side vault behind an opaque non-secret handle. Never place a\nShopify cart ID in widget state, tool results, model context, logs, or ordinary state handles.\n" },
|
|
45
45
|
{ relPath: "examples/shopify-storefront/noodle.json", content: "{\n \"entrypoint\": \"src/server.ts\",\n \"name\": \"shopify-storefront\",\n \"template\": \"widget\"\n}\n" },
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"@noodle-borg/managed-capabilities": "0.0.0",
|
|
42
42
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
43
43
|
"@noodle-borg/admission-limits": "0.0.0",
|
|
44
|
-
"@noodle-borg/agent-kit": "0.
|
|
44
|
+
"@noodle-borg/agent-kit": "0.115.0",
|
|
45
45
|
"@noodle-borg/app-package": "0.0.0",
|
|
46
46
|
"@noodle-borg/assistant-gateway": "0.0.0",
|
|
47
47
|
"@noodle-borg/auth": "0.0.0",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noodleseed/one",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.194.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Noodle CLI by Noodle Seed — author, run, and deploy declarative MCP servers. Embedding the assistant in your own web app is @noodleseed/assistant.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -236,7 +236,7 @@
|
|
|
236
236
|
"@modelcontextprotocol/client": "2.0.0",
|
|
237
237
|
"@modelcontextprotocol/server": "2.0.0",
|
|
238
238
|
"@noodle-borg/admission-limits": "0.0.0",
|
|
239
|
-
"@noodle-borg/agent-kit": "0.
|
|
239
|
+
"@noodle-borg/agent-kit": "0.115.0",
|
|
240
240
|
"@noodle-borg/app-audit": "0.0.0",
|
|
241
241
|
"@noodle-borg/app-package": "0.0.0",
|
|
242
242
|
"@noodle-borg/assistant-gateway": "0.0.0",
|