@nexus-framework/cli 0.1.1
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/LICENSE +201 -0
- package/README.md +545 -0
- package/bin/nexus.js +3 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +30 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/adopt.d.ts +25 -0
- package/dist/commands/adopt.d.ts.map +1 -0
- package/dist/commands/adopt.js +73 -0
- package/dist/commands/adopt.js.map +1 -0
- package/dist/commands/init.d.ts +24 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +102 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/generators/ai-config.d.ts +26 -0
- package/dist/generators/ai-config.d.ts.map +1 -0
- package/dist/generators/ai-config.js +305 -0
- package/dist/generators/ai-config.js.map +1 -0
- package/dist/generators/ci-cd.d.ts +12 -0
- package/dist/generators/ci-cd.d.ts.map +1 -0
- package/dist/generators/ci-cd.js +60 -0
- package/dist/generators/ci-cd.js.map +1 -0
- package/dist/generators/config.d.ts +12 -0
- package/dist/generators/config.d.ts.map +1 -0
- package/dist/generators/config.js +92 -0
- package/dist/generators/config.js.map +1 -0
- package/dist/generators/docs.d.ts +19 -0
- package/dist/generators/docs.d.ts.map +1 -0
- package/dist/generators/docs.js +431 -0
- package/dist/generators/docs.js.map +1 -0
- package/dist/generators/index.d.ts +24 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +154 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/landing-page.d.ts +13 -0
- package/dist/generators/landing-page.d.ts.map +1 -0
- package/dist/generators/landing-page.js +448 -0
- package/dist/generators/landing-page.js.map +1 -0
- package/dist/generators/structure.d.ts +24 -0
- package/dist/generators/structure.d.ts.map +1 -0
- package/dist/generators/structure.js +174 -0
- package/dist/generators/structure.js.map +1 -0
- package/dist/generators/tests.d.ts +12 -0
- package/dist/generators/tests.d.ts.map +1 -0
- package/dist/generators/tests.js +97 -0
- package/dist/generators/tests.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/data-strategy.d.ts +8 -0
- package/dist/prompts/data-strategy.d.ts.map +1 -0
- package/dist/prompts/data-strategy.js +34 -0
- package/dist/prompts/data-strategy.js.map +1 -0
- package/dist/prompts/features.d.ts +14 -0
- package/dist/prompts/features.d.ts.map +1 -0
- package/dist/prompts/features.js +46 -0
- package/dist/prompts/features.js.map +1 -0
- package/dist/prompts/frameworks.d.ts +9 -0
- package/dist/prompts/frameworks.d.ts.map +1 -0
- package/dist/prompts/frameworks.js +44 -0
- package/dist/prompts/frameworks.js.map +1 -0
- package/dist/prompts/index.d.ts +13 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +67 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/patterns.d.ts +8 -0
- package/dist/prompts/patterns.d.ts.map +1 -0
- package/dist/prompts/patterns.js +44 -0
- package/dist/prompts/patterns.js.map +1 -0
- package/dist/prompts/project-type.d.ts +8 -0
- package/dist/prompts/project-type.d.ts.map +1 -0
- package/dist/prompts/project-type.js +29 -0
- package/dist/prompts/project-type.js.map +1 -0
- package/dist/types/config.d.ts +50 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +7 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/prompts.d.ts +39 -0
- package/dist/types/prompts.d.ts.map +1 -0
- package/dist/types/prompts.js +7 -0
- package/dist/types/prompts.js.map +1 -0
- package/dist/types/templates.d.ts +38 -0
- package/dist/types/templates.d.ts.map +1 -0
- package/dist/types/templates.js +7 -0
- package/dist/types/templates.js.map +1 -0
- package/dist/utils/file-system.d.ts +27 -0
- package/dist/utils/file-system.d.ts.map +1 -0
- package/dist/utils/file-system.js +53 -0
- package/dist/utils/file-system.js.map +1 -0
- package/dist/utils/git.d.ts +14 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +40 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +38 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +106 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/package-manager.d.ts +16 -0
- package/dist/utils/package-manager.d.ts.map +1 -0
- package/dist/utils/package-manager.js +51 -0
- package/dist/utils/package-manager.js.map +1 -0
- package/dist/utils/project-detector.d.ts +55 -0
- package/dist/utils/project-detector.d.ts.map +1 -0
- package/dist/utils/project-detector.js +125 -0
- package/dist/utils/project-detector.js.map +1 -0
- package/dist/utils/validator.d.ts +25 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +59 -0
- package/dist/utils/validator.js.map +1 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +7 -0
- package/dist/version.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS CLI - Package Manager Utility
|
|
3
|
+
*
|
|
4
|
+
* Detect and interact with npm, yarn, or pnpm.
|
|
5
|
+
*/
|
|
6
|
+
import type { PackageManager } from '../types/config.js';
|
|
7
|
+
/**
|
|
8
|
+
* Detect the package manager being used in the current environment.
|
|
9
|
+
* Checks for lockfiles and the npm_config_user_agent env variable.
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectPackageManager(cwd?: string): PackageManager;
|
|
12
|
+
/** Get the install command for a given package manager */
|
|
13
|
+
export declare function getInstallCommand(pm: PackageManager): string;
|
|
14
|
+
/** Get the run command for a given package manager */
|
|
15
|
+
export declare function getRunCommand(pm: PackageManager, script: string): string;
|
|
16
|
+
//# sourceMappingURL=package-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAsB,GAAG,cAAc,CAchF;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAS5D;AAED,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CASxE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS CLI - Package Manager Utility
|
|
3
|
+
*
|
|
4
|
+
* Detect and interact with npm, yarn, or pnpm.
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
/**
|
|
9
|
+
* Detect the package manager being used in the current environment.
|
|
10
|
+
* Checks for lockfiles and the npm_config_user_agent env variable.
|
|
11
|
+
*/
|
|
12
|
+
export function detectPackageManager(cwd = process.cwd()) {
|
|
13
|
+
// Check env variable (set by npm/yarn/pnpm when running scripts)
|
|
14
|
+
const userAgent = process.env.npm_config_user_agent;
|
|
15
|
+
if (userAgent) {
|
|
16
|
+
if (userAgent.startsWith('yarn'))
|
|
17
|
+
return 'yarn';
|
|
18
|
+
if (userAgent.startsWith('pnpm'))
|
|
19
|
+
return 'pnpm';
|
|
20
|
+
return 'npm';
|
|
21
|
+
}
|
|
22
|
+
// Check lockfiles
|
|
23
|
+
if (fs.existsSync(path.join(cwd, 'yarn.lock')))
|
|
24
|
+
return 'yarn';
|
|
25
|
+
if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml')))
|
|
26
|
+
return 'pnpm';
|
|
27
|
+
return 'npm';
|
|
28
|
+
}
|
|
29
|
+
/** Get the install command for a given package manager */
|
|
30
|
+
export function getInstallCommand(pm) {
|
|
31
|
+
switch (pm) {
|
|
32
|
+
case 'yarn':
|
|
33
|
+
return 'yarn';
|
|
34
|
+
case 'pnpm':
|
|
35
|
+
return 'pnpm install';
|
|
36
|
+
default:
|
|
37
|
+
return 'npm install';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Get the run command for a given package manager */
|
|
41
|
+
export function getRunCommand(pm, script) {
|
|
42
|
+
switch (pm) {
|
|
43
|
+
case 'yarn':
|
|
44
|
+
return `yarn ${script}`;
|
|
45
|
+
case 'pnpm':
|
|
46
|
+
return `pnpm ${script}`;
|
|
47
|
+
default:
|
|
48
|
+
return `npm run ${script}`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=package-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC9D,iEAAiE;IACjE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACpD,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QAChD,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kBAAkB;IAClB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9D,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAEnE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,iBAAiB,CAAC,EAAkB;IAClD,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,cAAc,CAAC;QACxB;YACE,OAAO,aAAa,CAAC;IACzB,CAAC;AACH,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,aAAa,CAAC,EAAkB,EAAE,MAAc;IAC9D,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,MAAM;YACT,OAAO,QAAQ,MAAM,EAAE,CAAC;QAC1B,KAAK,MAAM;YACT,OAAO,QAAQ,MAAM,EAAE,CAAC;QAC1B;YACE,OAAO,WAAW,MAAM,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS CLI - Project Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects whether a directory contains an existing project and
|
|
5
|
+
* extracts basic project information by inspecting well-known files.
|
|
6
|
+
*
|
|
7
|
+
* Used by `nexus init --adopt` to intelligently generate .nexus/
|
|
8
|
+
* documentation for projects that already exist.
|
|
9
|
+
*/
|
|
10
|
+
/** Signals that indicate an existing project */
|
|
11
|
+
export interface ProjectSignals {
|
|
12
|
+
hasPackageJson: boolean;
|
|
13
|
+
hasGit: boolean;
|
|
14
|
+
hasSrc: boolean;
|
|
15
|
+
hasTsConfig: boolean;
|
|
16
|
+
hasNodeModules: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** Information extracted from an existing project */
|
|
19
|
+
export interface ProjectInfo {
|
|
20
|
+
/** Whether we detected a project at all */
|
|
21
|
+
detected: boolean;
|
|
22
|
+
/** Specific signals found */
|
|
23
|
+
signals: ProjectSignals;
|
|
24
|
+
/** Project name from package.json (if available) */
|
|
25
|
+
name: string | null;
|
|
26
|
+
/** Project description from package.json (if available) */
|
|
27
|
+
description: string | null;
|
|
28
|
+
/** Detected frontend framework (or null) */
|
|
29
|
+
framework: string | null;
|
|
30
|
+
/** Detected test framework (or null) */
|
|
31
|
+
testFramework: string | null;
|
|
32
|
+
/** Detected package manager */
|
|
33
|
+
packageManager: string | null;
|
|
34
|
+
/** Whether the project already has .nexus/ */
|
|
35
|
+
hasNexus: boolean;
|
|
36
|
+
/** List of detected dependencies (combined deps + devDeps) */
|
|
37
|
+
dependencies: string[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Check whether a directory looks like it already contains a project.
|
|
41
|
+
*
|
|
42
|
+
* Returns `true` if a `package.json` exists at the target path.
|
|
43
|
+
* This is a fast check used to decide whether to show the
|
|
44
|
+
* "--adopt" suggestion before any heavier analysis.
|
|
45
|
+
*/
|
|
46
|
+
export declare function isExistingProject(targetDir: string): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Inspect a directory and return detailed project information.
|
|
49
|
+
*
|
|
50
|
+
* This reads package.json (if present) and checks for common
|
|
51
|
+
* framework/tooling markers so the adopt generator can pre-fill
|
|
52
|
+
* as much of the NEXUS documentation as possible.
|
|
53
|
+
*/
|
|
54
|
+
export declare function detectProject(targetDir: string): Promise<ProjectInfo>;
|
|
55
|
+
//# sourceMappingURL=project-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-detector.d.ts","sourceRoot":"","sources":["../../src/utils/project-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,gDAAgD;AAChD,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,qDAAqD;AACrD,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,6BAA6B;IAC7B,OAAO,EAAE,cAAc,CAAC;IACxB,oDAAoD;IACpD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,4CAA4C;IAC5C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,wCAAwC;IACxC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,+BAA+B;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,8CAA8C;IAC9C,QAAQ,EAAE,OAAO,CAAC;IAClB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAMD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAiD3E"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS CLI - Project Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects whether a directory contains an existing project and
|
|
5
|
+
* extracts basic project information by inspecting well-known files.
|
|
6
|
+
*
|
|
7
|
+
* Used by `nexus init --adopt` to intelligently generate .nexus/
|
|
8
|
+
* documentation for projects that already exist.
|
|
9
|
+
*/
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import fs from 'fs-extra';
|
|
12
|
+
/* ──────────────────────────────────────────────────────────────
|
|
13
|
+
* Detection — runs against a directory path
|
|
14
|
+
* ────────────────────────────────────────────────────────────── */
|
|
15
|
+
/**
|
|
16
|
+
* Check whether a directory looks like it already contains a project.
|
|
17
|
+
*
|
|
18
|
+
* Returns `true` if a `package.json` exists at the target path.
|
|
19
|
+
* This is a fast check used to decide whether to show the
|
|
20
|
+
* "--adopt" suggestion before any heavier analysis.
|
|
21
|
+
*/
|
|
22
|
+
export function isExistingProject(targetDir) {
|
|
23
|
+
return fs.existsSync(path.join(targetDir, 'package.json'));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Inspect a directory and return detailed project information.
|
|
27
|
+
*
|
|
28
|
+
* This reads package.json (if present) and checks for common
|
|
29
|
+
* framework/tooling markers so the adopt generator can pre-fill
|
|
30
|
+
* as much of the NEXUS documentation as possible.
|
|
31
|
+
*/
|
|
32
|
+
export async function detectProject(targetDir) {
|
|
33
|
+
const signals = await detectSignals(targetDir);
|
|
34
|
+
// Default empty info
|
|
35
|
+
const info = {
|
|
36
|
+
detected: signals.hasPackageJson,
|
|
37
|
+
signals,
|
|
38
|
+
name: null,
|
|
39
|
+
description: null,
|
|
40
|
+
framework: null,
|
|
41
|
+
testFramework: null,
|
|
42
|
+
packageManager: null,
|
|
43
|
+
hasNexus: false,
|
|
44
|
+
dependencies: [],
|
|
45
|
+
};
|
|
46
|
+
if (!signals.hasPackageJson) {
|
|
47
|
+
return info;
|
|
48
|
+
}
|
|
49
|
+
// Read package.json
|
|
50
|
+
try {
|
|
51
|
+
const pkgPath = path.join(targetDir, 'package.json');
|
|
52
|
+
const pkg = (await fs.readJSON(pkgPath));
|
|
53
|
+
info.name = typeof pkg.name === 'string' ? pkg.name : null;
|
|
54
|
+
info.description = typeof pkg.description === 'string' ? pkg.description : null;
|
|
55
|
+
// Collect all dependency names
|
|
56
|
+
const deps = Object.keys(pkg.dependencies ?? {});
|
|
57
|
+
const devDeps = Object.keys(pkg.devDependencies ?? {});
|
|
58
|
+
info.dependencies = [...deps, ...devDeps];
|
|
59
|
+
// Detect framework
|
|
60
|
+
info.framework = detectFramework(info.dependencies);
|
|
61
|
+
// Detect test framework
|
|
62
|
+
info.testFramework = detectTestFramework(info.dependencies);
|
|
63
|
+
// Detect package manager
|
|
64
|
+
info.packageManager = await detectPM(targetDir);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// package.json unreadable — keep defaults
|
|
68
|
+
}
|
|
69
|
+
// Check for existing .nexus/
|
|
70
|
+
info.hasNexus = fs.existsSync(path.join(targetDir, '.nexus'));
|
|
71
|
+
return info;
|
|
72
|
+
}
|
|
73
|
+
/* ──────────────────────────────────────────────────────────────
|
|
74
|
+
* Internal helpers
|
|
75
|
+
* ────────────────────────────────────────────────────────────── */
|
|
76
|
+
async function detectSignals(dir) {
|
|
77
|
+
const [hasPackageJson, hasGit, hasSrc, hasTsConfig, hasNodeModules] = await Promise.all([
|
|
78
|
+
fs.pathExists(path.join(dir, 'package.json')),
|
|
79
|
+
fs.pathExists(path.join(dir, '.git')),
|
|
80
|
+
fs.pathExists(path.join(dir, 'src')),
|
|
81
|
+
fs.pathExists(path.join(dir, 'tsconfig.json')),
|
|
82
|
+
fs.pathExists(path.join(dir, 'node_modules')),
|
|
83
|
+
]);
|
|
84
|
+
return { hasPackageJson, hasGit, hasSrc, hasTsConfig, hasNodeModules };
|
|
85
|
+
}
|
|
86
|
+
function detectFramework(deps) {
|
|
87
|
+
if (deps.includes('next'))
|
|
88
|
+
return 'nextjs';
|
|
89
|
+
if (deps.includes('nuxt') || deps.includes('nuxt3'))
|
|
90
|
+
return 'nuxt';
|
|
91
|
+
if (deps.includes('@sveltejs/kit'))
|
|
92
|
+
return 'sveltekit';
|
|
93
|
+
if (deps.includes('astro'))
|
|
94
|
+
return 'astro';
|
|
95
|
+
if (deps.includes('remix') || deps.includes('@remix-run/react'))
|
|
96
|
+
return 'remix';
|
|
97
|
+
if (deps.includes('react') && deps.includes('vite'))
|
|
98
|
+
return 'react-vite';
|
|
99
|
+
if (deps.includes('react'))
|
|
100
|
+
return 'react-vite'; // React without Next is likely Vite/CRA
|
|
101
|
+
if (deps.includes('vue'))
|
|
102
|
+
return 'nuxt'; // Vue without Nuxt — closest match
|
|
103
|
+
if (deps.includes('svelte'))
|
|
104
|
+
return 'sveltekit'; // Svelte without kit — closest match
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
function detectTestFramework(deps) {
|
|
108
|
+
if (deps.includes('vitest'))
|
|
109
|
+
return 'vitest';
|
|
110
|
+
if (deps.includes('jest'))
|
|
111
|
+
return 'jest';
|
|
112
|
+
if (deps.includes('@jest/core'))
|
|
113
|
+
return 'jest';
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
async function detectPM(dir) {
|
|
117
|
+
if (await fs.pathExists(path.join(dir, 'yarn.lock')))
|
|
118
|
+
return 'yarn';
|
|
119
|
+
if (await fs.pathExists(path.join(dir, 'pnpm-lock.yaml')))
|
|
120
|
+
return 'pnpm';
|
|
121
|
+
if (await fs.pathExists(path.join(dir, 'package-lock.json')))
|
|
122
|
+
return 'npm';
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=project-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-detector.js","sourceRoot":"","sources":["../../src/utils/project-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS CLI - Validator Utility
|
|
3
|
+
*
|
|
4
|
+
* Input validation for project names and other user input.
|
|
5
|
+
*/
|
|
6
|
+
/** Result of a validation check */
|
|
7
|
+
export interface ValidationResult {
|
|
8
|
+
valid: boolean;
|
|
9
|
+
message?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Validate a project name.
|
|
13
|
+
* Must be a valid npm package name and the target directory must not already exist.
|
|
14
|
+
*/
|
|
15
|
+
export declare function validateProjectName(name: string, targetDir?: string): ValidationResult;
|
|
16
|
+
/**
|
|
17
|
+
* Validate that a value is non-empty.
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateNotEmpty(value: string, fieldName?: string): ValidationResult;
|
|
20
|
+
/**
|
|
21
|
+
* Sanitize a project name for use as a directory name.
|
|
22
|
+
* Converts to lowercase, replaces spaces with hyphens, strips invalid chars.
|
|
23
|
+
*/
|
|
24
|
+
export declare function sanitizeProjectName(name: string): string;
|
|
25
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,mCAAmC;AACnC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,gBAAgB,CA2BtF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAU,GAAG,gBAAgB,CAKrF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQxD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS CLI - Validator Utility
|
|
3
|
+
*
|
|
4
|
+
* Input validation for project names and other user input.
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import validateNpmPackageName from 'validate-npm-package-name';
|
|
9
|
+
/**
|
|
10
|
+
* Validate a project name.
|
|
11
|
+
* Must be a valid npm package name and the target directory must not already exist.
|
|
12
|
+
*/
|
|
13
|
+
export function validateProjectName(name, targetDir) {
|
|
14
|
+
if (!name || name.trim().length === 0) {
|
|
15
|
+
return { valid: false, message: 'Project name cannot be empty.' };
|
|
16
|
+
}
|
|
17
|
+
const trimmed = name.trim();
|
|
18
|
+
// Check npm naming rules
|
|
19
|
+
const npmResult = validateNpmPackageName(trimmed);
|
|
20
|
+
if (!npmResult.validForNewPackages) {
|
|
21
|
+
const errors = [...(npmResult.errors ?? []), ...(npmResult.warnings ?? [])];
|
|
22
|
+
return {
|
|
23
|
+
valid: false,
|
|
24
|
+
message: `Invalid package name: ${errors.join(', ')}`,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// Check if directory already exists
|
|
28
|
+
const dir = targetDir ?? path.resolve(process.cwd(), trimmed);
|
|
29
|
+
if (fs.existsSync(dir)) {
|
|
30
|
+
return {
|
|
31
|
+
valid: false,
|
|
32
|
+
message: `Directory "${trimmed}" already exists. Choose a different name or delete the existing directory.`,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return { valid: true };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Validate that a value is non-empty.
|
|
39
|
+
*/
|
|
40
|
+
export function validateNotEmpty(value, fieldName = 'Value') {
|
|
41
|
+
if (!value || value.trim().length === 0) {
|
|
42
|
+
return { valid: false, message: `${fieldName} cannot be empty.` };
|
|
43
|
+
}
|
|
44
|
+
return { valid: true };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Sanitize a project name for use as a directory name.
|
|
48
|
+
* Converts to lowercase, replaces spaces with hyphens, strips invalid chars.
|
|
49
|
+
*/
|
|
50
|
+
export function sanitizeProjectName(name) {
|
|
51
|
+
return name
|
|
52
|
+
.trim()
|
|
53
|
+
.toLowerCase()
|
|
54
|
+
.replace(/\s+/g, '-')
|
|
55
|
+
.replace(/[^a-z0-9\-_.]/g, '')
|
|
56
|
+
.replace(/^[-_.]+/, '')
|
|
57
|
+
.replace(/[-_.]+$/, '');
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,sBAAsB,MAAM,2BAA2B,CAAC;AAQ/D;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,SAAkB;IAClE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC;IACpE,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,yBAAyB;IACzB,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5E,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,yBAAyB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACtD,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,MAAM,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,cAAc,OAAO,6EAA6E;SAC5G,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,SAAS,GAAG,OAAO;IACjE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,SAAS,mBAAmB,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI;SACR,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;SAC7B,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,OAAO,UAAU,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nexus-framework/cli",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "AI-Native Project Scaffolding for the Modern Era — generates production-ready, AI-optimized project structures",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"nexus": "./bin/nexus.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"templates",
|
|
14
|
+
"bin"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"dev": "tsc --watch",
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"start": "node dist/cli.js",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"test:watch": "vitest",
|
|
22
|
+
"test:coverage": "vitest run --coverage",
|
|
23
|
+
"lint": "eslint src/ --ext .ts",
|
|
24
|
+
"lint:fix": "eslint src/ --ext .ts --fix",
|
|
25
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
26
|
+
"format:check": "prettier --check \"src/**/*.ts\"",
|
|
27
|
+
"type-check": "tsc --noEmit",
|
|
28
|
+
"pre-commit": "npm run lint && npm run type-check && npm run test",
|
|
29
|
+
"clean": "rm -rf dist",
|
|
30
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"cli",
|
|
34
|
+
"scaffolding",
|
|
35
|
+
"project-generator",
|
|
36
|
+
"ai-native",
|
|
37
|
+
"nextjs",
|
|
38
|
+
"react",
|
|
39
|
+
"svelte",
|
|
40
|
+
"typescript",
|
|
41
|
+
"developer-tools",
|
|
42
|
+
"gda-africa",
|
|
43
|
+
"nexus"
|
|
44
|
+
],
|
|
45
|
+
"author": "Glenhalton Takor <nexus@glenhalton.com>",
|
|
46
|
+
"license": "Apache-2.0",
|
|
47
|
+
"repository": {
|
|
48
|
+
"type": "git",
|
|
49
|
+
"url": "https://github.com/GDA-Africa/nexus-cli.git"
|
|
50
|
+
},
|
|
51
|
+
"bugs": {
|
|
52
|
+
"url": "https://github.com/GDA-Africa/nexus-cli/issues"
|
|
53
|
+
},
|
|
54
|
+
"homepage": "https://github.com/GDA-Africa/nexus-cli#readme",
|
|
55
|
+
"engines": {
|
|
56
|
+
"node": ">=20.0.0"
|
|
57
|
+
},
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"@inquirer/prompts": "^7.3.2",
|
|
60
|
+
"chalk": "^5.3.0",
|
|
61
|
+
"commander": "^12.1.0",
|
|
62
|
+
"execa": "^9.5.2",
|
|
63
|
+
"figlet": "^1.8.0",
|
|
64
|
+
"fs-extra": "^11.2.0",
|
|
65
|
+
"inquirer": "^12.3.2",
|
|
66
|
+
"mustache": "^4.2.0",
|
|
67
|
+
"ora": "^8.1.1",
|
|
68
|
+
"update-notifier": "^7.3.1",
|
|
69
|
+
"validate-npm-package-name": "^6.0.0"
|
|
70
|
+
},
|
|
71
|
+
"devDependencies": {
|
|
72
|
+
"@types/figlet": "^1.7.0",
|
|
73
|
+
"@types/fs-extra": "^11.0.4",
|
|
74
|
+
"@types/inquirer": "^9.0.7",
|
|
75
|
+
"@types/mustache": "^4.2.5",
|
|
76
|
+
"@types/node": "^22.13.1",
|
|
77
|
+
"@types/update-notifier": "^6.0.8",
|
|
78
|
+
"@types/validate-npm-package-name": "^4.0.2",
|
|
79
|
+
"@typescript-eslint/eslint-plugin": "^8.22.0",
|
|
80
|
+
"@typescript-eslint/parser": "^8.22.0",
|
|
81
|
+
"@vitest/coverage-v8": "^3.0.5",
|
|
82
|
+
"eslint": "^8.57.1",
|
|
83
|
+
"eslint-config-prettier": "^10.0.1",
|
|
84
|
+
"eslint-import-resolver-typescript": "^4.4.4",
|
|
85
|
+
"eslint-plugin-import": "^2.31.0",
|
|
86
|
+
"prettier": "^3.4.2",
|
|
87
|
+
"typescript": "^5.7.3",
|
|
88
|
+
"vitest": "^3.0.5"
|
|
89
|
+
}
|
|
90
|
+
}
|