@nifrajs/cli 4.0.0 → 5.0.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 +3 -0
- package/dist/agent-files.d.ts +107 -0
- package/dist/agent-files.d.ts.map +1 -0
- package/dist/agent-files.js +162 -0
- package/dist/agent-files.js.map +1 -0
- package/dist/app-files.d.ts +6 -0
- package/dist/app-files.d.ts.map +1 -1
- package/dist/app-files.js +27 -2
- package/dist/app-files.js.map +1 -1
- package/dist/assure-hydration.d.ts.map +1 -1
- package/dist/assure-hydration.js +7 -2
- package/dist/assure-hydration.js.map +1 -1
- package/dist/capabilities-tool.d.ts.map +1 -1
- package/dist/capabilities-tool.js +13 -3
- package/dist/capabilities-tool.js.map +1 -1
- package/dist/check-diagnostics.d.ts +20 -2
- package/dist/check-diagnostics.d.ts.map +1 -1
- package/dist/check-diagnostics.js +54 -7
- package/dist/check-diagnostics.js.map +1 -1
- package/dist/check-scan.d.ts +75 -22
- package/dist/check-scan.d.ts.map +1 -1
- package/dist/check-scan.js +1475 -310
- package/dist/check-scan.js.map +1 -1
- package/dist/check.d.ts +2 -2
- package/dist/check.d.ts.map +1 -1
- package/dist/check.js +192 -65
- package/dist/check.js.map +1 -1
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +112 -5
- package/dist/cli.js.map +1 -1
- package/dist/client-module.d.ts +18 -0
- package/dist/client-module.d.ts.map +1 -0
- package/dist/client-module.js +49 -0
- package/dist/client-module.js.map +1 -0
- package/dist/command-catalog.d.ts +21 -5
- package/dist/command-catalog.d.ts.map +1 -1
- package/dist/command-catalog.js +138 -38
- package/dist/command-catalog.js.map +1 -1
- package/dist/component-check.d.ts +13 -0
- package/dist/component-check.d.ts.map +1 -0
- package/dist/component-check.js +59 -0
- package/dist/component-check.js.map +1 -0
- package/dist/contract-proof.d.ts +1 -1
- package/dist/contract-proof.d.ts.map +1 -1
- package/dist/contract-proof.js +2 -24
- package/dist/contract-proof.js.map +1 -1
- package/dist/contracts.d.ts +19 -0
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +50 -3
- package/dist/contracts.js.map +1 -1
- package/dist/db-tool.d.ts.map +1 -1
- package/dist/db-tool.js +4 -3
- package/dist/db-tool.js.map +1 -1
- package/dist/dev-bun-config.d.ts +5 -1
- package/dist/dev-bun-config.d.ts.map +1 -1
- package/dist/dev-bun-config.js +44 -11
- package/dist/dev-bun-config.js.map +1 -1
- package/dist/diagnostics.d.ts +3 -0
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/diagnostics.js.map +1 -1
- package/dist/diff-tool.d.ts +9 -8
- package/dist/diff-tool.d.ts.map +1 -1
- package/dist/diff-tool.js +28 -24
- package/dist/diff-tool.js.map +1 -1
- package/dist/doctor.d.ts +13 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +23 -15
- package/dist/doctor.js.map +1 -1
- package/dist/env-file.d.ts +6 -0
- package/dist/env-file.d.ts.map +1 -1
- package/dist/env-file.js +6 -0
- package/dist/env-file.js.map +1 -1
- package/dist/fix-recipes.d.ts.map +1 -1
- package/dist/fix-recipes.js +28 -3
- package/dist/fix-recipes.js.map +1 -1
- package/dist/hand-built-manifest.d.ts +27 -0
- package/dist/hand-built-manifest.d.ts.map +1 -0
- package/dist/hand-built-manifest.js +124 -0
- package/dist/hand-built-manifest.js.map +1 -0
- package/dist/hooks-report.d.ts +23 -0
- package/dist/hooks-report.d.ts.map +1 -0
- package/dist/hooks-report.js +104 -0
- package/dist/hooks-report.js.map +1 -0
- package/dist/init-agents.d.ts +2 -2
- package/dist/init-agents.d.ts.map +1 -1
- package/dist/init-agents.js +17 -11
- package/dist/init-agents.js.map +1 -1
- package/dist/internal/nifra-project.d.ts +41 -0
- package/dist/internal/nifra-project.d.ts.map +1 -0
- package/dist/internal/nifra-project.js +183 -0
- package/dist/internal/nifra-project.js.map +1 -0
- package/dist/internal/project-specifiers.d.ts +16 -0
- package/dist/internal/project-specifiers.d.ts.map +1 -0
- package/dist/internal/project-specifiers.js +396 -0
- package/dist/internal/project-specifiers.js.map +1 -0
- package/dist/internal/script-kind.d.ts.map +1 -1
- package/dist/internal/script-kind.js +2 -1
- package/dist/internal/script-kind.js.map +1 -1
- package/dist/internal/source-facts.d.ts +2 -0
- package/dist/internal/source-facts.d.ts.map +1 -1
- package/dist/internal/source-facts.js +11 -0
- package/dist/internal/source-facts.js.map +1 -1
- package/dist/internal/typescript-import.d.ts +1 -1
- package/dist/internal/typescript-import.d.ts.map +1 -1
- package/dist/internal/typescript-import.js +5 -3
- package/dist/internal/typescript-import.js.map +1 -1
- package/dist/introspect.d.ts +6 -6
- package/dist/introspect.d.ts.map +1 -1
- package/dist/introspect.js +55 -24
- package/dist/introspect.js.map +1 -1
- package/dist/levels-tool.d.ts.map +1 -1
- package/dist/levels-tool.js +93 -15
- package/dist/levels-tool.js.map +1 -1
- package/dist/load.d.ts +31 -8
- package/dist/load.d.ts.map +1 -1
- package/dist/load.js +37 -7
- package/dist/load.js.map +1 -1
- package/dist/mcp-context.d.ts +5 -5
- package/dist/mcp-context.d.ts.map +1 -1
- package/dist/mcp-context.js +2 -2
- package/dist/mcp-context.js.map +1 -1
- package/dist/mcp-exec.d.ts +12 -4
- package/dist/mcp-exec.d.ts.map +1 -1
- package/dist/mcp-exec.js +50 -13
- package/dist/mcp-exec.js.map +1 -1
- package/dist/mcp-http.js +1 -1
- package/dist/mcp-io.d.ts +17 -0
- package/dist/mcp-io.d.ts.map +1 -1
- package/dist/mcp-io.js +40 -0
- package/dist/mcp-io.js.map +1 -1
- package/dist/mcp-isolate.d.ts.map +1 -1
- package/dist/mcp-isolate.js +3 -2
- package/dist/mcp-isolate.js.map +1 -1
- package/dist/mcp-project-child.js +1 -1
- package/dist/mcp-project-child.js.map +1 -1
- package/dist/mcp-root.d.ts.map +1 -1
- package/dist/mcp-root.js +50 -10
- package/dist/mcp-root.js.map +1 -1
- package/dist/mcp-ws.d.ts.map +1 -1
- package/dist/mcp-ws.js +3 -1
- package/dist/mcp-ws.js.map +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +8 -2
- package/dist/mcp.js.map +1 -1
- package/dist/migrate-layout.d.ts +7 -0
- package/dist/migrate-layout.d.ts.map +1 -1
- package/dist/migrate-layout.js +958 -71
- package/dist/migrate-layout.js.map +1 -1
- package/dist/output-schemas.d.ts +94 -0
- package/dist/output-schemas.d.ts.map +1 -0
- package/dist/output-schemas.js +864 -0
- package/dist/output-schemas.js.map +1 -0
- package/dist/port.d.ts.map +1 -1
- package/dist/port.js +3 -2
- package/dist/port.js.map +1 -1
- package/dist/project-facts.d.ts +15 -4
- package/dist/project-facts.d.ts.map +1 -1
- package/dist/project-facts.js +1 -0
- package/dist/project-facts.js.map +1 -1
- package/dist/recipes/4.0.0.d.ts.map +1 -1
- package/dist/recipes/4.0.0.js +2 -0
- package/dist/recipes/4.0.0.js.map +1 -1
- package/dist/recipes/5.0.0.d.ts +11 -0
- package/dist/recipes/5.0.0.d.ts.map +1 -0
- package/dist/recipes/5.0.0.js +34 -0
- package/dist/recipes/5.0.0.js.map +1 -0
- package/dist/recipes/index.d.ts +7 -0
- package/dist/recipes/index.d.ts.map +1 -1
- package/dist/recipes/index.js +2 -0
- package/dist/recipes/index.js.map +1 -1
- package/dist/replay.d.ts.map +1 -1
- package/dist/replay.js +12 -3
- package/dist/replay.js.map +1 -1
- package/dist/review.d.ts +3 -1
- package/dist/review.d.ts.map +1 -1
- package/dist/review.js +38 -7
- package/dist/review.js.map +1 -1
- package/dist/rules/codes.d.ts +10 -0
- package/dist/rules/codes.d.ts.map +1 -1
- package/dist/rules/codes.js +10 -0
- package/dist/rules/codes.js.map +1 -1
- package/dist/rules/comment-markers.d.ts +16 -7
- package/dist/rules/comment-markers.d.ts.map +1 -1
- package/dist/rules/comment-markers.js +58 -19
- package/dist/rules/comment-markers.js.map +1 -1
- package/dist/rules/contract-visibility.d.ts +3 -0
- package/dist/rules/contract-visibility.d.ts.map +1 -0
- package/dist/rules/contract-visibility.js +337 -0
- package/dist/rules/contract-visibility.js.map +1 -0
- package/dist/rules/data-guard.d.ts +7 -0
- package/dist/rules/data-guard.d.ts.map +1 -1
- package/dist/rules/data-guard.js +319 -37
- package/dist/rules/data-guard.js.map +1 -1
- package/dist/rules/layout.d.ts +4 -0
- package/dist/rules/layout.d.ts.map +1 -0
- package/dist/rules/layout.js +19 -0
- package/dist/rules/layout.js.map +1 -0
- package/dist/rules/legacy.d.ts.map +1 -1
- package/dist/rules/legacy.js +158 -43
- package/dist/rules/legacy.js.map +1 -1
- package/dist/rules/pages.d.ts +24 -0
- package/dist/rules/pages.d.ts.map +1 -1
- package/dist/rules/pages.js +221 -3
- package/dist/rules/pages.js.map +1 -1
- package/dist/rules/routes.d.ts +6 -0
- package/dist/rules/routes.d.ts.map +1 -1
- package/dist/rules/routes.js +111 -16
- package/dist/rules/routes.js.map +1 -1
- package/dist/rules/secrets.js +2 -2
- package/dist/rules/secrets.js.map +1 -1
- package/dist/rules/security.d.ts +12 -1
- package/dist/rules/security.d.ts.map +1 -1
- package/dist/rules/security.js +281 -68
- package/dist/rules/security.js.map +1 -1
- package/dist/rules/zones.d.ts +13 -0
- package/dist/rules/zones.d.ts.map +1 -1
- package/dist/rules/zones.js +192 -40
- package/dist/rules/zones.js.map +1 -1
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +6 -4
- package/dist/scaffold.js.map +1 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +14 -5
- package/dist/sdk.js.map +1 -1
- package/dist/stylex-migrate.d.ts.map +1 -1
- package/dist/stylex-migrate.js +163 -7
- package/dist/stylex-migrate.js.map +1 -1
- package/dist/sync-manifest.d.ts +10 -2
- package/dist/sync-manifest.d.ts.map +1 -1
- package/dist/sync-manifest.js +42 -18
- package/dist/sync-manifest.js.map +1 -1
- package/dist/test-tool.d.ts.map +1 -1
- package/dist/test-tool.js +12 -3
- package/dist/test-tool.js.map +1 -1
- package/dist/typecheck-coverage.d.ts +20 -0
- package/dist/typecheck-coverage.d.ts.map +1 -0
- package/dist/typecheck-coverage.js +129 -0
- package/dist/typecheck-coverage.js.map +1 -0
- package/dist/upgrade.d.ts +69 -0
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/upgrade.js +420 -77
- package/dist/upgrade.js.map +1 -1
- package/dist/verification-plan.d.ts.map +1 -1
- package/dist/verification-plan.js +11 -0
- package/dist/verification-plan.js.map +1 -1
- package/dist/version-drift.d.ts +22 -0
- package/dist/version-drift.d.ts.map +1 -0
- package/dist/version-drift.js +42 -0
- package/dist/version-drift.js.map +1 -0
- package/dist/web-app-options.d.ts +1 -1
- package/dist/web-app-options.d.ts.map +1 -1
- package/dist/web-app-options.js +1 -1
- package/dist/web-app-options.js.map +1 -1
- package/dist/work-graph.d.ts.map +1 -1
- package/dist/work-graph.js +20 -8
- package/dist/work-graph.js.map +1 -1
- package/docs/examples.json +54 -6
- package/docs/llms-full.txt +1539 -138
- package/docs/types.json +1456 -206
- package/package.json +11 -12
- package/src/agent-files.ts +203 -0
- package/src/app-files.ts +34 -4
- package/src/assure-hydration.ts +15 -2
- package/src/capabilities-tool.ts +15 -3
- package/src/check-diagnostics.ts +73 -9
- package/src/check-scan.ts +1773 -381
- package/src/check.ts +237 -76
- package/src/cli.ts +141 -5
- package/src/client-module.ts +61 -0
- package/src/command-catalog.ts +181 -47
- package/src/component-check.ts +79 -0
- package/src/contract-proof.ts +3 -25
- package/src/contracts.ts +60 -3
- package/src/db-tool.ts +5 -2
- package/src/dev-bun-config.ts +51 -10
- package/src/diagnostics.ts +3 -0
- package/src/diff-tool.ts +33 -26
- package/src/doctor.ts +43 -21
- package/src/env-file.ts +7 -0
- package/src/fix-recipes.ts +34 -3
- package/src/hand-built-manifest.ts +144 -0
- package/src/hooks-report.ts +135 -0
- package/src/init-agents.ts +17 -11
- package/src/internal/nifra-project.ts +191 -0
- package/src/internal/project-specifiers.ts +424 -0
- package/src/internal/script-kind.ts +2 -1
- package/src/internal/source-facts.ts +25 -0
- package/src/internal/typescript-import.ts +10 -3
- package/src/introspect.ts +65 -27
- package/src/levels-tool.ts +117 -20
- package/src/load.ts +78 -14
- package/src/mcp-context.ts +7 -7
- package/src/mcp-exec.ts +60 -17
- package/src/mcp-http.ts +1 -1
- package/src/mcp-io.ts +41 -0
- package/src/mcp-isolate.ts +9 -2
- package/src/mcp-project-child.ts +1 -1
- package/src/mcp-root.ts +58 -8
- package/src/mcp-ws.ts +4 -2
- package/src/mcp.ts +8 -3
- package/src/migrate-layout.ts +1109 -70
- package/src/output-schemas.ts +1084 -0
- package/src/port.ts +3 -2
- package/src/project-facts.ts +17 -3
- package/src/recipes/4.0.0.ts +2 -0
- package/src/recipes/5.0.0.ts +35 -0
- package/src/recipes/index.ts +10 -0
- package/src/replay.ts +14 -3
- package/src/review.ts +39 -10
- package/src/rules/codes.ts +10 -0
- package/src/rules/comment-markers.ts +57 -21
- package/src/rules/contract-visibility.ts +383 -0
- package/src/rules/data-guard.ts +351 -42
- package/src/rules/layout.ts +22 -0
- package/src/rules/legacy.ts +184 -51
- package/src/rules/pages.ts +238 -3
- package/src/rules/routes.ts +124 -16
- package/src/rules/secrets.ts +2 -2
- package/src/rules/security.ts +352 -71
- package/src/rules/zones.ts +205 -38
- package/src/scaffold.ts +6 -4
- package/src/sdk.ts +14 -5
- package/src/stylex-migrate.ts +134 -7
- package/src/sync-manifest.ts +48 -18
- package/src/test-tool.ts +18 -3
- package/src/typecheck-coverage.ts +134 -0
- package/src/upgrade.ts +487 -71
- package/src/verification-plan.ts +24 -0
- package/src/version-drift.ts +67 -0
- package/src/web-app-options.ts +2 -2
- package/src/work-graph.ts +17 -12
package/dist/load.d.ts
CHANGED
|
@@ -17,6 +17,9 @@ export type PluginsField = readonly unknown[] | (() => readonly unknown[] | Prom
|
|
|
17
17
|
* don't).
|
|
18
18
|
*/
|
|
19
19
|
export interface NifraFramework {
|
|
20
|
+
/** Optional coordinated Vite 8 component graph. Tooling stays in nifra.config.ts. */
|
|
21
|
+
readonly componentPipeline?: Omit<import("@nifrajs/web/server-components/build").ComponentPipelineOptions, "root" | "outDir" | "port" | "plugins">;
|
|
22
|
+
readonly serverComponents?: CreateWebAppOptions["serverComponents"];
|
|
20
23
|
/** The render adapter, e.g. `reactAdapter` from `@nifrajs/web-react`. */
|
|
21
24
|
readonly adapter: unknown;
|
|
22
25
|
/** The client runtime module providing `mountRouter`, e.g. `"@nifrajs/web-react/client"`. */
|
|
@@ -49,9 +52,13 @@ export interface NifraFramework {
|
|
|
49
52
|
* targets use the socket peer either way. */
|
|
50
53
|
readonly clientIp?: "platform";
|
|
51
54
|
/** `nifra dev` settings. `indicator: false` turns the in-page issues badge off for every run
|
|
52
|
-
* (`nifra dev --no-indicator` does it for one); browser errors still reach `nifra errors`.
|
|
55
|
+
* (`nifra dev --no-indicator` does it for one); browser errors still reach `nifra errors`.
|
|
56
|
+
* `allowedHosts` lists host names the Bun dev server answers besides loopback ones; it refuses
|
|
57
|
+
* every other `Host` so a DNS-rebound page cannot read it. The Vite pipeline uses Vite's own
|
|
58
|
+
* `server.allowedHosts`. */
|
|
53
59
|
readonly dev?: {
|
|
54
60
|
readonly indicator?: boolean;
|
|
61
|
+
readonly allowedHosts?: readonly string[];
|
|
55
62
|
};
|
|
56
63
|
/** Static files directory. Defaults to `<app>/public`; `false` disables it. */
|
|
57
64
|
readonly publicDir?: string | false;
|
|
@@ -64,9 +71,9 @@ export interface NifraFramework {
|
|
|
64
71
|
readonly cssCodeSplit?: boolean;
|
|
65
72
|
/** Framework-owned SSR stylesheet activation. Deferred mode is intended for aggregate CSS. */
|
|
66
73
|
readonly cssLoading?: CssLoadingMode;
|
|
67
|
-
/** Path `backend/app.ts`'s backend is served at
|
|
68
|
-
* page file under it can never render, so the app refuses to start and `nifra build`
|
|
69
|
-
* build.
|
|
74
|
+
/** Path `backend/app.ts`'s backend is served at over HTTP, such as `"/api"`; unset or `""`, it is
|
|
75
|
+
* not mounted. A page file under it can never render, so the app refuses to start and `nifra build`
|
|
76
|
+
* refuses to build.
|
|
70
77
|
*
|
|
71
78
|
* The fields from here down reach the generated server entry, so like `use` they MUST be exported
|
|
72
79
|
* from `backend/framework.ts` (re-export them from `nifra.config.ts` when both exist). */
|
|
@@ -84,7 +91,7 @@ export interface NifraFramework {
|
|
|
84
91
|
}
|
|
85
92
|
/** The {@link NifraFramework} fields forwarded to `createWebApp` and imported by the generated server
|
|
86
93
|
* entry, in one list so every command that builds the app forwards the same set. */
|
|
87
|
-
export declare const FRAMEWORK_WEB_OPTIONS: readonly ["apiPrefix", "apiStrip", "mounts", "csp", "nonce"];
|
|
94
|
+
export declare const FRAMEWORK_WEB_OPTIONS: readonly ["apiPrefix", "apiStrip", "mounts", "csp", "nonce", "serverComponents"];
|
|
88
95
|
export type FrameworkWebOption = (typeof FRAMEWORK_WEB_OPTIONS)[number];
|
|
89
96
|
/** Normalize a {@link PluginsField} (array | thunk | undefined) to a fresh array, awaiting a thunk. */
|
|
90
97
|
export declare function resolvePlugins(field: PluginsField | undefined): Promise<unknown[]>;
|
|
@@ -109,6 +116,20 @@ export interface LoadedApp {
|
|
|
109
116
|
/** The `backend` export from `backend/app.ts`, or `undefined` if there's no `backend/app.ts`. */
|
|
110
117
|
readonly backend: unknown;
|
|
111
118
|
}
|
|
119
|
+
/** An API-only app as the backend readers see it: `backend/app.ts` and no web config. */
|
|
120
|
+
export interface BackendOnlyApp {
|
|
121
|
+
readonly cwd: string;
|
|
122
|
+
readonly backend: unknown;
|
|
123
|
+
readonly framework?: undefined;
|
|
124
|
+
}
|
|
125
|
+
/** What the backend readers (routes, context, hooks, OpenAPI, the app's MCP surface) load. */
|
|
126
|
+
export type IntrospectedApp = LoadedApp | BackendOnlyApp;
|
|
127
|
+
/** How a command reaches the app. The MCP server hands out one whose calls both refuse. */
|
|
128
|
+
export interface AppLoader {
|
|
129
|
+
(outDirName?: string): Promise<LoadedApp>;
|
|
130
|
+
/** The whole app with a web config, else `backend/app.ts` alone. */
|
|
131
|
+
readonly backend: () => Promise<IntrospectedApp>;
|
|
132
|
+
}
|
|
112
133
|
export interface LoadAppOptions {
|
|
113
134
|
/** Optional dynamic-import query used by long-lived MCP processes to bust Bun's module cache. */
|
|
114
135
|
readonly importQuery?: string;
|
|
@@ -144,11 +165,13 @@ export declare function loadMonorepoApps(rootCwd: string, config: NifraMonorepoC
|
|
|
144
165
|
name: string;
|
|
145
166
|
cwd: string;
|
|
146
167
|
}>>;
|
|
168
|
+
/** Whether `cwd` has a web config file, the one thing that makes it more than its backend. */
|
|
169
|
+
export declare const hasAppConfig: (cwd: string) => boolean;
|
|
147
170
|
/**
|
|
148
|
-
* What reads only the backend
|
|
149
|
-
*
|
|
171
|
+
* What reads only the backend: the whole app when it has a web config, else `backend/app.ts`
|
|
172
|
+
* alone, so an API-only app needs no adapter for its routes, context, hooks or OpenAPI document.
|
|
150
173
|
*/
|
|
151
|
-
export declare function loadBackendApp(cwd: string, options?: LoadAppOptions): Promise<
|
|
174
|
+
export declare function loadBackendApp(cwd: string, options?: LoadAppOptions): Promise<IntrospectedApp>;
|
|
152
175
|
/** Discover + validate the app conventions rooted at `cwd`. Prefers `nifra.config.ts`, falls back
|
|
153
176
|
* to
|
|
154
177
|
* `backend/framework.ts`. Throws a clear, actionable error if neither exists or the config is
|
package/dist/load.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAIzD;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,GACpB,SAAS,OAAO,EAAE,GAClB,CAAC,MAAM,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAA;AAE5D;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,6FAA6F;IAC7F,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B;;;;8FAI0F;IAC1F,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAA;IACnC,oGAAoG;IACpG,QAAQ,CAAC,WAAW,CAAC,EAAE,YAAY,CAAA;IACnC;yEACqE;IACrE,QAAQ,CAAC,aAAa,CAAC,EAAE,YAAY,CAAA;IACrC;0GACsG;IACtG,QAAQ,CAAC,aAAa,CAAC,EAAE,YAAY,CAAA;IACrC,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACvC,sEAAsE;IACtE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAClD;sBACkB;IAClB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB;;;;iDAI6C;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAA;IAC9B;
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"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"}
|
package/dist/load.js
CHANGED
|
@@ -27,13 +27,33 @@ import { assertCurrentLayout, BACKEND_APP_FILE, CONFIG_FILE, FRAMEWORK_FILE } fr
|
|
|
27
27
|
import { checkPipelineSeparation } from "./pipeline-guard.js";
|
|
28
28
|
/** The {@link NifraFramework} fields forwarded to `createWebApp` and imported by the generated server
|
|
29
29
|
* entry, in one list so every command that builds the app forwards the same set. */
|
|
30
|
-
export const FRAMEWORK_WEB_OPTIONS = [
|
|
30
|
+
export const FRAMEWORK_WEB_OPTIONS = [
|
|
31
|
+
"apiPrefix",
|
|
32
|
+
"apiStrip",
|
|
33
|
+
"mounts",
|
|
34
|
+
"csp",
|
|
35
|
+
"nonce",
|
|
36
|
+
"serverComponents",
|
|
37
|
+
];
|
|
31
38
|
/** Refuse a forwarded field of the wrong shape at load, naming the field, rather than letting it fail
|
|
32
39
|
* later inside `createWebApp` or the generated server entry. */
|
|
33
40
|
function assertFrameworkWebOptions(fw, configFile) {
|
|
34
41
|
const wrong = (field, expected) => {
|
|
35
42
|
throw new Error(`[nifra] ${configFile}: \`${field}\` must be ${expected}.`);
|
|
36
43
|
};
|
|
44
|
+
if (fw.componentPipeline !== undefined) {
|
|
45
|
+
const pipeline = fw.componentPipeline;
|
|
46
|
+
if (typeof pipeline !== "object" ||
|
|
47
|
+
pipeline === null ||
|
|
48
|
+
!["react", "vue", "svelte", "solid", "preact"].includes(pipeline.adapter) ||
|
|
49
|
+
typeof pipeline.entries !== "object" ||
|
|
50
|
+
pipeline.entries === null ||
|
|
51
|
+
typeof pipeline.entries.client !== "string" ||
|
|
52
|
+
typeof pipeline.entries.ssr !== "string" ||
|
|
53
|
+
(pipeline.adapter === "react" && typeof pipeline.entries.rsc !== "string") ||
|
|
54
|
+
(pipeline.adapter !== "react" && pipeline.entries.rsc !== undefined))
|
|
55
|
+
wrong("componentPipeline", "an adapter plus existing client/ssr entries and a React-only rsc entry");
|
|
56
|
+
}
|
|
37
57
|
if (fw.apiPrefix !== undefined && typeof fw.apiPrefix !== "string") {
|
|
38
58
|
wrong("apiPrefix", 'a path string such as "/api", or "" to turn the backend mount off');
|
|
39
59
|
}
|
|
@@ -63,6 +83,11 @@ function assertFrameworkWebOptions(fw, configFile) {
|
|
|
63
83
|
const indicator = Reflect.get(fw.dev, "indicator");
|
|
64
84
|
if (indicator !== undefined && typeof indicator !== "boolean")
|
|
65
85
|
wrong("dev.indicator", "a boolean");
|
|
86
|
+
const allowedHosts = Reflect.get(fw.dev, "allowedHosts");
|
|
87
|
+
if (allowedHosts !== undefined &&
|
|
88
|
+
(!Array.isArray(allowedHosts) ||
|
|
89
|
+
allowedHosts.some((host) => typeof host !== "string" || host.trim() === "")))
|
|
90
|
+
wrong("dev.allowedHosts", 'an array of host names such as ["app.test"]');
|
|
66
91
|
}
|
|
67
92
|
}
|
|
68
93
|
/**
|
|
@@ -116,18 +141,19 @@ export async function loadMonorepoApps(rootCwd, config) {
|
|
|
116
141
|
}
|
|
117
142
|
const isAdapter = (v) => typeof v === "object" && v !== null;
|
|
118
143
|
const importWithQuery = (path, query) => import(__rewriteRelativeImportExtension(query === undefined || query === "" ? path : `${path}?${query}`));
|
|
144
|
+
/** Whether `cwd` has a web config file, the one thing that makes it more than its backend. */
|
|
145
|
+
export const hasAppConfig = (cwd) => existsSync(resolve(cwd, CONFIG_FILE)) || existsSync(resolve(cwd, FRAMEWORK_FILE));
|
|
119
146
|
/**
|
|
120
|
-
* What reads only the backend
|
|
121
|
-
*
|
|
147
|
+
* What reads only the backend: the whole app when it has a web config, else `backend/app.ts`
|
|
148
|
+
* alone, so an API-only app needs no adapter for its routes, context, hooks or OpenAPI document.
|
|
122
149
|
*/
|
|
123
150
|
export async function loadBackendApp(cwd, options = {}) {
|
|
124
|
-
if (
|
|
151
|
+
if (hasAppConfig(cwd))
|
|
125
152
|
return loadApp(cwd, "dist", options);
|
|
126
|
-
}
|
|
127
153
|
assertCurrentLayout(cwd);
|
|
128
154
|
const backendPath = resolve(cwd, BACKEND_APP_FILE);
|
|
129
155
|
if (!existsSync(backendPath)) {
|
|
130
|
-
throw new Error(`[nifra] no ${BACKEND_APP_FILE} in ${cwd}:
|
|
156
|
+
throw new Error(`[nifra] no ${CONFIG_FILE}, ${FRAMEWORK_FILE} or ${BACKEND_APP_FILE} in ${cwd}: a web app needs its config, an API-only app its ${BACKEND_APP_FILE}`);
|
|
131
157
|
}
|
|
132
158
|
const backend = (await importWithQuery(backendPath, options.importQuery)).backend;
|
|
133
159
|
return { cwd, backend };
|
|
@@ -148,7 +174,11 @@ export async function loadApp(cwd, outDirName = "dist", options = {}) {
|
|
|
148
174
|
" nifra is zero-config but needs one of them exporting at least:\n" +
|
|
149
175
|
" export const adapter = reactAdapter // from @nifrajs/web-react\n" +
|
|
150
176
|
' export const clientModule = "@nifrajs/web-react/client"\n' +
|
|
151
|
-
" (create-nifra scaffolds this for you.)"
|
|
177
|
+
" (create-nifra scaffolds this for you.)" +
|
|
178
|
+
(existsSync(resolve(cwd, BACKEND_APP_FILE))
|
|
179
|
+
? `\n With ${BACKEND_APP_FILE} and no web config this is an API-only app: \`nifra routes\`,\n` +
|
|
180
|
+
" `nifra context`, `nifra openapi` and `nifra mcp` read its backend; pages need the config."
|
|
181
|
+
: ""));
|
|
152
182
|
}
|
|
153
183
|
if (!existsSync(resolve(cwd, "routes"))) {
|
|
154
184
|
throw new Error(`[nifra] no routes/ directory in ${cwd} - nifra apps are file-routed under routes/.`);
|
package/dist/load.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":";;;;;;;;AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAG/C,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACnG,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-context.d.ts
CHANGED
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
* Resources, prompts, path scoping, and monorepo namespacing are independent of the JSON-RPC loop and
|
|
5
5
|
* of backend reflection. App loading is injected through the shared cached loader seam.
|
|
6
6
|
*/
|
|
7
|
-
import type {
|
|
7
|
+
import type { AppLoader } from "./load.js";
|
|
8
8
|
import type { McpPrompt, McpResource, McpServerFeatures, McpTool } from "./mcp-protocol.js";
|
|
9
|
-
export declare function openApiHandler(args: Record<string, unknown>, loadAppCached:
|
|
10
|
-
export declare function projectResources(cwd: string, loadAppCached?:
|
|
9
|
+
export declare function openApiHandler(args: Record<string, unknown>, loadAppCached: AppLoader): Promise<string>;
|
|
10
|
+
export declare function projectResources(cwd: string, loadAppCached?: AppLoader): McpResource[];
|
|
11
11
|
export declare function projectPrompts(): McpPrompt[];
|
|
12
|
-
export declare function projectFeatures(cwd: string, loadAppCached?:
|
|
12
|
+
export declare function projectFeatures(cwd: string, loadAppCached?: AppLoader): McpServerFeatures;
|
|
13
13
|
/**
|
|
14
14
|
* Resolve an optional `dir` tool argument - a subdirectory of the project root the caller wants to scope a
|
|
15
15
|
* check/test to (e.g. `nifra check` on `app/` when the MCP server's root is a monorepo). Returns the
|
|
@@ -22,7 +22,7 @@ export declare function dirError(dir: string | undefined): string;
|
|
|
22
22
|
/** Build the project-scoped tools for `cwd`. */
|
|
23
23
|
export interface CommandMcpToolOptions {
|
|
24
24
|
readonly cwd: string;
|
|
25
|
-
readonly loadAppCached?:
|
|
25
|
+
readonly loadAppCached?: AppLoader;
|
|
26
26
|
}
|
|
27
27
|
/** Adapt one executable catalog spec to its MCP descriptor and project-scoped handler. */
|
|
28
28
|
export declare function namespaceForApp(name: string, tools: McpTool[], features: McpServerFeatures): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-context.d.ts","sourceRoot":"","sources":["../src/mcp-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAG1C,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAO3F,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"mcp-context.d.ts","sourceRoot":"","sources":["../src/mcp-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAG1C,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAO3F,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,aAAa,EAAE,SAAS,GACvB,OAAO,CAAC,MAAM,CAAC,CAIjB;AA8BD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,aAAa,GAAE,SAAsC,GACpD,WAAW,EAAE,CAmCf;AAED,wBAAgB,cAAc,IAAI,SAAS,EAAE,CAkE5C;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,aAAa,GAAE,SAAsC,GACpD,iBAAiB,CAEnB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CA4BtF;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAMxD;AAED,gDAAgD;AAChD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,CAAA;CACnC;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EAAE,EAChB,QAAQ,EAAE,iBAAiB,GAC1B;IAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAAC,QAAQ,EAAE,iBAAiB,CAAA;CAAE,CAkBnD;AAED;;;;;;;;;;;;;;;GAeG"}
|
package/dist/mcp-context.js
CHANGED
|
@@ -16,7 +16,7 @@ function openApiFormat(args) {
|
|
|
16
16
|
export async function openApiHandler(args, loadAppCached) {
|
|
17
17
|
const { renderOpenApiWithTypes } = await import("./openapi-tool.js");
|
|
18
18
|
const pathPrefix = typeof args.path === "string" ? args.path : undefined;
|
|
19
|
-
return renderOpenApiWithTypes(await loadAppCached(), openApiFormat(args), pathPrefix);
|
|
19
|
+
return renderOpenApiWithTypes(await loadAppCached.backend(), openApiFormat(args), pathPrefix);
|
|
20
20
|
}
|
|
21
21
|
async function readProjectFile(cwd, relativeFile, maxChars) {
|
|
22
22
|
const target = resolveMcpProjectPath(cwd, relativeFile);
|
|
@@ -47,7 +47,7 @@ export function projectResources(cwd, loadAppCached = createCachedAppLoader(cwd)
|
|
|
47
47
|
mimeType: "application/json",
|
|
48
48
|
read: async () => {
|
|
49
49
|
const { routesToJson } = await import("./introspect.js");
|
|
50
|
-
return { text: JSON.stringify(routesToJson(await loadAppCached()), null, 2) };
|
|
50
|
+
return { text: JSON.stringify(routesToJson(await loadAppCached.backend()), null, 2) };
|
|
51
51
|
},
|
|
52
52
|
},
|
|
53
53
|
{
|
package/dist/mcp-context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-context.js","sourceRoot":"","sources":["../src/mcp-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAGrD,SAAS,aAAa,CAAC,IAA6B;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAC1B,OAAO,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAA6B,EAC7B,
|
|
1
|
+
{"version":3,"file":"mcp-context.js","sourceRoot":"","sources":["../src/mcp-context.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-exec.d.ts
CHANGED
|
@@ -6,14 +6,19 @@
|
|
|
6
6
|
* replaceable.
|
|
7
7
|
*/
|
|
8
8
|
import { type CommandCatalogEntry, type CommandSpec } from "./command-catalog.js";
|
|
9
|
-
import type { LoadAppOptions, LoadedApp } from "./load.js";
|
|
9
|
+
import type { AppLoader, LoadAppOptions, LoadedApp } from "./load.js";
|
|
10
10
|
import { type CommandMcpToolOptions } from "./mcp-context.js";
|
|
11
11
|
import type { McpTool, McpToolContext } from "./mcp-protocol.js";
|
|
12
|
+
type GatePaths = Pick<typeof import("node:path"), "isAbsolute" | "relative" | "resolve">;
|
|
13
|
+
/** The files a stack the caller supplies may show a codeframe from: project source, never a dotfile
|
|
14
|
+
* or anything under a dot directory (`.env`, `.git/`, `.nifra/`), and never a file outside the root -
|
|
15
|
+
* which on Windows includes one on another drive, where `relative` answers with an absolute path. */
|
|
16
|
+
export declare function explainSourceGate(root: string, paths?: GatePaths): (file: string) => boolean;
|
|
12
17
|
/** Path to a sibling child entry (`mcp-run` / `mcp-render` / `mcp-ws`), resolved next to this module (`.ts` in
|
|
13
18
|
* dev, `.js` once built). Each runs in a FRESH subprocess per call so the project's current code loads. */
|
|
14
19
|
export declare function toMcpTool(source: CommandSpec<unknown, unknown> | CommandCatalogEntry, options: CommandMcpToolOptions): McpTool;
|
|
15
|
-
export declare function catalogProjectTools(cwd: string, loadAppCached?:
|
|
16
|
-
export declare function projectTools(cwd: string, loadAppCached?:
|
|
20
|
+
export declare function catalogProjectTools(cwd: string, loadAppCached?: AppLoader): McpTool[];
|
|
21
|
+
export declare function projectTools(cwd: string, loadAppCached?: AppLoader): McpTool[];
|
|
17
22
|
/** Spawn `bun <child> <cwd>`, pipe `input` to its stdin, return its stdout (or a stderr-backed error). */
|
|
18
23
|
/**
|
|
19
24
|
* How long a child gets before it is killed.
|
|
@@ -28,6 +33,9 @@ export declare function projectTools(cwd: string, loadAppCached?: (outDirName?:
|
|
|
28
33
|
* within one attention span rather than after minutes of polling.
|
|
29
34
|
*/
|
|
30
35
|
export declare function spawnChild(child: "mcp-run" | "mcp-render" | "mcp-ws", cwd: string, input: unknown, label: string, signal?: AbortSignal): Promise<string>;
|
|
36
|
+
/** Stop every warm worker and start no more, once the MCP client has closed stdin. A live worker
|
|
37
|
+
* holds the process open, so the server would otherwise never exit. */
|
|
38
|
+
export declare function closeWarmWorkers(): void;
|
|
31
39
|
/** A persistent `mcp-run`/`mcp-render` `--worker` subprocess: the backend/web app is loaded ONCE and
|
|
32
40
|
* reused across newline-delimited `{ id, input }` requests, replying `{ id, output }`. The same machinery
|
|
33
41
|
* powers both `nifra_run warm` and `nifra_render warm` - `child` selects which engine, `label` shapes the
|
|
@@ -72,6 +80,6 @@ export interface CachedAppLoaderOptions {
|
|
|
72
80
|
/** `mtime:size` of the app's config, framework and backend entry files: what notices an edit. */
|
|
73
81
|
export declare function appFingerprint(cwd: string): Promise<string>;
|
|
74
82
|
/** Cache LoadedApp inside one MCP server process, invalidating when config/backend mtimes change. */
|
|
75
|
-
export declare function createCachedAppLoader(cwd: string, options?: CachedAppLoaderOptions):
|
|
83
|
+
export declare function createCachedAppLoader(cwd: string, options?: CachedAppLoaderOptions): AppLoader;
|
|
76
84
|
export {};
|
|
77
85
|
//# sourceMappingURL=mcp-exec.d.ts.map
|
package/dist/mcp-exec.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-exec.d.ts","sourceRoot":"","sources":["../src/mcp-exec.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,EACL,KAAK,mBAAmB,EAExB,KAAK,WAAW,EAMjB,MAAM,sBAAsB,CAAA;AAI7B,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"mcp-exec.d.ts","sourceRoot":"","sources":["../src/mcp-exec.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-exec.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { realpathSync } from "node:fs";
|
|
9
9
|
import { readdir, stat } from "node:fs/promises";
|
|
10
|
-
import { relative, resolve } from "node:path";
|
|
10
|
+
import { isAbsolute, relative, resolve } from "node:path";
|
|
11
11
|
import { fileURLToPath } from "node:url";
|
|
12
12
|
import { BACKEND_APP_FILE, CONFIG_FILE, FRAMEWORK_FILE } from "./app-files.js";
|
|
13
13
|
import { commandCatalog, commandMcpInputSchema, commandMcpName, findCommandSpec, toCommandCatalogEntry, } from "./command-catalog.js";
|
|
@@ -16,24 +16,27 @@ import { loadDocsCorpus } from "./docs-search.js";
|
|
|
16
16
|
import { loadExamplesCorpus } from "./examples.js";
|
|
17
17
|
import { dirError, openApiHandler, resolveProjectDir, } from "./mcp-context.js";
|
|
18
18
|
import { docsTools } from "./mcp-docs-tools.js";
|
|
19
|
-
import { CHILD_INPUT_MAX_BYTES, CHILD_OUTPUT_MAX_BYTES, CHILD_TIMEOUT_MS, readBoundedStream, timeoutMessage, validateLocalPort, } from "./mcp-io.js";
|
|
19
|
+
import { CHILD_INPUT_MAX_BYTES, CHILD_OUTPUT_MAX_BYTES, CHILD_TIMEOUT_MS, OWN_PROCESS_GROUP, readBoundedStream, signalProcessGroup, timeoutMessage, validateLocalPort, } from "./mcp-io.js";
|
|
20
20
|
import { mcpProjectPathError, resolveMcpProjectPath } from "./mcp-path.js";
|
|
21
21
|
import { loadTypesCorpus } from "./types-search.js";
|
|
22
22
|
const CODEFRAME_SOURCE = /\.(?:[cm]?[jt]sx?|vue|svelte|astro|mdx)$/i;
|
|
23
23
|
/** The files a stack the caller supplies may show a codeframe from: project source, never a dotfile
|
|
24
|
-
* or anything under a dot directory (`.env`, `.git/`, `.nifra/`)
|
|
25
|
-
|
|
24
|
+
* or anything under a dot directory (`.env`, `.git/`, `.nifra/`), and never a file outside the root -
|
|
25
|
+
* which on Windows includes one on another drive, where `relative` answers with an absolute path. */
|
|
26
|
+
export function explainSourceGate(root, paths = { isAbsolute, relative, resolve }) {
|
|
26
27
|
// The codeframe reads a native realpath, which expands a Windows short name (`RUNNER~1`); the root
|
|
27
28
|
// has to be spelled the same way or every file looks like it sits outside it.
|
|
28
|
-
let base = resolve(root);
|
|
29
|
+
let base = paths.resolve(root);
|
|
29
30
|
try {
|
|
30
31
|
base = realpathSync.native(base);
|
|
31
32
|
}
|
|
32
33
|
catch { }
|
|
33
|
-
return (file) =>
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
.
|
|
34
|
+
return (file) => {
|
|
35
|
+
const inside = paths.relative(base, file);
|
|
36
|
+
return (CODEFRAME_SOURCE.test(file) &&
|
|
37
|
+
!paths.isAbsolute(inside) &&
|
|
38
|
+
!inside.split(/[\\/]/).some((segment) => segment.startsWith(".")));
|
|
39
|
+
};
|
|
37
40
|
}
|
|
38
41
|
/** Path to a sibling child entry (`mcp-run` / `mcp-render` / `mcp-ws`), resolved next to this module (`.ts` in
|
|
39
42
|
* dev, `.js` once built). Each runs in a FRESH subprocess per call so the project's current code loads. */
|
|
@@ -44,7 +47,16 @@ export function toMcpTool(source, options) {
|
|
|
44
47
|
const entry = "run" in source ? undefined : source;
|
|
45
48
|
const { cwd } = options;
|
|
46
49
|
const loadAppCached = options.loadAppCached ?? createCachedAppLoader(cwd);
|
|
47
|
-
const pathFields = [
|
|
50
|
+
const pathFields = [
|
|
51
|
+
"config",
|
|
52
|
+
"out",
|
|
53
|
+
"lockfile",
|
|
54
|
+
"before",
|
|
55
|
+
"after",
|
|
56
|
+
"baseline",
|
|
57
|
+
"file",
|
|
58
|
+
"since",
|
|
59
|
+
];
|
|
48
60
|
const catalogEntry = entry ?? toCommandCatalogEntry(spec);
|
|
49
61
|
return {
|
|
50
62
|
name: commandMcpName(catalogEntry.name),
|
|
@@ -116,7 +128,7 @@ export function catalogProjectTools(cwd, loadAppCached = createCachedAppLoader(c
|
|
|
116
128
|
export function projectTools(cwd, loadAppCached = createCachedAppLoader(cwd)) {
|
|
117
129
|
const warmRun = createWarmHandler("mcp-run", cwd, "run");
|
|
118
130
|
const warmRender = createWarmHandler("mcp-render", cwd, "render");
|
|
119
|
-
const catalogTools = catalogProjectTools(cwd,
|
|
131
|
+
const catalogTools = catalogProjectTools(cwd, loadAppCached);
|
|
120
132
|
const legacyTools = [
|
|
121
133
|
{
|
|
122
134
|
name: "nifra_verify",
|
|
@@ -559,13 +571,14 @@ export async function spawnChild(child, cwd, input, label, signal) {
|
|
|
559
571
|
stdin: "pipe",
|
|
560
572
|
stdout: "pipe",
|
|
561
573
|
stderr: "pipe",
|
|
574
|
+
detached: OWN_PROCESS_GROUP,
|
|
562
575
|
});
|
|
563
576
|
let killed = false;
|
|
564
577
|
const kill = () => {
|
|
565
578
|
if (killed)
|
|
566
579
|
return;
|
|
567
580
|
killed = true;
|
|
568
|
-
proc
|
|
581
|
+
signalProcessGroup(proc, "SIGTERM");
|
|
569
582
|
};
|
|
570
583
|
const abort = () => kill();
|
|
571
584
|
signal?.addEventListener("abort", abort, { once: true });
|
|
@@ -657,6 +670,15 @@ function boundedAppend(current, next, max = 12_000) {
|
|
|
657
670
|
const combined = `${current}${next}`;
|
|
658
671
|
return combined.length <= max ? combined : combined.slice(combined.length - max);
|
|
659
672
|
}
|
|
673
|
+
const liveWarmWorkers = new Set();
|
|
674
|
+
let warmWorkersClosed = false;
|
|
675
|
+
/** Stop every warm worker and start no more, once the MCP client has closed stdin. A live worker
|
|
676
|
+
* holds the process open, so the server would otherwise never exit. */
|
|
677
|
+
export function closeWarmWorkers() {
|
|
678
|
+
warmWorkersClosed = true;
|
|
679
|
+
for (const worker of liveWarmWorkers)
|
|
680
|
+
worker.stop();
|
|
681
|
+
}
|
|
660
682
|
/** A persistent `mcp-run`/`mcp-render` `--worker` subprocess: the backend/web app is loaded ONCE and
|
|
661
683
|
* reused across newline-delimited `{ id, input }` requests, replying `{ id, output }`. The same machinery
|
|
662
684
|
* powers both `nifra_run warm` and `nifra_render warm` - `child` selects which engine, `label` shapes the
|
|
@@ -684,10 +706,12 @@ export class WarmWorker {
|
|
|
684
706
|
stdout: "pipe",
|
|
685
707
|
stderr: "pipe",
|
|
686
708
|
});
|
|
709
|
+
liveWarmWorkers.add(this);
|
|
687
710
|
void this.readStdout();
|
|
688
711
|
void this.readStderr();
|
|
689
712
|
void this.proc.exited.then((code) => {
|
|
690
713
|
this.closed = true;
|
|
714
|
+
liveWarmWorkers.delete(this);
|
|
691
715
|
const err = new Error(`warm ${this.label} worker exited (${code})${this.stderrBuffer ? `:\n${this.stderrBuffer}` : ""}`);
|
|
692
716
|
for (const pending of this.pending.values()) {
|
|
693
717
|
pending.cleanup();
|
|
@@ -868,8 +892,11 @@ function cancellationSuffix(signal) {
|
|
|
868
892
|
* message label, so there's a single source for the reuse + auto-restart-on-file-change logic. */
|
|
869
893
|
export function createWarmHandler(child, cwd, label) {
|
|
870
894
|
let worker;
|
|
895
|
+
const shuttingDown = `${label} cancelled: the MCP server is shutting down.`;
|
|
871
896
|
return async (input, signal) => {
|
|
872
897
|
const fingerprint = await warmRunFingerprint(cwd);
|
|
898
|
+
if (warmWorkersClosed)
|
|
899
|
+
return shuttingDown;
|
|
873
900
|
let current = worker;
|
|
874
901
|
if (current === undefined || current.fingerprint !== fingerprint) {
|
|
875
902
|
current?.stop();
|
|
@@ -889,6 +916,8 @@ export function createWarmHandler(child, cwd, label) {
|
|
|
889
916
|
const reason = cancellationSuffix(signal);
|
|
890
917
|
return `${label} cancelled${reason}.`;
|
|
891
918
|
}
|
|
919
|
+
if (warmWorkersClosed)
|
|
920
|
+
return shuttingDown;
|
|
892
921
|
return spawnChild(child, cwd, input, label, signal);
|
|
893
922
|
}
|
|
894
923
|
};
|
|
@@ -959,7 +988,7 @@ export function createCachedAppLoader(cwd, options = {}) {
|
|
|
959
988
|
});
|
|
960
989
|
const fingerprint = options.fingerprint ?? appFingerprint;
|
|
961
990
|
let cached;
|
|
962
|
-
|
|
991
|
+
const whole = async (outDirName = "dist") => {
|
|
963
992
|
const nextFingerprint = await fingerprint(cwd);
|
|
964
993
|
if (cached !== undefined &&
|
|
965
994
|
cached.outDirName === outDirName &&
|
|
@@ -972,5 +1001,13 @@ export function createCachedAppLoader(cwd, options = {}) {
|
|
|
972
1001
|
cached = { outDirName, fingerprint: nextFingerprint, app };
|
|
973
1002
|
return app;
|
|
974
1003
|
};
|
|
1004
|
+
const backend = async () => {
|
|
1005
|
+
const { hasAppConfig, loadBackendApp } = await import("./load.js");
|
|
1006
|
+
if (hasAppConfig(cwd))
|
|
1007
|
+
return whole();
|
|
1008
|
+
// The fingerprint names backend/app.ts, so an edit loads a fresh module and no edit reuses it.
|
|
1009
|
+
return loadBackendApp(cwd, { importQuery: cacheToken(await fingerprint(cwd)) });
|
|
1010
|
+
};
|
|
1011
|
+
return Object.assign(whole, { backend });
|
|
975
1012
|
}
|
|
976
1013
|
//# sourceMappingURL=mcp-exec.js.map
|