@nexus-framework/cli 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -417
- package/dist/cli.js +14 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +5 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/repair.d.ts +20 -0
- package/dist/commands/repair.d.ts.map +1 -0
- package/dist/commands/repair.js +85 -0
- package/dist/commands/repair.js.map +1 -0
- package/dist/commands/upgrade.d.ts +21 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +95 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/generators/ai-config.d.ts +15 -8
- package/dist/generators/ai-config.d.ts.map +1 -1
- package/dist/generators/ai-config.js +209 -131
- package/dist/generators/ai-config.js.map +1 -1
- package/dist/generators/config.d.ts.map +1 -1
- package/dist/generators/config.js +127 -19
- package/dist/generators/config.js.map +1 -1
- package/dist/generators/docs.d.ts.map +1 -1
- package/dist/generators/docs.js +379 -159
- package/dist/generators/docs.js.map +1 -1
- package/dist/generators/index.d.ts +44 -0
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +148 -3
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/landing-page.d.ts.map +1 -1
- package/dist/generators/landing-page.js +310 -76
- package/dist/generators/landing-page.js.map +1 -1
- package/dist/generators/structure.d.ts.map +1 -1
- package/dist/generators/structure.js +161 -17
- package/dist/generators/structure.js.map +1 -1
- package/dist/generators/tests.js +1 -1
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +12 -8
- package/dist/prompts/index.js.map +1 -1
- package/dist/types/config.d.ts +3 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/utils/file-system.d.ts +9 -1
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +24 -1
- package/dist/utils/file-system.js.map +1 -1
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.d.ts +2 -2
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +6 -3
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/validator.d.ts +20 -3
- package/dist/utils/validator.d.ts.map +1 -1
- package/dist/utils/validator.js +48 -15
- package/dist/utils/validator.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/dist/commands/init.js
CHANGED
|
@@ -15,7 +15,7 @@ import { generateProject } from '../generators/index.js';
|
|
|
15
15
|
import { runPrompts } from '../prompts/index.js';
|
|
16
16
|
import { logger } from '../utils/logger.js';
|
|
17
17
|
import { isExistingProject } from '../utils/project-detector.js';
|
|
18
|
-
import { validateProjectName } from '../utils/validator.js';
|
|
18
|
+
import { validateProjectName, toSlug } from '../utils/validator.js';
|
|
19
19
|
import { version } from '../version.js';
|
|
20
20
|
import { adoptCommand } from './adopt.js';
|
|
21
21
|
/**
|
|
@@ -40,9 +40,10 @@ export async function initCommand(projectName, options = {}) {
|
|
|
40
40
|
process.exit(1);
|
|
41
41
|
}
|
|
42
42
|
// Check if the target directory is an existing project
|
|
43
|
-
const
|
|
43
|
+
const slug = toSlug(projectName);
|
|
44
|
+
const targetDir = path.resolve(process.cwd(), slug);
|
|
44
45
|
if (isExistingProject(targetDir)) {
|
|
45
|
-
showAdoptSuggestion(
|
|
46
|
+
showAdoptSuggestion(slug);
|
|
46
47
|
process.exit(1);
|
|
47
48
|
}
|
|
48
49
|
}
|
|
@@ -55,7 +56,7 @@ export async function initCommand(projectName, options = {}) {
|
|
|
55
56
|
// Run interactive prompts
|
|
56
57
|
const config = await runPrompts(projectName);
|
|
57
58
|
logger.newline();
|
|
58
|
-
logger.nexus(`Creating "${config.
|
|
59
|
+
logger.nexus(`Creating "${config.displayName}" with ${config.frontendFramework}...`);
|
|
59
60
|
logger.newline();
|
|
60
61
|
// Generate the project
|
|
61
62
|
await generateProject(config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO1C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,WAAoB,EACpB,UAAuB,EAAE;IAEzB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEvB,8DAA8D;IAC9D,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,8DAA8D;IAE9D,0CAA0C;IAC1C,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,uBAAuB,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,uDAAuD;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QACpD,IAAI,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,IAAI,CAAC,WAAW,IAAI,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QACrD,mBAAmB,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,0BAA0B;QAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;QAE7C,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,WAAW,UAAU,MAAM,CAAC,iBAAiB,KAAK,CAAC,CAAC;QACrF,MAAM,CAAC,OAAO,EAAE,CAAC;QAEjB,uBAAuB;QACvB,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,oCAAoC;QACpC,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACtE,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC9D,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;oEAEoE;AAEpE,SAAS,mBAAmB,CAAC,WAAoB;IAC/C,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IACzE,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IACjF,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACtD,MAAM,CAAC,OAAO,EAAE,CAAC;IAEjB,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1B,MAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAC/E,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IAClE,MAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAC5E,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAC/D,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS CLI - Repair Command
|
|
3
|
+
*
|
|
4
|
+
* The `nexus repair [path]` command restores missing or corrupted .nexus/
|
|
5
|
+
* files WITHOUT updating templates to a newer version.
|
|
6
|
+
*
|
|
7
|
+
* Use this when:
|
|
8
|
+
* - Files were accidentally deleted from .nexus/
|
|
9
|
+
* - A file's structure is corrupted (empty, broken frontmatter, invalid JSON)
|
|
10
|
+
* - You want to fix issues without changing template content
|
|
11
|
+
*
|
|
12
|
+
* For upgrading to the latest CLI templates, use `nexus upgrade` instead.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Handler for `nexus repair [path]`.
|
|
16
|
+
*
|
|
17
|
+
* @param targetPath - Optional path to the project to repair (defaults to cwd)
|
|
18
|
+
*/
|
|
19
|
+
export declare function repairCommand(targetPath?: string): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=repair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../src/commands/repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwEtE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS CLI - Repair Command
|
|
3
|
+
*
|
|
4
|
+
* The `nexus repair [path]` command restores missing or corrupted .nexus/
|
|
5
|
+
* files WITHOUT updating templates to a newer version.
|
|
6
|
+
*
|
|
7
|
+
* Use this when:
|
|
8
|
+
* - Files were accidentally deleted from .nexus/
|
|
9
|
+
* - A file's structure is corrupted (empty, broken frontmatter, invalid JSON)
|
|
10
|
+
* - You want to fix issues without changing template content
|
|
11
|
+
*
|
|
12
|
+
* For upgrading to the latest CLI templates, use `nexus upgrade` instead.
|
|
13
|
+
*/
|
|
14
|
+
import path from 'node:path';
|
|
15
|
+
import fs from 'fs-extra';
|
|
16
|
+
import { repairProject } from '../generators/index.js';
|
|
17
|
+
import { logger } from '../utils/logger.js';
|
|
18
|
+
import { version } from '../version.js';
|
|
19
|
+
/**
|
|
20
|
+
* Handler for `nexus repair [path]`.
|
|
21
|
+
*
|
|
22
|
+
* @param targetPath - Optional path to the project to repair (defaults to cwd)
|
|
23
|
+
*/
|
|
24
|
+
export async function repairCommand(targetPath) {
|
|
25
|
+
logger.banner(version);
|
|
26
|
+
const targetDir = targetPath
|
|
27
|
+
? path.resolve(process.cwd(), targetPath)
|
|
28
|
+
: process.cwd();
|
|
29
|
+
// ─── Check for .nexus/manifest.json ──────────────────────
|
|
30
|
+
const manifestPath = path.join(targetDir, '.nexus', 'manifest.json');
|
|
31
|
+
let manifest;
|
|
32
|
+
try {
|
|
33
|
+
const raw = await fs.readFile(manifestPath, 'utf-8');
|
|
34
|
+
manifest = JSON.parse(raw);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
logger.error('No valid .nexus/manifest.json found in this project.');
|
|
38
|
+
logger.newline();
|
|
39
|
+
logger.info('The repair command requires an existing NEXUS project with a valid manifest.');
|
|
40
|
+
logger.info('If the manifest itself is corrupted, try `nexus upgrade` instead.');
|
|
41
|
+
logger.info('To add NEXUS to an existing project, run:');
|
|
42
|
+
logger.newline();
|
|
43
|
+
logger.nexus(' nexus adopt');
|
|
44
|
+
logger.newline();
|
|
45
|
+
process.exit(1);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const config = manifest.config;
|
|
49
|
+
logger.nexus(`Repairing "${config.displayName}" NEXUS ecosystem...`);
|
|
50
|
+
logger.newline();
|
|
51
|
+
try {
|
|
52
|
+
const result = await repairProject(targetDir, config);
|
|
53
|
+
const fixCount = result.created.length + result.repaired.length;
|
|
54
|
+
if (fixCount === 0) {
|
|
55
|
+
logger.nexus('All NEXUS files are intact — nothing to repair.');
|
|
56
|
+
logger.newline();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (result.created.length > 0) {
|
|
60
|
+
logger.info(`✨ Restored (${result.created.length} missing files):`);
|
|
61
|
+
for (const f of result.created) {
|
|
62
|
+
logger.info(` + ${f}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (result.repaired.length > 0) {
|
|
66
|
+
logger.info(`🔧 Repaired (${result.repaired.length} corrupted files):`);
|
|
67
|
+
for (const f of result.repaired) {
|
|
68
|
+
logger.info(` ⚕ ${f}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
logger.info(`🔒 Untouched (${result.preserved.length} valid files preserved)`);
|
|
72
|
+
logger.newline();
|
|
73
|
+
logger.nexus(`Repair complete! Fixed ${fixCount} file${fixCount === 1 ? '' : 's'}.`);
|
|
74
|
+
logger.info('Your project knowledge was preserved.');
|
|
75
|
+
logger.newline();
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
logger.error('Repair failed.');
|
|
79
|
+
if (err instanceof Error) {
|
|
80
|
+
logger.error(err.message);
|
|
81
|
+
}
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=repair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/commands/repair.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS CLI - Upgrade Command
|
|
3
|
+
*
|
|
4
|
+
* The `nexus upgrade [path]` command regenerates the .nexus/ ecosystem
|
|
5
|
+
* with the latest CLI templates while preserving project knowledge.
|
|
6
|
+
*
|
|
7
|
+
* Strategy:
|
|
8
|
+
* - REPLACE: AI instructions, tool files, manifest, .nexus/index.md
|
|
9
|
+
* - PRESERVE: knowledge.md, any doc with `status: populated`
|
|
10
|
+
* - SMART: Template docs get replaced; populated docs are kept
|
|
11
|
+
*
|
|
12
|
+
* The command reads `.nexus/manifest.json` to recover the original
|
|
13
|
+
* project config, regenerates everything, then applies the strategy.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Handler for `nexus upgrade [path]`.
|
|
17
|
+
*
|
|
18
|
+
* @param targetPath - Optional path to the project to upgrade (defaults to cwd)
|
|
19
|
+
*/
|
|
20
|
+
export declare function upgradeCommand(targetPath?: string): Promise<void>;
|
|
21
|
+
//# sourceMappingURL=upgrade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAWH;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkFvE"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS CLI - Upgrade Command
|
|
3
|
+
*
|
|
4
|
+
* The `nexus upgrade [path]` command regenerates the .nexus/ ecosystem
|
|
5
|
+
* with the latest CLI templates while preserving project knowledge.
|
|
6
|
+
*
|
|
7
|
+
* Strategy:
|
|
8
|
+
* - REPLACE: AI instructions, tool files, manifest, .nexus/index.md
|
|
9
|
+
* - PRESERVE: knowledge.md, any doc with `status: populated`
|
|
10
|
+
* - SMART: Template docs get replaced; populated docs are kept
|
|
11
|
+
*
|
|
12
|
+
* The command reads `.nexus/manifest.json` to recover the original
|
|
13
|
+
* project config, regenerates everything, then applies the strategy.
|
|
14
|
+
*/
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
import fs from 'fs-extra';
|
|
17
|
+
import { upgradeProject } from '../generators/index.js';
|
|
18
|
+
import { logger } from '../utils/logger.js';
|
|
19
|
+
import { version } from '../version.js';
|
|
20
|
+
/**
|
|
21
|
+
* Handler for `nexus upgrade [path]`.
|
|
22
|
+
*
|
|
23
|
+
* @param targetPath - Optional path to the project to upgrade (defaults to cwd)
|
|
24
|
+
*/
|
|
25
|
+
export async function upgradeCommand(targetPath) {
|
|
26
|
+
logger.banner(version);
|
|
27
|
+
const targetDir = targetPath
|
|
28
|
+
? path.resolve(process.cwd(), targetPath)
|
|
29
|
+
: process.cwd();
|
|
30
|
+
// ─── Check for .nexus/manifest.json ──────────────────────
|
|
31
|
+
const manifestPath = path.join(targetDir, '.nexus', 'manifest.json');
|
|
32
|
+
let manifest;
|
|
33
|
+
try {
|
|
34
|
+
const raw = await fs.readFile(manifestPath, 'utf-8');
|
|
35
|
+
manifest = JSON.parse(raw);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
logger.error('No .nexus/manifest.json found in this project.');
|
|
39
|
+
logger.newline();
|
|
40
|
+
logger.info('The upgrade command requires an existing NEXUS project.');
|
|
41
|
+
logger.info('To add NEXUS to an existing project, run:');
|
|
42
|
+
logger.newline();
|
|
43
|
+
logger.nexus(' nexus adopt');
|
|
44
|
+
logger.newline();
|
|
45
|
+
process.exit(1);
|
|
46
|
+
return; // unreachable but satisfies TS
|
|
47
|
+
}
|
|
48
|
+
const config = manifest.config;
|
|
49
|
+
const oldVersion = manifest.cli?.version ?? 'unknown';
|
|
50
|
+
logger.nexus(`Upgrading "${config.displayName}" NEXUS ecosystem...`);
|
|
51
|
+
logger.newline();
|
|
52
|
+
logger.info(`Previous CLI version: ${oldVersion}`);
|
|
53
|
+
logger.info(`Current CLI version: ${version}`);
|
|
54
|
+
logger.newline();
|
|
55
|
+
try {
|
|
56
|
+
const result = await upgradeProject(targetDir, config);
|
|
57
|
+
// Log results
|
|
58
|
+
if (result.created.length > 0) {
|
|
59
|
+
logger.info(`✨ Created (${result.created.length} new files):`);
|
|
60
|
+
for (const f of result.created) {
|
|
61
|
+
logger.info(` + ${f}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (result.repaired.length > 0) {
|
|
65
|
+
logger.info(`🔧 Repaired (${result.repaired.length} corrupted files restored):`);
|
|
66
|
+
for (const f of result.repaired) {
|
|
67
|
+
logger.info(` ⚕ ${f}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (result.replaced.length > 0) {
|
|
71
|
+
logger.info(`🔄 Replaced (${result.replaced.length} files updated to latest):`);
|
|
72
|
+
for (const f of result.replaced) {
|
|
73
|
+
logger.info(` ↻ ${f}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (result.preserved.length > 0) {
|
|
77
|
+
logger.info(`🔒 Preserved (${result.preserved.length} files with project knowledge):`);
|
|
78
|
+
for (const f of result.preserved) {
|
|
79
|
+
logger.info(` ✓ ${f}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
logger.newline();
|
|
83
|
+
logger.nexus(`Upgrade complete! NEXUS ecosystem updated from v${oldVersion} → v${version}.`);
|
|
84
|
+
logger.info('Your project knowledge (populated docs, knowledge base, progress) was preserved.');
|
|
85
|
+
logger.newline();
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
logger.error('Upgrade failed.');
|
|
89
|
+
if (err instanceof Error) {
|
|
90
|
+
logger.error(err.message);
|
|
91
|
+
}
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=upgrade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,18 +4,25 @@
|
|
|
4
4
|
* Generates AI agent instruction files for every major coding assistant.
|
|
5
5
|
*
|
|
6
6
|
* Strategy:
|
|
7
|
-
*
|
|
8
|
-
* can understand ("this is for AI tools")
|
|
7
|
+
* The master file lives in `.nexus/ai/instructions.md` — a single folder
|
|
8
|
+
* that beginners can understand ("this is for AI tools").
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* .
|
|
10
|
+
* EVERY tool-specific config file gets the FULL project-aware instructions
|
|
11
|
+
* embedded directly. We do NOT rely on "go read another file" directives
|
|
12
|
+
* because AI tools ignore cross-file pointers too often.
|
|
13
|
+
*
|
|
14
|
+
* Files generated:
|
|
15
|
+
* .nexus/ai/instructions.md — master file (full content)
|
|
16
|
+
* .cursorrules — Cursor (full content)
|
|
17
|
+
* .windsurfrules — Windsurf (full content)
|
|
18
|
+
* .clinerules — Cline (full content)
|
|
19
|
+
* AGENTS.md — Claude Code / OpenAI Codex (full content)
|
|
20
|
+
* .github/copilot-instructions.md — GitHub Copilot (full content)
|
|
16
21
|
*
|
|
17
22
|
* Every file is project-aware — it references the actual framework, data
|
|
18
23
|
* strategy, test framework, and patterns chosen during `nexus init`.
|
|
24
|
+
* Every file includes the onboarding protocol that tells the AI to
|
|
25
|
+
* populate template docs BEFORE doing anything the user asks.
|
|
19
26
|
*/
|
|
20
27
|
import type { NexusConfig } from '../types/config.js';
|
|
21
28
|
import type { GeneratedFile } from '../types/templates.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-config.d.ts","sourceRoot":"","sources":["../../src/generators/ai-config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ai-config.d.ts","sourceRoot":"","sources":["../../src/generators/ai-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAO3D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,EAAE,CAcrE"}
|