@nexus-framework/cli 0.1.1 → 0.1.2

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 (42) hide show
  1. package/README.md +69 -417
  2. package/dist/commands/init.d.ts.map +1 -1
  3. package/dist/commands/init.js +5 -4
  4. package/dist/commands/init.js.map +1 -1
  5. package/dist/generators/ai-config.d.ts +15 -8
  6. package/dist/generators/ai-config.d.ts.map +1 -1
  7. package/dist/generators/ai-config.js +165 -106
  8. package/dist/generators/ai-config.js.map +1 -1
  9. package/dist/generators/config.d.ts.map +1 -1
  10. package/dist/generators/config.js +127 -19
  11. package/dist/generators/config.js.map +1 -1
  12. package/dist/generators/docs.js +9 -9
  13. package/dist/generators/index.js +5 -3
  14. package/dist/generators/index.js.map +1 -1
  15. package/dist/generators/landing-page.d.ts.map +1 -1
  16. package/dist/generators/landing-page.js +310 -76
  17. package/dist/generators/landing-page.js.map +1 -1
  18. package/dist/generators/structure.d.ts.map +1 -1
  19. package/dist/generators/structure.js +161 -17
  20. package/dist/generators/structure.js.map +1 -1
  21. package/dist/generators/tests.js +1 -1
  22. package/dist/prompts/index.d.ts +3 -0
  23. package/dist/prompts/index.d.ts.map +1 -1
  24. package/dist/prompts/index.js +12 -8
  25. package/dist/prompts/index.js.map +1 -1
  26. package/dist/types/config.d.ts +3 -0
  27. package/dist/types/config.d.ts.map +1 -1
  28. package/dist/utils/index.d.ts +1 -1
  29. package/dist/utils/index.d.ts.map +1 -1
  30. package/dist/utils/index.js +1 -1
  31. package/dist/utils/index.js.map +1 -1
  32. package/dist/utils/logger.d.ts +2 -2
  33. package/dist/utils/logger.d.ts.map +1 -1
  34. package/dist/utils/logger.js +6 -3
  35. package/dist/utils/logger.js.map +1 -1
  36. package/dist/utils/validator.d.ts +20 -3
  37. package/dist/utils/validator.d.ts.map +1 -1
  38. package/dist/utils/validator.js +48 -15
  39. package/dist/utils/validator.js.map +1 -1
  40. package/dist/version.d.ts +1 -1
  41. package/dist/version.js +1 -1
  42. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../src/generators/structure.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE/E;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,kBAAkB,EAAE,CAmE7E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,CAwCtE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,CAqCjD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,CA0CjE"}
1
+ {"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../src/generators/structure.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE/E;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,kBAAkB,EAAE,CAmE7E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,CA+BtE;AAqKD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,CAqCjD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,CA0CjE"}
@@ -47,28 +47,18 @@ export function generateDirectories(config) {
47
47
  * Generate the project's package.json content.
48
48
  */
49
49
  export function generatePackageJson(config) {
50
+ const scripts = getFrameworkScripts(config);
51
+ const { dependencies, devDependencies } = getFrameworkDependencies(config);
50
52
  const pkg = {
51
53
  name: config.projectName,
52
54
  version: '0.1.0',
53
55
  private: true,
54
56
  type: 'module',
55
- scripts: {
56
- dev: 'echo "TODO: configure dev script"',
57
- build: 'echo "TODO: configure build script"',
58
- start: 'echo "TODO: configure start script"',
59
- lint: 'eslint . --ext .ts,.tsx',
60
- format: 'prettier --write .',
61
- 'type-check': 'tsc --noEmit',
62
- },
63
- dependencies: {},
64
- devDependencies: {
65
- typescript: '^5.7.0',
66
- '@types/node': '^22.0.0',
67
- eslint: '^8.57.0',
68
- prettier: '^3.4.0',
69
- },
57
+ scripts,
58
+ dependencies,
59
+ devDependencies,
70
60
  };
71
- // Add test scripts
61
+ // Add test scripts & dependencies
72
62
  if (config.testFramework === 'vitest') {
73
63
  pkg.scripts.test = 'vitest run';
74
64
  pkg.scripts['test:watch'] = 'vitest';
@@ -86,6 +76,160 @@ export function generatePackageJson(config) {
86
76
  content: JSON.stringify(pkg, null, 2) + '\n',
87
77
  };
88
78
  }
79
+ /* ──────────────────────────────────────────────────────────────
80
+ * Framework-specific scripts
81
+ * ────────────────────────────────────────────────────────────── */
82
+ function getFrameworkScripts(config) {
83
+ const base = {
84
+ lint: 'eslint . --ext .ts,.tsx',
85
+ format: 'prettier --write .',
86
+ 'type-check': 'tsc --noEmit',
87
+ };
88
+ switch (config.frontendFramework) {
89
+ case 'nextjs':
90
+ return {
91
+ dev: 'next dev',
92
+ build: 'next build',
93
+ start: 'next start',
94
+ ...base,
95
+ };
96
+ case 'react-vite':
97
+ return {
98
+ dev: 'vite',
99
+ build: 'tsc -b && vite build',
100
+ preview: 'vite preview',
101
+ ...base,
102
+ };
103
+ case 'sveltekit':
104
+ return {
105
+ dev: 'vite dev',
106
+ build: 'vite build',
107
+ preview: 'vite preview',
108
+ ...base,
109
+ };
110
+ case 'nuxt':
111
+ return {
112
+ dev: 'nuxt dev',
113
+ build: 'nuxt build',
114
+ preview: 'nuxt preview',
115
+ generate: 'nuxt generate',
116
+ ...base,
117
+ };
118
+ case 'remix':
119
+ return {
120
+ dev: 'remix vite:dev',
121
+ build: 'remix vite:build',
122
+ start: 'remix-serve ./build/server/index.js',
123
+ ...base,
124
+ };
125
+ case 'astro':
126
+ return {
127
+ dev: 'astro dev',
128
+ build: 'astro build',
129
+ preview: 'astro preview',
130
+ ...base,
131
+ };
132
+ default:
133
+ return {
134
+ dev: 'echo "TODO: configure dev script"',
135
+ build: 'tsc',
136
+ start: 'node dist/index.js',
137
+ ...base,
138
+ };
139
+ }
140
+ }
141
+ /* ──────────────────────────────────────────────────────────────
142
+ * Framework-specific dependencies
143
+ * ────────────────────────────────────────────────────────────── */
144
+ function getFrameworkDependencies(config) {
145
+ const baseDev = {
146
+ typescript: '^5.7.0',
147
+ '@types/node': '^22.0.0',
148
+ eslint: '^8.57.0',
149
+ prettier: '^3.4.0',
150
+ };
151
+ switch (config.frontendFramework) {
152
+ case 'nextjs':
153
+ return {
154
+ dependencies: {
155
+ next: '^15.0.0',
156
+ react: '^19.0.0',
157
+ 'react-dom': '^19.0.0',
158
+ },
159
+ devDependencies: {
160
+ ...baseDev,
161
+ '@types/react': '^19.0.0',
162
+ '@types/react-dom': '^19.0.0',
163
+ },
164
+ };
165
+ case 'react-vite':
166
+ return {
167
+ dependencies: {
168
+ react: '^19.0.0',
169
+ 'react-dom': '^19.0.0',
170
+ },
171
+ devDependencies: {
172
+ ...baseDev,
173
+ vite: '^6.0.0',
174
+ '@vitejs/plugin-react': '^4.3.0',
175
+ '@types/react': '^19.0.0',
176
+ '@types/react-dom': '^19.0.0',
177
+ },
178
+ };
179
+ case 'sveltekit':
180
+ return {
181
+ dependencies: {},
182
+ devDependencies: {
183
+ ...baseDev,
184
+ '@sveltejs/kit': '^2.0.0',
185
+ '@sveltejs/adapter-auto': '^3.0.0',
186
+ '@sveltejs/vite-plugin-svelte': '^4.0.0',
187
+ svelte: '^5.0.0',
188
+ vite: '^6.0.0',
189
+ },
190
+ };
191
+ case 'nuxt':
192
+ return {
193
+ dependencies: {},
194
+ devDependencies: {
195
+ ...baseDev,
196
+ nuxt: '^3.14.0',
197
+ vue: '^3.5.0',
198
+ },
199
+ };
200
+ case 'remix':
201
+ return {
202
+ dependencies: {
203
+ '@remix-run/node': '^2.0.0',
204
+ '@remix-run/react': '^2.0.0',
205
+ '@remix-run/serve': '^2.0.0',
206
+ react: '^19.0.0',
207
+ 'react-dom': '^19.0.0',
208
+ },
209
+ devDependencies: {
210
+ ...baseDev,
211
+ '@remix-run/dev': '^2.0.0',
212
+ vite: '^6.0.0',
213
+ '@types/react': '^19.0.0',
214
+ '@types/react-dom': '^19.0.0',
215
+ },
216
+ };
217
+ case 'astro':
218
+ return {
219
+ dependencies: {
220
+ astro: '^4.0.0',
221
+ },
222
+ devDependencies: {
223
+ ...baseDev,
224
+ },
225
+ };
226
+ default:
227
+ return {
228
+ dependencies: {},
229
+ devDependencies: baseDev,
230
+ };
231
+ }
232
+ }
89
233
  /**
90
234
  * Generate .gitignore file.
91
235
  */
@@ -130,7 +274,7 @@ yarn-error.log*
130
274
  * Generate a basic README for the created project.
131
275
  */
132
276
  export function generateReadme(config) {
133
- const content = `# ${config.projectName}
277
+ const content = `# ${config.displayName}
134
278
 
135
279
  > Generated with [NEXUS CLI](https://github.com/GDA-Africa/nexus-cli) 🔮
136
280
 
@@ -1 +1 @@
1
- {"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/generators/structure.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/generators/structure.ts"],"names":[],"mappings":"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"}
@@ -43,7 +43,7 @@ function generateExampleVitestTest(config) {
43
43
  path: 'tests/unit/example.test.ts',
44
44
  content: `import { describe, it, expect } from 'vitest';
45
45
 
46
- describe('${config.projectName}', () => {
46
+ describe('${config.displayName}', () => {
47
47
  it('should pass a basic sanity check', () => {
48
48
  expect(true).toBe(true);
49
49
  });
@@ -7,6 +7,9 @@ import type { NexusConfig } from '../types/config.js';
7
7
  /**
8
8
  * Run the full interactive prompt flow and return a complete NexusConfig.
9
9
  *
10
+ * Users can enter free-text names like "Todo List App" — we derive the
11
+ * slug ("todo-list-app") automatically for the folder & package.json name.
12
+ *
10
13
  * @param initialName - Optional project name passed via CLI argument
11
14
  */
12
15
  export declare function runPrompts(initialName?: string): Promise<NexusConfig>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAUtD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAsD3E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAUtD;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAuD3E"}
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { input } from '@inquirer/prompts';
7
7
  import { detectPackageManager } from '../utils/package-manager.js';
8
- import { validateProjectName, sanitizeProjectName } from '../utils/validator.js';
8
+ import { validateProjectName, toSlug, toDisplayName } from '../utils/validator.js';
9
9
  import { promptDataStrategy } from './data-strategy.js';
10
10
  import { promptFeatures } from './features.js';
11
11
  import { promptFramework } from './frameworks.js';
@@ -14,15 +14,18 @@ import { promptProjectType } from './project-type.js';
14
14
  /**
15
15
  * Run the full interactive prompt flow and return a complete NexusConfig.
16
16
  *
17
+ * Users can enter free-text names like "Todo List App" — we derive the
18
+ * slug ("todo-list-app") automatically for the folder & package.json name.
19
+ *
17
20
  * @param initialName - Optional project name passed via CLI argument
18
21
  */
19
22
  export async function runPrompts(initialName) {
20
- // 1. Project name
21
- let projectName;
23
+ // 1. Project name (free-text)
24
+ let rawName;
22
25
  if (!initialName) {
23
- projectName = await input({
26
+ rawName = await input({
24
27
  message: 'Project name:',
25
- default: 'my-nexus-app',
28
+ default: 'My Nexus App',
26
29
  validate: (val) => {
27
30
  const result = validateProjectName(val);
28
31
  return result.valid ? true : (result.message ?? 'Invalid name');
@@ -30,14 +33,14 @@ export async function runPrompts(initialName) {
30
33
  });
31
34
  }
32
35
  else {
33
- // Validate the provided name
34
36
  const validation = validateProjectName(initialName);
35
37
  if (!validation.valid) {
36
38
  throw new Error(validation.message ?? 'Invalid project name.');
37
39
  }
38
- projectName = initialName;
40
+ rawName = initialName;
39
41
  }
40
- projectName = sanitizeProjectName(projectName);
42
+ const projectName = toSlug(rawName);
43
+ const displayName = toDisplayName(rawName);
41
44
  // 2. Project type
42
45
  const projectType = await promptProjectType();
43
46
  // 3. Data strategy
@@ -51,6 +54,7 @@ export async function runPrompts(initialName) {
51
54
  // Assemble config
52
55
  const config = {
53
56
  projectName,
57
+ displayName,
54
58
  projectType,
55
59
  dataStrategy,
56
60
  appPatterns,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAoB;IACnD,kBAAkB;IAClB,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,MAAM,KAAK,CAAC;YACxB,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,cAAc;YACvB,QAAQ,EAAE,CAAC,GAAW,EAAE,EAAE;gBACxB,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBACxC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,cAAc,CAAC,CAAC;YAClE,CAAC;SACF,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,6BAA6B;QAC7B,MAAM,UAAU,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,uBAAuB,CAAC,CAAC;QACjE,CAAC;QACD,WAAW,GAAG,WAAW,CAAC;IAC5B,CAAC;IAED,WAAW,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAE/C,kBAAkB;IAClB,MAAM,WAAW,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAE9C,mBAAmB;IACnB,MAAM,YAAY,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAEhD,0BAA0B;IAC1B,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAE3C,eAAe;IACf,MAAM,iBAAiB,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAE7D,uBAAuB;IACvB,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;IAEnF,kBAAkB;IAClB,MAAM,MAAM,GAAgB;QAC1B,WAAW;QACX,WAAW;QACX,YAAY;QACZ,WAAW;QACX,iBAAiB;QACjB,eAAe,EAAE,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY;QAClE,gBAAgB,EAAE,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;QAC5D,aAAa;QACb,cAAc,EAAE,cAAc,IAAI,oBAAoB,EAAE;QACxD,GAAG;QACH,WAAW;KACZ,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAoB;IACnD,8BAA8B;IAC9B,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,GAAG,MAAM,KAAK,CAAC;YACpB,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,cAAc;YACvB,QAAQ,EAAE,CAAC,GAAW,EAAE,EAAE;gBACxB,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBACxC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,cAAc,CAAC,CAAC;YAClE,CAAC;SACF,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,uBAAuB,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,GAAG,WAAW,CAAC;IACxB,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAE3C,kBAAkB;IAClB,MAAM,WAAW,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAE9C,mBAAmB;IACnB,MAAM,YAAY,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAEhD,0BAA0B;IAC1B,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAE3C,eAAe;IACf,MAAM,iBAAiB,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAE7D,uBAAuB;IACvB,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;IAEnF,kBAAkB;IAClB,MAAM,MAAM,GAAgB;QAC1B,WAAW;QACX,WAAW;QACX,WAAW;QACX,YAAY;QACZ,WAAW;QACX,iBAAiB;QACjB,eAAe,EAAE,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY;QAClE,gBAAgB,EAAE,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;QAC5D,aAAa;QACb,cAAc,EAAE,cAAc,IAAI,oBAAoB,EAAE;QACxD,GAAG;QACH,WAAW;KACZ,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -21,7 +21,10 @@ export type TestFramework = 'vitest' | 'jest' | 'none';
21
21
  export type PackageManager = 'npm' | 'yarn' | 'pnpm';
22
22
  /** Full project configuration resolved from user prompts */
23
23
  export interface NexusConfig {
24
+ /** Slug used for folder name & package.json name (e.g. "todo-list-app") */
24
25
  projectName: string;
26
+ /** Human-readable project name for titles & headings (e.g. "Todo List App") */
27
+ displayName: string;
25
28
  projectType: ProjectType;
26
29
  dataStrategy: DataStrategy;
27
30
  appPatterns: AppPattern[];
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8BAA8B;AAC9B,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE5E,4BAA4B;AAC5B,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,aAAa,GAAG,aAAa,GAAG,QAAQ,CAAC;AAEnF,gCAAgC;AAChC,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,eAAe,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,WAAW,CAAC;AAEpG,oCAAoC;AACpC,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEnG,mCAAmC;AACnC,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEzE,+BAA+B;AAC/B,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;AAEhF,gCAAgC;AAChC,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD,iCAAiC;AACjC,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAErD,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,eAAe,EAAE,eAAe,CAAC;IACjC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,GAAG,EAAE,OAAO,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,qDAAqD;AACrD,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE;QACH,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8BAA8B;AAC9B,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE5E,4BAA4B;AAC5B,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,aAAa,GAAG,aAAa,GAAG,QAAQ,CAAC;AAEnF,gCAAgC;AAChC,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,eAAe,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,WAAW,CAAC;AAEpG,oCAAoC;AACpC,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEnG,mCAAmC;AACnC,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEzE,+BAA+B;AAC/B,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;AAEhF,gCAAgC;AAChC,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD,iCAAiC;AACjC,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAErD,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,eAAe,EAAE,eAAe,CAAC;IACjC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,GAAG,EAAE,OAAO,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,qDAAqD;AACrD,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE;QACH,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH"}
@@ -1,5 +1,5 @@
1
1
  export { logger } from './logger.js';
2
- export { validateProjectName, sanitizeProjectName } from './validator.js';
2
+ export { validateProjectName, sanitizeProjectName, toSlug, toDisplayName } from './validator.js';
3
3
  export { detectPackageManager, getInstallCommand, getRunCommand } from './package-manager.js';
4
4
  export { gitInit, isGitInstalled } from './git.js';
5
5
  export { ensureDirectory, writeFile, writeGeneratorResult, renderTemplate } from './file-system.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  export { logger } from './logger.js';
2
- export { validateProjectName, sanitizeProjectName } from './validator.js';
2
+ export { validateProjectName, sanitizeProjectName, toSlug, toDisplayName } from './validator.js';
3
3
  export { detectPackageManager, getInstallCommand, getRunCommand } from './package-manager.js';
4
4
  export { gitInit, isGitInstalled } from './git.js';
5
5
  export { ensureDirectory, writeFile, writeGeneratorResult, renderTemplate } from './file-system.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
@@ -20,9 +20,9 @@ export declare function divider(): void;
20
20
  /** Print the NEXUS banner */
21
21
  export declare function banner(version: string): void;
22
22
  /** Print final success with next steps */
23
- export declare function complete(projectName: string): void;
23
+ export declare function complete(projectName: string, displayName?: string): void;
24
24
  /** Print adopt-mode completion with next steps */
25
- export declare function adoptComplete(projectName: string): void;
25
+ export declare function adoptComplete(displayName: string): void;
26
26
  export declare const logger: {
27
27
  info: typeof info;
28
28
  success: typeof success;
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,mCAAmC;AACnC,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,4BAA4B;AAC5B,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,4BAA4B;AAC5B,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,2BAA2B;AAC3B,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,kCAAkC;AAClC,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,yBAAyB;AACzB,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED,8BAA8B;AAC9B,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED,6BAA6B;AAC7B,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAM5C;AAED,0CAA0C;AAC1C,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAelD;AAED,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAsBvD;AAED,eAAO,MAAM,MAAM;;;;;;;;;;;CAWlB,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,mCAAmC;AACnC,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,4BAA4B;AAC5B,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,4BAA4B;AAC5B,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,2BAA2B;AAC3B,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,kCAAkC;AAClC,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,yBAAyB;AACzB,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED,8BAA8B;AAC9B,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED,6BAA6B;AAC7B,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAM5C;AAED,0CAA0C;AAC1C,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAkBxE;AAED,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAsBvD;AAED,eAAO,MAAM,MAAM;;;;;;;;;;;CAWlB,CAAC"}
@@ -51,12 +51,15 @@ export function banner(version) {
51
51
  newline();
52
52
  }
53
53
  /** Print final success with next steps */
54
- export function complete(projectName) {
54
+ export function complete(projectName, displayName) {
55
+ const prettyName = displayName ?? projectName;
55
56
  newline();
56
57
  divider();
57
58
  newline();
58
59
  console.log(COLORS.success.bold(' ✅ Project created successfully!'));
59
60
  newline();
61
+ console.log(COLORS.bold(` ${prettyName}`));
62
+ newline();
60
63
  console.log(COLORS.bold(' Next steps:'));
61
64
  console.log(COLORS.primary(` cd ${projectName}`));
62
65
  console.log(COLORS.primary(' npm run dev'));
@@ -68,13 +71,13 @@ export function complete(projectName) {
68
71
  newline();
69
72
  }
70
73
  /** Print adopt-mode completion with next steps */
71
- export function adoptComplete(projectName) {
74
+ export function adoptComplete(displayName) {
72
75
  newline();
73
76
  divider();
74
77
  newline();
75
78
  console.log(COLORS.success.bold(' ✅ NEXUS adopted successfully!'));
76
79
  newline();
77
- console.log(COLORS.bold(` "${projectName}" now has NEXUS documentation & AI config.`));
80
+ console.log(COLORS.bold(` "${displayName}" now has NEXUS documentation & AI config.`));
78
81
  newline();
79
82
  console.log(COLORS.bold(' What happens next:'));
80
83
  console.log(COLORS.primary(' 1. Open your AI coding tool (Copilot, Cursor, Windsurf, etc.)'));
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,mBAAmB;AACnB,MAAM,MAAM,GAAG;IACb,OAAO,EAAE,KAAK,CAAC,IAAI;IACnB,OAAO,EAAE,KAAK,CAAC,KAAK;IACpB,OAAO,EAAE,KAAK,CAAC,MAAM;IACrB,KAAK,EAAE,KAAK,CAAC,GAAG;IAChB,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,GAAG,EAAE,KAAK,CAAC,GAAG;IACd,IAAI,EAAE,KAAK,CAAC,IAAI;CACjB,CAAC;AAEF,mCAAmC;AACnC,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,OAAO;IACrB,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,OAAO;IACrB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,MAAM,CAAC,OAAe;IACpC,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC3D,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,QAAQ,CAAC,WAAmB,EAAE,WAAoB;IAChE,MAAM,UAAU,GAAG,WAAW,IAAI,WAAW,CAAC;IAC9C,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;IACtE,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC;IAC5C,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,WAAW,EAAE,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC/C,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC,CAAC;IACvF,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IACpE,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,WAAW,4CAA4C,CAAC,CAAC,CAAC;IACxF,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,mEAAmE,CAAC,CAAC,CAAC;IACjG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,mEAAmE,CAAC,CAAC,CAAC;IACjG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,sEAAsE,CAAC,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,uEAAuE,CAAC,CAAC,CAAC;IACrG,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC,CAAC;IACvG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC,CAAC;IACvF,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI;IACJ,OAAO;IACP,IAAI;IACJ,KAAK;IACL,KAAK;IACL,OAAO;IACP,OAAO;IACP,MAAM;IACN,QAAQ;IACR,aAAa;CACd,CAAC"}
@@ -9,17 +9,34 @@ export interface ValidationResult {
9
9
  message?: string;
10
10
  }
11
11
  /**
12
- * Validate a project name.
13
- * Must be a valid npm package name and the target directory must not already exist.
12
+ * Validate a project name (accepts free-text like "Todo List App").
13
+ * Validates that the derived slug is a valid npm name and the directory doesn't exist.
14
14
  */
15
15
  export declare function validateProjectName(name: string, targetDir?: string): ValidationResult;
16
16
  /**
17
17
  * Validate that a value is non-empty.
18
18
  */
19
19
  export declare function validateNotEmpty(value: string, fieldName?: string): ValidationResult;
20
+ /**
21
+ * Convert any project name into a kebab-case slug for folder & package.json name.
22
+ *
23
+ * Examples:
24
+ * "Todo List App" → "todo-list-app"
25
+ * "My Cool Project" → "my-cool-project"
26
+ * "todo-list-app" → "todo-list-app"
27
+ * " Some App " → "some-app"
28
+ */
29
+ export declare function toSlug(name: string): string;
30
+ /**
31
+ * Convert a project name into a human-readable display name.
32
+ *
33
+ * If the input is already "free text" (contains spaces/uppercase), keep it.
34
+ * If it's a slug like "todo-list-app", convert to "Todo List App".
35
+ */
36
+ export declare function toDisplayName(name: string): string;
20
37
  /**
21
38
  * Sanitize a project name for use as a directory name.
22
- * Converts to lowercase, replaces spaces with hyphens, strips invalid chars.
39
+ * @deprecated Use `toSlug()` instead this is kept for backwards compatibility.
23
40
  */
24
41
  export declare function sanitizeProjectName(name: string): string;
25
42
  //# sourceMappingURL=validator.d.ts.map
@@ -1 +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"}
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,CA+BtF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAU,GAAG,gBAAgB,CAKrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS3C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD"}
@@ -7,29 +7,32 @@ import fs from 'node:fs';
7
7
  import path from 'node:path';
8
8
  import validateNpmPackageName from 'validate-npm-package-name';
9
9
  /**
10
- * Validate a project name.
11
- * Must be a valid npm package name and the target directory must not already exist.
10
+ * Validate a project name (accepts free-text like "Todo List App").
11
+ * Validates that the derived slug is a valid npm name and the directory doesn't exist.
12
12
  */
13
13
  export function validateProjectName(name, targetDir) {
14
14
  if (!name || name.trim().length === 0) {
15
15
  return { valid: false, message: 'Project name cannot be empty.' };
16
16
  }
17
- const trimmed = name.trim();
18
- // Check npm naming rules
19
- const npmResult = validateNpmPackageName(trimmed);
17
+ const slug = toSlug(name);
18
+ if (!slug) {
19
+ return { valid: false, message: 'Project name must contain at least one letter or number.' };
20
+ }
21
+ // Check npm naming rules against the derived slug
22
+ const npmResult = validateNpmPackageName(slug);
20
23
  if (!npmResult.validForNewPackages) {
21
24
  const errors = [...(npmResult.errors ?? []), ...(npmResult.warnings ?? [])];
22
25
  return {
23
26
  valid: false,
24
- message: `Invalid package name: ${errors.join(', ')}`,
27
+ message: `Invalid package name "${slug}": ${errors.join(', ')}`,
25
28
  };
26
29
  }
27
30
  // Check if directory already exists
28
- const dir = targetDir ?? path.resolve(process.cwd(), trimmed);
31
+ const dir = targetDir ?? path.resolve(process.cwd(), slug);
29
32
  if (fs.existsSync(dir)) {
30
33
  return {
31
34
  valid: false,
32
- message: `Directory "${trimmed}" already exists. Choose a different name or delete the existing directory.`,
35
+ message: `Directory "${slug}" already exists. Choose a different name or delete the existing directory.`,
33
36
  };
34
37
  }
35
38
  return { valid: true };
@@ -44,16 +47,46 @@ export function validateNotEmpty(value, fieldName = 'Value') {
44
47
  return { valid: true };
45
48
  }
46
49
  /**
47
- * Sanitize a project name for use as a directory name.
48
- * Converts to lowercase, replaces spaces with hyphens, strips invalid chars.
50
+ * Convert any project name into a kebab-case slug for folder & package.json name.
51
+ *
52
+ * Examples:
53
+ * "Todo List App" → "todo-list-app"
54
+ * "My Cool Project" → "my-cool-project"
55
+ * "todo-list-app" → "todo-list-app"
56
+ * " Some App " → "some-app"
49
57
  */
50
- export function sanitizeProjectName(name) {
58
+ export function toSlug(name) {
51
59
  return name
52
60
  .trim()
53
61
  .toLowerCase()
54
- .replace(/\s+/g, '-')
55
- .replace(/[^a-z0-9\-_.]/g, '')
56
- .replace(/^[-_.]+/, '')
57
- .replace(/[-_.]+$/, '');
62
+ .replace(/[^a-z0-9\s\-_.]/g, '') // strip invalid chars (keep spaces for now)
63
+ .replace(/\s+/g, '-') // spaces → hyphens
64
+ .replace(/-+/g, '-') // collapse multiple hyphens
65
+ .replace(/^[-_.]+/, '') // strip leading separators
66
+ .replace(/[-_.]+$/, ''); // strip trailing separators
67
+ }
68
+ /**
69
+ * Convert a project name into a human-readable display name.
70
+ *
71
+ * If the input is already "free text" (contains spaces/uppercase), keep it.
72
+ * If it's a slug like "todo-list-app", convert to "Todo List App".
73
+ */
74
+ export function toDisplayName(name) {
75
+ const trimmed = name.trim();
76
+ // If already has spaces or mixed case, it's a free-text name — just clean it up
77
+ if (/\s/.test(trimmed) || /[A-Z]/.test(trimmed)) {
78
+ return trimmed.replace(/\s+/g, ' ');
79
+ }
80
+ // Otherwise convert slug → title case: "todo-list-app" → "Todo List App"
81
+ return trimmed
82
+ .replace(/[-_]+/g, ' ')
83
+ .replace(/\b\w/g, (c) => c.toUpperCase());
84
+ }
85
+ /**
86
+ * Sanitize a project name for use as a directory name.
87
+ * @deprecated Use `toSlug()` instead — this is kept for backwards compatibility.
88
+ */
89
+ export function sanitizeProjectName(name) {
90
+ return toSlug(name);
58
91
  }
59
92
  //# sourceMappingURL=validator.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -3,5 +3,5 @@
3
3
  *
4
4
  * Single source of truth for the CLI version.
5
5
  */
6
- export declare const version = "0.1.1";
6
+ export declare const version = "0.1.2";
7
7
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -3,5 +3,5 @@
3
3
  *
4
4
  * Single source of truth for the CLI version.
5
5
  */
6
- export const version = '0.1.1';
6
+ export const version = '0.1.2';
7
7
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexus-framework/cli",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "AI-Native Project Scaffolding for the Modern Era — generates production-ready, AI-optimized project structures",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",