@corva/create-app 0.0.0-b560f33 → 0.0.0-e3730ad

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 (46) hide show
  1. package/README.md +5 -5
  2. package/common/python/Makefile +8 -5
  3. package/common/python/pyproject.toml +25 -0
  4. package/common/python/uv.lock +381 -0
  5. package/lib/commands/create.js +5 -5
  6. package/lib/constants/cli.js +6 -8
  7. package/lib/constants/manifest.js +3 -3
  8. package/lib/constants/package.js +51 -13
  9. package/lib/flows/lib/api.js +23 -8
  10. package/lib/flows/lib/manifest.js +1 -1
  11. package/lib/flows/steps/zip-file-list-resolve.js +13 -8
  12. package/lib/helpers/cli-version.js +14 -1
  13. package/lib/helpers/resolve-app-runtime.js +30 -15
  14. package/lib/helpers/utils.js +6 -2
  15. package/lib/main.js +3 -8
  16. package/package.json +1 -1
  17. package/templates/ui/javascript/.codex/config.toml +3 -0
  18. package/templates/ui/javascript/.cursor/mcp.json +8 -0
  19. package/templates/ui/javascript/.mcp.json +8 -0
  20. package/templates/ui/javascript/AGENTS.md +304 -0
  21. package/templates/ui/javascript/CLAUDE.md +1 -0
  22. package/templates/ui/javascript/src/App.completion.js +6 -17
  23. package/templates/ui/javascript/src/App.drilling.js +7 -11
  24. package/templates/ui/javascript/src/AppSettings.js +6 -20
  25. package/templates/ui/javascript/src/__tests__/App.test.js +4 -24
  26. package/templates/ui/javascript/src/__tests__/AppSettings.test.js +12 -5
  27. package/templates/ui/javascript/src/index.js +1 -0
  28. package/templates/ui/typescript/.codex/config.toml +3 -0
  29. package/templates/ui/typescript/.cursor/mcp.json +8 -0
  30. package/templates/ui/typescript/.mcp.json +8 -0
  31. package/templates/ui/typescript/AGENTS.md +344 -0
  32. package/templates/ui/typescript/CLAUDE.md +1 -0
  33. package/templates/ui/typescript/src/App.completion.tsx +6 -10
  34. package/templates/ui/typescript/src/App.drilling.tsx +7 -9
  35. package/templates/ui/typescript/src/AppSettings.tsx +4 -4
  36. package/templates/ui/typescript/src/__mocks__/mockData.ts +15 -187
  37. package/templates/ui/typescript/src/__tests__/App.test.tsx +5 -73
  38. package/templates/ui/typescript/src/__tests__/AppSettings.test.tsx +9 -13
  39. package/templates/ui/typescript/src/custom.d.ts +10 -0
  40. package/templates/ui/typescript/src/index.js +1 -0
  41. package/templates/ui/typescript/src/types.ts +0 -615
  42. package/common/python/requirements.txt +0 -2
  43. package/templates/ui/javascript/src/__mocks__/mockAppProps.js +0 -590
  44. package/templates/ui/javascript/src/__mocks__/mockAppSettingsProps.js +0 -290
  45. /package/templates/ui/javascript/src/{App.css → App.scss} +0 -0
  46. /package/templates/ui/typescript/src/{App.css → App.scss} +0 -0
@@ -10,7 +10,7 @@ const uiDependencies = {
10
10
  '@icon-park/react': '1.4.2',
11
11
  'classnames': '2.2.6',
12
12
  'corva-convert-units': '1.10.33',
13
- 'highcharts': '8.1.2',
13
+ 'highcharts': '10.3.3',
14
14
  'highcharts-react-official': '2.2.2',
15
15
  'lodash': '^4.17.21',
16
16
  'mapbox.js': '3.2.1',
@@ -22,17 +22,17 @@ const uiDependencies = {
22
22
 
23
23
  const jsUiDevDependencies = {
24
24
  '@corva/dc-platform-shared': 'latest',
25
- '@corva/eslint-config-browser': 'latest',
25
+ '@corva/eslint-config-browser': '0.2.2',
26
26
  '@testing-library/jest-dom': '^5.14.1',
27
27
  '@testing-library/react': '^12.1.5',
28
28
  '@testing-library/react-hooks': '^8.0.1',
29
29
  '@testing-library/user-event': '^13.2.1',
30
- 'jest-watch-typeahead': '^1.0.0',
31
- 'jest': '^27.4.3',
32
30
  'babel-jest': '^27.4.2',
33
31
  'babel-preset-react-app': '^10.0.1',
34
32
  'eslint': '7.32.0',
35
- 'postcss-loader': '4.1.0',
33
+ 'identity-obj-proxy': '^3.0.0',
34
+ 'jest': '^27.4.3',
35
+ 'jest-watch-typeahead': '^1.0.0',
36
36
  };
37
37
 
38
38
  const tsUiDevDependencies = {
@@ -124,12 +124,12 @@ const uiPackage = {
124
124
  },
125
125
  transformIgnorePatterns: [
126
126
  '/node_modules/(?!.*@babel/runtime|@icon-park/react/es).+\\.(js|jsx|mjs|cjs|ts|tsx)$',
127
- '^.+\\.module\\.(css|sass|scss)$',
127
+ '^.+\\.(css|sass|scss)$',
128
128
  ],
129
129
  modulePaths: [],
130
130
  moduleNameMapper: {
131
131
  '~(.*)': '<rootDir>/src/$1',
132
- '^.+\\.module\\.(css|sass|scss)$': 'identity-obj-proxy',
132
+ '^.+\\.(css|sass|scss)$': 'identity-obj-proxy',
133
133
  '@corva/ui(.*)': '@corva/ui/cjs-bundle/$1',
134
134
  },
135
135
  watchPlugins: ['jest-watch-typeahead/filename', 'jest-watch-typeahead/testname'],
@@ -138,6 +138,9 @@ const uiPackage = {
138
138
  'lint-staged': {
139
139
  'src/**/*.{js,jsx,ts,tsx}': 'eslint --fix',
140
140
  },
141
+ 'resolutions': {
142
+ '@noble/hashes': '1.8.0',
143
+ },
141
144
  };
142
145
 
143
146
  const tsUiPackage = {
@@ -145,29 +148,33 @@ const tsUiPackage = {
145
148
  devDependencies: tsUiDevDependencies,
146
149
  // todo: temporary solution, ref https://github.com/oppia/oppia/issues/22283#issuecomment-2756641371
147
150
  resolutions: {
151
+ ...uiPackage.resolutions,
148
152
  '@types/babel__traverse': '7.20.6',
149
153
  },
150
154
  };
151
155
 
152
156
  const nodeNpmScripts = {
153
157
  'bundle': 'create-corva-app zip .',
154
- 'test': 'npm audit --production && npm run unit',
158
+ 'test': 'npm run unit',
155
159
  'unit': 'jest',
156
160
  'lint': 'eslint --ext .js,.ts .',
157
161
  'lint:fix': 'eslint --ext .js,.ts --fix .',
158
162
  };
159
163
 
160
164
  const nodeDependencies = {
161
- '@corva/node-sdk': '^8.3.0',
165
+ '@corva/node-sdk': '^8.5.0',
162
166
  };
163
167
 
164
168
  const nodeDevDependencies = {
165
- '@corva/eslint-config-node': '^5.1.1',
169
+ '@corva/eslint-config-node': '^6.0.0',
170
+ '@typescript-eslint/eslint-plugin': '^8.58.1',
171
+ '@typescript-eslint/parser': '^8.58.1',
166
172
  'jest': '^29.7.0',
167
173
  'dotenv': '^16.0.3',
168
174
  'eslint': '^8.2.0',
175
+ 'eslint-plugin-jest': '^27.1.5',
169
176
  'prettier': '^2.0.0',
170
- 'typescript': '^5.5.4',
177
+ 'typescript': '^5.9.3',
171
178
  };
172
179
 
173
180
  const nodeTsDevDependencies = {
@@ -178,7 +185,7 @@ const nodeTsDevDependencies = {
178
185
 
179
186
  const nodeYarnScripts = {
180
187
  ...nodeNpmScripts,
181
- test: 'yarn audit --groups dependencies && yarn unit',
188
+ test: 'yarn unit',
182
189
  };
183
190
 
184
191
  const commonTsScripts = {
@@ -212,6 +219,36 @@ const nodeNpmPackage = {
212
219
  eslintConfig: {
213
220
  root: true,
214
221
  extends: '@corva/eslint-config-node',
222
+ overrides: [
223
+ {
224
+ files: ['**/*.ts'],
225
+ parser: '@typescript-eslint/parser',
226
+ parserOptions: {
227
+ project: 'tsconfig.json',
228
+ sourceType: 'module',
229
+ },
230
+ plugins: ['@typescript-eslint/eslint-plugin'],
231
+ rules: {
232
+ '@typescript-eslint/padding-line-between-statements': 'off',
233
+ },
234
+ },
235
+ {
236
+ files: [
237
+ '**/*.spec.js',
238
+ '**/*.spec.ts',
239
+ '**/*.spec.mjs',
240
+ '**/*.spec.cjs',
241
+ '**/__mocks__/**/*.js',
242
+ '**/__mocks__/**/*.ts',
243
+ '**/__mocks__/**/*.cjs',
244
+ '**/__mocks__/**/*.mjs',
245
+ ],
246
+ plugins: ['jest'],
247
+ env: {
248
+ jest: true,
249
+ },
250
+ },
251
+ ],
215
252
  },
216
253
  };
217
254
 
@@ -238,7 +275,8 @@ const nodeTsYarnPackage = {
238
275
 
239
276
  const extendWithTsConfig = (packageJson, version) => {
240
277
  packageJson.devDependencies = {
241
- [`@tsconfig/node${version}`]: `^${version === '12' ? '1.0.9' : '1.0.1'}`,
278
+ // New @tsconfig/nodeX package versioning: it starts with X major version
279
+ [`@tsconfig/node${version}`]: `^${version}`,
242
280
  ...packageJson.devDependencies,
243
281
  };
244
282
 
@@ -42,15 +42,30 @@ export class Api {
42
42
  * @returns {object}
43
43
  */
44
44
  async getAppByKey(appKey) {
45
- const { data } = await this.#api.get(`v2/apps/${appKey}`).json();
46
-
47
- if (!data) {
48
- throw new StepError(
49
- `App with key - ${appKey}, does not exist.\nThe key search is case-sensitive. You might need to update the app key in your app to exactly match the key.`,
50
- );
45
+ try {
46
+ const { data } = await this.#api.get(`v2/apps/${appKey}`).json();
47
+
48
+ if (!data) {
49
+ throw new StepError(
50
+ `App with key - ${appKey}, does not exist.\nThe key search is case-sensitive. You might need to update the app key in your app to exactly match the key.`,
51
+ );
52
+ }
53
+
54
+ return data;
55
+ } catch (error) {
56
+ if (error?.response?.statusCode === 404) {
57
+ throw new StepError(
58
+ `App with key - ${appKey}, does not exist.\nThe key search is case-sensitive. You might need to update the app key in your app to exactly match the key.`,
59
+ { cause: error },
60
+ );
61
+ }
62
+ // If error has a response, it's an API exception
63
+ else if (error?.response) {
64
+ throw new StepError(`getAppByKey request failed, code:${error?.response?.statusCode}`);
65
+ }
66
+
67
+ throw error;
51
68
  }
52
-
53
- return data;
54
69
  }
55
70
 
56
71
  /**
@@ -11,7 +11,7 @@ const SCHEDULER_MAPPING = [SCHEDULER_TYPE_DATA_TIME, SCHEDULER_TYPE_DEPTH, SCHED
11
11
  {},
12
12
  );
13
13
 
14
- const NODE_RUNTIMES = [APP_RUNTIMES.NODE18, APP_RUNTIMES.NODE20, APP_RUNTIMES.NODE22];
14
+ const NODE_RUNTIMES = [APP_RUNTIMES.NODE24];
15
15
 
16
16
  export class Manifest {
17
17
  constructor(manifest) {
@@ -98,13 +98,12 @@ const resolveDataToZipUiApp = async (itemsToZip = [], { options, pkg, dirName, m
98
98
 
99
99
  itemsToSave.push({
100
100
  name: tmpPackageForSourceName,
101
- content: _.set(
102
- 'scripts',
103
- {
104
- build: 'webpack --config=./config-overrides.js --mode production',
101
+ content: {
102
+ ...pkg,
103
+ scripts: {
104
+ build: pkg.scripts?.build,
105
105
  },
106
- pkg,
107
- ),
106
+ },
108
107
  });
109
108
 
110
109
  const itemsToRemove = [tmpPackageForSourceName];
@@ -112,7 +111,11 @@ const resolveDataToZipUiApp = async (itemsToZip = [], { options, pkg, dirName, m
112
111
  itemsToZip.push(
113
112
  'manifest.json',
114
113
  'config-overrides.js',
114
+ 'eslint.config.js',
115
+ 'eslint.config.mjs',
115
116
  'tsconfig.json',
117
+ 'prettier.config.js',
118
+ '.prettierrc',
116
119
  '.npmrc',
117
120
  '.nvmrc',
118
121
  'yarn.lock',
@@ -184,7 +187,9 @@ const resolveDataForZipNodeJsApp = async (itemsToZip = [], { options, pkg, dirNa
184
187
 
185
188
  itemsToZip.push('config', 'manifest.json', 'package.json', '.nvmrc', '.npmrc', '.eslintrc.js');
186
189
 
187
- if (packageDirContent.includes('package-lock.json')) {
190
+ if (packageDirContent.includes('pnpm-lock.yaml')) {
191
+ itemsToZip.push('pnpm-lock.yaml');
192
+ } else if (packageDirContent.includes('package-lock.json')) {
188
193
  itemsToZip.push('package-lock.json');
189
194
 
190
195
  if (shouldUpdateVersion) {
@@ -250,7 +255,7 @@ const resolveDataForZipPythonApp = async (itemsToZip = [], { manifest, dirName,
250
255
  );
251
256
  }
252
257
 
253
- itemsToZip.push('manifest.json', 'requirements.txt');
258
+ itemsToZip.push('manifest.json', 'pyproject.toml', 'uv.lock', 'requirements.txt');
254
259
 
255
260
  return {
256
261
  zipFileName,
@@ -75,7 +75,20 @@ export async function warnIfOutdated() {
75
75
  logger.write('Checking for updates...\n');
76
76
 
77
77
  const currentVersion = await getCurrentVersion();
78
- const latestVersion = await getLatestVersion();
78
+
79
+ let latestVersion;
80
+
81
+ try {
82
+ latestVersion = await getLatestVersion();
83
+ } catch (caughtError) {
84
+ if (!(caughtError instanceof StepError)) {
85
+ throw caughtError;
86
+ }
87
+
88
+ logger.write(' ⚠️ Skipping version check (could not reach npm registry).\n');
89
+
90
+ return;
91
+ }
79
92
 
80
93
  // Skip version check if current version is a prerelease (dev or next)
81
94
  if (!isRegularVersion(currentVersion)) {
@@ -1,13 +1,14 @@
1
1
  import debugFn from 'debug';
2
2
  import { APP_TYPES } from '../constants/cli.js';
3
-
4
- const debug = debugFn('cca:resolve-app-runtime');
5
-
6
3
  import spawn from 'cross-spawn';
7
4
  import { promises as fs } from 'fs';
8
5
  import os from 'os';
9
6
  import semver from 'semver';
10
7
 
8
+ const debug = debugFn('cca:resolve-app-runtime');
9
+ const DEFAULT_UI_NODE_VERSION = '24';
10
+ const DEFAULT_UI_NODE_RANGE = '>=24 <25';
11
+
11
12
  /**
12
13
  *
13
14
  * @param {string} command
@@ -38,11 +39,14 @@ const checkCliVersion = async (command, version) =>
38
39
 
39
40
  debug(`%s version output: %s`, command, data.toString());
40
41
 
41
- resolve(semver.satisfies(semver.coerce(data.toString('utf-8')), version));
42
+ const currentVersion = semver.coerce(data.toString('utf-8'));
43
+ const requiredVersion = semver.coerce(semverVersionsMapping.node[version] || version);
44
+
45
+ resolve(semver.gte(currentVersion, requiredVersion));
42
46
  });
43
47
  });
44
48
 
45
- const checkNodeVersion = (version) => async () => {
49
+ const checkNodeVersion = (range) => async () => {
46
50
  try {
47
51
  await fs.access(`${os.homedir()}/.nvm/nvm.sh`);
48
52
 
@@ -53,7 +57,7 @@ const checkNodeVersion = (version) => async () => {
53
57
  debug(e);
54
58
  debug('nvm is not installed, checking node version');
55
59
 
56
- return checkCliVersion('node', version);
60
+ return checkCliVersion('node', range);
57
61
  }
58
62
  };
59
63
 
@@ -61,17 +65,22 @@ export const IS_WINDOWS = process.platform === 'win32';
61
65
 
62
66
  const semverVersionsMapping = {
63
67
  node: {
64
- 18: '18.14.0',
65
- 20: '20.16.0',
68
+ 18: '18.20.8',
69
+ 20: '20.20.1',
70
+ 24: '24.15.0',
66
71
  },
67
72
  python: {
68
- '3.8': '3.8.16',
69
- '3.9': '3.9.16',
70
- '3.10': '3.10.9',
71
- '3.11': '3.11.1',
73
+ 3.13: '3.13.13',
74
+ 3.14: '3.14.4',
72
75
  },
73
76
  };
74
77
 
78
+ const nodeVersionRanges = {
79
+ 18: '>=18 <19',
80
+ 20: '>=20 <21',
81
+ 24: '>=24 <25',
82
+ };
83
+
75
84
  /**
76
85
  * @typedef {Object} Runtime
77
86
  * @property {string} language
@@ -79,17 +88,20 @@ const semverVersionsMapping = {
79
88
  * @property {string} packageManager
80
89
  * @property {string} version
81
90
  * @property {string} semver
91
+ * @property {string} [enginesNode]
82
92
  */
83
93
  export const resolveAppRuntime = (opts) => {
84
94
  if (opts.appType === APP_TYPES.UI) {
85
- const version = '20';
95
+ const version = DEFAULT_UI_NODE_VERSION;
86
96
 
87
97
  return {
98
+ environment: 'node',
88
99
  language: opts.useTypescript ? 'typescript' : 'javascript',
89
- isRuntimeAvailable: checkNodeVersion(version),
100
+ isRuntimeAvailable: checkNodeVersion(DEFAULT_UI_NODE_RANGE),
90
101
  packageManager: opts.packageManager,
91
102
  version,
92
103
  semver: semverVersionsMapping.node[version],
104
+ enginesNode: DEFAULT_UI_NODE_RANGE,
93
105
  };
94
106
  }
95
107
 
@@ -97,17 +109,20 @@ export const resolveAppRuntime = (opts) => {
97
109
  const version = /nodejs(\d{2})\.x/.exec(opts.runtime)[1];
98
110
 
99
111
  return {
112
+ environment: 'node',
100
113
  language: opts.useTypescript ? 'typescript' : 'javascript',
101
- isRuntimeAvailable: checkNodeVersion(version),
114
+ isRuntimeAvailable: checkNodeVersion(nodeVersionRanges[version]),
102
115
  packageManager: opts.packageManager,
103
116
  version,
104
117
  semver: semverVersionsMapping.node[version],
118
+ enginesNode: `^${version}`,
105
119
  };
106
120
  }
107
121
 
108
122
  const version = /python(\d\.\d+)/.exec(opts.runtime)[1];
109
123
 
110
124
  return {
125
+ environment: 'python',
111
126
  language: 'python',
112
127
  isRuntimeAvailable: async () => {
113
128
  if (!IS_WINDOWS) {
@@ -26,9 +26,13 @@ export const addUiAppFile = (templateFolder, root, runtime, manifest, opts) => {
26
26
  };
27
27
 
28
28
  export const getExcludedFiles = (manifest) => {
29
- if (manifest.isUi()) return ['App.drilling.js', 'App.completion.js', 'App.drilling.tsx', 'App.completion.tsx'];
29
+ const excludedFiles = ['.ruff_cache', '.venv', '.pytest_cache', '__pycache__'];
30
30
 
31
- return [];
31
+ if (manifest.isUi()) {
32
+ return [...excludedFiles, 'App.drilling.js', 'App.completion.js', 'App.drilling.tsx', 'App.completion.tsx'];
33
+ }
34
+
35
+ return excludedFiles;
32
36
  };
33
37
 
34
38
  export function copyFileSync(source, target) {
package/lib/main.js CHANGED
@@ -13,24 +13,20 @@ import { createCommand } from './commands/create.js';
13
13
 
14
14
  import { ERROR_ICON } from './constants/messages.js';
15
15
  import { StepError } from './flows/lib/step-error.js';
16
- import debugFn from 'debug';
17
-
18
- const debug = debugFn('cca:main');
19
16
 
20
17
  function checkNodeVersion() {
21
18
  logger.write('Checking node version...');
22
19
 
23
- const unsupportedNodeVersion = !semver.satisfies(process.version, '>=16');
20
+ const unsupportedNodeVersion = !semver.satisfies(process.version, '>=24 <25');
24
21
 
25
22
  if (unsupportedNodeVersion) {
26
23
  logger.log(
27
24
  chalk.red(
28
25
  `\nYou are using Node ${process.version}.\n\n` +
29
- `Please update to Node 16 or higher for a better, fully supported experience.\n`,
26
+ `Please update to Node 24.x for a better, fully supported experience.\n`,
30
27
  ),
31
28
  );
32
29
 
33
- // Fall back to latest supported react-scripts on Node 4
34
30
  return process.exit(1);
35
31
  }
36
32
 
@@ -58,9 +54,8 @@ export async function run() {
58
54
  if (e instanceof StepError) {
59
55
  console.error(chalk.red(`${ERROR_ICON} ${e.message}`));
60
56
  } else {
61
- debug(e);
62
-
63
57
  console.error(chalk.red(`${ERROR_ICON} Unknown error occured, please contact support`));
58
+ console.error(e);
64
59
  }
65
60
 
66
61
  process.exit(1);
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@corva/create-app","version":"0.0.0-b560f33","private":false,"description":"Create an app to use it in CORVA.AI","keywords":["react"],"bugs":{"url":"https://github.com/facebook/create-react-app/issues"},"repository":{"type":"git","url":"https://github.com/corva-ai/create-corva-app","directory":"@corva/create-app"},"license":"MIT","type":"module","bin":{"create-corva-app":"./bin/create-corva-app.cjs"},"files":["bin/**/*.cjs","bin/**/*.js","lib/**/*.js","templates","template_extensions","common"],"scripts":{"build":"echo \"build is not configured for package \\\"×\\\", skipping.\"","get-changelog":"conventional-changelog -r 2 -p angular","lint":"eslint . --resolve-plugins-relative-to $(pwd) --max-warnings 0","lint:fix":"eslint . --fix","release":"git add -A && standard-version -a","release-rc":"npm run release -- --prerelease","run:local-ui-ts-completion":"node ./bin/create-corva-app.cjs ../test-app-ui-ts-completions --appName 'TestAppUiTsCompletions' --segments 'completion' --category 'analytics' --appKey 'corva.testappuitscompletions.ui' --appType 'ui' --runtime 'ui' -t --extensions corva","run:local-ui-ts-drilling":"node ./bin/create-corva-app.cjs ../test-app-ui-ts-drilling --appName 'TestAppUiTsDrilling' --segments 'drilling' --category 'analytics' --appKey 'corva.testappuitsdrilling.ui' --appType 'ui' --runtime 'ui' -t --extensions corva","run:local-ui-ts-intervention":"node ./bin/create-corva-app.cjs ../test-app-ui-ts-intervention --appName 'TestAppUiTsIntervention' --segments 'intervention' --category 'analytics' --appKey 'corva.testappuitsintervention.ui' --appType 'ui' --runtime 'ui' -t --extensions corva","test":"NODE_OPTIONS='--experimental-vm-modules --no-warnings' jest"},"lint-staged":{"*.js":"npm run lint:fix"},"dependencies":{"archiver":"^5.3.0","chalk":"^4.1.0","commander":"^9.1.0","cross-spawn":"^7.0.3","debug":"^4.3.4","dotenv":"^16.0.0","figlet":"^1.5.0","form-data":"^4.0.0","fs-extra":"^9.0.1","glob":"^8.0.1","got":"^12.5.1","inquirer":"^8.2.3","is-glob":"^4.0.3","lodash":"^4.17.21","npm-api":"^1.0.0","semver":"^7.3.2","terminal-link":"^3.0.0"},"devDependencies":{"@babel/core":"^7.11.0","@babel/eslint-parser":"^7.19.1","@babel/plugin-proposal-class-properties":"^7.18.6","@babel/plugin-syntax-import-assertions":"^7.20.0","@babel/preset-react":"^7.18.6","@commitlint/cli":"^17.3.0","@commitlint/config-conventional":"^17.3.0","@corva/eslint-config-browser":"^0.1.7","@corva/eslint-config-node":"^5.1.1","@corva/node-sdk":"^8.0.1","@types/cross-spawn":"^6.0.2","@types/jest":"^29.5.4","@typescript-eslint/eslint-plugin":"^5.42.1","@typescript-eslint/parser":"^5.42.1","conventional-changelog-cli":"^2.1.0","eslint":"^8.2.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-import":"^2.26.0","eslint-plugin-jest":"^27.1.5","eslint-plugin-jsx-a11y":"^6.7.1","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.32.0","eslint-plugin-react-hooks":"^4.6.0","eslint-plugin-require-sort":"^1.3.0","husky":"^8.0.2","jest":"^29.6.4","prettier":"^2.0.0","prettier-plugin-packagejson":"^2.3.0","standard-version":"^9.0.0","typescript":"^4.8.4","zx":"^7.2.3"},"packageManager":"yarn@1.22.19+sha512.ff4579ab459bb25aa7c0ff75b62acebe576f6084b36aa842971cf250a5d8c6cd3bc9420b22ce63c7f93a0857bc6ef29291db39c3e7a23aab5adfd5a4dd6c5d71","engines":{"node":">=18"},"standard-version":{"skip":{"tag":true}}}
1
+ {"name":"@corva/create-app","version":"0.0.0-e3730ad","private":false,"description":"Create an app to use it in CORVA.AI","keywords":["react"],"bugs":{"url":"https://github.com/facebook/create-react-app/issues"},"repository":{"type":"git","url":"https://github.com/corva-ai/create-corva-app","directory":"@corva/create-app"},"license":"MIT","type":"module","bin":{"create-corva-app":"./bin/create-corva-app.cjs"},"files":["bin/**/*.cjs","bin/**/*.js","lib/**/*.js","templates","template_extensions","common"],"scripts":{"build":"echo \"build is not configured for package \\\"×\\\", skipping.\"","get-changelog":"conventional-changelog -r 2 -p angular","lint":"eslint . --resolve-plugins-relative-to $(pwd) --max-warnings 0","lint:fix":"eslint . --fix","release":"git add -A && standard-version -a","release-rc":"npm run release -- --prerelease","run:local-ui-ts-completion":"node ./bin/create-corva-app.cjs ../test-app-ui-ts-completions --appName 'TestAppUiTsCompletions' --segments 'completion' --category 'analytics' --appKey 'corva.testappuitscompletions.ui' --appType 'ui' --runtime 'ui' -t --extensions corva","run:local-ui-ts-drilling":"node ./bin/create-corva-app.cjs ../test-app-ui-ts-drilling --appName 'TestAppUiTsDrilling' --segments 'drilling' --category 'analytics' --appKey 'corva.testappuitsdrilling.ui' --appType 'ui' --runtime 'ui' -t --extensions corva","run:local-ui-ts-intervention":"node ./bin/create-corva-app.cjs ../test-app-ui-ts-intervention --appName 'TestAppUiTsIntervention' --segments 'intervention' --category 'analytics' --appKey 'corva.testappuitsintervention.ui' --appType 'ui' --runtime 'ui' -t --extensions corva","test":"NODE_OPTIONS='--experimental-vm-modules --no-warnings' jest"},"lint-staged":{"*.js":"npm run lint:fix"},"dependencies":{"archiver":"^5.3.0","chalk":"^4.1.0","commander":"^9.1.0","cross-spawn":"^7.0.3","debug":"^4.3.4","dotenv":"^16.0.0","figlet":"^1.5.0","form-data":"^4.0.0","fs-extra":"^9.0.1","glob":"^8.0.1","got":"^12.5.1","inquirer":"^8.2.3","is-glob":"^4.0.3","lodash":"^4.18.1","npm-api":"^1.0.0","semver":"^7.3.2","terminal-link":"^3.0.0"},"devDependencies":{"@babel/core":"^7.11.0","@babel/eslint-parser":"^7.19.1","@babel/plugin-proposal-class-properties":"^7.18.6","@babel/plugin-syntax-import-assertions":"^7.20.0","@babel/preset-react":"^7.18.6","@commitlint/cli":"^17.3.0","@commitlint/config-conventional":"^17.3.0","@corva/eslint-config-browser":"^0.1.7","@corva/eslint-config-node":"^6.0.0","@corva/node-sdk":"^8.5.0","@types/cross-spawn":"^6.0.2","@types/jest":"^29.5.4","@typescript-eslint/eslint-plugin":"^8.58.1","@typescript-eslint/parser":"^8.58.1","conventional-changelog-cli":"^2.1.0","eslint":"^8.2.0","eslint-plugin-jest":"^27.1.5","eslint-config-google":"^0.14.0","eslint-config-prettier":"^8.5.0","eslint-plugin-import":"^2.26.0","eslint-plugin-jsx-a11y":"^6.7.1","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.32.0","eslint-plugin-react-hooks":"^4.6.0","eslint-plugin-require-sort":"^1.3.0","husky":"^8.0.2","jest":"^29.6.4","prettier":"^2.0.0","prettier-plugin-packagejson":"^2.3.0","standard-version":"^9.0.0","typescript":"^5.9.3","zx":"^7.2.3"},"packageManager":"yarn@1.22.19+sha512.ff4579ab459bb25aa7c0ff75b62acebe576f6084b36aa842971cf250a5d8c6cd3bc9420b22ce63c7f93a0857bc6ef29291db39c3e7a23aab5adfd5a4dd6c5d71","engines":{"node":">=24 <25"},"standard-version":{"skip":{"tag":true}}}
@@ -0,0 +1,3 @@
1
+ [mcp_servers.corva-ui]
2
+ command = "npx"
3
+ args = ["-p", "@corva/ui", "corva-ui-mcp"]
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "corva-ui": {
4
+ "command": "npx",
5
+ "args": ["-p", "@corva/ui", "corva-ui-mcp"]
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "corva-ui": {
4
+ "command": "npx",
5
+ "args": ["-p", "@corva/ui", "corva-ui-mcp"]
6
+ }
7
+ }
8
+ }