@nexus-framework/cli 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -6
- package/dist/cli.js +87 -5
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt.d.ts +4 -2
- package/dist/commands/adopt.d.ts.map +1 -1
- package/dist/commands/adopt.js +47 -8
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pack.d.ts +28 -0
- package/dist/commands/pack.d.ts.map +1 -0
- package/dist/commands/pack.js +206 -0
- package/dist/commands/pack.js.map +1 -0
- package/dist/commands/skill.d.ts +53 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +371 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/update.d.ts +24 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +100 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/generators/ai-config.js +40 -1
- package/dist/generators/ai-config.js.map +1 -1
- package/dist/generators/docs.d.ts +10 -1
- package/dist/generators/docs.d.ts.map +1 -1
- package/dist/generators/docs.js +40 -65
- package/dist/generators/docs.js.map +1 -1
- package/dist/generators/index.d.ts +2 -1
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +85 -9
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/skills.d.ts +32 -0
- package/dist/generators/skills.d.ts.map +1 -0
- package/dist/generators/skills.js +220 -0
- package/dist/generators/skills.js.map +1 -0
- package/dist/generators/spring-boot.d.ts +12 -0
- package/dist/generators/spring-boot.d.ts.map +1 -0
- package/dist/generators/spring-boot.js +220 -0
- package/dist/generators/spring-boot.js.map +1 -0
- package/dist/generators/structure.d.ts +1 -0
- package/dist/generators/structure.d.ts.map +1 -1
- package/dist/generators/structure.js +129 -24
- package/dist/generators/structure.js.map +1 -1
- package/dist/prompts/adoption.d.ts +35 -0
- package/dist/prompts/adoption.d.ts.map +1 -0
- package/dist/prompts/adoption.js +153 -0
- package/dist/prompts/adoption.js.map +1 -0
- package/dist/prompts/frameworks.d.ts +5 -1
- package/dist/prompts/frameworks.d.ts.map +1 -1
- package/dist/prompts/frameworks.js +49 -1
- package/dist/prompts/frameworks.js.map +1 -1
- package/dist/prompts/index.d.ts +2 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +32 -7
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/project-type.d.ts.map +1 -1
- package/dist/prompts/project-type.js +6 -1
- package/dist/prompts/project-type.js.map +1 -1
- package/dist/prompts/skill-config.d.ts +19 -0
- package/dist/prompts/skill-config.d.ts.map +1 -0
- package/dist/prompts/skill-config.js +22 -0
- package/dist/prompts/skill-config.js.map +1 -0
- package/dist/types/config.d.ts +9 -3
- package/dist/types/config.d.ts.map +1 -1
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +4 -2
- package/dist/utils/file-system.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 +49 -36
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/project-detector.d.ts +20 -4
- package/dist/utils/project-detector.d.ts.map +1 -1
- package/dist/utils/project-detector.js +156 -27
- package/dist/utils/project-detector.js.map +1 -1
- package/dist/utils/update-check.d.ts +27 -0
- package/dist/utils/update-check.d.ts.map +1 -0
- package/dist/utils/update-check.js +111 -0
- package/dist/utils/update-check.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +9 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/commands/pack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,iEAAiE;AAEjE,MAAM,SAAS,GAAG,QAAQ,CAAC;AAC3B,MAAM,UAAU,GAAG,eAAe,CAAC;AACnC,MAAM,WAAW,GAAG,yDAAyD,CAAC;AAE9E;;GAEG;AACH,MAAM,qBAAqB,GAAG;IAC5B,QAAQ;IACR,aAAa;IACb,WAAW;IACX,sBAAsB;CACvB,CAAC;AAEF,iEAAiE;AAEjE;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAmB;IACnD,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAE3C,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,KAAK,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,gFAAgF;IAChF,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,GAAG,UAAU,GAAG,EAAE,MAAM,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAExC,MAAM,CAAC,KAAK,CAAC,qBAAqB,OAAO,IAAI,CAAC,CAAC;IAE/C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAExD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAE5B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErB,iEAAiE;QACjE,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAEvC,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAE1C,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACnC,MAAM,CAAC,IAAI,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;IACtC,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IACzE,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACxC,MAAM,CAAC,OAAO,EAAE,CAAC;AACnB,CAAC;AAED,iEAAiE;AAEjE;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAmB,EACnB,UAA6B,EAAE;IAE/B,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAElE,8BAA8B;IAC9B,IAAI,OAAe,CAAC;IAEpB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;YACrC,CAAC,CAAC,OAAO,CAAC,IAAI;YACd,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,KAAK,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QACjF,MAAM,CAAC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,aAAa,OAAO,MAAM,GAAG,IAAI,CAAC,CAAC;IAEhD,UAAU;IACV,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC;aACzB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;aACrC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;aACpB,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,EAAE,CAAC;IAEjB,SAAS;IACT,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,iEAAiE;AAEjE;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAAC,GAAW;IACzC,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,OAAO;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAClC,IAAI,EAAE;SACN,OAAO,EAAE,CAAC,CAAC,gFAAgF;IAE9F,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACpE,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,uCAAuC,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,EAAE,CAAC;IAEjB,IAAI,KAAK,GAAG,IAAI,CAAC;IAEjB,KAAK,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC,CAAC;YACvC,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,MAAM,SAAS,GAAG;QAChB,eAAe;QACf,0BAA0B;QAC1B,sBAAsB;KACvB,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,4BAA4B,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,CAAC;IAEjB,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS CLI - Skill Command
|
|
3
|
+
*
|
|
4
|
+
* Provides the `nexus skill` subcommand suite for managing skills in .nexus/skills/.
|
|
5
|
+
*
|
|
6
|
+
* Subcommands:
|
|
7
|
+
* nexus skill new <name> — scaffold a new custom skill
|
|
8
|
+
* nexus skill list — list all installed skills
|
|
9
|
+
* nexus skill install <pkg> — install from registry (community/)
|
|
10
|
+
* nexus skill remove <name> — remove a community skill
|
|
11
|
+
* nexus skill status — check core skills freshness
|
|
12
|
+
*
|
|
13
|
+
* Directory rules:
|
|
14
|
+
* core/ — NEXUS-owned; updated by `nexus upgrade`; NOT manageable via this command
|
|
15
|
+
* custom/ — User-owned; created with `skill new`; NEVER removed by NEXUS
|
|
16
|
+
* community/ — Registry-installed; managed by `skill install` / `skill remove`
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Scaffold a new custom skill interactively.
|
|
20
|
+
* Creates `.nexus/skills/custom/<name>.md` with template content and `status: draft`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function skillNewCommand(name?: string): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* List all skills installed in .nexus/skills/ grouped by directory.
|
|
25
|
+
*/
|
|
26
|
+
export declare function skillListCommand(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* List all skills available in the @nexus-framework/skills registry,
|
|
29
|
+
* optionally filtered to a single framework.
|
|
30
|
+
*
|
|
31
|
+
* Reads directly from the installed npm package — no network required.
|
|
32
|
+
*/
|
|
33
|
+
export declare function skillRegistryCommand(options?: {
|
|
34
|
+
framework?: string;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Install skills from the @nexus-framework/skills registry into community/.
|
|
38
|
+
*
|
|
39
|
+
* Currently a stub — will source from npm when @nexus-framework/skills is published.
|
|
40
|
+
* For now, notifies the user of upcoming availability.
|
|
41
|
+
*/
|
|
42
|
+
export declare function skillInstallCommand(pkg?: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Remove a community skill from .nexus/skills/community/.
|
|
45
|
+
* Refuses to remove core or custom skills with a clear explanation.
|
|
46
|
+
*/
|
|
47
|
+
export declare function skillRemoveCommand(name?: string): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Check if core skills are present and report any issues.
|
|
50
|
+
* Suggests running `nexus upgrade` if core skills are missing or outdated.
|
|
51
|
+
*/
|
|
52
|
+
export declare function skillStatusCommand(): Promise<void>;
|
|
53
|
+
//# sourceMappingURL=skill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAeH;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmGlE;AAMD;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiDtD;AAMD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D9F;AAMD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BrE;AAMD;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCrE;AAMD;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAsDxD"}
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS CLI - Skill Command
|
|
3
|
+
*
|
|
4
|
+
* Provides the `nexus skill` subcommand suite for managing skills in .nexus/skills/.
|
|
5
|
+
*
|
|
6
|
+
* Subcommands:
|
|
7
|
+
* nexus skill new <name> — scaffold a new custom skill
|
|
8
|
+
* nexus skill list — list all installed skills
|
|
9
|
+
* nexus skill install <pkg> — install from registry (community/)
|
|
10
|
+
* nexus skill remove <name> — remove a community skill
|
|
11
|
+
* nexus skill status — check core skills freshness
|
|
12
|
+
*
|
|
13
|
+
* Directory rules:
|
|
14
|
+
* core/ — NEXUS-owned; updated by `nexus upgrade`; NOT manageable via this command
|
|
15
|
+
* custom/ — User-owned; created with `skill new`; NEVER removed by NEXUS
|
|
16
|
+
* community/ — Registry-installed; managed by `skill install` / `skill remove`
|
|
17
|
+
*/
|
|
18
|
+
import fs from 'node:fs/promises';
|
|
19
|
+
import path from 'node:path';
|
|
20
|
+
import { input, select } from '@inquirer/prompts';
|
|
21
|
+
import { fileExists } from '../utils/file-system.js';
|
|
22
|
+
import { logger } from '../utils/logger.js';
|
|
23
|
+
import { version } from '../version.js';
|
|
24
|
+
/* ──────────────────────────────────────────────────────────────
|
|
25
|
+
* nexus skill new <name>
|
|
26
|
+
* ────────────────────────────────────────────────────────────── */
|
|
27
|
+
/**
|
|
28
|
+
* Scaffold a new custom skill interactively.
|
|
29
|
+
* Creates `.nexus/skills/custom/<name>.md` with template content and `status: draft`.
|
|
30
|
+
*/
|
|
31
|
+
export async function skillNewCommand(name) {
|
|
32
|
+
logger.banner(version);
|
|
33
|
+
const targetDir = process.cwd();
|
|
34
|
+
const skillsDir = path.join(targetDir, '.nexus', 'skills', 'custom');
|
|
35
|
+
if (!(await fileExists(skillsDir))) {
|
|
36
|
+
logger.error('No .nexus/skills/ directory found in this project.');
|
|
37
|
+
logger.info('Run `nexus init` or `nexus adopt` first to set up the NEXUS framework.');
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
// Prompt for skill details if not provided
|
|
41
|
+
const skillName = name ?? (await input({
|
|
42
|
+
message: 'Skill name (slug, e.g. "creating-a-service"):',
|
|
43
|
+
validate: (v) => v.trim().length > 0 ? true : 'Name cannot be empty',
|
|
44
|
+
}));
|
|
45
|
+
const slug = skillName.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
|
|
46
|
+
const category = await select({
|
|
47
|
+
message: 'Category:',
|
|
48
|
+
choices: [
|
|
49
|
+
{ value: 'ui', name: '🎨 ui — Component creation, styling, layout' },
|
|
50
|
+
{ value: 'routing', name: '🗺️ routing — Pages, routes, navigation' },
|
|
51
|
+
{ value: 'data', name: '📊 data — Data fetching, state, caching' },
|
|
52
|
+
{ value: 'testing', name: '🧪 testing — Unit, integration, E2E tests' },
|
|
53
|
+
{ value: 'api', name: '🔌 api — API endpoints, handlers, clients' },
|
|
54
|
+
{ value: 'config', name: '⚙️ config — Configuration, environment, setup' },
|
|
55
|
+
{ value: 'workflow', name: '🔄 workflow — Git, commits, PR, deployment' },
|
|
56
|
+
],
|
|
57
|
+
default: 'ui',
|
|
58
|
+
});
|
|
59
|
+
const rawTriggers = await input({
|
|
60
|
+
message: 'Trigger phrases (comma-separated, e.g. "creating a service, new service file"):',
|
|
61
|
+
validate: (v) => v.trim().length > 0 ? true : 'At least one trigger is required',
|
|
62
|
+
});
|
|
63
|
+
const triggers = rawTriggers
|
|
64
|
+
.split(',')
|
|
65
|
+
.map((t) => t.trim())
|
|
66
|
+
.filter(Boolean);
|
|
67
|
+
const outputPath = path.join(skillsDir, `${slug}.md`);
|
|
68
|
+
if (await fileExists(outputPath)) {
|
|
69
|
+
logger.warn(`Skill "${slug}" already exists at .nexus/skills/custom/${slug}.md`);
|
|
70
|
+
logger.info('Edit the file directly to update it.');
|
|
71
|
+
process.exit(0);
|
|
72
|
+
}
|
|
73
|
+
const triggersYaml = triggers.map((t) => ` - "${t}"`).join('\n');
|
|
74
|
+
const content = `---
|
|
75
|
+
skill: ${slug}
|
|
76
|
+
version: 1.0.0
|
|
77
|
+
framework: shared
|
|
78
|
+
category: ${category}
|
|
79
|
+
triggers:
|
|
80
|
+
${triggersYaml}
|
|
81
|
+
author: custom
|
|
82
|
+
status: draft
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
# Skill: ${toTitleCase(slug)}
|
|
86
|
+
|
|
87
|
+
## When to Read This
|
|
88
|
+
[Describe when an AI agent should read this skill — e.g. "Before creating any new service file."]
|
|
89
|
+
|
|
90
|
+
## Context
|
|
91
|
+
[Explain how this project specifically handles this type of task and why.]
|
|
92
|
+
|
|
93
|
+
## Steps
|
|
94
|
+
1. [First step]
|
|
95
|
+
2. [Second step]
|
|
96
|
+
3. [Continue...]
|
|
97
|
+
|
|
98
|
+
## Patterns We Use
|
|
99
|
+
- [Pattern the project follows]
|
|
100
|
+
- [Another pattern]
|
|
101
|
+
|
|
102
|
+
## Anti-Patterns — Never Do This
|
|
103
|
+
- [Something that looks reasonable but is wrong for this project]
|
|
104
|
+
- [Another anti-pattern]
|
|
105
|
+
|
|
106
|
+
## Example
|
|
107
|
+
\`\`\`
|
|
108
|
+
[A minimal, concrete example of the correct output]
|
|
109
|
+
\`\`\`
|
|
110
|
+
|
|
111
|
+
## Notes
|
|
112
|
+
[Optional: edge cases, exceptions, or links to relevant docs]
|
|
113
|
+
`;
|
|
114
|
+
await fs.writeFile(outputPath, content, 'utf-8');
|
|
115
|
+
logger.success(`Custom skill created: .nexus/skills/custom/${slug}.md`);
|
|
116
|
+
logger.info('Status is set to "draft" — change to "active" when ready to enforce it.');
|
|
117
|
+
}
|
|
118
|
+
/* ──────────────────────────────────────────────────────────────
|
|
119
|
+
* nexus skill list
|
|
120
|
+
* ────────────────────────────────────────────────────────────── */
|
|
121
|
+
/**
|
|
122
|
+
* List all skills installed in .nexus/skills/ grouped by directory.
|
|
123
|
+
*/
|
|
124
|
+
export async function skillListCommand() {
|
|
125
|
+
const targetDir = process.cwd();
|
|
126
|
+
const skillsBase = path.join(targetDir, '.nexus', 'skills');
|
|
127
|
+
if (!(await fileExists(skillsBase))) {
|
|
128
|
+
logger.warn('No .nexus/skills/ directory found. Run `nexus init` or `nexus adopt` first.');
|
|
129
|
+
process.exit(0);
|
|
130
|
+
}
|
|
131
|
+
logger.nexus('Installed Skills\n');
|
|
132
|
+
for (const dir of ['core', 'custom', 'community']) {
|
|
133
|
+
const dirPath = path.join(skillsBase, dir);
|
|
134
|
+
const label = dir === 'core' ? '📦 Core Skills (NEXUS-managed)' :
|
|
135
|
+
dir === 'custom' ? '✏️ Custom Skills (yours)' :
|
|
136
|
+
'🌐 Community Skills (registry-installed)';
|
|
137
|
+
logger.info(label);
|
|
138
|
+
if (!(await fileExists(dirPath))) {
|
|
139
|
+
logger.info(' (none)\n');
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const entries = await fs.readdir(dirPath);
|
|
143
|
+
const skillFiles = entries.filter((f) => f.endsWith('.md') && f !== 'README.md');
|
|
144
|
+
if (skillFiles.length === 0) {
|
|
145
|
+
logger.info(' (none)\n');
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
for (const file of skillFiles) {
|
|
149
|
+
const fullPath = path.join(dirPath, file);
|
|
150
|
+
const raw = await fs.readFile(fullPath, 'utf-8');
|
|
151
|
+
const meta = parseSkillFrontmatter(raw);
|
|
152
|
+
const statusIcon = meta.status === 'active' ? '✅' : meta.status === 'deprecated' ? '⚠️ ' : '📝';
|
|
153
|
+
const triggers = meta.triggers.length > 0 ? ` — ${meta.triggers.slice(0, 2).join(', ')}${meta.triggers.length > 2 ? '...' : ''}` : '';
|
|
154
|
+
console.log(` ${statusIcon} ${file.replace('.md', '')}${triggers}`);
|
|
155
|
+
}
|
|
156
|
+
logger.newline();
|
|
157
|
+
}
|
|
158
|
+
logger.info('Commands:');
|
|
159
|
+
logger.info(' nexus skill new <name> — create a custom skill');
|
|
160
|
+
logger.info(' nexus skill install <pkg> — install from registry');
|
|
161
|
+
logger.info(' nexus skill remove <name> — remove a community skill');
|
|
162
|
+
}
|
|
163
|
+
/* ──────────────────────────────────────────────────────────────
|
|
164
|
+
* nexus skill registry [--framework <fw>]
|
|
165
|
+
* ────────────────────────────────────────────────────────────── */
|
|
166
|
+
/**
|
|
167
|
+
* List all skills available in the @nexus-framework/skills registry,
|
|
168
|
+
* optionally filtered to a single framework.
|
|
169
|
+
*
|
|
170
|
+
* Reads directly from the installed npm package — no network required.
|
|
171
|
+
*/
|
|
172
|
+
export async function skillRegistryCommand(options = {}) {
|
|
173
|
+
const { listFrameworks, listSkills } = await import('@nexus-framework/skills');
|
|
174
|
+
const allFrameworks = listFrameworks();
|
|
175
|
+
// Alias map: CLI-friendly names → package folder names
|
|
176
|
+
const ALIASES = {
|
|
177
|
+
nextjs: 'next.js',
|
|
178
|
+
};
|
|
179
|
+
// --framework filter: normalise alias, then validate
|
|
180
|
+
let filterFramework;
|
|
181
|
+
if (options.framework) {
|
|
182
|
+
const input = options.framework.toLowerCase();
|
|
183
|
+
filterFramework = ALIASES[input] ?? input;
|
|
184
|
+
if (!allFrameworks.includes(filterFramework)) {
|
|
185
|
+
const friendlyList = allFrameworks
|
|
186
|
+
.map((f) => (f === 'next.js' ? 'nextjs (next.js)' : f))
|
|
187
|
+
.join(', ');
|
|
188
|
+
logger.error(`Unknown framework: "${options.framework}"`);
|
|
189
|
+
logger.info(`Available frameworks: ${friendlyList}`);
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
logger.nexus('Skill Registry (@nexus-framework/skills)\n');
|
|
194
|
+
// Frameworks to show — either the filtered one or all (shared last)
|
|
195
|
+
const frameworksToShow = filterFramework
|
|
196
|
+
? [filterFramework]
|
|
197
|
+
: [...allFrameworks.filter((f) => f !== 'shared'), 'shared'];
|
|
198
|
+
let totalSkills = 0;
|
|
199
|
+
for (const fw of frameworksToShow) {
|
|
200
|
+
const skills = listSkills(fw);
|
|
201
|
+
totalSkills += skills.length;
|
|
202
|
+
const label = fw === 'shared'
|
|
203
|
+
? '🔗 shared (installed for every framework)'
|
|
204
|
+
: `📦 ${fw}`;
|
|
205
|
+
logger.info(`${label} (${skills.length} skill${skills.length !== 1 ? 's' : ''})`);
|
|
206
|
+
if (skills.length === 0) {
|
|
207
|
+
logger.info(' (none)');
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
for (const slug of skills) {
|
|
211
|
+
console.log(` • ${slug}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
logger.newline();
|
|
215
|
+
}
|
|
216
|
+
if (!filterFramework) {
|
|
217
|
+
logger.info(`Total: ${totalSkills} skills across ${frameworksToShow.length} framework(s)`);
|
|
218
|
+
logger.newline();
|
|
219
|
+
}
|
|
220
|
+
logger.info('These skills are installed into .nexus/skills/core/ when you run `nexus init` or `nexus upgrade`.');
|
|
221
|
+
logger.info('Use `nexus skill list` to see what is installed in your current project.');
|
|
222
|
+
}
|
|
223
|
+
/* ──────────────────────────────────────────────────────────────
|
|
224
|
+
* nexus skill install <pkg>
|
|
225
|
+
* ────────────────────────────────────────────────────────────── */
|
|
226
|
+
/**
|
|
227
|
+
* Install skills from the @nexus-framework/skills registry into community/.
|
|
228
|
+
*
|
|
229
|
+
* Currently a stub — will source from npm when @nexus-framework/skills is published.
|
|
230
|
+
* For now, notifies the user of upcoming availability.
|
|
231
|
+
*/
|
|
232
|
+
export async function skillInstallCommand(pkg) {
|
|
233
|
+
if (!pkg) {
|
|
234
|
+
logger.error('Package name required. Usage: nexus skill install <package>');
|
|
235
|
+
logger.info('Example: nexus skill install @nexus-framework/skills-integrations');
|
|
236
|
+
process.exit(1);
|
|
237
|
+
}
|
|
238
|
+
const targetDir = process.cwd();
|
|
239
|
+
const communityDir = path.join(targetDir, '.nexus', 'skills', 'community');
|
|
240
|
+
if (!(await fileExists(communityDir))) {
|
|
241
|
+
logger.error('No .nexus/skills/ directory found. Run `nexus init` or `nexus adopt` first.');
|
|
242
|
+
process.exit(1);
|
|
243
|
+
}
|
|
244
|
+
// Stub: @nexus-framework/skills registry is in development
|
|
245
|
+
if (pkg.startsWith('@nexus-framework/skills')) {
|
|
246
|
+
logger.info(`📦 Package: ${pkg}`);
|
|
247
|
+
logger.warn('The @nexus-framework/skills registry is coming in a future release.');
|
|
248
|
+
logger.info('Core framework skills are already installed in .nexus/skills/core/');
|
|
249
|
+
logger.info('Check .nexus/skills/README.md for available skills.');
|
|
250
|
+
process.exit(0);
|
|
251
|
+
}
|
|
252
|
+
logger.warn(`Community skill packages from "${pkg}" are not yet supported.`);
|
|
253
|
+
logger.info('Only @nexus-framework/skills packages will be supported initially.');
|
|
254
|
+
process.exit(1);
|
|
255
|
+
}
|
|
256
|
+
/* ──────────────────────────────────────────────────────────────
|
|
257
|
+
* nexus skill remove <name>
|
|
258
|
+
* ────────────────────────────────────────────────────────────── */
|
|
259
|
+
/**
|
|
260
|
+
* Remove a community skill from .nexus/skills/community/.
|
|
261
|
+
* Refuses to remove core or custom skills with a clear explanation.
|
|
262
|
+
*/
|
|
263
|
+
export async function skillRemoveCommand(name) {
|
|
264
|
+
if (!name) {
|
|
265
|
+
logger.error('Skill name required. Usage: nexus skill remove <name>');
|
|
266
|
+
process.exit(1);
|
|
267
|
+
}
|
|
268
|
+
const targetDir = process.cwd();
|
|
269
|
+
const slug = name.replace(/\.md$/, '');
|
|
270
|
+
// Check if trying to remove a core skill
|
|
271
|
+
const corePath = path.join(targetDir, '.nexus', 'skills', 'core', `${slug}.md`);
|
|
272
|
+
if (await fileExists(corePath)) {
|
|
273
|
+
logger.error(`Cannot remove core skill "${slug}".`);
|
|
274
|
+
logger.info('Core skills are managed by NEXUS and regenerated on upgrade.');
|
|
275
|
+
logger.info('If you want to override it, create a custom skill with the same slug in .nexus/skills/custom/');
|
|
276
|
+
process.exit(1);
|
|
277
|
+
}
|
|
278
|
+
// Check if trying to remove a custom skill
|
|
279
|
+
const customPath = path.join(targetDir, '.nexus', 'skills', 'custom', `${slug}.md`);
|
|
280
|
+
if (await fileExists(customPath)) {
|
|
281
|
+
logger.error(`Cannot remove custom skill "${slug}" via this command.`);
|
|
282
|
+
logger.info('Custom skills are owned by you and are never touched by NEXUS.');
|
|
283
|
+
logger.info(`Delete it manually if needed: .nexus/skills/custom/${slug}.md`);
|
|
284
|
+
process.exit(1);
|
|
285
|
+
}
|
|
286
|
+
// Only proceed for community skills
|
|
287
|
+
const communityPath = path.join(targetDir, '.nexus', 'skills', 'community', `${slug}.md`);
|
|
288
|
+
if (!(await fileExists(communityPath))) {
|
|
289
|
+
logger.error(`Community skill "${slug}" not found.`);
|
|
290
|
+
logger.info('Run `nexus skill list` to see installed community skills.');
|
|
291
|
+
process.exit(1);
|
|
292
|
+
}
|
|
293
|
+
await fs.unlink(communityPath);
|
|
294
|
+
logger.success(`Removed community skill: .nexus/skills/community/${slug}.md`);
|
|
295
|
+
}
|
|
296
|
+
/* ──────────────────────────────────────────────────────────────
|
|
297
|
+
* nexus skill status
|
|
298
|
+
* ────────────────────────────────────────────────────────────── */
|
|
299
|
+
/**
|
|
300
|
+
* Check if core skills are present and report any issues.
|
|
301
|
+
* Suggests running `nexus upgrade` if core skills are missing or outdated.
|
|
302
|
+
*/
|
|
303
|
+
export async function skillStatusCommand() {
|
|
304
|
+
const targetDir = process.cwd();
|
|
305
|
+
const skillsBase = path.join(targetDir, '.nexus', 'skills');
|
|
306
|
+
if (!(await fileExists(skillsBase))) {
|
|
307
|
+
logger.warn('No .nexus/skills/ directory found. Run `nexus upgrade` to add skills.');
|
|
308
|
+
process.exit(0);
|
|
309
|
+
}
|
|
310
|
+
logger.nexus('Skills Status\n');
|
|
311
|
+
let issues = 0;
|
|
312
|
+
for (const dir of ['core', 'custom', 'community']) {
|
|
313
|
+
const dirPath = path.join(skillsBase, dir);
|
|
314
|
+
const exists = await fileExists(dirPath);
|
|
315
|
+
if (!exists) {
|
|
316
|
+
if (dir === 'core') {
|
|
317
|
+
logger.warn(`⚠️ Missing: .nexus/skills/core/ — run \`nexus upgrade\` to restore`);
|
|
318
|
+
issues++;
|
|
319
|
+
}
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
const entries = await fs.readdir(dirPath);
|
|
323
|
+
const skillFiles = entries.filter((f) => f.endsWith('.md') && f !== 'README.md');
|
|
324
|
+
for (const file of skillFiles) {
|
|
325
|
+
const fullPath = path.join(dirPath, file);
|
|
326
|
+
const raw = await fs.readFile(fullPath, 'utf-8');
|
|
327
|
+
const meta = parseSkillFrontmatter(raw);
|
|
328
|
+
if (meta.status === 'deprecated') {
|
|
329
|
+
logger.warn(`⚠️ Deprecated: .nexus/skills/${dir}/${file} — consider updating`);
|
|
330
|
+
issues++;
|
|
331
|
+
}
|
|
332
|
+
if (!meta.slug || !meta.triggers.length) {
|
|
333
|
+
logger.warn(`⚠️ Invalid frontmatter: .nexus/skills/${dir}/${file} — missing slug or triggers`);
|
|
334
|
+
issues++;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
if (issues === 0) {
|
|
339
|
+
logger.success('All skills look healthy.');
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
logger.newline();
|
|
343
|
+
logger.info(`${issues} issue(s) found. Run \`nexus upgrade\` to refresh core skills.`);
|
|
344
|
+
}
|
|
345
|
+
logger.newline();
|
|
346
|
+
logger.info('Available skills: .nexus/skills/README.md');
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Parse minimal YAML frontmatter from a skill file.
|
|
350
|
+
* Uses simple regex — no full YAML parser dependency needed.
|
|
351
|
+
*/
|
|
352
|
+
function parseSkillFrontmatter(content) {
|
|
353
|
+
const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
354
|
+
if (!fmMatch)
|
|
355
|
+
return { slug: '', status: 'draft', triggers: [] };
|
|
356
|
+
const fm = fmMatch[1];
|
|
357
|
+
const slug = (fm.match(/^skill:\s*(.+)$/m) ?? [])[1]?.trim() ?? '';
|
|
358
|
+
const status = (fm.match(/^status:\s*(.+)$/m) ?? [])[1]?.trim() ?? 'draft';
|
|
359
|
+
const triggersMatch = fm.match(/^triggers:\n((?:[ ]{2}- .+\n?)*)/m);
|
|
360
|
+
const triggers = triggersMatch
|
|
361
|
+
? triggersMatch[1]
|
|
362
|
+
.split('\n')
|
|
363
|
+
.filter((l) => l.trim().startsWith('- '))
|
|
364
|
+
.map((l) => l.replace(/^[ ]{2}- /, '').replace(/^"|"$/g, '').trim())
|
|
365
|
+
: [];
|
|
366
|
+
return { slug, status, triggers };
|
|
367
|
+
}
|
|
368
|
+
function toTitleCase(slug) {
|
|
369
|
+
return slug.replace(/-/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase());
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS CLI - Update Command
|
|
3
|
+
*
|
|
4
|
+
* `nexus update`
|
|
5
|
+
*
|
|
6
|
+
* Checks npm for the latest @nexus-framework/cli, shows what's new,
|
|
7
|
+
* and runs the correct package-manager install command automatically
|
|
8
|
+
* so the user never has to remember the full install command.
|
|
9
|
+
*/
|
|
10
|
+
import { version as currentVersion } from '../version.js';
|
|
11
|
+
export declare function updateCommand(): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Print a non-intrusive update notification banner.
|
|
14
|
+
* Called after every command if a newer version is detected.
|
|
15
|
+
* Designed to be fast and silent on failure.
|
|
16
|
+
*/
|
|
17
|
+
export declare function printUpdateBanner(info: {
|
|
18
|
+
current: string;
|
|
19
|
+
latest: string;
|
|
20
|
+
headline: string;
|
|
21
|
+
installCmd: string;
|
|
22
|
+
}): void;
|
|
23
|
+
export { currentVersion };
|
|
24
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,eAAe,CAAC;AAE1D,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAoEnD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAoBP;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS CLI - Update Command
|
|
3
|
+
*
|
|
4
|
+
* `nexus update`
|
|
5
|
+
*
|
|
6
|
+
* Checks npm for the latest @nexus-framework/cli, shows what's new,
|
|
7
|
+
* and runs the correct package-manager install command automatically
|
|
8
|
+
* so the user never has to remember the full install command.
|
|
9
|
+
*/
|
|
10
|
+
import { execSync } from 'node:child_process';
|
|
11
|
+
import boxen from 'boxen';
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
import { logger } from '../utils/logger.js';
|
|
14
|
+
import { checkForUpdate } from '../utils/update-check.js';
|
|
15
|
+
import { version as currentVersion } from '../version.js';
|
|
16
|
+
export async function updateCommand() {
|
|
17
|
+
logger.nexus('Checking for updates …');
|
|
18
|
+
logger.newline();
|
|
19
|
+
const info = await checkForUpdate(8000); // give a generous timeout for explicit update command
|
|
20
|
+
// ── Offline / registry unreachable ──────────────────────────
|
|
21
|
+
if (info === null) {
|
|
22
|
+
logger.warn('Could not reach the npm registry.');
|
|
23
|
+
logger.info('Check your internet connection and try again.');
|
|
24
|
+
logger.newline();
|
|
25
|
+
logger.info('Manual update: npm install -g @nexus-framework/cli');
|
|
26
|
+
logger.newline();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// ── Already up to date ───────────────────────────────────────
|
|
30
|
+
if (!info.hasUpdate) {
|
|
31
|
+
logger.success(`You are already on the latest version: v${info.current}`);
|
|
32
|
+
logger.newline();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// ── Update available ─────────────────────────────────────────
|
|
36
|
+
const banner = [
|
|
37
|
+
chalk.bold.cyan('📦 Update available!'),
|
|
38
|
+
'',
|
|
39
|
+
` ${chalk.dim('Current:')} v${info.current}`,
|
|
40
|
+
` ${chalk.green.bold('Latest:')} v${info.latest}`,
|
|
41
|
+
'',
|
|
42
|
+
` ${chalk.bold("What's new:")}`,
|
|
43
|
+
` ${info.headline}`,
|
|
44
|
+
'',
|
|
45
|
+
chalk.dim('Installing now …'),
|
|
46
|
+
].join('\n');
|
|
47
|
+
console.log(boxen(banner, {
|
|
48
|
+
padding: 1,
|
|
49
|
+
margin: { top: 0, bottom: 1, left: 0, right: 0 },
|
|
50
|
+
borderStyle: 'round',
|
|
51
|
+
borderColor: 'cyan',
|
|
52
|
+
}));
|
|
53
|
+
// Run the install
|
|
54
|
+
try {
|
|
55
|
+
logger.info(`Running: ${info.installCmd}`);
|
|
56
|
+
logger.newline();
|
|
57
|
+
execSync(info.installCmd, { stdio: 'inherit' });
|
|
58
|
+
logger.newline();
|
|
59
|
+
logger.success(`NEXUS CLI updated to v${info.latest} ✨`);
|
|
60
|
+
logger.info("You're now running the latest version — restart your terminal if needed.");
|
|
61
|
+
logger.newline();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
logger.error('Automatic install failed.');
|
|
65
|
+
logger.newline();
|
|
66
|
+
logger.info('Run this manually:');
|
|
67
|
+
logger.info(` ${info.installCmd}`);
|
|
68
|
+
logger.newline();
|
|
69
|
+
logger.info('Or with a specific package manager:');
|
|
70
|
+
logger.info(' npm install -g @nexus-framework/cli');
|
|
71
|
+
logger.info(' yarn global add @nexus-framework/cli');
|
|
72
|
+
logger.info(' pnpm add -g @nexus-framework/cli');
|
|
73
|
+
logger.newline();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Print a non-intrusive update notification banner.
|
|
78
|
+
* Called after every command if a newer version is detected.
|
|
79
|
+
* Designed to be fast and silent on failure.
|
|
80
|
+
*/
|
|
81
|
+
export function printUpdateBanner(info) {
|
|
82
|
+
const lines = [
|
|
83
|
+
chalk.yellow.bold(`💡 NEXUS v${info.latest} is available`)
|
|
84
|
+
+ chalk.dim(` (you have v${info.current})`),
|
|
85
|
+
'',
|
|
86
|
+
` ${chalk.bold("What's new:")} ${info.headline}`,
|
|
87
|
+
'',
|
|
88
|
+
` ${chalk.dim('Update:')} ${chalk.cyan(info.installCmd)}`,
|
|
89
|
+
` ${chalk.dim('or run:')} ${chalk.cyan('nexus update')}`,
|
|
90
|
+
].join('\n');
|
|
91
|
+
console.log(boxen(lines, {
|
|
92
|
+
padding: { top: 0, bottom: 0, left: 1, right: 1 },
|
|
93
|
+
margin: { top: 1, bottom: 0, left: 0, right: 0 },
|
|
94
|
+
borderStyle: 'single',
|
|
95
|
+
borderColor: 'yellow',
|
|
96
|
+
dimBorder: true,
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
export { currentVersion };
|
|
100
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|