@noodleseed/one 0.188.0 → 0.190.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/node_modules/@noodle-borg/agent-kit/dist/behavior-skills.js +19 -35
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/index.d.ts +0 -1
- package/node_modules/@noodle-borg/agent-kit/dist/index.js +9 -27
- package/node_modules/@noodle-borg/agent-kit/dist/plugin-bootstrap-skill.js +1 -10
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-split.js +68 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +38 -4
- package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js +4 -4
- package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-split.js +68 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-existing-app-ref.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-router.d.ts +3 -2
- package/node_modules/@noodle-borg/agent-kit/dist/skill-router.js +11 -99
- package/node_modules/@noodle-borg/agent-kit/dist/skill-server-playbook-ref.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-verification-ref.js +2 -2
- package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/package.json +1 -1
- package/node_modules/@noodle-borg/service/package.json +1 -1
- package/node_modules/@noodle-borg/transport-http/dist/handler.js +3 -0
- package/node_modules/@noodle-borg/transport-http/dist/routing.d.ts +2 -0
- package/node_modules/@noodle-borg/transport-http/dist/routing.js +2 -0
- package/node_modules/@noodle-borg/transport-http/dist/serve-request.js +3 -1
- package/node_modules/@noodleseed/assistant/package.json +1 -1
- package/package.json +2 -2
- package/node_modules/@noodle-borg/agent-kit/dist/plan-execution-skill.d.ts +0 -10
- package/node_modules/@noodle-borg/agent-kit/dist/plan-execution-skill.js +0 -56
|
@@ -15,7 +15,7 @@ export const EXPECTED_BEHAVIOR_SKILL_NAMES = [
|
|
|
15
15
|
export const BEHAVIOR_SKILLS = [
|
|
16
16
|
{
|
|
17
17
|
name: 'designing-mcp-products',
|
|
18
|
-
description: '
|
|
18
|
+
description: 'Design a Noodle Seed MCP product or choose its first workflow. Use when the user benefit, conversational fit, scope, or evidence level is unclear.',
|
|
19
19
|
outcome: 'Produce the smallest decision-ready MCP product design before code or hosted mutation.',
|
|
20
20
|
positiveTriggers: [
|
|
21
21
|
'Turn a vague product idea into an MCP product.',
|
|
@@ -147,7 +147,7 @@ export const BEHAVIOR_SKILLS = [
|
|
|
147
147
|
},
|
|
148
148
|
{
|
|
149
149
|
name: 'embedding-mcp-assistants',
|
|
150
|
-
description: '
|
|
150
|
+
description: 'Embed a Noodle Seed assistant in a website or SaaS app, including public-to-product onboarding. Use for browser mounting, sessions, identity, or customer-specific routing.',
|
|
151
151
|
outcome: 'Select one decision-complete assistant topology, including the dual-surface continuous-onboarding default when it fits, then deliver the embed with identity and credential separation proven at the tested level.',
|
|
152
152
|
positiveTriggers: [
|
|
153
153
|
'Embed the Noodle assistant in an existing web app.',
|
|
@@ -167,10 +167,16 @@ export const BEHAVIOR_SKILLS = [
|
|
|
167
167
|
'For a first-workflow recommendation: evidence for a public visitor surface, account boundary, useful pre-account result, and authenticated outcome.',
|
|
168
168
|
],
|
|
169
169
|
primaryReference: 'references/embedded-assistant.md',
|
|
170
|
-
supportingReferences: [
|
|
171
|
-
|
|
170
|
+
supportingReferences: [
|
|
171
|
+
'references/embedded-assistant-messaging.md',
|
|
172
|
+
'references/embedded-assistant-identity.md',
|
|
173
|
+
'references/embedded-assistant-rendering.md',
|
|
174
|
+
'references/embedded-assistant-operations.md',
|
|
175
|
+
'references/authoring-workflow.md',
|
|
176
|
+
],
|
|
177
|
+
evidence: 'The selected topology and trust boundaries are clear, and the embed works at the requested evidence level without forwarding inbound credentials to business backends.',
|
|
172
178
|
recovery: 'Localize failures to origin, session exchange, browser mount, MCP surface, or hosted configuration.',
|
|
173
|
-
stop: '
|
|
179
|
+
stop: 'Clarify any missing identity, origin, routing, or model ownership needed for the next change; continue independent work within the requested scope.',
|
|
174
180
|
},
|
|
175
181
|
{
|
|
176
182
|
name: 'verifying-mcp-delivery',
|
|
@@ -215,7 +221,7 @@ export const BEHAVIOR_SKILLS = [
|
|
|
215
221
|
primaryReference: 'references/verify-and-recover.md',
|
|
216
222
|
supportingReferences: ['references/troubleshooting.md', 'references/inspect-hosted.md'],
|
|
217
223
|
evidence: 'The failed layer is rerun successfully, or the stable blocker and exact next action are reported.',
|
|
218
|
-
recovery: '
|
|
224
|
+
recovery: 'If the same failure persists without a new evidence-backed repair, preserve the repro and passing layers and report the blocker.',
|
|
219
225
|
stop: 'Stop before hosted mutation unless the user separately requests deploying-mcp-services.',
|
|
220
226
|
},
|
|
221
227
|
{
|
|
@@ -294,38 +300,16 @@ export function renderBehaviorSkillBody(skill, _target) {
|
|
|
294
300
|
'',
|
|
295
301
|
skill.outcome,
|
|
296
302
|
'',
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
...skill.
|
|
300
|
-
'',
|
|
301
|
-
'## Do not use when',
|
|
302
|
-
'',
|
|
303
|
-
...skill.negativeTriggers.map((trigger) => `- ${trigger}`),
|
|
304
|
-
'',
|
|
305
|
-
'## Required inputs',
|
|
303
|
+
`Read [the workflow](./${skill.primaryReference}) for this task. Read other references only for the relevant concern:`,
|
|
304
|
+
...skill.supportingReferences.map((reference) => `- [${reference}](./${reference})`),
|
|
305
|
+
...(skill.supportingReferences.length === 0 ? ['- No additional reference is required.'] : []),
|
|
306
306
|
'',
|
|
307
|
+
'Establish the inputs needed for the requested outcome:',
|
|
307
308
|
...skill.requiredInputs.map((entry) => `- ${entry}`),
|
|
308
309
|
'',
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
`
|
|
312
|
-
...skill.supportingReferences.map((reference) => `Load the supporting reference at \`${reference}\` only when the playbook or observed evidence names that concern.`),
|
|
313
|
-
'',
|
|
314
|
-
'## Verification evidence',
|
|
315
|
-
'',
|
|
316
|
-
skill.evidence,
|
|
317
|
-
'',
|
|
318
|
-
'## Recovery paths',
|
|
319
|
-
'',
|
|
320
|
-
skill.recovery,
|
|
321
|
-
'',
|
|
322
|
-
'## Stop conditions',
|
|
323
|
-
'',
|
|
324
|
-
skill.stop,
|
|
325
|
-
'',
|
|
326
|
-
'## Handoff contract',
|
|
327
|
-
'',
|
|
328
|
-
'Pass the selected outcome, explicit target, changed files, commands run, passing evidence, first unproven evidence layer, sanitized failure, remaining authority, and exact next action. The receiving skill continues from that layer; do not restart discovery or discard prior proof.',
|
|
310
|
+
`Done when: ${skill.evidence}`,
|
|
311
|
+
`If blocked: ${skill.recovery}`,
|
|
312
|
+
`Boundary: ${skill.stop}`,
|
|
329
313
|
].join('\n');
|
|
330
314
|
}
|
|
331
315
|
//# sourceMappingURL=behavior-skills.js.map
|
|
@@ -86,7 +86,7 @@ export const BUNDLED_EXAMPLE_FILES = [
|
|
|
86
86
|
{ relPath: "examples/google-bigquery/src/server.ts", content: "import {\n annotations,\n bind,\n connection,\n connector,\n googleWorkloadIdentity,\n server,\n tool,\n variable,\n z,\n} from '@noodleseed/one';\n\nconst BIGQUERY_ORIGIN = 'https://bigquery.googleapis.com';\nconst BIGQUERY_READONLY = 'https://www.googleapis.com/auth/bigquery.readonly';\n\nconst bigquery = connector('google_bigquery')\n .version('1.0.0')\n .http({\n baseUrl: BIGQUERY_ORIGIN,\n allowedOrigins: [BIGQUERY_ORIGIN],\n credentialProfiles: { google_wif: { kind: 'bearer' } },\n operations: {\n query: {\n type: 'read',\n method: 'POST',\n path: '/bigquery/v2/projects/${args.project_id}/queries',\n input: z.object({\n project_id: z.string().min(1),\n query: z.string().min(1),\n max_results: z.number().int().min(1).max(1000).optional(),\n }),\n output: z.object({\n job_complete: z.boolean().optional(),\n schema: z.unknown().optional(),\n rows: z.array(z.unknown()).optional(),\n total_rows: z.string().optional(),\n }),\n request: {\n query: '${args.query}',\n useLegacySql: false,\n maxResults: '${args.max_results}',\n },\n response: {\n job_complete: '${response.jobComplete}',\n schema: '${response.schema}',\n rows: '${response.rows}',\n total_rows: '${response.totalRows}',\n },\n credentials: {\n profiles: ['google_wif'],\n scopes: [BIGQUERY_READONLY],\n audience: BIGQUERY_ORIGIN,\n },\n },\n },\n });\n\nconst google = connection(\n 'customer_google_cloud',\n googleWorkloadIdentity({\n provider: variable('GOOGLE_WIF_PROVIDER'),\n access: {\n kind: 'serviceAccountImpersonation',\n serviceAccount: variable('GOOGLE_SERVICE_ACCOUNT'),\n },\n }),\n);\n\nexport default server(\n 'google_bigquery',\n {\n title: 'Google BigQuery Reader',\n version: '1.0.0',\n use: {\n bigquery: bind(bigquery, { profile: 'google_wif', connection: google }),\n },\n instructions:\n 'Run read-only GoogleSQL queries in the configured customer BigQuery project. Never invent project, dataset, or table names.',\n },\n [\n tool('query_bigquery', {\n title: 'Query BigQuery',\n description:\n 'Run one read-only GoogleSQL query in an explicitly named Google Cloud project and return the typed BigQuery rows.',\n input: z.object({\n project_id: z.string().min(1).meta({ title: 'Google Cloud project' }),\n query: z.string().min(1).meta({ title: 'GoogleSQL query' }),\n max_results: z.number().int().min(1).max(1000).optional(),\n }),\n output: z.object({\n job_complete: z.boolean(),\n schema: z.unknown().optional(),\n rows: z.array(z.unknown()),\n total_rows: z.string().optional(),\n }),\n annotations: annotations.readOnly(),\n fulfil({ input, connectors }) {\n const result = connectors.bigquery.query({\n project_id: input.project_id,\n query: input.query,\n max_results: input.max_results,\n });\n return {\n job_complete: result.job_complete,\n schema: result.schema.optional(),\n rows: result.rows,\n total_rows: result.total_rows.optional(),\n };\n },\n }),\n ],\n);\n" },
|
|
87
87
|
{ relPath: "examples/google-bigquery/test/server.test.ts", content: "import { describe, expect, it } from 'vitest';\nimport app from '../src/server.js';\n\ndescribe('Google BigQuery workload-identity flagship', () => {\n it('binds a read-only Google operation to keyless service-account impersonation', async () => {\n const manifest = await app.toManifest();\n expect(manifest.connectors?.bigquery).toMatchObject({\n id: 'google_bigquery',\n binding: {\n profile: 'google_wif',\n connection: {\n id: 'customer_google_cloud',\n source: {\n kind: 'googleWorkloadIdentity',\n provider: '${env.GOOGLE_WIF_PROVIDER}',\n access: {\n kind: 'serviceAccountImpersonation',\n serviceAccount: '${env.GOOGLE_SERVICE_ACCOUNT}',\n },\n },\n },\n },\n });\n expect(app.toConnectorCatalog()).toMatchObject({\n connectors: [\n {\n credentialProfiles: { google_wif: { kind: 'bearer' } },\n operations: {\n query: {\n credentials: {\n profiles: ['google_wif'],\n scopes: ['https://www.googleapis.com/auth/bigquery.readonly'],\n audience: 'https://bigquery.googleapis.com',\n },\n },\n },\n },\n ],\n });\n expect(JSON.stringify({ manifest, catalog: app.toConnectorCatalog() })).not.toMatch(\n /private[_-]?key|client[_-]?secret|access[_-]?token/i,\n );\n });\n});\n" },
|
|
88
88
|
{ relPath: "examples/google-bigquery/vitest.config.ts", content: "import { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n resolve: {\n alias: {\n '@noodleseed/one': new URL('../../packages/authoring/src/index.ts', import.meta.url).pathname,\n '@noodle-borg/capabilities': new URL(\n '../../packages/capabilities/src/index.ts',\n import.meta.url,\n ).pathname,\n '@noodle-borg/compiler': new URL('../../packages/compiler/src/index.ts', import.meta.url)\n .pathname,\n '@noodle-borg/connector-defs': new URL(\n '../../packages/connector-defs/src/index.ts',\n import.meta.url,\n ).pathname,\n },\n },\n test: { include: ['test/**/*.test.ts'] },\n});\n" },
|
|
89
|
-
{ 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, the
|
|
89
|
+
{ 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" },
|
|
90
90
|
{ relPath: "examples/hello/noodle.json", content: "{\n \"entrypoint\": \"src/server.ts\",\n \"name\": \"hello\",\n \"template\": \"hello\"\n}\n" },
|
|
91
91
|
{ 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\": \"latest\"\n }\n}\n" },
|
|
92
92
|
{ relPath: "examples/hello/src/server.ts", content: "import { annotations, server, tool, z } from '@noodleseed/one';\n\n// Customer apps stay on the public SDK; @noodle-borg/* packages are runtime implementation 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" },
|
|
@@ -3,7 +3,6 @@ export type * from '@noodle-borg/agent-packaging';
|
|
|
3
3
|
export { HOST_PACKAGING_LIMITS, packageHostTarget } from '@noodle-borg/agent-packaging';
|
|
4
4
|
export * from '@noodle-borg/plugin-distribution';
|
|
5
5
|
export * from './behavior-skills.js';
|
|
6
|
-
export * from './plan-execution-skill.js';
|
|
7
6
|
export * from './plugin-compatibility.js';
|
|
8
7
|
export * from './plugin-copilot-bundle.js';
|
|
9
8
|
export * from './plugin-launcher.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
2
|
import { BEHAVIOR_SKILLS, renderBehaviorSkillBody } from './behavior-skills.js';
|
|
3
3
|
import { BUNDLED_EXAMPLE_FILES } from './generated/example-files.js';
|
|
4
|
-
import {
|
|
4
|
+
import { AUTHORING_TOPIC_PATHS } from './skill-authoring-split.js';
|
|
5
5
|
import { SKILL_REFERENCES } from './skill-content.js';
|
|
6
6
|
import { defineSkillRegistry, renderRegisteredSkillFiles, } from './skill-registry.js';
|
|
7
7
|
import { SKILL_DESCRIPTION, skillRouterBody } from './skill-router.js';
|
|
@@ -9,7 +9,6 @@ import { AGENT_KIT_VERSION } from './version.js';
|
|
|
9
9
|
export { HOST_PACKAGING_LIMITS, packageHostTarget } from '@noodle-borg/agent-packaging';
|
|
10
10
|
export * from '@noodle-borg/plugin-distribution';
|
|
11
11
|
export * from './behavior-skills.js';
|
|
12
|
-
export * from './plan-execution-skill.js';
|
|
13
12
|
export * from './plugin-compatibility.js';
|
|
14
13
|
export * from './plugin-copilot-bundle.js';
|
|
15
14
|
export * from './plugin-launcher.js';
|
|
@@ -29,7 +28,10 @@ const MANAGED_FILE_BY_TARGET = {
|
|
|
29
28
|
};
|
|
30
29
|
const SKILL_REFERENCE_BY_PATH = new Map(SKILL_REFERENCES.map((reference) => [reference.relPath, reference]));
|
|
31
30
|
function behaviorSkillReferenceFiles(skill) {
|
|
32
|
-
|
|
31
|
+
const paths = [skill.primaryReference, ...skill.supportingReferences];
|
|
32
|
+
if (paths.includes('references/authoring-workflow.md'))
|
|
33
|
+
paths.push(...AUTHORING_TOPIC_PATHS);
|
|
34
|
+
return [...new Set(paths)].map((path) => {
|
|
33
35
|
const reference = SKILL_REFERENCE_BY_PATH.get(path);
|
|
34
36
|
if (reference === undefined)
|
|
35
37
|
throw new Error(`missing behavior skill reference: ${path}`);
|
|
@@ -66,7 +68,6 @@ export const SKILL_REGISTRY = defineSkillRegistry([
|
|
|
66
68
|
renderBody: (target) => renderBehaviorSkillBody(skill, target),
|
|
67
69
|
files: behaviorSkillReferenceFiles(skill),
|
|
68
70
|
})),
|
|
69
|
-
{ ...EXECUTING_NOODLE_PLANS_SKILL, version: AGENT_KIT_VERSION },
|
|
70
71
|
]);
|
|
71
72
|
export function parseAgentTargets(value) {
|
|
72
73
|
if (value === undefined || value === 'all')
|
|
@@ -110,29 +111,10 @@ export function renderManagedBlock(input) {
|
|
|
110
111
|
'# Noodle Seed Project Context',
|
|
111
112
|
'',
|
|
112
113
|
`Agent target: ${input.target === 'codex' ? 'Codex' : 'Claude Code'}.`,
|
|
113
|
-
'',
|
|
114
|
-
'
|
|
115
|
-
'',
|
|
116
|
-
'
|
|
117
|
-
'',
|
|
118
|
-
"- **Applicability**: when the request is unrelated to the Noodle MCP server or app, follow the project's normal instructions and run no Noodle lifecycle commands.",
|
|
119
|
-
'- **Route first**: read the `noodle-seed` skill `SKILL.md`, choose exactly one primary route for the requested outcome, and read that primary reference. Read supporting references only when the route or observed evidence requires them.',
|
|
120
|
-
"- Discover: `noodle commands --json` — every command, flag, and exit code (don't read source).",
|
|
121
|
-
'- Author, when the selected route requires it: edit the configured TypeScript entrypoint — follow that route and its capability references.',
|
|
122
|
-
'- Validate: `noodle validate --json` → on failure `{ok:false,error:{code,message,fix,next,errors:[{code,path,message}]}}`; per-field detail is in `error.errors[]`.',
|
|
123
|
-
'- Repair: fix each `error.errors[]` entry at its `path`, re-run validate; `noodle validate --fix-prompt` gives ready repair prose. Never freeform re-edit.',
|
|
124
|
-
'- Smoke: `noodle test --json`.',
|
|
125
|
-
'- Continue only to the level the selected route requests: Apps/widgets use `noodle check --json` plus `noodle devtools`; hosted inspection stays read-only; hosted mutation runs only when the current user request explicitly authorizes the exact action and target.',
|
|
126
|
-
'- Stale skill? `noodle agents doctor --json` → `noodle agents setup --write`.',
|
|
127
|
-
'',
|
|
128
|
-
'The exact `--json`/exit-code contract is in the `noodle-seed` skill and its `references/agent-contract.md`. Human-oriented command prose lives in the project README, not here.',
|
|
129
|
-
'',
|
|
130
|
-
'## Safety',
|
|
131
|
-
'',
|
|
132
|
-
'- Keep secrets, bearer tokens, refresh tokens, static access keys, `.env` / `.env.noodle` values, and `~/.noodle/config.json` out of prompts, logs, docs, tests, and generated files.',
|
|
133
|
-
'- Do not hand-author manifest JSON or YAML, runtime artifact JSON, connector IR, or hosted asset metadata.',
|
|
134
|
-
'- Do not add static data-plane credential paths; hosted access is identity-based.',
|
|
135
|
-
'- Never run `link`, hosted secret/variable/config/access changes, deploy, rollback, host configuration writes, or directory submission unless the current user request explicitly authorizes the exact mutation and target.',
|
|
114
|
+
'Build this project in its configured TypeScript entrypoint. The compiler owns manifests and runtime artifacts; do not hand-author them.',
|
|
115
|
+
'For Noodle tasks, choose the relevant installed skill directly; `noodle-seed` helps with setup or unclear tasks. Read its linked reference only when needed. For unrelated work, follow the project instructions.',
|
|
116
|
+
'Use `noodle commands --json` for current commands and parse `noodle validate --json` errors by code and path. Validate the requested behavior at the appropriate level; local success does not prove a live connector or hosted service.',
|
|
117
|
+
'Keep credentials out of source, prompts, logs, and browser code. Hosted writes need the authorized action and explicit organization, application, and environment.',
|
|
136
118
|
'',
|
|
137
119
|
'## Project Defaults',
|
|
138
120
|
'',
|
|
@@ -5,8 +5,7 @@ import { NOODLE_WORDMARK } from './welcome-wordmark.js';
|
|
|
5
5
|
export const PLUGIN_NAME = 'noodle-seed';
|
|
6
6
|
/** Cold-start discovery text shared by direct marketplace and official-directory projections. */
|
|
7
7
|
const BOOTSTRAP_SKILL_DESCRIPTION = 'Use when asked to build, create, or ship an MCP server, MCP app, AI app, or connector, or to ' +
|
|
8
|
-
'make a product, API, or SaaS reachable by AI agents
|
|
9
|
-
'signup or onboarding conversion or choose a first Noodle workflow. Bootstraps Noodle Seed — TypeScript ' +
|
|
8
|
+
'make a product, API, or SaaS reachable by AI agents. Bootstraps Noodle Seed TypeScript ' +
|
|
10
9
|
'authoring with the noodle CLI, local validation and testing, and governed hosted deployment.';
|
|
11
10
|
function bootstrapRouterBody() {
|
|
12
11
|
return [
|
|
@@ -42,12 +41,6 @@ function bootstrapRouterBody() {
|
|
|
42
41
|
`${PLUGIN_WINDOWS_SUPPORT.installCommand}` +
|
|
43
42
|
'`; never expose a private plugin path as a workaround.',
|
|
44
43
|
'',
|
|
45
|
-
'## First-workflow default',
|
|
46
|
-
'',
|
|
47
|
-
'When the user wants to get started but has not chosen a workflow, inspect the available product and repository context. If more signed-up or signed-in users are valuable and the product has a public visitor entry point, an existing account boundary, a genuine useful result that can be delivered before signup, and a meaningful next action inside the authenticated product, recommend public-to-product continuous onboarding as the first workflow.',
|
|
48
|
-
'',
|
|
49
|
-
'This default is not limited to B2B SaaS. Do not infer fit from the industry label alone, and do not manufacture pre-signup value or pressure. If the evidence is incomplete, ask only for the smallest missing fit fact. After project setup, route the accepted recommendation to `embedding-mcp-assistants`; the project-local playbook owns the two-surface design and exact implementation.',
|
|
50
|
-
'',
|
|
51
44
|
'## Cold start (no project yet)',
|
|
52
45
|
'',
|
|
53
46
|
'1. New or empty directory: use `noodle-readiness.setup_project` with `mode: "initialize"`, or inline-execute the public fallback `noodle init --json`. This prepares the SaaS profile, installs pinned project-local tooling, and runs local checks. Preserve the existing package manager; use `install: false` / `--no-install` only for explicitly files-only work.',
|
|
@@ -55,8 +48,6 @@ function bootstrapRouterBody() {
|
|
|
55
48
|
'3. Read the newly installed project-local `noodle-seed` `SKILL.md`, select its route for the requested outcome, and stop bootstrap discovery. This handoff is the bootstrap stop condition.',
|
|
56
49
|
'Inspect `setup.ready`, `completed`, `failed`, `proof`, and `restartRequired`. A failed stage is not completion: repair that stage and retry the same public command without `--force`. Files-only output is unverified; local-synthetic proof never proves customer identity, backend writes, or hosted operation. Read the new context explicitly in an existing session; never launch a nested agent or claim it reloaded automatically.',
|
|
57
50
|
'',
|
|
58
|
-
'After handoff, the project-local route decides which public command is needed. Continue to prefer typed `noodle-readiness` tools. If they remain unavailable, inline-execute that route’s exact public CLI arguments through the same packaged launcher. Do not invent a second lifecycle or bypass the project skill.',
|
|
59
|
-
'',
|
|
60
51
|
'For authorized hosted work, preserve the canonical preflight, configuration, deployment, and readiness sequence. Follow every structured public `noodle ... --from-env` configuration action before resuming the same deploy. Linking and each configuration write remain separately authorized mutations. Show task-level progress and the exact target. On failure, report the structured error, safe public recovery commands, and resume command only.',
|
|
61
52
|
'',
|
|
62
53
|
'## Bootstrap boundary',
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { renderAuthoringWorkflowReference } from './skill-authoring-refs.js';
|
|
2
|
+
const TOPIC_BY_HEADING = {
|
|
3
|
+
'Input paths': 'core',
|
|
4
|
+
'Fit check': 'core',
|
|
5
|
+
'Product-guide decision': 'core',
|
|
6
|
+
'Repair loop': 'core',
|
|
7
|
+
Connectors: 'connectors',
|
|
8
|
+
'HTTP connector example (full server)': 'connectors',
|
|
9
|
+
'Customer OAuth for remote MCP clients': 'authentication',
|
|
10
|
+
'Auth-derived customer API endpoints': 'authentication',
|
|
11
|
+
'Per-tool authorization': 'authentication',
|
|
12
|
+
'Delegated downstream auth (call your API as the signed-in user)': 'authentication',
|
|
13
|
+
'Design tools for the model': 'core',
|
|
14
|
+
'Invocation context': 'context',
|
|
15
|
+
'Ask for structured missing input': 'context',
|
|
16
|
+
'Compute connector example': 'connectors',
|
|
17
|
+
Tests: 'verification',
|
|
18
|
+
'Secrets and variables': 'authentication',
|
|
19
|
+
'Embedded assistant': 'managed',
|
|
20
|
+
'Managed capability reuse': 'managed',
|
|
21
|
+
'Knowledge components': 'managed',
|
|
22
|
+
'Managed collections': 'managed',
|
|
23
|
+
Boundaries: 'core',
|
|
24
|
+
};
|
|
25
|
+
export const AUTHORING_TOPIC_PATHS = [
|
|
26
|
+
'references/authoring-connectors.md',
|
|
27
|
+
'references/authoring-authentication.md',
|
|
28
|
+
'references/authoring-context.md',
|
|
29
|
+
'references/authoring-verification.md',
|
|
30
|
+
'references/authoring-managed.md',
|
|
31
|
+
];
|
|
32
|
+
/** The source is single-authored; each rendered reference is loaded only for its task. */
|
|
33
|
+
export function renderAuthoringTopic(topic) {
|
|
34
|
+
const source = renderAuthoringWorkflowReference();
|
|
35
|
+
const sections = source.split(/(?=^## )/m);
|
|
36
|
+
const selected = sections.slice(1).filter((section) => {
|
|
37
|
+
const heading = /^## ([^\n]+)/.exec(section)?.[1];
|
|
38
|
+
if (heading === undefined)
|
|
39
|
+
throw new Error('authoring reference has no heading');
|
|
40
|
+
if (heading === 'Contents')
|
|
41
|
+
return false;
|
|
42
|
+
if (!(heading in TOPIC_BY_HEADING))
|
|
43
|
+
throw new Error(`unrouted authoring topic: ${heading}`);
|
|
44
|
+
return TOPIC_BY_HEADING[heading] === topic;
|
|
45
|
+
});
|
|
46
|
+
if (selected.length === 0)
|
|
47
|
+
throw new Error(`empty authoring topic: ${topic}`);
|
|
48
|
+
const contents = selected.map((section) => `- ${/^## ([^\n]+)/.exec(section)?.[1] ?? ''}`);
|
|
49
|
+
const intro = topic === 'core'
|
|
50
|
+
? [
|
|
51
|
+
'# Authoring workflow',
|
|
52
|
+
'',
|
|
53
|
+
'Use this overview for Noodle authoring decisions. Open only the relevant topic:',
|
|
54
|
+
'- [Connectors and worked examples](./authoring-connectors.md)',
|
|
55
|
+
'- [Customer authentication and secrets](./authoring-authentication.md)',
|
|
56
|
+
'- [Invocation context and missing input](./authoring-context.md)',
|
|
57
|
+
'- [Verification](./authoring-verification.md)',
|
|
58
|
+
'- [Managed capabilities and collections](./authoring-managed.md)',
|
|
59
|
+
'',
|
|
60
|
+
'## Contents',
|
|
61
|
+
'',
|
|
62
|
+
...contents,
|
|
63
|
+
'',
|
|
64
|
+
].join('\n')
|
|
65
|
+
: `# Authoring: ${topic}\n\n## Contents\n\n${contents.join('\n')}\n\n`;
|
|
66
|
+
return `${intro}${selected.join('').trimEnd()}\n`;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=skill-authoring-split.js.map
|
|
@@ -12,10 +12,11 @@ import { CLI_COMMANDS, COMPILE_ERROR_CODES, SDK_EXPORTS } from './generated/surf
|
|
|
12
12
|
import { mdTable } from './md.js';
|
|
13
13
|
import { renderAgentGuideReference } from './skill-agent-guide-ref.js';
|
|
14
14
|
import { renderBuildAnMcpAppReference } from './skill-app-playbook-ref.js';
|
|
15
|
-
import {
|
|
15
|
+
import { renderExamplesReference, renderWidgetsAndAppsReference } from './skill-authoring-refs.js';
|
|
16
|
+
import { renderAuthoringTopic } from './skill-authoring-split.js';
|
|
16
17
|
import { renderConnectAnApiReference } from './skill-connect-refs.js';
|
|
17
18
|
import { renderExperienceDesignReference } from './skill-design-refs.js';
|
|
18
|
-
import {
|
|
19
|
+
import { renderEmbeddedAssistantTopic } from './skill-embedded-assistant-split.js';
|
|
19
20
|
import { renderWrapExistingAppReference } from './skill-existing-app-ref.js';
|
|
20
21
|
import { renderFeedbackReference } from './skill-feedback-ref.js';
|
|
21
22
|
import { renderAppDirectoryComplianceReference, renderDeployAndOpsReference, renderInspectHostedReference, renderPublishingReference, renderTestInHostsReference, renderTroubleshootingReference, } from './skill-operations-refs.js';
|
|
@@ -409,9 +410,42 @@ export const SKILL_REFERENCES = [
|
|
|
409
410
|
{ relPath: 'references/agent-contract.md', render: renderAgentContractReference },
|
|
410
411
|
{ relPath: 'references/compile-errors.md', render: renderCompileErrorsReference },
|
|
411
412
|
{ relPath: 'references/build-an-mcp-server.md', render: renderBuildAnMcpServerReference },
|
|
412
|
-
{ relPath: 'references/authoring-workflow.md', render:
|
|
413
|
+
{ relPath: 'references/authoring-workflow.md', render: () => renderAuthoringTopic('core') },
|
|
414
|
+
{
|
|
415
|
+
relPath: 'references/authoring-connectors.md',
|
|
416
|
+
render: () => renderAuthoringTopic('connectors'),
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
relPath: 'references/authoring-authentication.md',
|
|
420
|
+
render: () => renderAuthoringTopic('authentication'),
|
|
421
|
+
},
|
|
422
|
+
{ relPath: 'references/authoring-context.md', render: () => renderAuthoringTopic('context') },
|
|
423
|
+
{
|
|
424
|
+
relPath: 'references/authoring-verification.md',
|
|
425
|
+
render: () => renderAuthoringTopic('verification'),
|
|
426
|
+
},
|
|
427
|
+
{ relPath: 'references/authoring-managed.md', render: () => renderAuthoringTopic('managed') },
|
|
413
428
|
{ relPath: 'references/tool-design.md', render: renderToolDesignReference },
|
|
414
|
-
{
|
|
429
|
+
{
|
|
430
|
+
relPath: 'references/embedded-assistant.md',
|
|
431
|
+
render: () => renderEmbeddedAssistantTopic('core'),
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
relPath: 'references/embedded-assistant-messaging.md',
|
|
435
|
+
render: () => renderEmbeddedAssistantTopic('messaging'),
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
relPath: 'references/embedded-assistant-identity.md',
|
|
439
|
+
render: () => renderEmbeddedAssistantTopic('identity'),
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
relPath: 'references/embedded-assistant-rendering.md',
|
|
443
|
+
render: () => renderEmbeddedAssistantTopic('rendering'),
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
relPath: 'references/embedded-assistant-operations.md',
|
|
447
|
+
render: () => renderEmbeddedAssistantTopic('operations'),
|
|
448
|
+
},
|
|
415
449
|
{ relPath: 'references/connect-an-api.md', render: renderConnectAnApiReference },
|
|
416
450
|
{ relPath: 'references/wrap-existing-app.md', render: renderWrapExistingAppReference },
|
|
417
451
|
{ relPath: 'references/build-an-mcp-app.md', render: renderBuildAnMcpAppReference },
|
|
@@ -57,7 +57,7 @@ export function renderEmbeddedAssistantReference() {
|
|
|
57
57
|
'| Owner | Values | Destination |',
|
|
58
58
|
'| --- | --- | --- |',
|
|
59
59
|
'| Noodle operator | Login, selected org/app/env | Plugin-managed CLI profile and explicit target; never the SaaS runtime |',
|
|
60
|
-
'| Noodle-managed model | No authored provider, model id, URL, or key | Hosted operator state;
|
|
60
|
+
'| Noodle-managed model | No authored provider, model id, URL, or key | Hosted operator state; billing-attributed targets are eligible for the bounded sponsored beta |',
|
|
61
61
|
'| Operator-provided model | `ASSISTANT_MODEL_BASE_URL`, `ASSISTANT_MODEL`, `ASSISTANT_MODEL_API_KEY` | `noodle variables set` / `noodle secrets set`; never the SaaS environment |',
|
|
62
62
|
'| Connector/delegated exchange | Connector credentials and any customer-owned token-exchange client | Noodle managed configuration plus the matching customer backend secret manager |',
|
|
63
63
|
'| SaaS backend | `NOODLE_SERVICE_URL`, `NOODLE_ASSISTANT_CLIENT_ID`, `NOODLE_ASSISTANT_CLIENT_SECRET`, `PUBLIC_APP_ORIGIN` | Backend-only environment or secret manager; never browser code or public-prefixed variables |',
|
|
@@ -65,7 +65,7 @@ export function renderEmbeddedAssistantReference() {
|
|
|
65
65
|
'',
|
|
66
66
|
'## Select the architecture before code',
|
|
67
67
|
'',
|
|
68
|
-
'
|
|
68
|
+
'Establish the user, job, access mode, identity/session boundary, server-owned routing, model owner, and relevant origins before changing those trust boundaries. Record consequential choices proportionally; continue independent local work while a missing fact is clarified.',
|
|
69
69
|
'',
|
|
70
70
|
'If the external user, job, or workflow set is still vague, hand off to `designing-mcp-products` before code. Preserve its bounded product outcome and resume this workflow only when the value path and one representative success path are explicit.',
|
|
71
71
|
'',
|
|
@@ -88,7 +88,7 @@ export function renderEmbeddedAssistantReference() {
|
|
|
88
88
|
'',
|
|
89
89
|
'Use the existing host framework and its package manager. Recommend the managed renderer unless the product names a concrete UI or integration benefit that requires the headless client; a custom renderer accepts the complete transcript-part obligation described below. Recommend `noodleManaged()` when Noodle owns the managed-cloud model for the exact eligible target; recommend `openAICompatible(...)` only when the operator or self-hosted deployment owns that model endpoint and credentials. Never present both as unfinished choices.',
|
|
90
90
|
'',
|
|
91
|
-
'
|
|
91
|
+
'Explain the selected topology and its identity, credential, routing, and model boundaries in the form useful for the task. If a fact needed for a security-sensitive edit is missing, ask for that fact and continue any independent work.',
|
|
92
92
|
'',
|
|
93
93
|
'### First-workflow default: continuous onboarding',
|
|
94
94
|
'',
|
|
@@ -141,7 +141,7 @@ export function renderEmbeddedAssistantReference() {
|
|
|
141
141
|
'}),',
|
|
142
142
|
'```',
|
|
143
143
|
'',
|
|
144
|
-
'`noodleManaged()` is the zero-configuration Cloud path: the public artifact contains only `{ kind: "noodle-managed" }`. It never exposes a provider or model identifier
|
|
144
|
+
'`noodleManaged()` is the zero-configuration Cloud path: the public artifact contains only `{ kind: "noodle-managed" }`. It never exposes a provider or model identifier. Billing-attributed targets are eligible for the bounded sponsored beta; missing billing attribution or hosted protection fails closed. For a customer- or self-hosted model, replace it with `openAICompatible({ baseUrl: variable("ASSISTANT_MODEL_BASE_URL"), model: variable("ASSISTANT_MODEL"), apiKey: secret("ASSISTANT_MODEL_API_KEY"), transport: "responses" })` when the endpoint implements Responses. Omit `transport` or use `"chat-completions"` for Chat Completions. Noodle calls only the selected transport and never probes or falls back to the other endpoint.',
|
|
145
145
|
'',
|
|
146
146
|
'Origins are exact: scheme, host, and optional port, with no path, trailing slash, or wildcard. Production origins must be HTTPS; plain HTTP is accepted only for loopback development origins (`http://localhost:<port>`, `http://127.0.0.1:<port>`). `noodle dev` serves the MCP project, not the embedding SaaS. For a public surface it also prints a process-local Embed ID and script; mount that script on the separately running loopback website to test anonymous mint, chat, widgets, and confirmation. The local ID is ephemeral, while a hosted deploy provisions the stable ID behind durable admission counters.',
|
|
147
147
|
'',
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { renderEmbeddedAssistantReference } from './skill-embedded-assistant-ref.js';
|
|
2
|
+
const TOPIC_BY_HEADING = {
|
|
3
|
+
'Public messaging: WhatsApp, Instagram DMs and SMS': 'messaging',
|
|
4
|
+
'Collect interactions': 'messaging',
|
|
5
|
+
Architecture: 'core',
|
|
6
|
+
'Select the architecture before code': 'core',
|
|
7
|
+
'Install into the existing application': 'core',
|
|
8
|
+
'Author and validate': 'core',
|
|
9
|
+
'Product workflow guidance': 'core',
|
|
10
|
+
'Customize the presentation': 'rendering',
|
|
11
|
+
'Configure and deploy': 'operations',
|
|
12
|
+
'Access modes and customer auth': 'identity',
|
|
13
|
+
'Create the backend client': 'identity',
|
|
14
|
+
'Integrate the customer backend': 'identity',
|
|
15
|
+
'Ground time and ambient facts': 'identity',
|
|
16
|
+
'Structured missing input': 'identity',
|
|
17
|
+
'Verified session context (identity and claims)': 'identity',
|
|
18
|
+
'The session response': 'identity',
|
|
19
|
+
'Mount a public website surface': 'rendering',
|
|
20
|
+
'Choose a browser renderer': 'rendering',
|
|
21
|
+
'Host readiness and promotion': 'operations',
|
|
22
|
+
'Launch and qualified-usage proof': 'operations',
|
|
23
|
+
'Toolchain requirements': 'operations',
|
|
24
|
+
'Verify the boundary': 'operations',
|
|
25
|
+
'Troubleshooting: symptom to diagnosis': 'operations',
|
|
26
|
+
};
|
|
27
|
+
/** Keep the authored reference single-sourced while loading only the requested topic in an agent. */
|
|
28
|
+
export function renderEmbeddedAssistantTopic(topic) {
|
|
29
|
+
const source = renderEmbeddedAssistantReference();
|
|
30
|
+
const sections = source.split(/(?=^## )/m);
|
|
31
|
+
const selected = sections.slice(1).filter((section) => {
|
|
32
|
+
const heading = /^## ([^\n]+)/.exec(section)?.[1];
|
|
33
|
+
if (heading === undefined)
|
|
34
|
+
throw new Error('embedded assistant reference has no heading');
|
|
35
|
+
if (heading === 'Contents')
|
|
36
|
+
return false;
|
|
37
|
+
if (!(heading in TOPIC_BY_HEADING)) {
|
|
38
|
+
throw new Error(`unrouted embedded assistant topic: ${heading}`);
|
|
39
|
+
}
|
|
40
|
+
return TOPIC_BY_HEADING[heading] === topic;
|
|
41
|
+
});
|
|
42
|
+
if (selected.length === 0)
|
|
43
|
+
throw new Error(`empty embedded assistant topic: ${topic}`);
|
|
44
|
+
const contents = selected.map((section) => {
|
|
45
|
+
const heading = /^## ([^\n]+)/.exec(section)?.[1];
|
|
46
|
+
if (heading === undefined)
|
|
47
|
+
throw new Error('embedded assistant section has no heading');
|
|
48
|
+
return `- ${heading}`;
|
|
49
|
+
});
|
|
50
|
+
const intro = topic === 'core'
|
|
51
|
+
? [
|
|
52
|
+
'# Embedded assistant',
|
|
53
|
+
'',
|
|
54
|
+
'Read this overview for architecture and authoring. Load only the topic needed next:',
|
|
55
|
+
'- [Messaging and collection](./embedded-assistant-messaging.md)',
|
|
56
|
+
'- [Identity and backend sessions](./embedded-assistant-identity.md)',
|
|
57
|
+
'- [Appearance and browser rendering](./embedded-assistant-rendering.md)',
|
|
58
|
+
'- [Deployment, verification and recovery](./embedded-assistant-operations.md)',
|
|
59
|
+
'',
|
|
60
|
+
'## Contents',
|
|
61
|
+
'',
|
|
62
|
+
...contents,
|
|
63
|
+
'',
|
|
64
|
+
].join('\n')
|
|
65
|
+
: `# Embedded assistant: ${topic}\n\n## Contents\n\n${contents.join('\n')}\n\n`;
|
|
66
|
+
return `${intro}${selected.join('').trimEnd()}\n`;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=skill-embedded-assistant-split.js.map
|
|
@@ -42,7 +42,7 @@ export function renderWrapExistingAppReference() {
|
|
|
42
42
|
'6. **Reject unstable seams.** Do not call an unstable server-call protocol whose identifier or serialization changes across builds. Never use direct database access, including ORM or SQL; it bypasses application authorization and business rules. Do not log in and copy a browser session into the runtime; copying a browser session or its credentials into the runtime is prohibited. Do not treat a service credential as per-user authorization. Propose a narrow application-owned HTTP handler instead.',
|
|
43
43
|
'7. **Separate implementation ownership.** Produce an existing-application phase for handlers/auth/tests, a Noodle-project phase for TypeScript connector/tools/fakes/tests, and a cross-surface verification phase. If repositories differ, create separate repository-scoped plans and approval boundaries.',
|
|
44
44
|
'8. **Present and stop.** Show the capability map, identity/routing decision, minimum honest application changes, rejected alternatives, test matrix, risks, and phases in the conversation. A design approval is review only. Local implementation requires an explicit “proceed” for the named repository. Local implementation approval does not authorize hosted configuration, live writes, deployment, publication, or issue-state changes; those require their own authority.',
|
|
45
|
-
'9. **
|
|
45
|
+
'9. **Continue approved work.** After the user authorizes the implementation, follow the repository workflow and the relevant Noodle authoring or API-connection skill. Verify real output without reopening settled decisions.',
|
|
46
46
|
'',
|
|
47
47
|
'## Verification evidence',
|
|
48
48
|
'',
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { BehaviorSkillName } from './behavior-skills.js';
|
|
2
2
|
import type { AgentTarget } from './index.js';
|
|
3
|
-
export declare const SKILL_DESCRIPTION
|
|
3
|
+
export declare const SKILL_DESCRIPTION = "Build or operate a Noodle Seed MCP server or app with TypeScript and the noodle CLI. Use for Noodle project setup, an unclear Noodle workflow, or finding the relevant specialist skill.";
|
|
4
4
|
export type SkillReferencePath = `references/${string}.md`;
|
|
5
5
|
export declare const APP_DIRECTORY_COMPLIANCE_REFERENCE: SkillReferencePath;
|
|
6
6
|
type SkillRouteId = 'design-product' | 'create-product-guide' | 'wrap-existing-app' | 'build-server' | 'connect-api' | 'build-app' | 'verify-recover' | 'debug-recover' | 'inspect-hosted' | 'deploy-hosted' | 'embed-assistant' | 'publish' | 'feedback';
|
|
@@ -11,6 +11,7 @@ export interface SkillRoute {
|
|
|
11
11
|
readonly exitCondition: string;
|
|
12
12
|
}
|
|
13
13
|
export declare const SKILL_ROUTES: readonly SkillRoute[];
|
|
14
|
+
/** A short index for ambiguous requests; installed specialist skills are directly discoverable. */
|
|
14
15
|
export declare function skillRouterBody(_target: AgentTarget): string;
|
|
15
16
|
export {};
|
|
16
17
|
//# sourceMappingURL=skill-router.d.ts.map
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
// Intent router for the project-local `noodle-seed` skill. Keep this file small: it selects one
|
|
2
2
|
// outcome workflow and bounds progressive disclosure. Detailed MCP guidance belongs in the
|
|
3
3
|
// one-level reference tree rendered by skill-content.ts.
|
|
4
|
-
|
|
5
|
-
export const SKILL_DESCRIPTION = 'Use when building, validating, testing, deploying, or operating a local or hosted Noodle Seed ' +
|
|
6
|
-
'MCP server or app authored in TypeScript with the noodle CLI, or improving signup or onboarding ' +
|
|
7
|
-
'conversion or selecting a first Noodle workflow for an account-growth product.';
|
|
4
|
+
export const SKILL_DESCRIPTION = 'Build or operate a Noodle Seed MCP server or app with TypeScript and the noodle CLI. Use for Noodle project setup, an unclear Noodle workflow, or finding the relevant specialist skill.';
|
|
8
5
|
export const APP_DIRECTORY_COMPLIANCE_REFERENCE = 'references/app-directory-compliance.md';
|
|
9
6
|
export const SKILL_ROUTES = [
|
|
10
7
|
{
|
|
11
8
|
id: 'design-product',
|
|
12
|
-
intent: '
|
|
9
|
+
intent: 'Choose a first Noodle workflow or turn a vague MCP idea into a bounded design',
|
|
13
10
|
skill: 'designing-mcp-products',
|
|
14
11
|
exitCondition: 'The product contract identifies the user benefit, model boundary, evidence, and next implementation skill.',
|
|
15
12
|
},
|
|
@@ -86,110 +83,25 @@ export const SKILL_ROUTES = [
|
|
|
86
83
|
exitCondition: 'A sanitized dry-run preview and exact proposal are shown, then one submission occurs only after explicit approval.',
|
|
87
84
|
},
|
|
88
85
|
];
|
|
89
|
-
/**
|
|
90
|
-
const REFERENCE_INDEX_LINES = [
|
|
91
|
-
'- `references/agent-contract.md` — the `--json` envelope, exit codes, and the three output modes.',
|
|
92
|
-
'- `references/product-agent-guides.md` — decide, interview, propose, prove, preview, and explicitly install one host-neutral product guide.',
|
|
93
|
-
'- `references/sdk-surface.md` — what to import from `@noodleseed/one` and which builder to use.',
|
|
94
|
-
'- `references/cli-commands.md` — every `noodle` command, grouped by area.',
|
|
95
|
-
'- `references/compile-errors.md` — fix `noodle validate` errors by code.',
|
|
96
|
-
'- `references/build-an-mcp-server.md` — outcome-first workflow for a focused, tested, model-facing MCP product.',
|
|
97
|
-
'- `references/authoring-workflow.md` — input paths, fit checks, connector patterns, authentication, invocation context, testing, and managed config.',
|
|
98
|
-
'- `references/tool-design.md` — intent-shaped tools, titles and annotations, bounded outputs, tool-surface budget, and context provisioning.',
|
|
99
|
-
'- `references/embedded-assistant.md` — HTTPS origins, managed model config, deploy sequencing, session exchange, browser mounting, and credential boundaries.',
|
|
100
|
-
'- `references/connect-an-api.md` — secure credentials, probe the live API, model the observed shape, and prove real output.',
|
|
101
|
-
'- `references/wrap-existing-app.md` — read-only identity-first planning for an existing application with no stable usable API.',
|
|
102
|
-
'- `references/build-an-mcp-app.md` — product-fit, output-boundary, fallback, and evidence workflow for an MCP App.',
|
|
103
|
-
'- `references/experience-design.md` — design an app experience: funnel boundary, grounding, two users, display modes, and wireframe.',
|
|
104
|
-
'- `references/widgets-and-apps.md` — MCP Apps, typed views, widget hooks, output shaping, and CSP.',
|
|
105
|
-
'- `references/test-in-hosts.md` — connect and test in real MCP hosts and protocol inspection clients.',
|
|
106
|
-
'- `references/verify-and-recover.md` — ordered evidence ladder, bounded repair, and honest completion claims.',
|
|
107
|
-
'- `references/troubleshooting.md` — runtime symptom to cause and fix, locally and hosted.',
|
|
108
|
-
'- `references/inspect-hosted.md` — read-only hosted status, logs, metrics, events, and deployment diagnosis.',
|
|
109
|
-
'- `references/deploy-and-ops.md` — explicitly authorized hosted link, config, deploy, access, connection writes, and rollback.',
|
|
110
|
-
'- `references/publishing.md` — prepare and submit to app and connector directories.',
|
|
111
|
-
`- \`${APP_DIRECTORY_COMPLIANCE_REFERENCE}\` — the pre-submission experience and policy checklist.`,
|
|
112
|
-
'- `references/examples.md` — flagship example index and a canonical `server.ts`.',
|
|
113
|
-
'- `references/feedback.md` — draft sanitized product feedback and submit only with user approval.',
|
|
114
|
-
];
|
|
115
|
-
function routeTableLines() {
|
|
116
|
-
return [
|
|
117
|
-
'| User outcome | Load sibling skill | Canonical playbook | Done when |',
|
|
118
|
-
'| :--- | :--- | :--- | :--- |',
|
|
119
|
-
...SKILL_ROUTES.map((route) => {
|
|
120
|
-
const skill = BEHAVIOR_SKILLS.find((candidate) => candidate.name === route.skill);
|
|
121
|
-
if (skill === undefined)
|
|
122
|
-
throw new Error(`missing behavior skill for route ${route.id}`);
|
|
123
|
-
const supporting = skill.supportingReferences.length > 0
|
|
124
|
-
? skill.supportingReferences.map((reference) => `\`${reference}\``).join(', ')
|
|
125
|
-
: 'None';
|
|
126
|
-
return `| ${route.intent} | \`${route.skill}\` | \`${skill.primaryReference}\` (${supporting}) | ${route.exitCondition} |`;
|
|
127
|
-
}),
|
|
128
|
-
];
|
|
129
|
-
}
|
|
86
|
+
/** A short index for ambiguous requests; installed specialist skills are directly discoverable. */
|
|
130
87
|
export function skillRouterBody(_target) {
|
|
131
|
-
const preamble = 'Use this skill for project-local Noodle Seed authoring in the active coding host; preserve generated and user instruction boundaries.';
|
|
132
88
|
return [
|
|
133
89
|
'# Noodle Seed',
|
|
134
90
|
'',
|
|
135
|
-
'
|
|
136
|
-
'',
|
|
137
|
-
preamble,
|
|
138
|
-
'',
|
|
139
|
-
"If the request is unrelated to the Noodle MCP surface, stop here: follow the project's normal instructions and run no Noodle lifecycle commands.",
|
|
140
|
-
'',
|
|
141
|
-
'**Installed-plugin execution.** When this skill is supplied by the Noodle Developer plugin, you write and test the application source, then use its supported `noodle-readiness` tools for project setup, build gates, exact-target linking, variables, secret-from-environment transfer, gated deployment, and feedback. Treat the corresponding public `noodle ...` command as recovery text, never as permission to discover or expose an internal launcher. If a tool fails, report its structured error and public `noodle ...` command; do not ask the user to copy a private installation path or perform an operation the authorized tool can perform.',
|
|
142
|
-
'',
|
|
143
|
-
'## Route the request',
|
|
144
|
-
'',
|
|
145
|
-
'Choose exactly one primary route from the user outcome below, then load the selected sibling skill and hand off the request. Read that primary reference in full; read supporting references only when the sibling or observed evidence requires them. Do not reread the corpus or restart discovery after the handoff.',
|
|
146
|
-
'',
|
|
147
|
-
'Apply this precedence when wording overlaps: concrete failure evidence takes the debugging route; an explicit request to create, revise, regenerate, or recover an app product skill takes `creating-product-agent-guides`; an MCP App/UI outcome takes the App route; an existing application with no stable, usable API or specification takes `wrapping-existing-applications`; only when all four API-evidence inputs exist—an API base URL, authentication scheme, representative safe read, and observed response—use `connecting-apis-to-mcp`; missing, stale, inaccessible, undocumented-only, or otherwise unusable evidence remains in `wrapping-existing-applications`; both integration routes take precedence over generic server building; hosted inspection is debugging read-only; hosted mutation requires the explicitly requested deployment route.',
|
|
148
|
-
'',
|
|
149
|
-
'Negative routing examples: “Inspect hosted logs/status” → `inspect-hosted` (read-only). “Prepare for deployment” → the applicable build or verification route; with existing access it may inspect `deploy preflight`, then stop with a handoff. Preparation does not authorize `link`, hosted config, publication, rollback, host writes, or submission. “Keep this local” → a build or verification route, never a hosted route.',
|
|
150
|
-
'',
|
|
151
|
-
'## First-workflow heuristic',
|
|
152
|
-
'',
|
|
153
|
-
'When the user asks what to build first or gives only a broad growth goal, inspect the repository and product context before asking them to invent a workflow. Do not classify the business or choose a design from an industry label alone.',
|
|
154
|
-
'',
|
|
155
|
-
'If the evidence shows a public visitor surface, an existing signup or sign-in boundary, a useful pre-account result the assistant can genuinely produce, and a meaningful authenticated outcome inside the product—and more authenticated users are valuable—recommend public-to-product continuous onboarding and route to `embedding-mcp-assistants`. This recommendation is not limited to B2B SaaS. If one of those facts is unclear, ask only for the smallest missing fit fact; if the pattern does not fit, route by the user’s actual outcome instead.',
|
|
156
|
-
'',
|
|
157
|
-
...routeTableLines(),
|
|
158
|
-
'',
|
|
159
|
-
'## Common machine loop',
|
|
160
|
-
'',
|
|
161
|
-
'Every `--json` command speaks the canonical envelope on stdout. Parse machine state instead of scraping human prose; `references/agent-contract.md` owns the envelope, streaming records, and exit codes.',
|
|
162
|
-
'',
|
|
163
|
-
'Inside the installed plugin, perform mapped steps with `noodle-readiness` tools and use the public `noodle ...` spelling only when reporting the logical action or a fallback. Outside the plugin, run the public CLI directly. Never construct a hidden launcher command.',
|
|
164
|
-
'',
|
|
165
|
-
"1. **Discover** — use `noodle commands --json` when the required command or flags are uncertain; don't read CLI source.",
|
|
166
|
-
'2. **Author** — for build routes, edit the configured TypeScript entrypoint, usually `src/server.ts`.',
|
|
167
|
-
'3. **Validate** — run `noodle validate --json`; repair each `error.errors[]` item at its `path`, then re-run `noodle validate --json`.',
|
|
168
|
-
'4. **Smoke** — run `noodle test --json` after validation passes.',
|
|
169
|
-
'5. **Prove the requested level** — connector routes require a safe live read with `noodle tools call`; App routes require `noodle check --json` and `noodle devtools`; hosted or host actions run only when the selected route and current user request authorize that exact level.',
|
|
170
|
-
'6. **Report evidence** — claim only the highest level actually exercised and name anything not run.',
|
|
171
|
-
'',
|
|
172
|
-
'## Reference lookup catalog',
|
|
173
|
-
'',
|
|
174
|
-
'This is a lookup catalog, not a discovery checklist. Return here only when the selected primary route names a missing technical detail:',
|
|
175
|
-
'',
|
|
176
|
-
...REFERENCE_INDEX_LINES,
|
|
91
|
+
'Author Noodle Seed MCP servers and apps in TypeScript. The compiler owns manifests and runtime artifacts. If the request is unrelated to this Noodle project, follow the project instructions without running Noodle lifecycle commands.',
|
|
177
92
|
'',
|
|
178
|
-
'##
|
|
93
|
+
'## Find the relevant skill',
|
|
179
94
|
'',
|
|
180
|
-
'
|
|
95
|
+
'Use a specialist skill directly when the task is clear. For an ambiguous Noodle request, use this index; a task may need more than one skill as work progresses.',
|
|
96
|
+
...SKILL_ROUTES.map((route) => `- ${route.intent}: \`${route.skill}\``),
|
|
181
97
|
'',
|
|
182
|
-
'
|
|
98
|
+
'For a concrete failure, start with `debugging-mcp-delivery`. For hosted status or logs, inspect read-only. Deployment, configuration writes, rollback, and directory submission require an authorized target and action. API connection needs a usable API origin, auth scheme, safe read, and observed result; when those are missing, inspect the application and establish them before promising a live integration.',
|
|
183
99
|
'',
|
|
184
|
-
'
|
|
185
|
-
'- Never expose an internal launcher or private installation path, ask the user to paste a command the plugin can execute, or use an ad hoc shell/file-parsing pipeline to move a secret. Use the typed secret-from-environment tool or `noodle secrets set ... --from-env NAME`.',
|
|
186
|
-
'- Do not hand-author manifest JSON/YAML, runtime artifacts, connector IR, or hosted asset metadata.',
|
|
187
|
-
'- Do not add static data-plane credential paths; hosted access is identity-based.',
|
|
188
|
-
'- Hosted mutation is opt-in. Run `link`, hosted secret/variable/config/access changes, deploy, rollback, host configuration writes, or directory submission only when the current user request explicitly authorizes the exact mutation and target. An inspect, prepare, validate, test, or local-only request grants no such authority; stop and ask before crossing that boundary.',
|
|
100
|
+
'## Find current product facts',
|
|
189
101
|
'',
|
|
190
|
-
'
|
|
102
|
+
'Use [the SDK reference](./references/sdk-surface.md) for TypeScript builders, [the CLI reference](./references/cli-commands.md) or `noodle commands --json` for commands, and [the machine response contract](./references/agent-contract.md) when parsing errors. Read only the reference relevant to the task. Validate authored changes with `noodle validate --json`, then run the relevant local behavior check. A connector-backed capability also needs a representative safe live read before claiming its response mapping works.',
|
|
191
103
|
'',
|
|
192
|
-
'
|
|
104
|
+
'In the installed Noodle Developer plugin, use supported `noodle-readiness` tools for lifecycle operations; report public `noodle ...` commands for recovery. Outside the plugin, run the public CLI. Keep credentials and internal launcher paths out of prompts and output. Transfer secrets only through supported from-environment operations. Hosted changes need the user-authorized target and action; local checks do not prove hosted behavior.',
|
|
193
105
|
].join('\n');
|
|
194
106
|
}
|
|
195
107
|
//# sourceMappingURL=skill-router.js.map
|
|
@@ -50,7 +50,7 @@ export function renderBuildAnMcpServerReference() {
|
|
|
50
50
|
'- Tool registers but returns empty or `undefined` fields: inspect one sanitized real response, correct `${response...}` mappings, and rerun the same read.',
|
|
51
51
|
'- Credential unavailable: verify `secret(...)` naming and the effective local target; never inline or print the secret.',
|
|
52
52
|
'- Missing product input: ask for the smallest concrete example, schema, or rule that unblocks the selected job. Do not widen the build to compensate.',
|
|
53
|
-
'- Repeated failure at the same layer:
|
|
53
|
+
'- Repeated failure at the same layer: continue only with a new evidence-backed cause; otherwise preserve the sanitized error and passing evidence, then report the blocker and exact next action.',
|
|
54
54
|
'',
|
|
55
55
|
'## Stop conditions',
|
|
56
56
|
'',
|
|
@@ -42,7 +42,7 @@ export function renderVerifyAndRecoverReference() {
|
|
|
42
42
|
'3. Form one evidence-backed cause from the observed output. If the two canonical supports do not cover it, select one matching symptom from the router lookup catalog; do not scan every recovery path.',
|
|
43
43
|
'4. Make the smallest in-scope repair. Do not freeform re-edit adjacent code, change credentials, redeploy, or add product behavior without evidence and authority.',
|
|
44
44
|
'5. Rerun only the same evidence layer that failed. Once it passes, continue upward only to the user-requested level.',
|
|
45
|
-
'6.
|
|
45
|
+
'6. If the same failure persists without a new evidence-backed cause, preserve the repro and report the blocker. Stop when the next action requires new authority or external state.',
|
|
46
46
|
'',
|
|
47
47
|
'## Verification evidence',
|
|
48
48
|
'',
|
|
@@ -69,7 +69,7 @@ export function renderVerifyAndRecoverReference() {
|
|
|
69
69
|
'',
|
|
70
70
|
'- Stop complete when the user-requested evidence level and every dependency below it pass in the current target.',
|
|
71
71
|
'- Stop blocked when progress requires credentials, approval, host access, deployment authority, production access, or an external-state change not available in scope.',
|
|
72
|
-
'- Stop
|
|
72
|
+
'- Stop when the same failure has no new evidence-backed repair; do not hide repetition behind unrelated edits.',
|
|
73
73
|
'- Never claim fixed or working without rerunning the failed layer, and never upgrade compile, local, deployment, or stale historical evidence into a stronger claim.',
|
|
74
74
|
].join('\n');
|
|
75
75
|
}
|
|
@@ -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.113.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",
|
|
@@ -124,6 +124,9 @@ export function createMcpRouter(lookup, options = {}) {
|
|
|
124
124
|
...(route?.kind === 'tenant' && route.publicResourceUrl !== undefined
|
|
125
125
|
? { publicResourceUrl: route.publicResourceUrl }
|
|
126
126
|
: {}),
|
|
127
|
+
...(route?.kind === 'tenant' && route.clientAddress !== undefined
|
|
128
|
+
? { clientAddress: route.clientAddress }
|
|
129
|
+
: {}),
|
|
127
130
|
}, routeId, maxBody, options.allowedOrigins, tenant);
|
|
128
131
|
})()).then(() => logRequest(logger, logId, req, res, start));
|
|
129
132
|
};
|
|
@@ -10,6 +10,8 @@ type ParsedRoute = {
|
|
|
10
10
|
readonly ref: TenantRouteRef;
|
|
11
11
|
readonly logId: string;
|
|
12
12
|
readonly publicResourceUrl?: string;
|
|
13
|
+
/** The caller address the edge Worker observed; present only on edge-authenticated routes. */
|
|
14
|
+
readonly clientAddress?: string;
|
|
13
15
|
} | {
|
|
14
16
|
readonly kind: 'deployment';
|
|
15
17
|
readonly deploymentId: string;
|
|
@@ -15,6 +15,7 @@ export async function resolveRoute(req, pathname, publicTenantRouting) {
|
|
|
15
15
|
const ref = await publicTenantRouting.resolveTenant(publicRef);
|
|
16
16
|
if (ref === undefined)
|
|
17
17
|
return { ok: true, route: null };
|
|
18
|
+
const clientAddress = header(req, 'x-noodle-client-address');
|
|
18
19
|
return {
|
|
19
20
|
ok: true,
|
|
20
21
|
route: {
|
|
@@ -22,6 +23,7 @@ export async function resolveRoute(req, pathname, publicTenantRouting) {
|
|
|
22
23
|
ref,
|
|
23
24
|
logId: tenantLogId(ref),
|
|
24
25
|
publicResourceUrl: canonicalPublicResourceUrl(forwardedHost),
|
|
26
|
+
...(clientAddress !== undefined ? { clientAddress } : {}),
|
|
25
27
|
},
|
|
26
28
|
};
|
|
27
29
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { trustedPublicAdmission } from '@noodle-borg/admission-limits/portable';
|
|
2
|
+
import { clientAddressBucket, trustedPublicAdmission, } from '@noodle-borg/admission-limits/portable';
|
|
3
3
|
import { createDualEraMcpHandler, handleStatelessHttp, JSON_RPC, } from '@noodle-borg/protocol';
|
|
4
4
|
import { admissionContexts, requestsInvocationContext } from './admission-context.js';
|
|
5
5
|
import { authorizeIdentityMode, authorizeMixedMode, authorizePublicServiceMode, canonicalResourceUrl, isIdentityMode, } from './identity-authorization.js';
|
|
@@ -134,6 +134,7 @@ export async function serveRequest(req, res, target, auth, routeId, maxBody, all
|
|
|
134
134
|
...(auth.accessMode !== undefined ? { accessMode: auth.accessMode } : {}),
|
|
135
135
|
...(req.socket.remoteAddress !== undefined ? { remoteAddress: req.socket.remoteAddress } : {}),
|
|
136
136
|
});
|
|
137
|
+
const callerNetwork = clientAddressBucket(auth.clientAddress);
|
|
137
138
|
for (const context of contexts) {
|
|
138
139
|
const decision = auth.admissionGate
|
|
139
140
|
? await auth.admissionGate(context)
|
|
@@ -148,6 +149,7 @@ export async function serveRequest(req, res, target, auth, routeId, maxBody, all
|
|
|
148
149
|
...(context.env !== undefined ? { env: context.env } : {}),
|
|
149
150
|
...(context.serverVersion !== undefined ? { serverVersion: context.serverVersion } : {}),
|
|
150
151
|
...(context.accessMode !== undefined ? { accessMode: context.accessMode } : {}),
|
|
152
|
+
...(callerNetwork !== undefined ? { callerNetwork } : {}),
|
|
151
153
|
decision: decision.allow ? 'allow' : 'deny',
|
|
152
154
|
...(decision.reason !== undefined ? { reason: decision.reason } : {}),
|
|
153
155
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noodleseed/assistant",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.39.0",
|
|
4
4
|
"description": "Embed the Noodle Seed customer-branded assistant in your web app with managed or framework-owned UI, a framework-neutral MCP App host, a DOM-free client, and a backend session helper. Authoring and deploying the server is @noodleseed/one.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noodleseed/one",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.190.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.113.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",
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { AgentTarget } from './skill-registry.js';
|
|
2
|
-
export declare const EXECUTING_NOODLE_PLANS_SKILL: {
|
|
3
|
-
readonly name: "executing-noodle-plans";
|
|
4
|
-
readonly 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.";
|
|
5
|
-
readonly supportedHosts: readonly ["codex", "claude-code"];
|
|
6
|
-
readonly files: readonly [];
|
|
7
|
-
readonly renderBody: typeof renderExecutingNoodlePlansSkill;
|
|
8
|
-
};
|
|
9
|
-
export declare function renderExecutingNoodlePlansSkill(_target?: AgentTarget): string;
|
|
10
|
-
//# sourceMappingURL=plan-execution-skill.d.ts.map
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
export const EXECUTING_NOODLE_PLANS_SKILL = {
|
|
2
|
-
name: 'executing-noodle-plans',
|
|
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
|
-
supportedHosts: ['codex', 'claude-code'],
|
|
5
|
-
files: [],
|
|
6
|
-
renderBody: renderExecutingNoodlePlansSkill,
|
|
7
|
-
};
|
|
8
|
-
export function renderExecutingNoodlePlansSkill(_target) {
|
|
9
|
-
return [
|
|
10
|
-
'# Execute a Noodle Seed implementation plan',
|
|
11
|
-
'',
|
|
12
|
-
'Execute an approved plan without reopening settled design decisions. Keep implementation, review, and evidence scoped to the current repository and the authority the user granted.',
|
|
13
|
-
'',
|
|
14
|
-
'## Preconditions',
|
|
15
|
-
'',
|
|
16
|
-
'- Read the plan, repository instructions, current branch status, and the files named by the first incomplete task.',
|
|
17
|
-
'- Confirm the plan is decision-complete, test-first, compatible with the current code, and explicit about public contracts and required verification.',
|
|
18
|
-
'- Work in the repository-required isolated branch or worktree and preserve unrelated changes.',
|
|
19
|
-
'- If current code invalidates the plan or two requirements conflict, stop before editing and ask which requirement governs.',
|
|
20
|
-
'',
|
|
21
|
-
'## Task loop',
|
|
22
|
-
'',
|
|
23
|
-
'Execute one task at a time in plan order:',
|
|
24
|
-
'',
|
|
25
|
-
'1. Restate the task boundary, expected behavior, focused failing test, and files in scope.',
|
|
26
|
-
'2. Add or update the focused test first and run it to confirm the expected failure when practical.',
|
|
27
|
-
'3. Implement only the behavior required to make that test pass. Do not add compatibility paths, abstractions, or adjacent cleanup the plan did not require.',
|
|
28
|
-
'4. Run the focused test, then the package-level checks named by the plan.',
|
|
29
|
-
'5. Review the task diff for plan compliance, correctness, security, type safety, and unnecessary surface area.',
|
|
30
|
-
'6. Record completion in the plan checkbox when it is writable and in a focused conventional commit.',
|
|
31
|
-
'',
|
|
32
|
-
'When the active host provides isolated task workers and user authorization permits delegation, use a fresh implementer for an independent task and a separate reviewer after it. Give each worker only the task requirements, binding global constraints, file paths, and required evidence. Never run workers in parallel when their files or contracts overlap. Execute inline when workers are unavailable, tasks are tightly coupled, or delegation is not authorized.',
|
|
33
|
-
'',
|
|
34
|
-
'## Review and recovery',
|
|
35
|
-
'',
|
|
36
|
-
'- Independent review must compare the task requirements with the exact task diff and test evidence; implementer self-review does not replace it when a reviewer is available.',
|
|
37
|
-
'- Return concrete findings to the implementer, rerun the tests that cover each correction, and review the correction diff again.',
|
|
38
|
-
'- Allow at most three correction rounds for the same finding. Then stop with the unresolved requirement, attempted fixes, and current evidence instead of silently accepting drift.',
|
|
39
|
-
'- On context loss or interruption, resume from the plan checkboxes, git status, and git log; verify the last completed task before starting the first incomplete one.',
|
|
40
|
-
'',
|
|
41
|
-
'## Completion',
|
|
42
|
-
'',
|
|
43
|
-
'- Review the complete branch diff against the plan and all accepted design constraints.',
|
|
44
|
-
'- Run the focused tests, affected package checks, generated-surface checks, and the repository readiness gate.',
|
|
45
|
-
'- For Noodle application behavior, also run the validation, test, check, preview, or hosted evidence level selected by the owning Noodle Seed build or verification skill.',
|
|
46
|
-
'- Report commits, evidence, residual risk, and the first unproven layer. Do not claim deployment, publication, merge, or production behavior that was not performed.',
|
|
47
|
-
'- Hand delivery to the repository workflow; executing a plan does not itself authorize merge, deploy, publication, or other external mutation.',
|
|
48
|
-
'',
|
|
49
|
-
'## Stop conditions',
|
|
50
|
-
'',
|
|
51
|
-
'- Stop before implementation when the plan is incomplete or stale in a way that changes behavior, architecture, security, or public contracts.',
|
|
52
|
-
'- Stop after three unsuccessful correction rounds on the same load-bearing finding.',
|
|
53
|
-
'- Stop before any external mutation or destructive action outside the user-authorized task boundary.',
|
|
54
|
-
].join('\n');
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=plan-execution-skill.js.map
|