@noodleseed/one 0.155.0 → 0.156.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/dist/assistant-embed-django-tests.d.ts +3 -0
- package/dist/assistant-embed-django-tests.d.ts.map +1 -0
- package/dist/assistant-embed-django-tests.js +140 -0
- package/dist/assistant-embed-django-tests.js.map +1 -0
- package/dist/assistant-embed-django.d.ts +4 -0
- package/dist/assistant-embed-django.d.ts.map +1 -0
- package/dist/assistant-embed-django.js +259 -0
- package/dist/assistant-embed-django.js.map +1 -0
- package/dist/assistant-embed-installation.d.ts +29 -0
- package/dist/assistant-embed-installation.d.ts.map +1 -0
- package/dist/assistant-embed-installation.js +124 -0
- package/dist/assistant-embed-installation.js.map +1 -0
- package/dist/assistant-embed-profile.d.ts +8 -0
- package/dist/assistant-embed-profile.d.ts.map +1 -0
- package/dist/assistant-embed-profile.js +150 -0
- package/dist/assistant-embed-profile.js.map +1 -0
- package/dist/assistant-embed-scaffold-template.d.ts +3 -2
- package/dist/assistant-embed-scaffold-template.d.ts.map +1 -1
- package/dist/assistant-embed-scaffold-template.js +39 -84
- package/dist/assistant-embed-scaffold-template.js.map +1 -1
- package/dist/assistant-embed-tests.d.ts +5 -0
- package/dist/assistant-embed-tests.d.ts.map +1 -0
- package/dist/assistant-embed-tests.js +106 -0
- package/dist/assistant-embed-tests.js.map +1 -0
- package/dist/assistant-embed-vue.d.ts +3 -0
- package/dist/assistant-embed-vue.d.ts.map +1 -0
- package/dist/assistant-embed-vue.js +77 -0
- package/dist/assistant-embed-vue.js.map +1 -0
- package/dist/commands/assistant-embed-ops.d.ts.map +1 -1
- package/dist/commands/assistant-embed-ops.js +112 -63
- package/dist/commands/assistant-embed-ops.js.map +1 -1
- package/dist/commands/author-loop.d.ts.map +1 -1
- package/dist/commands/author-loop.js +24 -28
- package/dist/commands/author-loop.js.map +1 -1
- package/dist/commands/deploy-first-flow.d.ts.map +1 -1
- package/dist/commands/deploy-first-flow.js +26 -15
- package/dist/commands/deploy-first-flow.js.map +1 -1
- package/dist/commands/deploy-preflight.d.ts +5 -0
- package/dist/commands/deploy-preflight.d.ts.map +1 -1
- package/dist/commands/deploy-preflight.js +44 -5
- package/dist/commands/deploy-preflight.js.map +1 -1
- package/dist/commands/local-readiness.d.ts +9 -1
- package/dist/commands/local-readiness.d.ts.map +1 -1
- package/dist/commands/local-readiness.js +74 -4
- package/dist/commands/local-readiness.js.map +1 -1
- package/dist/commands/project-setup.d.ts.map +1 -1
- package/dist/commands/project-setup.js +10 -15
- package/dist/commands/project-setup.js.map +1 -1
- package/dist/control-plane-request.d.ts +4 -0
- package/dist/control-plane-request.d.ts.map +1 -1
- package/dist/control-plane-request.js +40 -20
- package/dist/control-plane-request.js.map +1 -1
- package/dist/project-scaffold-model.d.ts +14 -0
- package/dist/project-scaffold-model.d.ts.map +1 -0
- package/dist/project-scaffold-model.js +36 -0
- package/dist/project-scaffold-model.js.map +1 -0
- package/dist/project-scaffold-templates.d.ts.map +1 -1
- package/dist/project-scaffold-templates.js +73 -39
- package/dist/project-scaffold-templates.js.map +1 -1
- package/dist/project-scaffold-test-template.d.ts +4 -0
- package/dist/project-scaffold-test-template.d.ts.map +1 -0
- package/dist/project-scaffold-test-template.js +89 -0
- package/dist/project-scaffold-test-template.js.map +1 -0
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +1 -2
- package/dist/project.js.map +1 -1
- package/dist/widget-focused-template.d.ts +1 -1
- package/dist/widget-focused-template.d.ts.map +1 -1
- package/dist/widget-focused-template.js +34 -12
- package/dist/widget-focused-template.js.map +1 -1
- package/dist/widget-scaffold-template.d.ts +1 -1
- package/dist/widget-scaffold-template.d.ts.map +1 -1
- package/dist/widget-scaffold-template.js +75 -43
- package/dist/widget-scaffold-template.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +17 -3
- package/node_modules/@noodle-borg/agent-kit/dist/skill-app-playbook-ref.js +2 -2
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +9 -12
- package/node_modules/@noodle-borg/agent-kit/dist/skill-connect-refs.js +2 -2
- package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-operations-ref.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js +32 -26
- package/node_modules/@noodle-borg/agent-kit/dist/skill-server-playbook-ref.js +2 -2
- package/node_modules/@noodle-borg/agent-kit/dist/skill-verification-ref.js +2 -1
- 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/authoring/dist/assistant.d.ts +6 -0
- package/node_modules/@noodle-borg/authoring/dist/recording.d.ts +1 -1
- package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-assistant.js +10 -4
- package/node_modules/@noodle-borg/compiler/package.json +0 -1
- package/node_modules/@noodle-borg/deploy-client/dist/deploy-payload-size.js +6 -2
- package/node_modules/@noodle-borg/service/dist/registry-helpers.d.ts +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deploy-preflight.js +193 -96
- package/node_modules/@noodle-borg/service/package.json +1 -1
- package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +3 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/index.js +3 -0
- package/node_modules/@noodleseed/assistant/README.md +21 -23
- package/node_modules/@noodleseed/assistant/package.json +1 -1
- package/package.json +5 -4
- package/dist/saas-scaffold-template.d.ts +0 -4
- package/dist/saas-scaffold-template.d.ts.map +0 -1
- package/dist/saas-scaffold-template.js +0 -56
- package/dist/saas-scaffold-template.js.map +0 -1
- package/node_modules/tailwindcss/LICENSE +0 -21
- package/node_modules/tailwindcss/README.md +0 -36
- package/node_modules/tailwindcss/dist/chunk-5JIJA4QV.mjs +0 -1
- package/node_modules/tailwindcss/dist/chunk-HMCCH6MG.mjs +0 -1
- package/node_modules/tailwindcss/dist/chunk-X4GG3EDV.mjs +0 -1
- package/node_modules/tailwindcss/dist/colors-C__qRT83.d.ts +0 -347
- package/node_modules/tailwindcss/dist/colors.d.mts +0 -347
- package/node_modules/tailwindcss/dist/colors.d.ts +0 -5
- package/node_modules/tailwindcss/dist/colors.js +0 -1
- package/node_modules/tailwindcss/dist/colors.mjs +0 -1
- package/node_modules/tailwindcss/dist/default-theme.d.mts +0 -1199
- package/node_modules/tailwindcss/dist/default-theme.d.ts +0 -1199
- package/node_modules/tailwindcss/dist/default-theme.js +0 -1
- package/node_modules/tailwindcss/dist/default-theme.mjs +0 -1
- package/node_modules/tailwindcss/dist/flatten-color-palette.d.mts +0 -6
- package/node_modules/tailwindcss/dist/flatten-color-palette.d.ts +0 -6
- package/node_modules/tailwindcss/dist/flatten-color-palette.js +0 -1
- package/node_modules/tailwindcss/dist/flatten-color-palette.mjs +0 -1
- package/node_modules/tailwindcss/dist/lib.d.mts +0 -379
- package/node_modules/tailwindcss/dist/lib.d.ts +0 -3
- package/node_modules/tailwindcss/dist/lib.js +0 -38
- package/node_modules/tailwindcss/dist/lib.mjs +0 -38
- package/node_modules/tailwindcss/dist/plugin.d.mts +0 -11
- package/node_modules/tailwindcss/dist/plugin.d.ts +0 -134
- package/node_modules/tailwindcss/dist/plugin.js +0 -1
- package/node_modules/tailwindcss/dist/plugin.mjs +0 -1
- package/node_modules/tailwindcss/dist/resolve-config-B4yBzhca.d.ts +0 -29
- package/node_modules/tailwindcss/dist/resolve-config-QUZ9b-Gn.d.mts +0 -190
- package/node_modules/tailwindcss/dist/types-DWdTiksJ.d.mts +0 -128
- package/node_modules/tailwindcss/index.css +0 -944
- package/node_modules/tailwindcss/package.json +0 -89
- package/node_modules/tailwindcss/preflight.css +0 -393
- package/node_modules/tailwindcss/theme.css +0 -510
- package/node_modules/tailwindcss/utilities.css +0 -1
|
@@ -18,28 +18,35 @@ async function serviceRequest(url, token, init, fetchImpl, options, accept, read
|
|
|
18
18
|
const timeoutMs = options.timeoutMs ?? DEFAULT_SERVICE_TIMEOUT_MS;
|
|
19
19
|
const method = (init.method ?? 'GET').toUpperCase();
|
|
20
20
|
const maxAttempts = method === 'GET' ? 2 : 1;
|
|
21
|
+
const sentRequestId = new Headers(init.headers).get('x-request-id') ?? undefined;
|
|
21
22
|
let lastError;
|
|
22
23
|
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
24
|
+
const startedAt = Date.now();
|
|
23
25
|
try {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
lastError = error;
|
|
30
|
-
continue;
|
|
31
|
-
}
|
|
32
|
-
throw error;
|
|
26
|
+
return await fetchService(url, token, init, fetchImpl, timeoutMs, accept, async (response) => {
|
|
27
|
+
if (response.ok)
|
|
28
|
+
return read(response);
|
|
29
|
+
throw await serviceErrorFromResponse(response, token);
|
|
30
|
+
});
|
|
33
31
|
}
|
|
34
32
|
catch (error) {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
33
|
+
const serviceError = error instanceof ServiceRequestError ? error : undefined;
|
|
34
|
+
const timedOut = error instanceof Error && ['AbortError', 'TimeoutError'].includes(error.name);
|
|
35
|
+
const requestId = serviceError?.requestId ?? sentRequestId;
|
|
36
|
+
const code = serviceError?.code ?? (timedOut ? 'request_timeout' : undefined);
|
|
37
|
+
const normalized = new ServiceRequestError({
|
|
38
|
+
status: serviceError?.status ?? 0,
|
|
39
|
+
message: timedOut
|
|
40
|
+
? `request timed out after ${timeoutMs}ms`
|
|
41
|
+
: redactKnown(error instanceof Error ? error.message : String(error), token),
|
|
42
|
+
...(code !== undefined ? { code } : {}),
|
|
43
|
+
...(requestId !== undefined ? { requestId } : {}),
|
|
44
|
+
elapsedMs: Date.now() - startedAt,
|
|
45
|
+
...(serviceError?.phase !== undefined ? { phase: serviceError.phase } : {}),
|
|
46
|
+
...(serviceError?.retryAfterSeconds !== undefined
|
|
47
|
+
? { retryAfterSeconds: serviceError.retryAfterSeconds }
|
|
48
|
+
: {}),
|
|
49
|
+
});
|
|
43
50
|
if (attempt < maxAttempts && isTransientStatus(normalized.status)) {
|
|
44
51
|
lastError = normalized;
|
|
45
52
|
continue;
|
|
@@ -49,7 +56,7 @@ async function serviceRequest(url, token, init, fetchImpl, options, accept, read
|
|
|
49
56
|
}
|
|
50
57
|
throw lastError ?? new ServiceRequestError({ status: 0, message: 'request failed' });
|
|
51
58
|
}
|
|
52
|
-
async function fetchService(url, token, init, fetchImpl, timeoutMs, accept) {
|
|
59
|
+
async function fetchService(url, token, init, fetchImpl, timeoutMs, accept, consume) {
|
|
53
60
|
const headers = new Headers(init.headers);
|
|
54
61
|
headers.set('accept', accept);
|
|
55
62
|
headers.set('x-noodle-cli-version', currentCliVersion());
|
|
@@ -58,7 +65,7 @@ async function fetchService(url, token, init, fetchImpl, timeoutMs, accept) {
|
|
|
58
65
|
const controller = new AbortController();
|
|
59
66
|
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
60
67
|
try {
|
|
61
|
-
return await fetchImpl(url, { ...init, headers, signal: controller.signal });
|
|
68
|
+
return await consume(await fetchImpl(url, { ...init, headers, signal: controller.signal }));
|
|
62
69
|
}
|
|
63
70
|
finally {
|
|
64
71
|
clearTimeout(timer);
|
|
@@ -67,20 +74,27 @@ async function fetchService(url, token, init, fetchImpl, timeoutMs, accept) {
|
|
|
67
74
|
async function serviceErrorFromResponse(response, token) {
|
|
68
75
|
let message = `request failed (${response.status})`;
|
|
69
76
|
let code;
|
|
77
|
+
let phase;
|
|
70
78
|
try {
|
|
71
79
|
const body = (await response.json());
|
|
72
80
|
if (typeof body.error === 'string')
|
|
73
81
|
message = body.error;
|
|
74
82
|
if (typeof body.code === 'string')
|
|
75
83
|
code = body.code;
|
|
84
|
+
if (typeof body.phase === 'string' && /^(body|validation|checks|admission)$/.test(body.phase))
|
|
85
|
+
phase = body.phase;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (error instanceof Error && ['AbortError', 'TimeoutError'].includes(error.name))
|
|
89
|
+
throw error;
|
|
76
90
|
}
|
|
77
|
-
catch { }
|
|
78
91
|
const requestId = response.headers.get('x-request-id') ?? response.headers.get('x-correlation-id') ?? undefined;
|
|
79
92
|
const retryAfterSeconds = parseRetryAfterSeconds(response.headers.get('retry-after'));
|
|
80
93
|
return new ServiceRequestError({
|
|
81
94
|
status: response.status,
|
|
82
95
|
message: redactKnown(message, token),
|
|
83
96
|
...(code !== undefined ? { code } : {}),
|
|
97
|
+
...(phase !== undefined ? { phase } : {}),
|
|
84
98
|
...(requestId !== undefined ? { requestId } : {}),
|
|
85
99
|
...(retryAfterSeconds !== undefined ? { retryAfterSeconds } : {}),
|
|
86
100
|
});
|
|
@@ -109,6 +123,8 @@ export class ServiceRequestError extends Error {
|
|
|
109
123
|
code;
|
|
110
124
|
requestId;
|
|
111
125
|
retryAfterSeconds;
|
|
126
|
+
elapsedMs;
|
|
127
|
+
phase;
|
|
112
128
|
constructor(input) {
|
|
113
129
|
super(input.message);
|
|
114
130
|
this.name = 'ServiceRequestError';
|
|
@@ -119,6 +135,10 @@ export class ServiceRequestError extends Error {
|
|
|
119
135
|
this.requestId = input.requestId;
|
|
120
136
|
if (input.retryAfterSeconds !== undefined)
|
|
121
137
|
this.retryAfterSeconds = input.retryAfterSeconds;
|
|
138
|
+
if (input.elapsedMs !== undefined)
|
|
139
|
+
this.elapsedMs = input.elapsedMs;
|
|
140
|
+
if (input.phase !== undefined)
|
|
141
|
+
this.phase = input.phase;
|
|
122
142
|
}
|
|
123
143
|
}
|
|
124
144
|
//# sourceMappingURL=control-plane-request.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-plane-request.js","sourceRoot":"","sources":["../src/control-plane-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAWhD,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAW,EACX,KAAyB,EACzB,OAAoB,EAAE,EACtB,YAA0B,KAAK,EAC/B,UAA8B,EAAE;IAEhC,OAAO,cAAc,CACnB,GAAG,EACH,KAAK,EACL,IAAI,EACJ,SAAS,EACT,OAAO,EACP,kBAAkB,EAClB,KAAK,EAAE,QAAQ,EAAE,EAAE;QACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,SAAc,CAAC;QACnD,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;IACtC,CAAC,CACF,CAAC;AACJ,CAAC;AAED,qGAAqG;AACrG,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAW,EACX,KAAyB,EACzB,OAAoB,EAAE,EACtB,YAA0B,KAAK,EAC/B,UAA8B,EAAE;IAEhC,OAAO,cAAc,CACnB,GAAG,EACH,KAAK,EACL,IAAI,EACJ,SAAS,EACT,OAAO,EACP,iBAAiB,EACjB,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnB,KAAK,EAAE,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QACnD,OAAO,EAAE,QAAQ,CAAC,OAAO;KAC1B,CAAC,CACH,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,GAAW,EACX,KAAyB,EACzB,IAAiB,EACjB,SAAuB,EACvB,OAA2B,EAC3B,MAAc,EACd,IAAwC;IAExC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,0BAA0B,CAAC;IAClE,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,WAAW,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,IAAI,SAA0C,CAAC;IAC/C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"control-plane-request.js","sourceRoot":"","sources":["../src/control-plane-request.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { InitTemplate } from './project.js';
|
|
2
|
+
/** Shared content contract: scripts, environment declarations and executable fixtures use these seams. */
|
|
3
|
+
export interface ScaffoldModel {
|
|
4
|
+
readonly widget: boolean;
|
|
5
|
+
readonly tool: string;
|
|
6
|
+
readonly input: Readonly<Record<string, unknown>>;
|
|
7
|
+
readonly invalidInput: Readonly<Record<string, unknown>>;
|
|
8
|
+
readonly expected: Readonly<Record<string, unknown>>;
|
|
9
|
+
readonly variables: readonly string[];
|
|
10
|
+
readonly httpFixture: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const SCAFFOLD_MODELS: Readonly<Record<InitTemplate, ScaffoldModel>>;
|
|
13
|
+
export declare function scaffoldEnvironment(model: ScaffoldModel): string;
|
|
14
|
+
//# sourceMappingURL=project-scaffold-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-scaffold-model.d.ts","sourceRoot":"","sources":["../src/project-scaffold-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,0GAA0G;AAC1G,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAYD,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,CAqBzE,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAKhE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const workspace = {
|
|
2
|
+
widget: true,
|
|
3
|
+
tool: 'show_preferences',
|
|
4
|
+
input: {},
|
|
5
|
+
invalidInput: { unexpected: 'not permitted' },
|
|
6
|
+
expected: { channel: 'email', demo: true },
|
|
7
|
+
variables: [],
|
|
8
|
+
httpFixture: false,
|
|
9
|
+
};
|
|
10
|
+
export const SCAFFOLD_MODELS = {
|
|
11
|
+
hello: {
|
|
12
|
+
widget: false,
|
|
13
|
+
tool: 'greet',
|
|
14
|
+
input: { name: 'Ada' },
|
|
15
|
+
invalidInput: { name: 7 },
|
|
16
|
+
expected: { message: 'Hello, Ada!' },
|
|
17
|
+
variables: [],
|
|
18
|
+
httpFixture: false,
|
|
19
|
+
},
|
|
20
|
+
'http-api': {
|
|
21
|
+
widget: false,
|
|
22
|
+
tool: 'get_post',
|
|
23
|
+
input: { post_id: '1' },
|
|
24
|
+
invalidInput: { post_id: '../private' },
|
|
25
|
+
expected: { title: 'Fixture post', body: 'Synthetic test content.' },
|
|
26
|
+
variables: ['POSTS_API_ORIGIN'],
|
|
27
|
+
httpFixture: true,
|
|
28
|
+
},
|
|
29
|
+
widget: workspace,
|
|
30
|
+
saas: { ...workspace, variables: ['ASSISTANT_ORIGIN'] },
|
|
31
|
+
};
|
|
32
|
+
export function scaffoldEnvironment(model) {
|
|
33
|
+
return ('# Names only. Bind the exact local or hosted target with noodle variables set.\n' +
|
|
34
|
+
model.variables.map((name) => `${name}=\n`).join(''));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=project-scaffold-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-scaffold-model.js","sourceRoot":"","sources":["../src/project-scaffold-model.ts"],"names":[],"mappings":"AAaA,MAAM,SAAS,GAAkB;IAC/B,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,kBAAkB;IACxB,KAAK,EAAE,EAAE;IACT,YAAY,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE;IAC7C,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;IAC1C,SAAS,EAAE,EAAE;IACb,WAAW,EAAE,KAAK;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAkD;IAC5E,KAAK,EAAE;QACL,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACtB,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;QACzB,QAAQ,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE;QACpC,SAAS,EAAE,EAAE;QACb,WAAW,EAAE,KAAK;KACnB;IACD,UAAU,EAAE;QACV,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;QACvB,YAAY,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE;QACvC,QAAQ,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,yBAAyB,EAAE;QACpE,SAAS,EAAE,CAAC,kBAAkB,CAAC;QAC/B,WAAW,EAAE,IAAI;KAClB;IACD,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,CAAC,kBAAkB,CAAC,EAAE;CACxD,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,KAAoB;IACtD,OAAO,CACL,kFAAkF;QAClF,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CACrD,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-scaffold-templates.d.ts","sourceRoot":"","sources":["../src/project-scaffold-templates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"project-scaffold-templates.d.ts","sourceRoot":"","sources":["../src/project-scaffold-templates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAIrE,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM3C;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AACD,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,SAAS,kBAAkB,EAAE,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8BxB;AACD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,SAAS,kBAAkB,EAAE,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoDxB;AACD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,EACtB,YAAY,EAAE,SAAS,kBAAkB,EAAE,EAC3C,QAAQ,EAAE,MAAM,EAChB,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyIxB"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { SCAFFOLD_MODELS, scaffoldEnvironment } from './project-scaffold-model.js';
|
|
2
|
+
import { scaffoldBehaviorTest } from './project-scaffold-test-template.js';
|
|
1
3
|
export function title(value) {
|
|
2
4
|
return value
|
|
3
5
|
.split('-')
|
|
@@ -35,27 +37,29 @@ export default server('${serverName}', { title: '${title(name)}', version: '1.0.
|
|
|
35
37
|
}
|
|
36
38
|
export function httpApiFiles(name, agentTargets) {
|
|
37
39
|
const serverName = manifestName(name);
|
|
38
|
-
return commonFiles(name, 'http-api', agentTargets, `import { connector, server, tool, z } from '@noodleseed/one';
|
|
40
|
+
return commonFiles(name, 'http-api', agentTargets, `import { annotations, connector, server, tool, variable, z } from '@noodleseed/one';
|
|
39
41
|
|
|
40
|
-
|
|
42
|
+
// CONTRACT SEAM: share the operation's validated input/output with the public tool.
|
|
43
|
+
const input = z.object({ post_id: z.string().regex(/^[0-9]{1,12}$/).default('1') }).strict();
|
|
44
|
+
const output = z.object({ title: z.string(), body: z.string() });
|
|
45
|
+
// BINDING SEAM: the operator supplies a reviewed origin, never a tool argument or browser value.
|
|
46
|
+
const origin = variable('POSTS_API_ORIGIN');
|
|
47
|
+
const posts = connector('posts')
|
|
41
48
|
.version('1.0.0')
|
|
42
49
|
.http({
|
|
43
|
-
baseUrl:
|
|
44
|
-
allowedOrigins: [
|
|
50
|
+
baseUrl: origin,
|
|
51
|
+
allowedOrigins: [origin],
|
|
45
52
|
operations: {
|
|
46
53
|
get_post: {
|
|
47
54
|
type: 'read',
|
|
48
55
|
method: 'GET',
|
|
49
56
|
path: '/posts/\${args.post_id}',
|
|
50
|
-
input
|
|
57
|
+
input,
|
|
51
58
|
response: {
|
|
52
59
|
title: '\${response.title}',
|
|
53
60
|
body: '\${response.body}',
|
|
54
61
|
},
|
|
55
|
-
output
|
|
56
|
-
title: z.string().optional(),
|
|
57
|
-
body: z.string().optional(),
|
|
58
|
-
}),
|
|
62
|
+
output,
|
|
59
63
|
},
|
|
60
64
|
},
|
|
61
65
|
});
|
|
@@ -63,17 +67,13 @@ const jsonplaceholder = connector('jsonplaceholder')
|
|
|
63
67
|
export default server('${serverName}', {
|
|
64
68
|
title: '${title(name)}',
|
|
65
69
|
version: '1.0.0',
|
|
66
|
-
use: { posts
|
|
70
|
+
use: { posts },
|
|
67
71
|
}, [
|
|
68
72
|
tool('get_post', {
|
|
69
|
-
description: '
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
output: z.object({
|
|
74
|
-
title: z.string(),
|
|
75
|
-
body: z.string(),
|
|
76
|
-
}),
|
|
73
|
+
description: 'Read one post by its validated numeric identifier.',
|
|
74
|
+
annotations: annotations.readOnly(),
|
|
75
|
+
input,
|
|
76
|
+
output,
|
|
77
77
|
fulfil: ({ input, connectors }) => {
|
|
78
78
|
const post = connectors.posts.getPost({ post_id: input.post_id });
|
|
79
79
|
return { title: post.title, body: post.body };
|
|
@@ -83,15 +83,13 @@ export default server('${serverName}', {
|
|
|
83
83
|
`, {});
|
|
84
84
|
}
|
|
85
85
|
export function commonFiles(name, template, agentTargets, serverTs, extraDevDependencies) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
? 'noodle validate --json && noodle test --json && noodle check --json'
|
|
90
|
-
: 'noodle validate --json && noodle test --json';
|
|
86
|
+
const model = SCAFFOLD_MODELS[template];
|
|
87
|
+
const agentCheck = 'vitest run --dir test && noodle validate --json && tsc --noEmit' +
|
|
88
|
+
(model.widget ? ' && noodle check --json' : '');
|
|
91
89
|
// Widget projects also get a ChatGPT-targeted readiness gate (domain, openai/* metadata, CSP shape) —
|
|
92
90
|
// the ChatGPT App out-of-box promise, so an agent can exercise it explicitly.
|
|
93
|
-
const agentCheckChatgpt =
|
|
94
|
-
? '
|
|
91
|
+
const agentCheckChatgpt = model.widget
|
|
92
|
+
? 'vitest run --dir test && noodle validate --json && tsc --noEmit && noodle check --target chatgpt --json'
|
|
95
93
|
: undefined;
|
|
96
94
|
return {
|
|
97
95
|
'noodle.json': `${JSON.stringify({
|
|
@@ -111,6 +109,7 @@ export function commonFiles(name, template, agentTargets, serverTs, extraDevDepe
|
|
|
111
109
|
type: 'module',
|
|
112
110
|
scripts: {
|
|
113
111
|
test: 'vitest run --dir test',
|
|
112
|
+
typecheck: 'tsc --noEmit',
|
|
114
113
|
validate: 'noodle validate',
|
|
115
114
|
dev: 'noodle dev',
|
|
116
115
|
deploy: 'noodle deploy',
|
|
@@ -121,29 +120,63 @@ export function commonFiles(name, template, agentTargets, serverTs, extraDevDepe
|
|
|
121
120
|
devDependencies: {
|
|
122
121
|
'@noodleseed/one': 'latest',
|
|
123
122
|
vitest: 'latest',
|
|
123
|
+
typescript: 'latest',
|
|
124
|
+
'@types/node': 'latest',
|
|
124
125
|
...extraDevDependencies,
|
|
125
126
|
},
|
|
126
127
|
}, null, 2)}\n`,
|
|
127
|
-
'test/server.test.ts':
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
})
|
|
135
|
-
|
|
136
|
-
|
|
128
|
+
'test/server.test.ts': scaffoldBehaviorTest(model),
|
|
129
|
+
'tsconfig.json': `${JSON.stringify({
|
|
130
|
+
compilerOptions: {
|
|
131
|
+
target: 'ESNext',
|
|
132
|
+
module: 'ESNext',
|
|
133
|
+
moduleResolution: 'bundler',
|
|
134
|
+
lib: ['ESNext', 'DOM', 'DOM.Iterable'],
|
|
135
|
+
...(model.widget ? { jsx: 'react-jsx' } : {}),
|
|
136
|
+
strict: true,
|
|
137
|
+
skipLibCheck: true,
|
|
138
|
+
esModuleInterop: true,
|
|
139
|
+
noEmit: true,
|
|
140
|
+
},
|
|
141
|
+
include: ['src', 'test'],
|
|
142
|
+
}, null, 2)}\n`,
|
|
143
|
+
'vitest.config.ts': "import { defineConfig } from 'vitest/config';\n\n// Keep generated Agent Kit example suites outside the application's test run.\nexport default defineConfig({ test: { dir: 'test', include: ['**/*.test.ts'], pool: 'forks' } });\n",
|
|
144
|
+
...(model.variables.length ? { '.env.example': scaffoldEnvironment(model) } : {}),
|
|
145
|
+
'.gitignore': [
|
|
146
|
+
'node_modules',
|
|
147
|
+
'dist',
|
|
148
|
+
'.env',
|
|
149
|
+
'.env.noodle',
|
|
150
|
+
'.env.*',
|
|
151
|
+
'!.env.example',
|
|
152
|
+
'.noodle/',
|
|
153
|
+
'',
|
|
154
|
+
].join('\n'),
|
|
137
155
|
'README.md': `# ${title(name)}
|
|
138
156
|
|
|
139
157
|
## Run locally (no account, no login)
|
|
140
158
|
|
|
141
159
|
\`\`\`sh
|
|
142
|
-
|
|
160
|
+
npm install
|
|
161
|
+
npm test
|
|
143
162
|
\`\`\`
|
|
144
163
|
|
|
145
|
-
|
|
146
|
-
|
|
164
|
+
The generated tests compile the authored source, list tools, check a representative result and reject invalid
|
|
165
|
+
input. They copy source into temporary fixture storage, never copy customer credentials, and make no hosted
|
|
166
|
+
requests. Use your existing package manager consistently. A fixture pass is not a customer-integration pass.
|
|
167
|
+
${model.variables.length
|
|
168
|
+
? `
|
|
169
|
+
## Bind the application
|
|
170
|
+
|
|
171
|
+
The operator supplies ${model.variables.map((name) => `\`${name}\``).join(', ')}; \`.env.example\` lists names only.
|
|
172
|
+
Use \`noodle variables set <name> --runtime local --scope env --org local --app ${name} --env dev --from-env <name>\`
|
|
173
|
+
after exporting the reviewed value, or use your existing ignored \`.env\` locally. Do not put secrets in source.
|
|
174
|
+
For the API profile, connect the existing authorized endpoint; add delegated connector auth before private data.
|
|
175
|
+
`
|
|
176
|
+
: ''}
|
|
177
|
+
Run \`npm run dev\` for hot reload and \`npm run agent:check\` for the local suite plus validation. A bare
|
|
178
|
+
\`noodle test\` checks registration only; use \`--tool ${model.tool} --args '${JSON.stringify(model.input)}'\`
|
|
179
|
+
for an explicit read after configuring its backend. Never use a production write as a setup check.
|
|
147
180
|
|
|
148
181
|
## Deploy (requires a Noodle Seed account)
|
|
149
182
|
|
|
@@ -152,7 +185,8 @@ noodle login
|
|
|
152
185
|
noodle deploy --org <org> --app ${name}
|
|
153
186
|
\`\`\`
|
|
154
187
|
|
|
155
|
-
\`noodle deploy\` infers and saves the target on first run
|
|
188
|
+
\`noodle deploy\` infers and saves the target on first run. Review that target and keep private capabilities
|
|
189
|
+
owner-only until the real customer authentication and authorization checks pass.
|
|
156
190
|
|
|
157
191
|
If this project already uses \`.env\`, \`noodle dev\` treats matching declared \`secret("NAME")\` and
|
|
158
192
|
\`variable("NAME")\` keys as a read-only fallback. Scoped values in \`.env.noodle\`, written with
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-scaffold-templates.js","sourceRoot":"","sources":["../src/project-scaffold-templates.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"project-scaffold-templates.js","sourceRoot":"","sources":["../src/project-scaffold-templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ScaffoldModel } from './project-scaffold-model.js';
|
|
2
|
+
/** Exercise the actual authored source through the local CLI; never mutate customer config or call live APIs. */
|
|
3
|
+
export declare function scaffoldBehaviorTest(model: ScaffoldModel): string;
|
|
4
|
+
//# sourceMappingURL=project-scaffold-test-template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-scaffold-test-template.d.ts","sourceRoot":"","sources":["../src/project-scaffold-test-template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,iHAAiH;AACjH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CA0FjE"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/** Exercise the actual authored source through the local CLI; never mutate customer config or call live APIs. */
|
|
2
|
+
export function scaffoldBehaviorTest(model) {
|
|
3
|
+
return `import { execFile } from 'node:child_process';
|
|
4
|
+
import { cpSync, mkdirSync, mkdtempSync, rmSync, symlinkSync, writeFileSync } from 'node:fs';
|
|
5
|
+
${model.httpFixture ? "import { createServer } from 'node:http';\n" : ''}import { tmpdir } from 'node:os';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
|
|
9
|
+
|
|
10
|
+
// TEST SEAM: update the representative read and expectations when your business contract changes.
|
|
11
|
+
// This proves local synthetic behavior, not customer identity, hosted integration or production readiness.
|
|
12
|
+
const project = fileURLToPath(new URL('..', import.meta.url));
|
|
13
|
+
const scratch = mkdtempSync(join(tmpdir(), 'noodle-behavior-'));
|
|
14
|
+
const tool = ${JSON.stringify(model.tool)};
|
|
15
|
+
const variables: readonly string[] = ${JSON.stringify(model.variables)};
|
|
16
|
+
${model.httpFixture
|
|
17
|
+
? `let requests = 0;
|
|
18
|
+
const backend = createServer((request, response) => {
|
|
19
|
+
requests++;
|
|
20
|
+
if (request.method !== 'GET' || request.url !== '/posts/1') {
|
|
21
|
+
response.writeHead(404).end();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
response.writeHead(200, { 'content-type': 'application/json' });
|
|
25
|
+
response.end(JSON.stringify(${JSON.stringify(model.expected)}));
|
|
26
|
+
});
|
|
27
|
+
`
|
|
28
|
+
: ''}
|
|
29
|
+
beforeAll(async () => {
|
|
30
|
+
// Copy only authored source, never .env, saved accounts, project links, credentials or generated skills.
|
|
31
|
+
cpSync(join(project, 'src'), join(scratch, 'src'), { recursive: true });
|
|
32
|
+
cpSync(join(project, 'package.json'), join(scratch, 'package.json'));
|
|
33
|
+
symlinkSync(join(project, 'node_modules'), join(scratch, 'node_modules'), 'dir');
|
|
34
|
+
mkdirSync(join(scratch, 'home'));
|
|
35
|
+
writeFileSync(join(scratch, 'noodle.json'), JSON.stringify({ entrypoint: 'src/server.ts', name: 'fixture' }));
|
|
36
|
+
writeFileSync(join(scratch, 'runner.mjs'), "import { run } from '@noodleseed/one'; process.exitCode = await run(JSON.parse(process.argv[2]), {}, process.argv[3]);");
|
|
37
|
+
${model.httpFixture
|
|
38
|
+
? ` await new Promise<void>((resolve) => backend.listen(0, '127.0.0.1', resolve));
|
|
39
|
+
const address = backend.address();
|
|
40
|
+
if (!address || typeof address === 'string') throw new Error('fixture did not listen');
|
|
41
|
+
const origin = 'http://127.0.0.1:' + address.port;
|
|
42
|
+
`
|
|
43
|
+
: " const origin = 'http://localhost:3000';\n"} writeFileSync(join(scratch, '.env'), variables.map((name) => name + '=' + origin).join('\\n'));
|
|
44
|
+
});
|
|
45
|
+
afterAll(async () => {
|
|
46
|
+
${model.httpFixture ? ' await new Promise<void>((resolve) => backend.close(() => resolve()));\n' : ''} rmSync(scratch, { recursive: true, force: true });
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
function command(args: string[]): Promise<{ exit: number; body: unknown }> {
|
|
50
|
+
// Execute the installed public CLI in native Node, independent of the test runner's module transforms.
|
|
51
|
+
return new Promise((resolve, reject) => execFile(process.execPath, [
|
|
52
|
+
join(scratch, 'runner.mjs'),
|
|
53
|
+
JSON.stringify([...args, '--json']),
|
|
54
|
+
join(scratch, 'home'),
|
|
55
|
+
], {
|
|
56
|
+
cwd: scratch, timeout: 25_000, maxBuffer: 1024 * 1024,
|
|
57
|
+
env: { PATH: process.env.PATH, NOODLE_UPDATE_CHECK: 'off' },
|
|
58
|
+
}, (error, stdout) => {
|
|
59
|
+
if (error && typeof error.code !== 'number') { reject(new Error('Local CLI process could not complete.')); return; }
|
|
60
|
+
const exit = typeof error?.code === 'number' ? error.code : 0;
|
|
61
|
+
try { resolve({ exit, body: JSON.parse(stdout) }); }
|
|
62
|
+
catch { reject(new Error('Local CLI did not return a JSON envelope.')); }
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
describe.sequential('local application behavior', () => {
|
|
67
|
+
it('compiles the authored source and view', async () => {
|
|
68
|
+
const result = await command(['validate']);
|
|
69
|
+
expect(result.exit, JSON.stringify(result.body)).toBe(0);
|
|
70
|
+
}, 30_000);
|
|
71
|
+
it('registers the representative capability', async () => {
|
|
72
|
+
const result = await command(['tools', 'list']);
|
|
73
|
+
expect(result.exit, JSON.stringify(result.body)).toBe(0);
|
|
74
|
+
expect(result.body).toMatchObject({ ok: true, data: { result: { tools: expect.arrayContaining([expect.objectContaining({ name: tool })]) } } });
|
|
75
|
+
}, 30_000);
|
|
76
|
+
it('returns the expected useful result', async () => {
|
|
77
|
+
const result = await command(['tools', 'call', tool, '--args', JSON.stringify(${JSON.stringify(model.input)})]);
|
|
78
|
+
expect(result.exit, JSON.stringify(result.body)).toBe(0);
|
|
79
|
+
expect(result.body).toMatchObject({ ok: true, data: { result: { structuredContent: ${JSON.stringify(model.expected)} } } });
|
|
80
|
+
${model.httpFixture ? ' expect(requests).toBe(1);\n' : ''} }, 30_000);
|
|
81
|
+
it('rejects invalid input without claiming completion', async () => {
|
|
82
|
+
const result = await command(['tools', 'call', tool, '--args', JSON.stringify(${JSON.stringify(model.invalidInput)})]);
|
|
83
|
+
expect(result.exit).not.toBe(0);
|
|
84
|
+
expect(result.body).toMatchObject({ ok: false });
|
|
85
|
+
${model.httpFixture ? ' expect(requests).toBe(1);\n' : ''} }, 30_000);
|
|
86
|
+
});
|
|
87
|
+
`;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=project-scaffold-test-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-scaffold-test-template.js","sourceRoot":"","sources":["../src/project-scaffold-test-template.ts"],"names":[],"mappings":"AAEA,iHAAiH;AACjH,MAAM,UAAU,oBAAoB,CAAC,KAAoB;IACvD,OAAO;;EAEP,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,6CAA6C,CAAC,CAAC,CAAC,EAAE;;;;;;;;;eASzD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;uCACF,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC;EAEpE,KAAK,CAAC,WAAW;QACf,CAAC,CAAC;;;;;;;;gCAQ0B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;;CAE7D;QACG,CAAC,CAAC,EACN;;;;;;;;;EAUE,KAAK,CAAC,WAAW;QACf,CAAC,CAAC;;;;CAIL;QACG,CAAC,CAAC,6CACN;;;EAGE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,2EAA2E,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oFA+BlB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;;yFAEtB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;EACrH,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,EAAE;;oFAEwB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC;;;EAGpH,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,EAAE;;CAE3D,CAAC;AACF,CAAC"}
|
package/dist/project.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,UAAU,EAAuB,KAAK,mBAAmB,EAAQ,MAAM,aAAa,CAAC;AACnG,OAAO,EACL,KAAK,2BAA2B,EAKjC,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
|
package/dist/project.js
CHANGED
|
@@ -4,7 +4,6 @@ import { ACCESS_MODES } from '@noodle-borg/wire-contracts';
|
|
|
4
4
|
import { DEFAULT_SERVICE_URL, slug } from './deploy.js';
|
|
5
5
|
import { resolveConfiguredProjectEntrypoint, resolveConventionalEntrypoint, resolveProjectEntrypoint, } from './project-entrypoint.js';
|
|
6
6
|
import { helloFiles, httpApiFiles } from './project-scaffold-templates.js';
|
|
7
|
-
import { saasFiles } from './saas-scaffold-template.js';
|
|
8
7
|
import { widgetFiles } from './widget-scaffold-template.js';
|
|
9
8
|
export { CONVENTIONAL_ENTRYPOINTS, resolveConventionalEntrypoint, } from './project-entrypoint.js';
|
|
10
9
|
export function projectConfigPath(cwd = process.cwd()) {
|
|
@@ -164,7 +163,7 @@ export function initProject(options = {}) {
|
|
|
164
163
|
}
|
|
165
164
|
}
|
|
166
165
|
const files = template === 'saas'
|
|
167
|
-
?
|
|
166
|
+
? widgetFiles(name, options.agentTargets ?? ['codex', 'claude-code'], 'saas')
|
|
168
167
|
: template === 'hello'
|
|
169
168
|
? helloFiles(name, options.agentTargets ?? ['codex', 'claude-code'])
|
|
170
169
|
: template === 'http-api'
|