@noodleseed/one 0.18.2 → 0.19.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/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +21 -5
- package/dist/agents.js.map +1 -1
- package/dist/checklist.d.ts +33 -0
- package/dist/checklist.d.ts.map +1 -0
- package/dist/checklist.js +37 -0
- package/dist/checklist.js.map +1 -0
- package/dist/commands/audit-ops.d.ts +11 -0
- package/dist/commands/audit-ops.d.ts.map +1 -1
- package/dist/commands/audit-ops.js +27 -11
- package/dist/commands/audit-ops.js.map +1 -1
- package/dist/commands/author-loop.d.ts +8 -0
- package/dist/commands/author-loop.d.ts.map +1 -1
- package/dist/commands/author-loop.js +14 -0
- package/dist/commands/author-loop.js.map +1 -1
- package/dist/commands/catalog-data-config.d.ts.map +1 -1
- package/dist/commands/catalog-data-config.js +6 -0
- package/dist/commands/catalog-data-config.js.map +1 -1
- package/dist/commands/catalog-data-core.d.ts.map +1 -1
- package/dist/commands/catalog-data-core.js +43 -0
- package/dist/commands/catalog-data-core.js.map +1 -1
- package/dist/commands/catalog-data-resources.d.ts.map +1 -1
- package/dist/commands/catalog-data-resources.js +47 -0
- package/dist/commands/catalog-data-resources.js.map +1 -1
- package/dist/commands/catalog-render.d.ts +18 -6
- package/dist/commands/catalog-render.d.ts.map +1 -1
- package/dist/commands/catalog-render.js +155 -57
- package/dist/commands/catalog-render.js.map +1 -1
- package/dist/commands/catalog-types.d.ts +10 -0
- package/dist/commands/catalog-types.d.ts.map +1 -1
- package/dist/commands/catalog.d.ts +1 -1
- package/dist/commands/catalog.d.ts.map +1 -1
- package/dist/commands/catalog.js.map +1 -1
- package/dist/commands/config-values.d.ts +12 -3
- package/dist/commands/config-values.d.ts.map +1 -1
- package/dist/commands/config-values.js +40 -6
- package/dist/commands/config-values.js.map +1 -1
- package/dist/commands/deploy-status-ops.d.ts +35 -0
- package/dist/commands/deploy-status-ops.d.ts.map +1 -1
- package/dist/commands/deploy-status-ops.js +68 -13
- package/dist/commands/deploy-status-ops.js.map +1 -1
- package/dist/commands/deployments-ops.d.ts.map +1 -1
- package/dist/commands/deployments-ops.js +1 -0
- package/dist/commands/deployments-ops.js.map +1 -1
- package/dist/commands/diagnostics-ops.d.ts +58 -0
- package/dist/commands/diagnostics-ops.d.ts.map +1 -1
- package/dist/commands/diagnostics-ops.js +56 -20
- package/dist/commands/diagnostics-ops.js.map +1 -1
- package/dist/commands/github-ops.d.ts +15 -0
- package/dist/commands/github-ops.d.ts.map +1 -1
- package/dist/commands/github-ops.js +49 -12
- package/dist/commands/github-ops.js.map +1 -1
- package/dist/commands/mcp-apps.d.ts.map +1 -1
- package/dist/commands/mcp-apps.js +18 -8
- package/dist/commands/mcp-apps.js.map +1 -1
- package/dist/commands/org-admin.d.ts +28 -0
- package/dist/commands/org-admin.d.ts.map +1 -1
- package/dist/commands/org-admin.js +84 -7
- package/dist/commands/org-admin.js.map +1 -1
- package/dist/commands/policy-ops.d.ts +3 -0
- package/dist/commands/policy-ops.d.ts.map +1 -1
- package/dist/commands/policy-ops.js +45 -3
- package/dist/commands/policy-ops.js.map +1 -1
- package/dist/commands/session.d.ts +32 -0
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +64 -17
- package/dist/commands/session.js.map +1 -1
- package/dist/detail-card.d.ts +32 -0
- package/dist/detail-card.d.ts.map +1 -0
- package/dist/detail-card.js +53 -0
- package/dist/detail-card.js.map +1 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +18 -11
- package/dist/doctor.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/relative-time.d.ts +4 -1
- package/dist/relative-time.d.ts.map +1 -1
- package/dist/relative-time.js +18 -1
- package/dist/relative-time.js.map +1 -1
- package/dist/table.d.ts +3 -0
- package/dist/table.d.ts.map +1 -1
- package/dist/table.js +4 -1
- package/dist/table.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/hook-notes.d.ts +2 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/hook-notes.d.ts.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/hook-notes.js +15 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/hook-notes.js.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts +2 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +10 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/index.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/md.d.ts +3 -0
- package/node_modules/@noodle-borg/agent-kit/dist/md.d.ts.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/md.js +13 -0
- package/node_modules/@noodle-borg/agent-kit/dist/md.js.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.d.ts +4 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.d.ts.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +240 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-content.d.ts +0 -4
- package/node_modules/@noodle-borg/agent-kit/dist/skill-content.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +61 -193
- package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.d.ts +5 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.d.ts.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js +240 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
- package/node_modules/@noodle-borg/service/dist/request-event-metrics.d.ts +2 -2
- package/package.json +2 -2
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
// Renderers for the hierarchical `noodle-seed` skill: one SKILL.md router plus one-level-deep
|
|
2
|
-
// reference files. Factual sections (SDK surface, CLI commands, compile errors) are
|
|
3
|
-
// the generated surface (./generated/surface.ts) + curated maps (./curated/*), so
|
|
4
|
-
// from the real SDK/CLI/compiler. Prose references are curated
|
|
5
|
-
//
|
|
6
|
-
//
|
|
2
|
+
// reference files. Factual sections (SDK surface, CLI commands, compile errors, React hooks) are
|
|
3
|
+
// derived from the generated surface (./generated/surface.ts) + curated maps (./curated/*), so
|
|
4
|
+
// they never drift from the real SDK/CLI/compiler. Prose references are curated and live in
|
|
5
|
+
// ./skill-authoring-refs.ts and ./skill-operations-refs.ts. The drift gate enforces both currency
|
|
6
|
+
// (every generated name rendered) and structure (router < 500 lines, references one level deep,
|
|
7
|
+
// long references open with a Contents TOC).
|
|
7
8
|
import { COMMAND_GROUP_ORDER, COMMAND_GROUPS } from './curated/command-groups.js';
|
|
8
9
|
import { ERROR_FIXES } from './curated/error-fixes.js';
|
|
9
10
|
import { CLI_COMMANDS, COMPILE_ERROR_CODES, SDK_EXPORTS } from './generated/surface.js';
|
|
11
|
+
import { mdTable } from './md.js';
|
|
12
|
+
import { renderAuthoringWorkflowReference, renderExamplesReference, renderWidgetsAndAppsReference, } from './skill-authoring-refs.js';
|
|
13
|
+
import { renderDeployAndOpsReference, renderPublishingReference, renderTestInHostsReference, renderTroubleshootingReference, } from './skill-operations-refs.js';
|
|
10
14
|
export const SKILL_DESCRIPTION = 'Use when building, validating, testing, deploying, or operating a local or hosted Noodle Seed ' +
|
|
11
15
|
'MCP server or app authored in TypeScript with the noodle CLI.';
|
|
12
|
-
function mdTable(headers, rows) {
|
|
13
|
-
return [
|
|
14
|
-
`| ${headers.join(' | ')} |`,
|
|
15
|
-
`| ${headers.map(() => ':--').join(' | ')} |`,
|
|
16
|
-
...rows.map((row) => `| ${row.join(' | ')} |`),
|
|
17
|
-
].join('\n');
|
|
18
|
-
}
|
|
19
16
|
// ----------------------------------------------------------------------------
|
|
20
17
|
// SKILL.md router (target-aware preamble; references are shared across targets)
|
|
21
18
|
// ----------------------------------------------------------------------------
|
|
@@ -37,6 +34,7 @@ export function skillRouterBody(target) {
|
|
|
37
34
|
'3. `noodle dev` — local loopback runtime that serves and hot-reloads the manifest.',
|
|
38
35
|
'4. `noodle check` / `noodle devtools` — MCP Apps/widget readiness and preview (see `references/widgets-and-apps.md`).',
|
|
39
36
|
'5. `noodle deploy` after `noodle login` + `noodle link` (see `references/deploy-and-ops.md`).',
|
|
37
|
+
'6. Prove it in a real host — `noodle connect <client>` (see `references/test-in-hosts.md`); debug symptoms with `references/troubleshooting.md`.',
|
|
40
38
|
'',
|
|
41
39
|
'## References',
|
|
42
40
|
'',
|
|
@@ -45,9 +43,12 @@ export function skillRouterBody(target) {
|
|
|
45
43
|
'- `references/sdk-surface.md` — what to import from `@noodleseed/one` and which builder to use.',
|
|
46
44
|
'- `references/cli-commands.md` — every `noodle` command, grouped by area.',
|
|
47
45
|
'- `references/compile-errors.md` — fix `noodle validate` errors by code.',
|
|
48
|
-
'- `references/authoring-workflow.md` — input paths (scrape / OpenAPI import / user interview), the validate→test→dev repair loop, connectors, and secrets/variables.',
|
|
49
|
-
'- `references/widgets-and-apps.md` — MCP Apps, React `view` widgets, and CSP.',
|
|
46
|
+
'- `references/authoring-workflow.md` — input paths (scrape / OpenAPI import / user interview), the fit check, the validate→test→dev repair loop, connectors, and secrets/variables.',
|
|
47
|
+
'- `references/widgets-and-apps.md` — MCP Apps, React `view` widgets, the widget hook surface, output shaping, and CSP.',
|
|
48
|
+
'- `references/test-in-hosts.md` — connect and test in ChatGPT (developer mode), Claude, agent hosts, and MCP Inspector.',
|
|
49
|
+
'- `references/troubleshooting.md` — runtime symptom → cause → fix, in-host and hosted.',
|
|
50
50
|
'- `references/deploy-and-ops.md` — login/link/deploy/status/access and hosted operations.',
|
|
51
|
+
'- `references/publishing.md` — submit to the ChatGPT apps directory and Claude connectors directory.',
|
|
51
52
|
'- `references/examples.md` — flagship example index and a canonical `server.ts`.',
|
|
52
53
|
'',
|
|
53
54
|
'## Safety',
|
|
@@ -70,6 +71,7 @@ const SDK_GROUPS = [
|
|
|
70
71
|
{ label: 'Connectors & flows', members: ['connector', 'when'] },
|
|
71
72
|
{ label: 'Resources & prompts', members: ['resource', 'prompt'] },
|
|
72
73
|
{ label: 'Managed config', members: ['secret', 'variable'] },
|
|
74
|
+
{ label: 'Customer auth', members: ['customerAuth'] },
|
|
73
75
|
{ label: 'Sessions', members: ['handoffSession'] },
|
|
74
76
|
{ label: 'Schemas', members: ['z'] },
|
|
75
77
|
];
|
|
@@ -87,6 +89,7 @@ const SDK_NOTES = {
|
|
|
87
89
|
prompt: '`prompt(name, { ... })` — an MCP prompt.',
|
|
88
90
|
secret: '`secret("NAME")` — reference a managed secret (operated via `noodle secrets`).',
|
|
89
91
|
variable: '`variable("NAME")` — reference a managed variable (operated via `noodle variables`).',
|
|
92
|
+
customerAuth: '`customerAuth.oidc(...)`, `.firebase(...)`, `.microsoft(...)`, or `.bridge(...)` — end-user/customer identity for `--access customers` deployments.',
|
|
90
93
|
handoffSession: '`handoffSession(...)` — typed cross-host handoff session envelopes.',
|
|
91
94
|
z: '`z` — Zod, for input/output schemas (compiles to JSON Schema 2020-12).',
|
|
92
95
|
};
|
|
@@ -107,9 +110,21 @@ export function renderSdkSurfaceReference() {
|
|
|
107
110
|
return [
|
|
108
111
|
'# @noodleseed/one SDK surface',
|
|
109
112
|
'',
|
|
110
|
-
'Import these from `@noodleseed/one`. They are declarative builders that emit manifest data — do not hand-author the manifest or runtime artifacts. React view helpers come from `@noodleseed/one/react` (`generateHelpers`).',
|
|
113
|
+
'Import these from `@noodleseed/one`. They are declarative builders that emit manifest data — do not hand-author the manifest or runtime artifacts. React view helpers come from `@noodleseed/one/react` (`generateHelpers`); the hook surface is documented in `widgets-and-apps.md`.',
|
|
114
|
+
'Platform helper connectors are explicit subpath imports from `@noodleseed/one/platform` (`noodlePlatform`, `noodlePlatformCatalog`) when an app needs first-party hosted state APIs.',
|
|
111
115
|
'',
|
|
112
116
|
...sections,
|
|
117
|
+
'## Authoring signatures',
|
|
118
|
+
'',
|
|
119
|
+
'- `server(name, options, definitions)` — `options` commonly includes `title`, `version`, `instructions`, `branding`, `auth`, `use`, `provides`, `state`, and `handoff`; `definitions` is the array of tools/resources/prompts/widgets.',
|
|
120
|
+
'- `tool(name, { description, input, output, annotations?, fulfil })` — `input`/`output` are Zod schemas; `fulfil({ input, connectors, user })` returns data matching `output`.',
|
|
121
|
+
'- `toolWithWidget(name, { description, input, output, fulfil, view })` — same as `tool`, plus `view: { component, entry }` for a React widget.',
|
|
122
|
+
'- `toolForWidget(name, { input, output, fulfil })` — helper tool for widget actions; hidden from the model.',
|
|
123
|
+
'- `resource(name, { uri, description?, mimeType?, fulfil })` and `prompt(name, { description?, arguments?, fulfil })` expose MCP resources/prompts.',
|
|
124
|
+
'- `widget(name, { title, view, csp?, domain?, permissions? })` declares reusable view metadata; `asset("./path")` packages local files.',
|
|
125
|
+
'- `customerAuth.*(...)` belongs in `server` options when deployed customer callers need verified identity; inspect `examples/customer-auth` or `examples/sharepoint` before using it.',
|
|
126
|
+
'- `state` defines durable widget state handles; `handoff` declares allowed external domains for safe host handoff.',
|
|
127
|
+
'',
|
|
113
128
|
]
|
|
114
129
|
.join('\n')
|
|
115
130
|
.trimEnd();
|
|
@@ -160,12 +175,40 @@ export function renderCompileErrorsReference() {
|
|
|
160
175
|
'## Contents',
|
|
161
176
|
'',
|
|
162
177
|
'- The repair loop',
|
|
178
|
+
'- JSON shape',
|
|
179
|
+
'- Fix prompt',
|
|
163
180
|
'- Error codes',
|
|
164
181
|
'',
|
|
165
182
|
'## The repair loop',
|
|
166
183
|
'',
|
|
167
184
|
'Run `noodle validate` (add `--json` for machine-readable output, `--fix-prompt` for an agent repair prompt). Each error carries a `code`, a dotted `path` to the offending field, and a `message`; many also carry `expected`/`got`, `didYouMean`/`suggestions`, and a `docAnchor`. Fix the specific error the `path` locates, then re-validate. Do not freeform re-edit. Once `noodle validate` passes, run `noodle test`, then `noodle dev`.',
|
|
168
185
|
'',
|
|
186
|
+
'## JSON shape',
|
|
187
|
+
'',
|
|
188
|
+
'Use `noodle validate --json` in automated repair loops. Treat `errors[]` as the work queue and change only the cited file/path before re-running validation.',
|
|
189
|
+
'',
|
|
190
|
+
'```json',
|
|
191
|
+
'{',
|
|
192
|
+
' "ok": false,',
|
|
193
|
+
' "errors": [',
|
|
194
|
+
' {',
|
|
195
|
+
' "code": "unknown_operation",',
|
|
196
|
+
' "path": "tools.search.fulfil.steps.0.operation",',
|
|
197
|
+
' "message": "Unknown connector operation.",',
|
|
198
|
+
' "expected": "operation declared on connector alias `crm`",',
|
|
199
|
+
' "got": "crm.find_customer",',
|
|
200
|
+
' "didYouMean": "crm.findCustomer",',
|
|
201
|
+
' "suggestions": ["crm.findCustomer"],',
|
|
202
|
+
' "docAnchor": "connectors.operations"',
|
|
203
|
+
' }',
|
|
204
|
+
' ]',
|
|
205
|
+
'}',
|
|
206
|
+
'```',
|
|
207
|
+
'',
|
|
208
|
+
'## Fix prompt',
|
|
209
|
+
'',
|
|
210
|
+
'`noodle validate --fix-prompt` prints a compact agent repair prompt with the same structured errors. Use it when delegating a repair pass, but still inspect the resulting code and re-run `noodle validate --json`.',
|
|
211
|
+
'',
|
|
169
212
|
'## Error codes',
|
|
170
213
|
'',
|
|
171
214
|
mdTable(['Code', 'Fix'], rows),
|
|
@@ -174,184 +217,6 @@ export function renderCompileErrorsReference() {
|
|
|
174
217
|
.trimEnd();
|
|
175
218
|
}
|
|
176
219
|
// ----------------------------------------------------------------------------
|
|
177
|
-
// references/authoring-workflow.md (CURATED)
|
|
178
|
-
// ----------------------------------------------------------------------------
|
|
179
|
-
export function renderAuthoringWorkflowReference() {
|
|
180
|
-
return [
|
|
181
|
-
'# Authoring workflow',
|
|
182
|
-
'',
|
|
183
|
-
'## Contents',
|
|
184
|
-
'',
|
|
185
|
-
'- Input paths',
|
|
186
|
-
'- Repair loop',
|
|
187
|
-
'- Connectors',
|
|
188
|
-
'- Secrets and variables',
|
|
189
|
-
'- Boundaries',
|
|
190
|
-
'',
|
|
191
|
-
'## Input paths',
|
|
192
|
-
'',
|
|
193
|
-
'1. **Website scrape** — if the user gives a URL, scrape it for surface hints (products, services, hours, contact, pricing). Stop there: the URL does not reveal CRM, booking systems, custom APIs, auth model, eligibility rules, quoting logic, or approval flows. Those live in the business systems and the owner’s head — ask.',
|
|
194
|
-
'2. **OpenAPI import** — `noodle import openapi <file>` emits a starter `server.ts` from a spec. Use it when the user provides an OpenAPI document.',
|
|
195
|
-
'3. **User interview** — Noodle does not interview; you do. Cover custom APIs/integrations, eligibility rules, quoting/approval logic, and private schemas (SQL DDL or JSON samples for custom `connector` declarations). Ask for concrete examples and sample payloads; do not guess a schema from a URL or invent endpoints.',
|
|
196
|
-
'',
|
|
197
|
-
'## Repair loop',
|
|
198
|
-
'',
|
|
199
|
-
'Author in `server.ts`, then `noodle validate` → fix cited errors (see `compile-errors.md`) → re-validate → `noodle test` → `noodle dev`. Keep the loop tight and error-driven.',
|
|
200
|
-
'',
|
|
201
|
-
'## Connectors',
|
|
202
|
-
'',
|
|
203
|
-
'Declare connectors as data, not imperative code:',
|
|
204
|
-
'',
|
|
205
|
-
'- **HTTP**: `connector("id").version("1.0.0").http({ baseUrl, allowedOrigins, auth, operations })` with per-operation `request`/`response` mapping using `${args...}` / `${response...}` expressions.',
|
|
206
|
-
'- **Compute**: `connector("id").version("1.0.0").compute(name, { input, output, calls?, run })` — a self-contained, sandboxed function (no imports/closure capture) that may call allowlisted operations via `callOperation`.',
|
|
207
|
-
'',
|
|
208
|
-
'Tools record connector calls into a flow; recording is not execution. Do not branch on runtime outputs with native `if` — use declarative `when(...)` conditions.',
|
|
209
|
-
'',
|
|
210
|
-
'## Secrets and variables',
|
|
211
|
-
'',
|
|
212
|
-
'Author managed config as `secret("NAME")` / `variable("NAME")` and operate it with `noodle secrets set` / `noodle variables set` (scoped org/app/env). Never inline secret values in `server.ts`, tests, or generated files.',
|
|
213
|
-
'',
|
|
214
|
-
'## Boundaries',
|
|
215
|
-
'',
|
|
216
|
-
'Do not hand-author manifest JSON/YAML, runtime artifacts, connector IR, or hosted asset metadata. Do not read or copy secrets, bearer tokens, refresh tokens, static access keys, `.env.noodle`, or `~/.noodle/config.json`. Hosted access is identity-based — do not add static data-plane credential paths.',
|
|
217
|
-
].join('\n');
|
|
218
|
-
}
|
|
219
|
-
// ----------------------------------------------------------------------------
|
|
220
|
-
// references/widgets-and-apps.md (CURATED)
|
|
221
|
-
// ----------------------------------------------------------------------------
|
|
222
|
-
export function renderWidgetsAndAppsReference() {
|
|
223
|
-
return [
|
|
224
|
-
'# MCP Apps and widgets',
|
|
225
|
-
'',
|
|
226
|
-
'## Contents',
|
|
227
|
-
'',
|
|
228
|
-
'- Tools and views',
|
|
229
|
-
'- React authoring',
|
|
230
|
-
'- CSP and permissions',
|
|
231
|
-
'- Host bridge',
|
|
232
|
-
'- Readiness and boundaries',
|
|
233
|
-
'',
|
|
234
|
-
'## Tools and views',
|
|
235
|
-
'',
|
|
236
|
-
'Use `toolWithWidget(name, { description, input, output, fulfil, view })` for a model-visible tool that renders a widget, and `toolForWidget(name, { ... })` for a widget-only helper hidden from the model. A `view` is `{ component: "name", entry: "./views/name.tsx" }`.',
|
|
237
|
-
'',
|
|
238
|
-
'## React authoring',
|
|
239
|
-
'',
|
|
240
|
-
'Author views as React components. Get typed helpers from `@noodleseed/one/react`:',
|
|
241
|
-
'',
|
|
242
|
-
'```ts',
|
|
243
|
-
"import { generateHelpers } from '@noodleseed/one/react';",
|
|
244
|
-
'const { useCallTool, useLayout, useToolInfo, useViewState } = generateHelpers<AppType>();',
|
|
245
|
-
'```',
|
|
246
|
-
'',
|
|
247
|
-
'Bind interactive elements to tools (`useCallTool("place_order")`) and annotate model-facing context with `data-llm`. A raw `html` escape hatch exists for self-contained widgets (declarative `data-bind`/`data-action`; no inline `<script>`).',
|
|
248
|
-
'',
|
|
249
|
-
'## CSP, domain, and permissions',
|
|
250
|
-
'',
|
|
251
|
-
'Declare network/host needs explicitly: `csp: { connectDomains, resourceDomains, frameDomains }` and `permissions` (e.g. `clipboardWrite`). Secrets are never injected into widgets; tool output is redacted before widget delivery.',
|
|
252
|
-
'',
|
|
253
|
-
'For ChatGPT: set `domain` on each widget (one https origin per app; required for app-store submission, optional for dev-mode testing), and declare external-link targets in the server-level `handoff.allowedDomains` — the compiler derives ChatGPT’s `redirect_domains` from it so `useOpenExternal()` links open without the safe-link warning. `noodle check --target chatgpt` verifies all of this.',
|
|
254
|
-
'',
|
|
255
|
-
'## Host bridge',
|
|
256
|
-
'',
|
|
257
|
-
'One runtime targets both Claude’s ext-apps bridge and ChatGPT’s `window.openai`, detected at startup. Tool results still carry useful `content`/`structuredContent` so non-Apps hosts degrade gracefully.',
|
|
258
|
-
'',
|
|
259
|
-
'## Readiness and boundaries',
|
|
260
|
-
'',
|
|
261
|
-
'Run `noodle check` for widget/Apps readiness and `noodle devtools` to preview metadata and rendering. Brand via the `server` `branding` tokens (the compiler derives the palette); do not inject raw global CSS.',
|
|
262
|
-
].join('\n');
|
|
263
|
-
}
|
|
264
|
-
// ----------------------------------------------------------------------------
|
|
265
|
-
// references/deploy-and-ops.md (CURATED)
|
|
266
|
-
// ----------------------------------------------------------------------------
|
|
267
|
-
export function renderDeployAndOpsReference() {
|
|
268
|
-
return [
|
|
269
|
-
'# Deploy and operations',
|
|
270
|
-
'',
|
|
271
|
-
'## Contents',
|
|
272
|
-
'',
|
|
273
|
-
'- Authenticate',
|
|
274
|
-
'- Link and target',
|
|
275
|
-
'- Deploy and inspect',
|
|
276
|
-
'- Access modes',
|
|
277
|
-
'- Org and members',
|
|
278
|
-
'- Config and observability',
|
|
279
|
-
'',
|
|
280
|
-
'## Authenticate',
|
|
281
|
-
'',
|
|
282
|
-
'`noodle login` to authenticate with Noodle Seed Cloud, `noodle whoami` to confirm, `noodle logout` to clear credentials. Local commands (`dev`/`validate`/`test`) need none of this.',
|
|
283
|
-
'',
|
|
284
|
-
'## Link and target',
|
|
285
|
-
'',
|
|
286
|
-
'`noodle link --org <slug> --app <slug> [--env <slug>]` binds the directory to a target. Unlinked, `noodle deploy` uses your default org, the project name as the app, and `prod`. `noodle target show|set` inspects or changes the target.',
|
|
287
|
-
'',
|
|
288
|
-
'## Deploy and inspect',
|
|
289
|
-
'',
|
|
290
|
-
'`noodle deploy` deploys the server. Then `noodle open` (latest URL), `noodle status`, `noodle inspect` (metadata, no secrets), `noodle smoke` (readiness diagnostics), and `noodle rollback <deploymentId>` to revert.',
|
|
291
|
-
'',
|
|
292
|
-
'## Access modes',
|
|
293
|
-
'',
|
|
294
|
-
'`noodle access set owner-only|org-members|authenticated|customers` controls who can call the deployed server. Hosted access is identity-based; never add static data-plane keys.',
|
|
295
|
-
'',
|
|
296
|
-
'## Org and members',
|
|
297
|
-
'',
|
|
298
|
-
'`noodle orgs list|create` and `noodle members list|add|remove --org <slug>` manage organizations and membership.',
|
|
299
|
-
'',
|
|
300
|
-
'## Config and observability',
|
|
301
|
-
'',
|
|
302
|
-
'Manage runtime config with `noodle secrets` / `noodle variables` (scoped org/app/env). Operators use `noodle logs`, `noodle audit`, and `noodle policy` for logs, governance audit, and policy.',
|
|
303
|
-
'',
|
|
304
|
-
'## Analytics (verify after deploy, debug errors)',
|
|
305
|
-
'',
|
|
306
|
-
'After a deploy gets traffic, verify with `noodle metrics --agent-output` — it returns a `health` verdict (`ok`/`attention`), a one-line summary, and `attention[]` items each carrying the exact next command. When a tool errors, drill in with `noodle events --tool <name> --json` (filters: `--status tool_error|mcp_error`, `--client <name>`); `noodle events --session <id> --json` replays one session chronologically. `--json` on both returns the full payload; human runs get the branded report. Two-tier errors: `tool_error` is recoverable (handed back to the model), `mcp_error` needs attention (protocol/timeout/internal).',
|
|
307
|
-
].join('\n');
|
|
308
|
-
}
|
|
309
|
-
// ----------------------------------------------------------------------------
|
|
310
|
-
// references/examples.md (CURATED index + one canonical server.ts)
|
|
311
|
-
// ----------------------------------------------------------------------------
|
|
312
|
-
const FLAGSHIP_EXAMPLES = [
|
|
313
|
-
['hello', 'Minimal TypeScript quickstart — a single tool, no connectors/widgets.'],
|
|
314
|
-
['weather', 'HTTP connectors, multi-step flows, and the sandboxed compute connector.'],
|
|
315
|
-
['restaurant-pickup', 'MCP Apps widgets, React `view` authoring, assets, branding, and handoff.'],
|
|
316
|
-
[
|
|
317
|
-
'customer-auth',
|
|
318
|
-
'End-user (customer) auth via OIDC/Firebase bridge with delegated credentials.',
|
|
319
|
-
],
|
|
320
|
-
['stateful-draft', 'Durable, caller-scoped widget state handles with optimistic revisions.'],
|
|
321
|
-
['perplexity', 'A real SaaS API with bearer auth and a managed `secret`.'],
|
|
322
|
-
[
|
|
323
|
-
'internal-ops-demo',
|
|
324
|
-
'Governed internal connectivity — tools/resources/prompts, role-shaped output.',
|
|
325
|
-
],
|
|
326
|
-
];
|
|
327
|
-
export function renderExamplesReference() {
|
|
328
|
-
const rows = FLAGSHIP_EXAMPLES.map(([name, useWhen]) => [`\`${name}\``, useWhen]);
|
|
329
|
-
return [
|
|
330
|
-
'# Examples',
|
|
331
|
-
'',
|
|
332
|
-
'Flagship examples (one per capability). Read the matching example for the pattern you need; extend an existing flagship rather than inventing a new shape.',
|
|
333
|
-
'',
|
|
334
|
-
mdTable(['Example', 'Use when'], rows),
|
|
335
|
-
'',
|
|
336
|
-
'## Canonical server.ts',
|
|
337
|
-
'',
|
|
338
|
-
'Author with `server(name, options, definitions)` and top-level helpers:',
|
|
339
|
-
'',
|
|
340
|
-
'```ts',
|
|
341
|
-
"import { server, tool, z } from '@noodleseed/one';",
|
|
342
|
-
'',
|
|
343
|
-
"export default server('hello', { title: 'Hello', version: '1.0.0' }, [",
|
|
344
|
-
" tool('greet', {",
|
|
345
|
-
" description: 'Greet someone by name.',",
|
|
346
|
-
' input: z.object({ name: z.string() }),',
|
|
347
|
-
' output: z.object({ greeting: z.string() }),',
|
|
348
|
-
' fulfil: ({ input }) => ({ greeting: `Hello, ${input.name}!` }),',
|
|
349
|
-
' }),',
|
|
350
|
-
']);',
|
|
351
|
-
'```',
|
|
352
|
-
].join('\n');
|
|
353
|
-
}
|
|
354
|
-
// ----------------------------------------------------------------------------
|
|
355
220
|
// Reference registry (consumed by index.ts and the drift gate)
|
|
356
221
|
// ----------------------------------------------------------------------------
|
|
357
222
|
export const SKILL_REFERENCES = [
|
|
@@ -360,7 +225,10 @@ export const SKILL_REFERENCES = [
|
|
|
360
225
|
{ relPath: 'references/compile-errors.md', render: renderCompileErrorsReference },
|
|
361
226
|
{ relPath: 'references/authoring-workflow.md', render: renderAuthoringWorkflowReference },
|
|
362
227
|
{ relPath: 'references/widgets-and-apps.md', render: renderWidgetsAndAppsReference },
|
|
228
|
+
{ relPath: 'references/test-in-hosts.md', render: renderTestInHostsReference },
|
|
229
|
+
{ relPath: 'references/troubleshooting.md', render: renderTroubleshootingReference },
|
|
363
230
|
{ relPath: 'references/deploy-and-ops.md', render: renderDeployAndOpsReference },
|
|
231
|
+
{ relPath: 'references/publishing.md', render: renderPublishingReference },
|
|
364
232
|
{ relPath: 'references/examples.md', render: renderExamplesReference },
|
|
365
233
|
];
|
|
366
234
|
//# sourceMappingURL=skill-content.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-content.js","sourceRoot":"","sources":["../src/skill-content.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,iGAAiG;AACjG,
|
|
1
|
+
{"version":3,"file":"skill-content.js","sourceRoot":"","sources":["../src/skill-content.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function renderTestInHostsReference(): string;
|
|
2
|
+
export declare function renderTroubleshootingReference(): string;
|
|
3
|
+
export declare function renderDeployAndOpsReference(): string;
|
|
4
|
+
export declare function renderPublishingReference(): string;
|
|
5
|
+
//# sourceMappingURL=skill-operations-refs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-operations-refs.d.ts","sourceRoot":"","sources":["../src/skill-operations-refs.ts"],"names":[],"mappings":"AASA,wBAAgB,0BAA0B,IAAI,MAAM,CA0CnD;AAMD,wBAAgB,8BAA8B,IAAI,MAAM,CAiFvD;AAMD,wBAAgB,2BAA2B,IAAI,MAAM,CA8DpD;AAMD,wBAAgB,yBAAyB,IAAI,MAAM,CAkClD"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
// Curated operations-side skill references: test-in-hosts, troubleshooting, deploy-and-ops,
|
|
2
|
+
// publishing. Facts here mirror the shipped CLI commands and host connection flows; keep prose
|
|
3
|
+
// aligned with `noodle connect`, `noodle check`, and the analytics command surface.
|
|
4
|
+
import { mdTable } from './md.js';
|
|
5
|
+
// ----------------------------------------------------------------------------
|
|
6
|
+
// references/test-in-hosts.md (CURATED)
|
|
7
|
+
// ----------------------------------------------------------------------------
|
|
8
|
+
export function renderTestInHostsReference() {
|
|
9
|
+
return [
|
|
10
|
+
'# Test in real hosts',
|
|
11
|
+
'',
|
|
12
|
+
'Local `noodle dev` and `noodle devtools` prove the server works; the widget experience is only proven inside a real host. `noodle connect <client>` prints the exact setup flow per host.',
|
|
13
|
+
'',
|
|
14
|
+
'## Contents',
|
|
15
|
+
'',
|
|
16
|
+
'- Local inspection first',
|
|
17
|
+
'- Agent hosts (Claude Code, Codex, editors)',
|
|
18
|
+
'- ChatGPT (developer mode)',
|
|
19
|
+
'- Claude',
|
|
20
|
+
'- Public URL for a local server',
|
|
21
|
+
'- What to verify',
|
|
22
|
+
'',
|
|
23
|
+
'## Local inspection first',
|
|
24
|
+
'',
|
|
25
|
+
'Run `noodle dev` and inspect the loopback endpoint with MCP Inspector: `noodle connect inspector` prints the flow (`npx @modelcontextprotocol/inspector <printed endpoint>`). Preview widget metadata and rendering with `noodle devtools`.',
|
|
26
|
+
'',
|
|
27
|
+
'## Agent hosts (Claude Code, Codex, editors)',
|
|
28
|
+
'',
|
|
29
|
+
'`noodle connect claude-code` / `noodle connect codex` (add `--write` for project-local setup). For other editors (`cursor`, `vscode`, `gemini`), `noodle connect <client>` prints the setup steps, and `noodle docs export --format llms` produces portable context. With a deployed endpoint, `noodle connect <client> --endpoint <url>` prints the MCP client registration config.',
|
|
30
|
+
'',
|
|
31
|
+
'## ChatGPT (developer mode)',
|
|
32
|
+
'',
|
|
33
|
+
'1. Deploy: `noodle deploy`, then `noodle open --print` for the hosted MCP URL (ChatGPT needs a public HTTPS endpoint, not loopback).',
|
|
34
|
+
'2. In ChatGPT: Settings → Connectors → enable Developer mode → add the endpoint (`noodle connect chatgpt` prints these steps).',
|
|
35
|
+
'3. Toggle the connector on in a new conversation and sign in when prompted; testers outside your org need a wider access mode (`noodle access set`).',
|
|
36
|
+
'4. Test on mobile too — invoke the same connector from the ChatGPT iOS/Android apps to check widget layout.',
|
|
37
|
+
'',
|
|
38
|
+
'## Claude',
|
|
39
|
+
'',
|
|
40
|
+
'`noodle connect claude` prints the flow: deploy, then add the hosted MCP URL as a custom connector in Claude settings and sign in when prompted. Widgets render in Apps-capable Claude surfaces; elsewhere the tool’s text/structured result is shown.',
|
|
41
|
+
'',
|
|
42
|
+
'## Public URL for a local server',
|
|
43
|
+
'',
|
|
44
|
+
'To try an undeployed server in a host that requires a public URL, `noodle dev --tunnel` publishes a temporary public URL for the loopback endpoint (requires the external `cloudflared` binary on PATH). Treat it as a short-lived test URL — deploy for anything shared.',
|
|
45
|
+
'',
|
|
46
|
+
'## What to verify',
|
|
47
|
+
'',
|
|
48
|
+
'Run a golden prompt set — direct (“use <tool> to…”), indirect (a natural request the model should route), and negative (requests that must not trigger the tool). Confirm the model picks the right tool with the right arguments, the widget renders and its actions work, external links open, and the experience degrades to readable text where Apps are unsupported. Symptoms → `references/troubleshooting.md`.',
|
|
49
|
+
].join('\n');
|
|
50
|
+
}
|
|
51
|
+
// ----------------------------------------------------------------------------
|
|
52
|
+
// references/troubleshooting.md (CURATED)
|
|
53
|
+
// ----------------------------------------------------------------------------
|
|
54
|
+
export function renderTroubleshootingReference() {
|
|
55
|
+
const rows = [
|
|
56
|
+
[
|
|
57
|
+
'Images, fonts, or styles don’t load inside the widget',
|
|
58
|
+
'The host sandbox silently blocks origins not declared in the widget CSP',
|
|
59
|
+
'Add every asset origin to `csp: { resourceDomains: [...] }` (fetch/XHR origins go in `connectDomains`, embedded iframes in `frameDomains`), then re-run `noodle check --target chatgpt`',
|
|
60
|
+
],
|
|
61
|
+
[
|
|
62
|
+
'ChatGPT warns “Widget CSP is not set”',
|
|
63
|
+
'The widget declares no `csp`',
|
|
64
|
+
'Declare `csp` on the widget with the exact origins it uses',
|
|
65
|
+
],
|
|
66
|
+
[
|
|
67
|
+
'ChatGPT warns “Widget domain is not set”',
|
|
68
|
+
'No `domain` on the widget (required for app-store submission)',
|
|
69
|
+
'Set `domain: "https://…"` (one https origin per app) on each widget',
|
|
70
|
+
],
|
|
71
|
+
[
|
|
72
|
+
'External links do nothing, or show a safe-link warning',
|
|
73
|
+
'Link opened outside the host bridge, or the target origin is not allowlisted',
|
|
74
|
+
'Use `useOpenExternal()` (never `window.open`) and add the target origins to the server-level `handoff.allowedDomains`',
|
|
75
|
+
],
|
|
76
|
+
[
|
|
77
|
+
'Tool succeeds but no widget appears',
|
|
78
|
+
'The tool has no view, or the host surface doesn’t support MCP Apps',
|
|
79
|
+
'Use `toolWithWidget`, run `noodle check`, preview with `noodle devtools`; on non-Apps surfaces only the text/structured result renders',
|
|
80
|
+
],
|
|
81
|
+
[
|
|
82
|
+
'Widget shows stale or missing data',
|
|
83
|
+
'The widget reads `structuredContent`, which must match the `output` schema',
|
|
84
|
+
'Make `fulfil` return exactly the `output` shape (arrays and nested objects are supported); inspect the live result with `noodle devtools`',
|
|
85
|
+
],
|
|
86
|
+
[
|
|
87
|
+
'`useCallTool` fails from the widget',
|
|
88
|
+
'Tool name mismatch, or the helper tool is model-visible',
|
|
89
|
+
'List names with `noodle tools`; widget-only helpers must be declared with `toolForWidget`',
|
|
90
|
+
],
|
|
91
|
+
[
|
|
92
|
+
'`noodle validate` passes but React views fail to bundle (“requires Vite”)',
|
|
93
|
+
'Project dependencies are not installed — widget bundling uses the app-local Vite',
|
|
94
|
+
'Run the project’s package install, then retry `noodle dev` / `noodle deploy`',
|
|
95
|
+
],
|
|
96
|
+
[
|
|
97
|
+
'Hosted endpoint returns 401 to probes',
|
|
98
|
+
'Expected: hosted servers challenge unauthenticated calls with OAuth metadata',
|
|
99
|
+
'Sign in from the host when prompted; widen who may call with `noodle access set` if testers are outside the org',
|
|
100
|
+
],
|
|
101
|
+
[
|
|
102
|
+
'Tools error only after deploy',
|
|
103
|
+
'Runtime/config differences surface hosted (secrets, connector reachability)',
|
|
104
|
+
'Run `noodle smoke`, then `noodle metrics --agent-output` and `noodle events --tool <name> --status tool_error --json`; check `noodle secrets list` scope',
|
|
105
|
+
],
|
|
106
|
+
[
|
|
107
|
+
'Need to invoke a deployed tool from the terminal',
|
|
108
|
+
'The `noodle` CLI is not a general MCP client and has no `call` verb',
|
|
109
|
+
'Use `noodle test` for the local smoke, `noodle tools`/`resources`/`prompts` for local listing, MCP Inspector, or `npx @mcpjam/cli@latest tools call --url <url> ...` for headless MCP probing',
|
|
110
|
+
],
|
|
111
|
+
[
|
|
112
|
+
'One customer/session reports a bad answer or protocol error',
|
|
113
|
+
'The failure may be a model/tool error, host protocol error, or connector/runtime error',
|
|
114
|
+
'Run `noodle metrics --agent-output`, then `noodle events --tool <name> --status tool_error --json`; copy the `sessionId` into `noodle events --session <id> --json`, then match timestamps with `noodle logs`',
|
|
115
|
+
],
|
|
116
|
+
];
|
|
117
|
+
return [
|
|
118
|
+
'# Troubleshooting in hosts',
|
|
119
|
+
'',
|
|
120
|
+
'## Contents',
|
|
121
|
+
'',
|
|
122
|
+
'- First moves',
|
|
123
|
+
'- Symptom map',
|
|
124
|
+
'',
|
|
125
|
+
'## First moves',
|
|
126
|
+
'',
|
|
127
|
+
'Re-run the local gates before debugging in-host: `noodle validate`, `noodle check` (add `--target chatgpt` for ChatGPT-specific requirements), and `noodle doctor`. Confirm the CLI is current with `noodle update --check` and that the project-local skill is intact with `noodle agents doctor --json` — host metadata requirements evolve and fixes ship in the CLI/agent-kit. Never paste tokens, secrets, or `.env.noodle` values into prompts or logs while debugging.',
|
|
128
|
+
'',
|
|
129
|
+
'For protocol/conformance checks, the headless harness is `@mcpjam/cli`, not a `noodle` subcommand. Use it against a local `noodle dev` URL without an access token, or against hosted URLs through the host/OAuth flow printed by `noodle connect`.',
|
|
130
|
+
'',
|
|
131
|
+
'## Symptom map',
|
|
132
|
+
'',
|
|
133
|
+
mdTable(['Symptom', 'Likely cause', 'Fix'], rows),
|
|
134
|
+
].join('\n');
|
|
135
|
+
}
|
|
136
|
+
// ----------------------------------------------------------------------------
|
|
137
|
+
// references/deploy-and-ops.md (CURATED)
|
|
138
|
+
// ----------------------------------------------------------------------------
|
|
139
|
+
export function renderDeployAndOpsReference() {
|
|
140
|
+
return [
|
|
141
|
+
'# Deploy and operations',
|
|
142
|
+
'',
|
|
143
|
+
'## Contents',
|
|
144
|
+
'',
|
|
145
|
+
'- Authenticate',
|
|
146
|
+
'- Link and target',
|
|
147
|
+
'- Deploy and inspect',
|
|
148
|
+
'- Access modes',
|
|
149
|
+
'- Org and members',
|
|
150
|
+
'- Config and observability',
|
|
151
|
+
'- Agent-safe CLI recipes',
|
|
152
|
+
'',
|
|
153
|
+
'## Authenticate',
|
|
154
|
+
'',
|
|
155
|
+
'`noodle login` to authenticate with Noodle Seed Cloud, `noodle whoami` to confirm, `noodle logout` to clear credentials. Local commands (`dev`/`validate`/`test`) need none of this.',
|
|
156
|
+
'',
|
|
157
|
+
'## Link and target',
|
|
158
|
+
'',
|
|
159
|
+
'`noodle link --org <slug> --app <slug> [--env <slug>]` binds the directory to a target. Unlinked, `noodle deploy` uses your default org, the project name as the app, and `prod`. `noodle target show|set` inspects or changes the target.',
|
|
160
|
+
'',
|
|
161
|
+
'## Deploy and inspect',
|
|
162
|
+
'',
|
|
163
|
+
'`noodle deploy` deploys the server. Then `noodle open` (latest URL), `noodle status`, `noodle inspect` (metadata, no secrets), `noodle smoke` (readiness diagnostics), and `noodle rollback <deploymentId>` to revert.',
|
|
164
|
+
'',
|
|
165
|
+
'## Access modes',
|
|
166
|
+
'',
|
|
167
|
+
'`noodle access set owner-only|org-members|authenticated|customers` controls who can call the deployed server. Hosted access is identity-based; never add static data-plane keys.',
|
|
168
|
+
'',
|
|
169
|
+
'## Org and members',
|
|
170
|
+
'',
|
|
171
|
+
'`noodle orgs list|create` and `noodle members list|add|remove --org <slug>` manage organizations and membership.',
|
|
172
|
+
'',
|
|
173
|
+
'## Config and observability',
|
|
174
|
+
'',
|
|
175
|
+
'Manage runtime config with `noodle secrets` / `noodle variables` (scoped org/app/env). Operators use `noodle logs`, `noodle audit`, and `noodle policy` for logs, governance audit, and policy.',
|
|
176
|
+
'',
|
|
177
|
+
'## Agent-safe CLI recipes',
|
|
178
|
+
'',
|
|
179
|
+
'Use explicit flags in headless runs so commands never wait for a prompt:',
|
|
180
|
+
'',
|
|
181
|
+
'```sh',
|
|
182
|
+
'noodle link --org acme --app support-assistant --env prod',
|
|
183
|
+
'noodle secrets set CRM_TOKEN --scope env --org acme --app support-assistant --env prod --from-env CRM_TOKEN',
|
|
184
|
+
'noodle secrets set CRM_CERT --scope env --org acme --app support-assistant --env prod --from-file ./cert.pem',
|
|
185
|
+
'printf %s "$CRM_TOKEN" | noodle secrets set CRM_TOKEN --scope env --org acme --app support-assistant --env prod --from-stdin',
|
|
186
|
+
'noodle variables set CRM_BASE_URL --scope env --org acme --app support-assistant --env prod --value https://crm.example.com',
|
|
187
|
+
'noodle secrets list --scope env --org acme --app support-assistant --env prod --json',
|
|
188
|
+
'noodle validate --json',
|
|
189
|
+
'noodle test --json',
|
|
190
|
+
'noodle deploy --json',
|
|
191
|
+
'noodle smoke --json',
|
|
192
|
+
'noodle agents doctor --json',
|
|
193
|
+
'```',
|
|
194
|
+
'',
|
|
195
|
+
'`secrets resolve` is for local diagnostics only; do not print resolved values into prompts, logs, tests, or docs. Prefer `--from-env`, `--from-file`, or `--from-stdin` over inline `--value` for sensitive values. Variables may use `--value` when the value is non-secret.',
|
|
196
|
+
'',
|
|
197
|
+
'## Analytics (verify after deploy, debug errors)',
|
|
198
|
+
'',
|
|
199
|
+
'After a deploy gets traffic, verify with `noodle metrics --agent-output` — it returns a `health` verdict (`ok`/`attention`), a one-line summary, and `attention[]` items each carrying the exact next command. When a tool errors, drill in with `noodle events --tool <name> --json` (filters: `--status tool_error|mcp_error`, `--client <name>`); `noodle events --session <id> --json` replays one session chronologically. `--json` on both returns the full payload; human runs get the branded report. Two-tier errors: `tool_error` is recoverable (handed back to the model), `mcp_error` needs attention (protocol/timeout/internal). Wire edge-triggered webhooks on error share, error count, calls, or p95 latency with `noodle alerts add|list|remove|test`.',
|
|
200
|
+
].join('\n');
|
|
201
|
+
}
|
|
202
|
+
// ----------------------------------------------------------------------------
|
|
203
|
+
// references/publishing.md (CURATED)
|
|
204
|
+
// ----------------------------------------------------------------------------
|
|
205
|
+
export function renderPublishingReference() {
|
|
206
|
+
return [
|
|
207
|
+
'# Publish to app directories',
|
|
208
|
+
'',
|
|
209
|
+
'Directory requirements evolve — treat this as the workflow map and verify against the host’s current submission docs before submitting.',
|
|
210
|
+
'',
|
|
211
|
+
'## Contents',
|
|
212
|
+
'',
|
|
213
|
+
'- Readiness gate',
|
|
214
|
+
'- ChatGPT apps directory',
|
|
215
|
+
'- Claude connectors directory',
|
|
216
|
+
'',
|
|
217
|
+
'## Readiness gate',
|
|
218
|
+
'',
|
|
219
|
+
'Before any submission:',
|
|
220
|
+
'',
|
|
221
|
+
'1. `noodle check --target chatgpt` must be clean — every widget needs `domain` (one https origin per app) and an exact `csp` (hosts require the CSP to list precisely the domains you fetch from).',
|
|
222
|
+
'2. Audit tool responses in developer mode: run realistic prompts and strip anything not strictly needed — PII, internal identifiers (session/trace/request IDs, internal account IDs), and any secrets.',
|
|
223
|
+
'3. The server must be deployed and publicly reachable: `noodle deploy`, confirm with `noodle open --print` and `noodle smoke`. Reviewers connect to the real endpoint — never submit a placeholder or loopback URL, and the access mode must not be `owner-only` (`noodle access set`).',
|
|
224
|
+
'4. Polish the listing surface: tool descriptions, widget titles, and the `server` branding tokens are what reviewers and users see.',
|
|
225
|
+
'',
|
|
226
|
+
'## ChatGPT apps directory',
|
|
227
|
+
'',
|
|
228
|
+
'Submit from the OpenAI developer dashboard (platform.openai.com → Apps):',
|
|
229
|
+
'',
|
|
230
|
+
'- Complete organization identity verification first (individual or business) — it is enforced at review time.',
|
|
231
|
+
'- The submission form asks for the app name, logo, description, company and privacy policy URLs, MCP server URL and tool information, screenshots, test prompts with expected responses, and localization details.',
|
|
232
|
+
'- One version may be published and one in review at a time; to revise a pending submission, cancel the review and resubmit rather than creating a new app.',
|
|
233
|
+
'- Review combines automated checks and manual evaluation; rejections come with feedback — fix and resubmit, or reply to appeal. An approved app is also distributed as a Codex plugin.',
|
|
234
|
+
'',
|
|
235
|
+
'## Claude connectors directory',
|
|
236
|
+
'',
|
|
237
|
+
'Anthropic runs a connectors directory for Claude; submission goes through Anthropic’s published process (see the Anthropic connectors directory FAQ on support.claude.com). The same readiness gate applies: deployed public endpoint, clean `noodle check`, and graceful degradation where Apps rendering is unavailable.',
|
|
238
|
+
].join('\n');
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=skill-operations-refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-operations-refs.js","sourceRoot":"","sources":["../src/skill-operations-refs.ts"],"names":[],"mappings":"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"}
|