@nexical/cli-core 0.1.0 → 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.
- package/README.md +195 -0
- package/cli.ts +9 -0
- package/dist/chunk-2HJDWSDA.js +19 -0
- package/dist/chunk-2HJDWSDA.js.map +1 -0
- package/dist/chunk-C4IL52NB.js +2 -0
- package/dist/chunk-C4IL52NB.js.map +1 -0
- package/dist/chunk-CKAS75E6.js +67 -0
- package/dist/chunk-CKAS75E6.js.map +1 -0
- package/dist/chunk-IIOHHU2E.js +48 -0
- package/dist/chunk-IIOHHU2E.js.map +1 -0
- package/dist/chunk-LLXEFSKN.js +69 -0
- package/dist/chunk-LLXEFSKN.js.map +1 -0
- package/dist/chunk-SNTKHUTX.js +29 -0
- package/dist/chunk-SNTKHUTX.js.map +1 -0
- package/dist/chunk-Z4RQIDDY.js +255 -0
- package/dist/chunk-Z4RQIDDY.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +15 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/src/BaseCommand.d.ts +21 -0
- package/dist/src/BaseCommand.js +10 -0
- package/dist/src/BaseCommand.js.map +1 -0
- package/dist/src/CLI.d.ts +23 -0
- package/dist/src/CLI.js +10 -0
- package/dist/src/CLI.js.map +1 -0
- package/dist/src/CommandInterface.d.ts +21 -0
- package/dist/src/CommandInterface.js +3 -0
- package/dist/src/CommandInterface.js.map +1 -0
- package/dist/src/CommandLoader.d.ts +20 -0
- package/dist/src/CommandLoader.js +9 -0
- package/dist/src/CommandLoader.js.map +1 -0
- package/dist/src/commands/help.d.ts +19 -0
- package/dist/src/commands/help.js +134 -0
- package/dist/src/commands/help.js.map +1 -0
- package/dist/src/utils/config.d.ts +7 -0
- package/dist/src/utils/config.js +13 -0
- package/dist/src/utils/config.js.map +1 -0
- package/dist/src/utils/logger.d.ts +6 -0
- package/dist/src/utils/logger.js +10 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/shell.d.ts +3 -0
- package/dist/src/utils/shell.js +9 -0
- package/dist/src/utils/shell.js.map +1 -0
- package/index.ts +5 -7
- package/package.json +7 -2
- package/src/utils/logger.ts +2 -2
- package/test/utils/integration-helpers.ts +1 -1
- package/tsconfig.json +2 -2
- package/tsup.config.ts +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/help.ts"],"sourcesContent":["import { BaseCommand } from '../BaseCommand.js';\nimport pc from 'picocolors';\n\nexport default class HelpCommand extends BaseCommand {\n static description = 'Display help for commands.';\n\n static args = {\n args: [\n { name: 'command...', required: false, description: 'Command name to get help for' }\n ],\n options: []\n };\n\n async run(options: any) {\n const commandParts = options.command || [];\n const query = commandParts.join(' ');\n\n if (!query) {\n // General help\n this.printGlobalHelp();\n return;\n }\n\n // Search for specific command or namespace\n const commands = this.cli.getCommands();\n\n // Exact match?\n const exactMatch = commands.find((c: any) => c.command === query);\n if (exactMatch) {\n // Try to find CAC command if it exists (e.g. top-level commands like 'init')\n // For subcommands (e.g. 'module add'), CAC might only have 'module <subcommand>', \n // so cacCmd will be undefined for the exact query.\n const cacCmd = this.cli.getRawCLI().commands.find((c: any) => c.name === query);\n\n this.printCommandHelp(exactMatch, cacCmd);\n return;\n }\n\n // Namespace match? (e.g. \"module\" matches \"module add\", \"module remove\")\n const namespaceMatches = commands.filter((c: any) => c.command.startsWith(query + ' '));\n\n if (namespaceMatches.length > 0) {\n console.log(`\\n Commands for ${pc.bold(query)}:\\n`);\n for (const cmd of namespaceMatches) {\n const name = cmd.command;\n const desc = cmd.class.description || '';\n console.log(` ${pc.cyan(name.padEnd(20))} ${desc}`);\n }\n console.log('');\n return;\n }\n\n this.error(`Unknown command: ${query}`);\n }\n\n private printGlobalHelp() {\n const commands = this.cli.getCommands();\n const bin = this.cli.name;\n\n console.log('');\n console.log(` Usage: ${pc.cyan(bin)} <command> [options]`);\n console.log('');\n console.log(' Commands:');\n console.log('');\n\n for (const cmd of commands) {\n const name = cmd.command;\n const desc = cmd.class.description || '';\n console.log(` ${pc.cyan(name.padEnd(25))} ${desc}`);\n }\n\n console.log('');\n console.log(' Options:');\n console.log('');\n console.log(` ${pc.yellow('--help'.padEnd(25))} Display this message`);\n console.log(` ${pc.yellow('--version'.padEnd(25))} Display version number`);\n console.log(` ${pc.yellow('--root-dir <path>'.padEnd(25))} Override project root`);\n console.log(` ${pc.yellow('--debug'.padEnd(25))} Enable debug mode`);\n console.log('');\n }\n\n private printCommandHelp(loadedCommand: any, cacCmd?: any) {\n const CommandClass = loadedCommand.class;\n\n let usage = CommandClass.usage;\n if (!usage && cacCmd) usage = cacCmd.rawName;\n\n // Fallback: construct usage from args definition if usage is missing\n if (!usage) {\n let tempUsage = loadedCommand.command;\n const args = CommandClass.args?.args || [];\n args.forEach((arg: any) => {\n const isVariadic = arg.name.endsWith('...');\n const cleanName = isVariadic ? arg.name.slice(0, -3) : arg.name;\n if (arg.required) tempUsage += isVariadic ? ` <...${cleanName}>` : ` <${cleanName}>`;\n else tempUsage += isVariadic ? ` [...${cleanName}]` : ` [${cleanName}]`;\n });\n usage = tempUsage;\n }\n\n console.log('');\n console.log(` Usage: ${pc.cyan(usage)}`);\n console.log('');\n\n const description = CommandClass.description || (cacCmd && cacCmd.description) || '';\n console.log(` ${description}`);\n console.log('');\n\n // Arguments\n // Prefer class definition (or cacCmd definition if we wanted, but class is source of truth for our commands)\n const argsDef = CommandClass.args?.args;\n if (argsDef && Array.isArray(argsDef) && argsDef.length > 0) {\n console.log(' Arguments:');\n for (const arg of argsDef) {\n const name = arg.name;\n const desc = arg.description || '';\n const required = arg.required ? ' (required)' : '';\n console.log(` ${pc.cyan(name.padEnd(25))} ${desc}${pc.dim(required)}`);\n }\n console.log('');\n }\n\n // Options\n const optionsList = [];\n\n if (cacCmd) {\n // If CAC command exists, use its parsed options (includes globals)\n optionsList.push(...cacCmd.options);\n } else {\n // Reconstruct options from Class + Globals\n const classOptions = CommandClass.args?.options || [];\n\n for (const opt of classOptions) {\n optionsList.push({\n rawName: opt.name, // e.g. '--repo <url>'\n description: opt.description,\n config: { default: opt.default }\n });\n }\n\n // Append Global Options manually since they are always available\n optionsList.push({ rawName: '--help', description: 'Display this message', config: {} });\n optionsList.push({ rawName: '--version', description: 'Display version number', config: {} });\n optionsList.push({ rawName: '--root-dir <path>', description: 'Override project root', config: {} });\n optionsList.push({ rawName: '--debug', description: 'Enable debug mode', config: {} });\n }\n\n if (optionsList.length > 0) {\n console.log(' Options:');\n for (const opt of optionsList) {\n const flags = opt.rawName.padEnd(25);\n const desc = opt.description || '';\n const def = opt.config?.default ? ` (default: ${opt.config.default})` : '';\n console.log(` ${pc.yellow(flags)} ${desc}${pc.dim(def)}`);\n }\n console.log('');\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Loader } from 'lilconfig';
|
|
2
|
+
|
|
3
|
+
declare const loadYaml: Loader;
|
|
4
|
+
declare function findProjectRoot(commandName: string, startDir: string): Promise<string | null>;
|
|
5
|
+
declare function loadConfig(commandName: string, rootDir: string): Promise<any>;
|
|
6
|
+
|
|
7
|
+
export { findProjectRoot, loadConfig, loadYaml };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createRequire } from "module"; const require = createRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
findProjectRoot,
|
|
4
|
+
loadConfig,
|
|
5
|
+
loadYaml
|
|
6
|
+
} from "../../chunk-IIOHHU2E.js";
|
|
7
|
+
import "../../chunk-2HJDWSDA.js";
|
|
8
|
+
export {
|
|
9
|
+
findProjectRoot,
|
|
10
|
+
loadConfig,
|
|
11
|
+
loadYaml
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/index.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export { CLI, CLIConfig } from './src/CLI.js';
|
|
2
|
+
export { BaseCommand } from './src/BaseCommand.js';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export { logger, setDebugMode } from './src/utils/logger.js';
|
|
5
|
+
export { runCommand } from './src/utils/shell.js';
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const app = new CLI();
|
|
9
|
-
app.start();
|
|
7
|
+
export * from './src/CommandInterface.js';
|
package/package.json
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nexical/cli-core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"type": "module",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./dist/index.js"
|
|
9
|
+
},
|
|
5
10
|
"scripts": {
|
|
6
11
|
"build": "tsup",
|
|
7
12
|
"dev": "tsup --watch",
|
|
8
|
-
"cli": "node dist/
|
|
13
|
+
"cli": "node dist/cli.js",
|
|
9
14
|
"test": "npm run test:unit && npm run test:integration && npm run test:e2e",
|
|
10
15
|
"test:unit": "vitest run --config vitest.config.ts --coverage",
|
|
11
16
|
"test:integration": "vitest run --config vitest.integration.config.ts",
|
package/src/utils/logger.ts
CHANGED
|
@@ -2,9 +2,9 @@ import { consola, LogLevels } from 'consola';
|
|
|
2
2
|
|
|
3
3
|
export const logger = consola.create({
|
|
4
4
|
defaults: {
|
|
5
|
-
tag: '
|
|
5
|
+
tag: 'CLI',
|
|
6
6
|
},
|
|
7
|
-
level: LogLevels.info
|
|
7
|
+
level: LogLevels.info
|
|
8
8
|
});
|
|
9
9
|
|
|
10
10
|
export function setDebugMode(enabled: boolean) {
|
|
@@ -4,7 +4,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
4
4
|
|
|
5
5
|
// Constants
|
|
6
6
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
-
export const CLI_BIN = path.resolve(__dirname, '../../dist/
|
|
7
|
+
export const CLI_BIN = path.resolve(__dirname, '../../dist/cli.js');
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Runs the CLI command against the compiled binary (E2E style)
|
package/tsconfig.json
CHANGED