@lensmcp/nx-plugin 1.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.
Files changed (38) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +141 -0
  3. package/executors/agent-build/agent-build.d.ts +21 -0
  4. package/executors/agent-build/agent-build.d.ts.map +1 -0
  5. package/executors/agent-build/agent-build.js +86 -0
  6. package/executors/agent-build/schema.d.ts +5 -0
  7. package/executors/agent-build/schema.json +25 -0
  8. package/executors/agent-dev/agent-dev.d.ts +24 -0
  9. package/executors/agent-dev/agent-dev.d.ts.map +1 -0
  10. package/executors/agent-dev/agent-dev.js +327 -0
  11. package/executors/agent-dev/schema.d.ts +9 -0
  12. package/executors/agent-dev/schema.json +41 -0
  13. package/executors/agent-verify/agent-verify.d.ts +22 -0
  14. package/executors/agent-verify/agent-verify.d.ts.map +1 -0
  15. package/executors/agent-verify/agent-verify.js +156 -0
  16. package/executors/agent-verify/schema.d.ts +7 -0
  17. package/executors/agent-verify/schema.json +23 -0
  18. package/executors.json +22 -0
  19. package/generators/init/init.d.ts +5 -0
  20. package/generators/init/init.d.ts.map +1 -0
  21. package/generators/init/init.js +167 -0
  22. package/generators/init/schema.d.ts +4 -0
  23. package/generators/init/schema.json +22 -0
  24. package/generators/setup-nest/schema.d.ts +4 -0
  25. package/generators/setup-nest/schema.json +18 -0
  26. package/generators/setup-nest/setup-nest.d.ts +41 -0
  27. package/generators/setup-nest/setup-nest.d.ts.map +1 -0
  28. package/generators/setup-nest/setup-nest.js +281 -0
  29. package/generators/setup-vite/schema.d.ts +4 -0
  30. package/generators/setup-vite/schema.json +18 -0
  31. package/generators/setup-vite/setup-vite.d.ts +31 -0
  32. package/generators/setup-vite/setup-vite.d.ts.map +1 -0
  33. package/generators/setup-vite/setup-vite.js +125 -0
  34. package/generators.json +22 -0
  35. package/index.d.ts +14 -0
  36. package/index.d.ts.map +1 -0
  37. package/index.js +21 -0
  38. package/package.json +47 -0
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupViteGenerator = setupViteGenerator;
4
+ exports.patchViteConfig = patchViteConfig;
5
+ const devkit_1 = require("@nx/devkit");
6
+ const IMPORT_LINE = `import { lensmcpVitePlugin } from '@lensmcp/vite-plugin';`;
7
+ /**
8
+ * Wires LensMCP into a host Vite project. Idempotent on every step.
9
+ *
10
+ * 1. Locate the project's vite.config.{ts,mts,js,mjs,cts,cjs}.
11
+ * 2. Add `import { lensmcpVitePlugin } from '@lensmcp/vite-plugin'`
12
+ * near the top (after the last existing import).
13
+ * 3. Insert `lensmcpVitePlugin({ enabled: mode !== 'production' })`
14
+ * into the `plugins` array if not already present. We do *not*
15
+ * AST-edit — we use string heuristics on the standard
16
+ * `defineConfig({ plugins: [...] })` shape. If the file is too
17
+ * custom for the heuristics, we print a diff hint and bail.
18
+ * 4. Add Nx targets: agent-dev, agent-build, agent-verify.
19
+ */
20
+ async function setupViteGenerator(tree, rawOptions) {
21
+ const options = {
22
+ project: rawOptions.project,
23
+ skipFormat: rawOptions.skipFormat ?? false,
24
+ };
25
+ const project = (0, devkit_1.readProjectConfiguration)(tree, options.project);
26
+ const viteConfigPath = findViteConfig(tree, project.root);
27
+ if (!viteConfigPath) {
28
+ throw new Error(`setup-vite: no vite.config.{ts,mts,js,mjs,cts,cjs} found under ${project.root}.`);
29
+ }
30
+ const original = tree.read(viteConfigPath, 'utf-8') ?? '';
31
+ const patched = patchViteConfig(original);
32
+ if (patched === null) {
33
+ throw new Error(`setup-vite: could not safely patch ${viteConfigPath}.\n` +
34
+ `Expected a defineConfig({ plugins: [...] }) or defineConfig(({ mode }) => ({ plugins: [...] })) shape.\n` +
35
+ `Edit manually: add \`${IMPORT_LINE}\` and push \`lensmcpVitePlugin({ enabled: mode !== 'production' })\` into the plugins array.`);
36
+ }
37
+ if (patched !== original) {
38
+ tree.write(viteConfigPath, patched);
39
+ }
40
+ // Idempotent Nx target additions.
41
+ const targets = { ...(project.targets ?? {}) };
42
+ if (!targets['agent-dev']) {
43
+ targets['agent-dev'] = {
44
+ executor: '@lensmcp/nx-plugin:agent-dev',
45
+ options: {
46
+ kind: 'vite-react',
47
+ chrome: true,
48
+ headless: true,
49
+ },
50
+ };
51
+ project.targets = targets;
52
+ (0, devkit_1.updateProjectConfiguration)(tree, options.project, project);
53
+ }
54
+ if (!options.skipFormat) {
55
+ await (0, devkit_1.formatFiles)(tree);
56
+ }
57
+ }
58
+ exports.default = setupViteGenerator;
59
+ // ---------- helpers ----------
60
+ function findViteConfig(tree, root) {
61
+ // Nx generates `vite.config.mts` for ESM workspaces — cover every Vite-supported extension.
62
+ for (const name of [
63
+ 'vite.config.ts',
64
+ 'vite.config.mts',
65
+ 'vite.config.js',
66
+ 'vite.config.mjs',
67
+ 'vite.config.cts',
68
+ 'vite.config.cjs',
69
+ ]) {
70
+ const p = (0, devkit_1.joinPathFragments)(root, name);
71
+ if (tree.exists(p))
72
+ return p;
73
+ }
74
+ return undefined;
75
+ }
76
+ /**
77
+ * String-heuristic patch:
78
+ *
79
+ * 1. If the file already imports `@lensmcp/vite-plugin` and mentions
80
+ * `lensmcpVitePlugin(` in the plugins array, return unchanged.
81
+ * 2. Otherwise insert the import near the top (after the last
82
+ * `import …` line) and add the plugin call to the plugins array
83
+ * declared by `plugins: [` (first occurrence).
84
+ *
85
+ * If neither anchor is found, return `null` so the generator can ask
86
+ * the user to patch manually.
87
+ */
88
+ function patchViteConfig(src) {
89
+ const hasImport = src.includes("from '@lensmcp/vite-plugin'") || src.includes('from "@lensmcp/vite-plugin"');
90
+ const hasPluginCall = /lensmcpVitePlugin\s*\(/.test(src);
91
+ if (hasImport && hasPluginCall)
92
+ return src;
93
+ const pluginsAnchor = src.indexOf('plugins:');
94
+ if (pluginsAnchor === -1)
95
+ return null;
96
+ const bracketStart = src.indexOf('[', pluginsAnchor);
97
+ if (bracketStart === -1)
98
+ return null;
99
+ let withImport = src;
100
+ if (!hasImport) {
101
+ const importLines = [...src.matchAll(/^\s*import .+;?\s*$/gm)];
102
+ const lastImport = importLines.length > 0 ? importLines[importLines.length - 1] : null;
103
+ if (lastImport && lastImport.index !== undefined) {
104
+ const insertAt = lastImport.index + lastImport[0].length;
105
+ withImport = src.slice(0, insertAt) + `\n${IMPORT_LINE}` + src.slice(insertAt);
106
+ }
107
+ else {
108
+ withImport = `${IMPORT_LINE}\n` + src;
109
+ }
110
+ }
111
+ if (hasPluginCall)
112
+ return withImport;
113
+ const adjBracket = withImport.indexOf('[', withImport.indexOf('plugins:'));
114
+ const before = withImport.slice(0, adjBracket + 1);
115
+ const after = withImport.slice(adjBracket + 1);
116
+ // Insert at the start of the array with a trailing comma if the array isn't empty.
117
+ const trimmedAfter = after.replace(/^\s*/, '');
118
+ const startsClosed = trimmedAfter.startsWith(']');
119
+ const separator = startsClosed ? '' : ', ';
120
+ // `mode` is only in scope for the function-form config (`defineConfig(({ mode }) => …)`).
121
+ // For the object form, gate on NODE_ENV instead of emitting code that doesn't compile.
122
+ const hasModeInScope = /defineConfig\s*\(\s*(?:async\s*)?\(\s*\{[^}]*\bmode\b[^}]*\}/.test(withImport);
123
+ const enabledExpr = hasModeInScope ? "mode !== 'production'" : "process.env.NODE_ENV !== 'production'";
124
+ return `${before}lensmcpVitePlugin({ enabled: ${enabledExpr} })${separator}${after}`;
125
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "name": "@lensmcp/nx-plugin",
4
+ "version": "0.0.1",
5
+ "generators": {
6
+ "init": {
7
+ "factory": "./dist/generators/init/init",
8
+ "schema": "./dist/generators/init/schema.json",
9
+ "description": "Install LensMCP into a host Nx workspace (idempotent)."
10
+ },
11
+ "setup-vite": {
12
+ "factory": "./dist/generators/setup-vite/setup-vite",
13
+ "schema": "./dist/generators/setup-vite/schema.json",
14
+ "description": "Wire LensMCP into a Vite project (patches vite.config + adds agent-dev target)."
15
+ },
16
+ "setup-nest": {
17
+ "factory": "./dist/generators/setup-nest/setup-nest",
18
+ "schema": "./dist/generators/setup-nest/schema.json",
19
+ "description": "Wire LensMCP into a NestJS project (rewrites main.ts bootstrap to createLensmcpNestApp + agent-dev target)."
20
+ }
21
+ }
22
+ }
package/index.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ export { initGenerator } from './generators/init/init.js';
2
+ export { setupViteGenerator, patchViteConfig } from './generators/setup-vite/setup-vite.js';
3
+ export { setupNestGenerator, patchMainBootstrap, patchAppModule } from './generators/setup-nest/setup-nest.js';
4
+ export { default as agentDevExecutor } from './executors/agent-dev/agent-dev.js';
5
+ export { default as agentBuildExecutor } from './executors/agent-build/agent-build.js';
6
+ export { default as agentVerifyExecutor } from './executors/agent-verify/agent-verify.js';
7
+ export type { InitGeneratorSchema } from './generators/init/schema.js';
8
+ export type { SetupViteGeneratorSchema } from './generators/setup-vite/schema.js';
9
+ export type { SetupNestGeneratorSchema } from './generators/setup-nest/schema.js';
10
+ export type { AgentDevExecutorSchema } from './executors/agent-dev/schema.js';
11
+ export type { AgentBuildExecutorSchema } from './executors/agent-build/schema.js';
12
+ export type { AgentVerifyExecutorSchema } from './executors/agent-verify/schema.js';
13
+ export { initGenerator as default } from './generators/init/init.js';
14
+ //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC/G,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC1F,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,YAAY,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClF,YAAY,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClF,YAAY,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,YAAY,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClF,YAAY,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,aAAa,IAAI,OAAO,EAAE,MAAM,2BAA2B,CAAC"}
package/index.js ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = exports.agentVerifyExecutor = exports.agentBuildExecutor = exports.agentDevExecutor = exports.patchAppModule = exports.patchMainBootstrap = exports.setupNestGenerator = exports.patchViteConfig = exports.setupViteGenerator = exports.initGenerator = void 0;
4
+ const tslib_1 = require("tslib");
5
+ var init_js_1 = require("./generators/init/init.js");
6
+ Object.defineProperty(exports, "initGenerator", { enumerable: true, get: function () { return init_js_1.initGenerator; } });
7
+ var setup_vite_js_1 = require("./generators/setup-vite/setup-vite.js");
8
+ Object.defineProperty(exports, "setupViteGenerator", { enumerable: true, get: function () { return setup_vite_js_1.setupViteGenerator; } });
9
+ Object.defineProperty(exports, "patchViteConfig", { enumerable: true, get: function () { return setup_vite_js_1.patchViteConfig; } });
10
+ var setup_nest_js_1 = require("./generators/setup-nest/setup-nest.js");
11
+ Object.defineProperty(exports, "setupNestGenerator", { enumerable: true, get: function () { return setup_nest_js_1.setupNestGenerator; } });
12
+ Object.defineProperty(exports, "patchMainBootstrap", { enumerable: true, get: function () { return setup_nest_js_1.patchMainBootstrap; } });
13
+ Object.defineProperty(exports, "patchAppModule", { enumerable: true, get: function () { return setup_nest_js_1.patchAppModule; } });
14
+ var agent_dev_js_1 = require("./executors/agent-dev/agent-dev.js");
15
+ Object.defineProperty(exports, "agentDevExecutor", { enumerable: true, get: function () { return tslib_1.__importDefault(agent_dev_js_1).default; } });
16
+ var agent_build_js_1 = require("./executors/agent-build/agent-build.js");
17
+ Object.defineProperty(exports, "agentBuildExecutor", { enumerable: true, get: function () { return tslib_1.__importDefault(agent_build_js_1).default; } });
18
+ var agent_verify_js_1 = require("./executors/agent-verify/agent-verify.js");
19
+ Object.defineProperty(exports, "agentVerifyExecutor", { enumerable: true, get: function () { return tslib_1.__importDefault(agent_verify_js_1).default; } });
20
+ var init_js_2 = require("./generators/init/init.js");
21
+ Object.defineProperty(exports, "default", { enumerable: true, get: function () { return init_js_2.initGenerator; } });
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@lensmcp/nx-plugin",
3
+ "version": "1.0.0",
4
+ "main": "./index.js",
5
+ "module": "./index.js",
6
+ "types": "./index.d.ts",
7
+ "exports": {
8
+ "./package.json": "./package.json",
9
+ ".": {
10
+ "types": "./index.d.ts",
11
+ "import": "./index.js",
12
+ "default": "./index.js"
13
+ }
14
+ },
15
+ "dependencies": {
16
+ "@nx/devkit": "22.7.3",
17
+ "tslib": "^2.3.0"
18
+ },
19
+ "generators": "./generators.json",
20
+ "executors": "./executors.json",
21
+ "license": "Apache-2.0",
22
+ "homepage": "https://github.com/kiwiapps-ltd/lensmcp#readme",
23
+ "bugs": {
24
+ "url": "https://github.com/kiwiapps-ltd/lensmcp/issues"
25
+ },
26
+ "engines": {
27
+ "node": ">=18"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "description": "Nx plugin that installs LensMCP into a workspace (generators + agent-dev/build/verify executors).",
33
+ "keywords": [
34
+ "lensmcp",
35
+ "mcp",
36
+ "observability",
37
+ "ai-agents",
38
+ "claude",
39
+ "nx",
40
+ "nx-plugin"
41
+ ],
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "git+https://github.com/kiwiapps-ltd/lensmcp.git",
45
+ "directory": "libs/nx-plugin"
46
+ }
47
+ }