@husar.ai/cli 0.4.3 → 0.4.5
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/dist/cli.js +132 -54
- package/dist/cli.js.map +1 -1
- package/dist/functions/create.d.ts +1 -1
- package/dist/functions/create.js +287 -152
- package/dist/functions/create.js.map +1 -1
- package/dist/ui.d.ts +51 -0
- package/dist/ui.js +181 -0
- package/dist/ui.js.map +1 -0
- package/package.json +10 -6
- package/src/cli.ts +183 -61
- package/src/functions/create.ts +356 -190
- package/src/ui.ts +260 -0
package/dist/cli.js
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
process.removeAllListeners('warning');
|
|
3
|
+
process.on('warning', (warning) => {
|
|
4
|
+
if (warning.name === 'DeprecationWarning' && warning.message.includes('punycode')) {
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
console.warn(warning.name, warning.message);
|
|
8
|
+
});
|
|
2
9
|
import { Command } from 'commander';
|
|
3
10
|
import { ConfigMaker } from 'config-maker';
|
|
4
11
|
import { parser } from './functions/parser.js';
|
|
@@ -8,73 +15,129 @@ import { getAdminToken } from "./types/config.js";
|
|
|
8
15
|
import { startLoginFlow } from './auth/login.js';
|
|
9
16
|
import { clearAuth, getCurrentUser, getConfigPath, isLoggedIn, readAuthConfig } from './auth/config.js';
|
|
10
17
|
import { runCreateCommand } from './functions/create.js';
|
|
18
|
+
import { printBanner, printCompactBanner, log, successBox, errorBox, infoBox, spinner, theme, chalk } from './ui.js';
|
|
11
19
|
const config = new ConfigMaker('husar', { decoders: {} });
|
|
12
20
|
const program = new Command();
|
|
13
|
-
program
|
|
21
|
+
program
|
|
22
|
+
.name('husar.ai')
|
|
23
|
+
.description(theme.muted('Headless CMS for Modern Developers'))
|
|
24
|
+
.version('0.4.3')
|
|
25
|
+
.hook('preAction', (thisCommand) => {
|
|
26
|
+
const cmdName = thisCommand.args[0];
|
|
27
|
+
if (cmdName !== 'mcp') {
|
|
28
|
+
printCompactBanner();
|
|
29
|
+
}
|
|
30
|
+
});
|
|
14
31
|
program
|
|
15
32
|
.command('generate [folderPath]')
|
|
16
|
-
.description('Generate cms structure
|
|
33
|
+
.description('Generate cms/ structure with GraphQL client')
|
|
17
34
|
.action(async (folderPath = '.') => {
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
35
|
+
const spin = spinner('Loading configuration...');
|
|
36
|
+
try {
|
|
37
|
+
const host = await config.getValueOrThrow('host', { saveOnInput: true });
|
|
38
|
+
const conf = config.get();
|
|
39
|
+
const hostEnv = conf.hostEnvironmentVariable;
|
|
40
|
+
const authenticationEnv = conf.authenticationEnvironmentVariable;
|
|
41
|
+
spin.text = 'Generating CMS client...';
|
|
42
|
+
await generateCms({
|
|
43
|
+
baseFolder: folderPath,
|
|
44
|
+
host,
|
|
45
|
+
hostEnvironmentVariable: hostEnv,
|
|
46
|
+
authenticationEnvironmentVariable: authenticationEnv,
|
|
47
|
+
});
|
|
48
|
+
spin.succeed('CMS client generated successfully');
|
|
49
|
+
log.blank();
|
|
50
|
+
log.done(`Generated in ${theme.info(folderPath + '/cms/')}`);
|
|
51
|
+
log.substep('zeus/ - GraphQL Zeus client');
|
|
52
|
+
log.substep('ssr.ts - Server-side client');
|
|
53
|
+
log.substep('react.ts - React components');
|
|
54
|
+
log.substep('host.ts - Host configuration');
|
|
55
|
+
log.blank();
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
spin.fail('Generation failed');
|
|
59
|
+
log.error(err.message);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
28
62
|
});
|
|
29
63
|
program
|
|
30
64
|
.command('copy <inputFile> <name>')
|
|
31
|
-
.description('AI-parse HTML/JSX and upsert into CMS
|
|
65
|
+
.description('AI-parse HTML/JSX and upsert into CMS')
|
|
32
66
|
.option('-t, --type <type>', 'target type: model|shape', 'shape')
|
|
33
67
|
.action(async (inputFile, name, opts) => {
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
68
|
+
const spin = spinner(`Parsing ${inputFile}...`);
|
|
69
|
+
try {
|
|
70
|
+
const conf = config.get();
|
|
71
|
+
if (!conf.host) {
|
|
72
|
+
spin.fail('Host not configured');
|
|
73
|
+
errorBox('Please run "husar.ai generate" first to configure your CMS host.');
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
const adminToken = getAdminToken(conf);
|
|
77
|
+
if (!adminToken) {
|
|
78
|
+
spin.fail('Admin token not configured');
|
|
79
|
+
errorBox('Set HUSAR_ADMIN_TOKEN environment variable,\nor add adminTokenEnv to husar.json', 'Authentication Required');
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
spin.text = `AI parsing ${inputFile}...`;
|
|
83
|
+
const result = await parser({
|
|
84
|
+
inputFile,
|
|
85
|
+
opts: { name, type: opts?.type },
|
|
86
|
+
authentication: { HUSAR_MCP_HOST: conf.host, HUSAR_MCP_ADMIN_TOKEN: adminToken },
|
|
87
|
+
});
|
|
88
|
+
if (result) {
|
|
89
|
+
spin.succeed(`Parsed and upserted as ${opts?.type || 'shape'}: ${name}`);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
spin.fail('Failed to parse file');
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
37
95
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
96
|
+
catch (err) {
|
|
97
|
+
spin.fail('Parse failed');
|
|
98
|
+
log.error(err.message);
|
|
99
|
+
process.exit(1);
|
|
41
100
|
}
|
|
42
|
-
const result = await parser({
|
|
43
|
-
inputFile,
|
|
44
|
-
opts: { name, type: opts?.type },
|
|
45
|
-
authentication: { HUSAR_MCP_HOST: conf.host, HUSAR_MCP_ADMIN_TOKEN: adminToken },
|
|
46
|
-
});
|
|
47
|
-
console.log(result ? 'File parsed and upserted successfully.' : 'Failed to parse and upsert file.');
|
|
48
101
|
});
|
|
49
102
|
program
|
|
50
103
|
.command('mcp')
|
|
51
|
-
.description('
|
|
104
|
+
.description('Start MCP server for AI IDE integration')
|
|
52
105
|
.action(async () => {
|
|
53
106
|
await startMcpServer();
|
|
54
107
|
await new Promise(() => { });
|
|
55
108
|
});
|
|
56
109
|
program
|
|
57
110
|
.command('login')
|
|
58
|
-
.description('Log in to Husar.ai via browser
|
|
111
|
+
.description('Log in to Husar.ai via browser')
|
|
59
112
|
.action(async () => {
|
|
60
113
|
const loggedIn = await isLoggedIn();
|
|
61
114
|
if (loggedIn) {
|
|
62
115
|
const user = await getCurrentUser();
|
|
63
|
-
|
|
64
|
-
|
|
116
|
+
infoBox(`Logged in as ${theme.info(user?.email ?? 'unknown')}\n\n` +
|
|
117
|
+
`Run ${theme.muted('husar.ai logout')} to switch accounts.`, 'Already Authenticated');
|
|
65
118
|
return;
|
|
66
119
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
120
|
+
const spin = spinner('Opening browser for authentication...');
|
|
121
|
+
try {
|
|
122
|
+
const result = await startLoginFlow();
|
|
123
|
+
if (result.success) {
|
|
124
|
+
spin.succeed('Authentication successful');
|
|
125
|
+
const details = [`Email: ${theme.info(result.email ?? 'unknown')}`];
|
|
126
|
+
if (result.project) {
|
|
127
|
+
details.push(`Project: ${theme.info(result.project.projectName)}`);
|
|
128
|
+
details.push(`Host: ${theme.muted(result.project.host)}`);
|
|
129
|
+
}
|
|
130
|
+
successBox(details.join('\n'), 'Logged In');
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
spin.fail('Authentication failed');
|
|
134
|
+
errorBox(result.error ?? 'Unknown error');
|
|
135
|
+
process.exit(1);
|
|
74
136
|
}
|
|
75
137
|
}
|
|
76
|
-
|
|
77
|
-
|
|
138
|
+
catch (err) {
|
|
139
|
+
spin.fail('Login failed');
|
|
140
|
+
log.error(err.message);
|
|
78
141
|
process.exit(1);
|
|
79
142
|
}
|
|
80
143
|
});
|
|
@@ -84,49 +147,64 @@ program
|
|
|
84
147
|
.action(async () => {
|
|
85
148
|
const loggedIn = await isLoggedIn();
|
|
86
149
|
if (!loggedIn) {
|
|
87
|
-
|
|
150
|
+
log.info('Not logged in.');
|
|
88
151
|
return;
|
|
89
152
|
}
|
|
90
153
|
const user = await getCurrentUser();
|
|
154
|
+
const spin = spinner('Clearing credentials...');
|
|
91
155
|
await clearAuth();
|
|
92
|
-
|
|
93
|
-
|
|
156
|
+
spin.succeed('Logged out successfully');
|
|
157
|
+
log.dim(`Was: ${user?.email ?? 'unknown'}`);
|
|
158
|
+
log.dim(`Cleared: ${getConfigPath()}`);
|
|
94
159
|
});
|
|
95
160
|
program
|
|
96
161
|
.command('whoami')
|
|
97
|
-
.description('Display current
|
|
162
|
+
.description('Display current user and connected projects')
|
|
98
163
|
.action(async () => {
|
|
99
164
|
const loggedIn = await isLoggedIn();
|
|
100
165
|
if (!loggedIn) {
|
|
101
|
-
|
|
166
|
+
infoBox(`Not logged in.\n\nRun ${theme.info('husar.ai login')} to authenticate.`, 'Authentication Status');
|
|
102
167
|
return;
|
|
103
168
|
}
|
|
104
169
|
const user = await getCurrentUser();
|
|
105
170
|
const authConfig = await readAuthConfig();
|
|
106
|
-
console.log(
|
|
171
|
+
console.log();
|
|
172
|
+
console.log(chalk.bold(' Account'));
|
|
173
|
+
console.log(` ${theme.muted('Email')} ${theme.info(user?.email ?? 'unknown')}`);
|
|
174
|
+
console.log(` ${theme.muted('Config')} ${getConfigPath()}`);
|
|
107
175
|
if (authConfig.projects && Object.keys(authConfig.projects).length > 0) {
|
|
108
|
-
console.log(
|
|
176
|
+
console.log();
|
|
177
|
+
console.log(chalk.bold(' Connected Projects'));
|
|
109
178
|
for (const [name, project] of Object.entries(authConfig.projects)) {
|
|
110
|
-
console.log(`
|
|
111
|
-
console.log(`
|
|
179
|
+
console.log(` ${theme.primary('•')} ${name}`);
|
|
180
|
+
console.log(` ${theme.muted(project.host)}`);
|
|
112
181
|
}
|
|
113
182
|
}
|
|
114
|
-
|
|
115
|
-
console.log('\nNo projects connected. Run "husar create" to set up a new project.');
|
|
116
|
-
}
|
|
117
|
-
console.log(`\n📁 Config: ${getConfigPath()}`);
|
|
183
|
+
console.log();
|
|
118
184
|
});
|
|
119
185
|
program
|
|
120
186
|
.command('create [projectName]')
|
|
121
|
-
.description('Create a new project with Husar CMS
|
|
122
|
-
.option('-f, --framework <framework>', '
|
|
123
|
-
.option('--skip-install', 'Skip
|
|
187
|
+
.description('Create a new project with Husar CMS')
|
|
188
|
+
.option('-f, --framework <framework>', 'nextjs, vite, or clean (interactive if not specified)')
|
|
189
|
+
.option('--skip-install', 'Skip npm install after scaffolding')
|
|
124
190
|
.action(async (projectName, opts) => {
|
|
191
|
+
printBanner('Project Creator');
|
|
125
192
|
await runCreateCommand({
|
|
126
193
|
projectName,
|
|
127
194
|
framework: opts.framework,
|
|
128
195
|
skipInstall: opts.skipInstall,
|
|
129
196
|
});
|
|
130
197
|
});
|
|
198
|
+
program.addHelpText('before', () => {
|
|
199
|
+
printBanner();
|
|
200
|
+
return '';
|
|
201
|
+
});
|
|
202
|
+
program.addHelpText('after', () => {
|
|
203
|
+
console.log();
|
|
204
|
+
console.log(theme.muted(' Documentation:'), theme.link('https://docs.husar.ai'));
|
|
205
|
+
console.log(theme.muted(' Discord:'), theme.link('https://discord.gg/husar'));
|
|
206
|
+
console.log();
|
|
207
|
+
return '';
|
|
208
|
+
});
|
|
131
209
|
program.parse(process.argv);
|
|
132
210
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|