@airdraft/cli 0.1.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/CHANGELOG.md +5 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +225 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands.d.ts +136 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +614 -0
- package/dist/commands.js.map +1 -0
- package/dist/github.d.ts +75 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +234 -0
- package/dist/github.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
package/CHANGELOG.md
ADDED
package/dist/bin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
|
package/dist/bin.js
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { initProject, validateConfig, printSchema, generateSecret, generateTypes, createUser, loginCloud } from './commands.js';
|
|
4
|
+
import { readFile } from 'node:fs/promises';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { createInterface } from 'node:readline';
|
|
7
|
+
const program = new Command();
|
|
8
|
+
program
|
|
9
|
+
.name('airdraft')
|
|
10
|
+
.description('Airdraft CMS CLI — scaffold, validate, and manage your git-native CMS')
|
|
11
|
+
.version('0.1.0');
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// airdraft init
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
program
|
|
16
|
+
.command('init')
|
|
17
|
+
.description('Scaffold Airdraft config and route handler into the current Next.js project')
|
|
18
|
+
.option('--force', 'Overwrite existing files', false)
|
|
19
|
+
.option('--cwd <dir>', 'Target directory (defaults to process.cwd())')
|
|
20
|
+
.option('--mode <mode>', 'Setup mode: cloud-app | own-app-auto | own-app-manual (prompts if omitted)')
|
|
21
|
+
.action(async (opts) => {
|
|
22
|
+
console.log('Initializing Airdraft...\n');
|
|
23
|
+
const validModes = ['cloud-app', 'own-app-auto', 'own-app-manual'];
|
|
24
|
+
if (opts.mode && !validModes.includes(opts.mode)) {
|
|
25
|
+
console.error(`Invalid --mode "${opts.mode}". Must be one of: ${validModes.join(', ')}`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
await initProject({
|
|
30
|
+
cwd: opts.cwd,
|
|
31
|
+
force: opts.force,
|
|
32
|
+
mode: opts.mode,
|
|
33
|
+
log: (msg) => console.log(msg),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
console.error('init failed:', err instanceof Error ? err.message : err);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// airdraft validate
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
program
|
|
45
|
+
.command('validate')
|
|
46
|
+
.description('Validate airdraft.config.json for schema correctness')
|
|
47
|
+
.option('--config <path>', 'Path to config file (default: ./airdraft.config.json)')
|
|
48
|
+
.option('--cwd <dir>', 'Working directory (defaults to process.cwd())')
|
|
49
|
+
.action(async (opts) => {
|
|
50
|
+
console.log('Validating Airdraft config...\n');
|
|
51
|
+
const result = await validateConfig({
|
|
52
|
+
configPath: opts.config,
|
|
53
|
+
cwd: opts.cwd,
|
|
54
|
+
log: (msg) => console.log(msg),
|
|
55
|
+
error: (msg) => console.error(msg),
|
|
56
|
+
});
|
|
57
|
+
process.exit(result.valid ? 0 : 1);
|
|
58
|
+
});
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// airdraft schema
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
program
|
|
63
|
+
.command('schema')
|
|
64
|
+
.description('Print the schema derived from your Airdraft config')
|
|
65
|
+
.option('--config <path>', 'Path to config file (default: ./airdraft.config.json)')
|
|
66
|
+
.option('--cwd <dir>', 'Working directory (defaults to process.cwd())')
|
|
67
|
+
.action(async (opts) => {
|
|
68
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
69
|
+
const configPath = opts.config ?? join(cwd, 'airdraft.config.json');
|
|
70
|
+
try {
|
|
71
|
+
const raw = await readFile(configPath, 'utf8');
|
|
72
|
+
const config = JSON.parse(raw);
|
|
73
|
+
console.log(printSchema({ collections: config.collections }));
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
console.error('Failed to read config:', err instanceof Error ? err.message : err);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// airdraft generate-secret (C7)
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
program
|
|
84
|
+
.command('generate-secret')
|
|
85
|
+
.description('Generate a random 64-char hex secret for AIRDRAFT_JWT_SECRET')
|
|
86
|
+
.action(() => {
|
|
87
|
+
const secret = generateSecret();
|
|
88
|
+
console.log(secret);
|
|
89
|
+
console.log('\nAdd to your .env.local:');
|
|
90
|
+
console.log(`AIRDRAFT_JWT_SECRET=${secret}`);
|
|
91
|
+
});
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// airdraft generate-types
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
program
|
|
96
|
+
.command('generate-types [source]')
|
|
97
|
+
.description('Generate TypeScript types from your Airdraft schema.\n\n' +
|
|
98
|
+
' [source] Local JSON file path or HTTP(S) URL to /api/cms/schema.\n' +
|
|
99
|
+
' Defaults to ./airdraft.schema.json')
|
|
100
|
+
.option('--out <path>', 'Output file (default: ./lib/cms-types.ts)')
|
|
101
|
+
.option('--api-key <key>', 'API key for authenticated schema endpoints ($CMS_API_KEY if unset)')
|
|
102
|
+
.option('--cwd <dir>', 'Working directory (defaults to process.cwd())')
|
|
103
|
+
.action(async (source, opts) => {
|
|
104
|
+
try {
|
|
105
|
+
await generateTypes({
|
|
106
|
+
source,
|
|
107
|
+
out: opts.out,
|
|
108
|
+
apiKey: opts.apiKey ?? process.env.CMS_API_KEY,
|
|
109
|
+
cwd: opts.cwd,
|
|
110
|
+
log: (msg) => console.log(msg),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
console.error('generate-types failed:', err instanceof Error ? err.message : err);
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
function prompt(question) {
|
|
119
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
120
|
+
return new Promise((resolve) => {
|
|
121
|
+
rl.question(question, (answer) => {
|
|
122
|
+
rl.close();
|
|
123
|
+
resolve(answer.trim());
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function promptPassword(question) {
|
|
128
|
+
return new Promise((resolve) => {
|
|
129
|
+
process.stdout.write(question);
|
|
130
|
+
// Hide typed characters
|
|
131
|
+
if (process.stdin.isTTY)
|
|
132
|
+
process.stdin.setRawMode(true);
|
|
133
|
+
let password = '';
|
|
134
|
+
process.stdin.resume();
|
|
135
|
+
process.stdin.setEncoding('utf8');
|
|
136
|
+
const onData = (char) => {
|
|
137
|
+
if (char === '\r' || char === '\n' || char === '\u0003') {
|
|
138
|
+
if (char === '\u0003')
|
|
139
|
+
process.exit();
|
|
140
|
+
if (process.stdin.isTTY)
|
|
141
|
+
process.stdin.setRawMode(false);
|
|
142
|
+
process.stdin.pause();
|
|
143
|
+
process.stdin.removeListener('data', onData);
|
|
144
|
+
process.stdout.write('\n');
|
|
145
|
+
resolve(password);
|
|
146
|
+
}
|
|
147
|
+
else if (char === '\u007f' || char === '\b') {
|
|
148
|
+
password = password.slice(0, -1);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
password += char;
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
process.stdin.on('data', onData);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
// airdraft create-user
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
program
|
|
161
|
+
.command('create-user')
|
|
162
|
+
.description('Create a new user in the local UserStore (.airdraft/users.json)')
|
|
163
|
+
.option('--email <email>', 'User email address')
|
|
164
|
+
.option('--role <role>', 'Role: admin | publisher | editor (default: editor)')
|
|
165
|
+
.option('--name <name>', 'Display name (optional)')
|
|
166
|
+
.option('--cwd <dir>', 'Working directory (defaults to process.cwd())')
|
|
167
|
+
.action(async (opts) => {
|
|
168
|
+
const validRoles = ['admin', 'publisher', 'editor'];
|
|
169
|
+
let email = opts.email ?? '';
|
|
170
|
+
if (!email)
|
|
171
|
+
email = await prompt('Email: ');
|
|
172
|
+
if (!email) {
|
|
173
|
+
console.error('Email is required.');
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
let role = (opts.role ?? '');
|
|
177
|
+
if (!role) {
|
|
178
|
+
const r = await prompt('Role (admin/publisher/editor) [editor]: ');
|
|
179
|
+
role = (r || 'editor');
|
|
180
|
+
}
|
|
181
|
+
if (!validRoles.includes(role)) {
|
|
182
|
+
console.error(`Invalid role "${role}". Must be one of: ${validRoles.join(', ')}`);
|
|
183
|
+
process.exit(1);
|
|
184
|
+
}
|
|
185
|
+
let name = opts.name;
|
|
186
|
+
if (name === undefined) {
|
|
187
|
+
const n = await prompt('Display name (optional): ');
|
|
188
|
+
name = n || undefined;
|
|
189
|
+
}
|
|
190
|
+
const password = await promptPassword('Password: ');
|
|
191
|
+
if (!password) {
|
|
192
|
+
console.error('Password is required.');
|
|
193
|
+
process.exit(1);
|
|
194
|
+
}
|
|
195
|
+
const confirm = await promptPassword('Confirm password: ');
|
|
196
|
+
if (password !== confirm) {
|
|
197
|
+
console.error('Passwords do not match.');
|
|
198
|
+
process.exit(1);
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
await createUser({ email, password, role: role, name, cwd: opts.cwd });
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
console.error('Failed:', err instanceof Error ? err.message : err);
|
|
205
|
+
process.exit(1);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
// airdraft login
|
|
210
|
+
// ---------------------------------------------------------------------------
|
|
211
|
+
program
|
|
212
|
+
.command('login')
|
|
213
|
+
.description('Authenticate the CLI with Airdraft Cloud')
|
|
214
|
+
.option('--cloud-url <url>', 'Cloud dashboard URL (default: https://app.airdraft.space)')
|
|
215
|
+
.action(async (opts) => {
|
|
216
|
+
try {
|
|
217
|
+
await loginCloud({ cloudUrl: opts.cloudUrl, log: (msg) => console.log(msg) });
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
console.error('login failed:', err instanceof Error ? err.message : err);
|
|
221
|
+
process.exit(1);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
program.parse(process.argv);
|
|
225
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import type { CmsSchema } from '@airdraft/core';
|
|
2
|
+
import type { Role } from '@airdraft/plugin-auth';
|
|
3
|
+
export interface AirdraftConfigFile {
|
|
4
|
+
basePath?: string;
|
|
5
|
+
adapter?: 'github' | 'local';
|
|
6
|
+
collections: Record<string, {
|
|
7
|
+
path: string;
|
|
8
|
+
format: 'mdx' | 'json' | 'yaml';
|
|
9
|
+
fields: Record<string, {
|
|
10
|
+
type: string;
|
|
11
|
+
required?: boolean;
|
|
12
|
+
}>;
|
|
13
|
+
publish?: boolean;
|
|
14
|
+
slugSource?: string;
|
|
15
|
+
}>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Deployment mode selected during `airdraft init`.
|
|
19
|
+
* - `cloud-app` — Mode 2: use Airdraft's hosted GitHub App (project key from dashboard)
|
|
20
|
+
* - `own-app-auto` — Mode 3: register your own GitHub App via App Manifest (browser flow)
|
|
21
|
+
* - `own-app-manual` — Mode 3: enter GitHub App credentials manually
|
|
22
|
+
*/
|
|
23
|
+
export type InitMode = 'cloud-app' | 'own-app-auto' | 'own-app-manual';
|
|
24
|
+
/**
|
|
25
|
+
* Pre-filled credentials for non-interactive usage (testing, scripting, CI).
|
|
26
|
+
* Any field that is provided skips the corresponding interactive prompt.
|
|
27
|
+
*/
|
|
28
|
+
export interface InitCredentials {
|
|
29
|
+
/** Mode 2 only — Airdraft project key (ntk_...) */
|
|
30
|
+
projectKey?: string;
|
|
31
|
+
/** Mode 3 only — GitHub App ID */
|
|
32
|
+
appId?: string;
|
|
33
|
+
/** Mode 3 only — RSA PEM private key */
|
|
34
|
+
privateKey?: string;
|
|
35
|
+
/** Mode 3 only — GitHub App installation ID */
|
|
36
|
+
installationId?: string;
|
|
37
|
+
/** Both modes — "owner/repo" */
|
|
38
|
+
repo?: string;
|
|
39
|
+
/** Both modes — default branch (default: "main") */
|
|
40
|
+
branch?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface InitOptions {
|
|
43
|
+
/** Target directory (defaults to cwd) */
|
|
44
|
+
cwd?: string;
|
|
45
|
+
/** Force overwrite of existing files */
|
|
46
|
+
force?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Deployment mode. If omitted, the user is prompted interactively.
|
|
49
|
+
* - `cloud-app` — Mode 2: Airdraft's GitHub App (needs cloud project key)
|
|
50
|
+
* - `own-app-auto` — Mode 3: register own App via GitHub App Manifest (browser flow)
|
|
51
|
+
* - `own-app-manual` — Mode 3: enter GitHub App credentials manually
|
|
52
|
+
*/
|
|
53
|
+
mode?: InitMode;
|
|
54
|
+
/**
|
|
55
|
+
* Pre-filled credentials — skips interactive prompts for the provided fields.
|
|
56
|
+
* Useful for testing and non-interactive CI usage.
|
|
57
|
+
*/
|
|
58
|
+
credentials?: InitCredentials;
|
|
59
|
+
/** Logger callback for progress messages */
|
|
60
|
+
log?: (msg: string) => void;
|
|
61
|
+
}
|
|
62
|
+
export declare function initProject(opts?: InitOptions): Promise<void>;
|
|
63
|
+
export interface ValidateOptions {
|
|
64
|
+
/** Path to the config file. Defaults to airdraft.config.json in cwd */
|
|
65
|
+
configPath?: string;
|
|
66
|
+
cwd?: string;
|
|
67
|
+
log?: (msg: string) => void;
|
|
68
|
+
error?: (msg: string) => void;
|
|
69
|
+
}
|
|
70
|
+
export interface ValidateResult {
|
|
71
|
+
valid: boolean;
|
|
72
|
+
errors: string[];
|
|
73
|
+
warnings: string[];
|
|
74
|
+
}
|
|
75
|
+
export declare function validateConfig(opts?: ValidateOptions): Promise<ValidateResult>;
|
|
76
|
+
export declare function printSchema(schema: CmsSchema): string;
|
|
77
|
+
/**
|
|
78
|
+
* Generates a cryptographically random 64-character hex secret suitable for
|
|
79
|
+
* use as `AIRDRAFT_JWT_SECRET`.
|
|
80
|
+
*
|
|
81
|
+
* Usage:
|
|
82
|
+
* npx airdraft generate-secret
|
|
83
|
+
*/
|
|
84
|
+
export declare function generateSecret(): string;
|
|
85
|
+
export interface GenerateTypesOptions {
|
|
86
|
+
/**
|
|
87
|
+
* Where to read the schema from. Accepts:
|
|
88
|
+
* - A local file path (e.g. `./airdraft.schema.json`)
|
|
89
|
+
* - An HTTP/HTTPS URL (e.g. `https://your-project.airdraft.cloud/api/cms/schema`)
|
|
90
|
+
*
|
|
91
|
+
* Defaults to `./airdraft.schema.json` in the current working directory.
|
|
92
|
+
*/
|
|
93
|
+
source?: string;
|
|
94
|
+
/** Output file path for the generated TypeScript. Defaults to `./lib/cms-types.ts`. */
|
|
95
|
+
out?: string;
|
|
96
|
+
/** API key sent as `x-api-key` header when fetching from a URL. */
|
|
97
|
+
apiKey?: string;
|
|
98
|
+
cwd?: string;
|
|
99
|
+
log?: (msg: string) => void;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Reads an Airdraft schema (from a local JSON file or a live API endpoint) and
|
|
103
|
+
* writes typed TypeScript interfaces to the output file.
|
|
104
|
+
*
|
|
105
|
+
* Works with:
|
|
106
|
+
* - Local file: `airdraft.schema.json` in the project root
|
|
107
|
+
* - Local dev server: `http://localhost:3000/api/cms/schema`
|
|
108
|
+
* - Airdraft Cloud: `https://your-project.airdraft.cloud/api/cms/schema`
|
|
109
|
+
*/
|
|
110
|
+
export declare function generateTypes(opts?: GenerateTypesOptions): Promise<void>;
|
|
111
|
+
export interface LoginOptions {
|
|
112
|
+
/** Cloud dashboard base URL. Defaults to https://app.airdraft.space */
|
|
113
|
+
cloudUrl?: string;
|
|
114
|
+
log?: (msg: string) => void;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Opens a browser for CLI authentication against Airdraft Cloud.
|
|
118
|
+
*
|
|
119
|
+
* Flow:
|
|
120
|
+
* 1. Start a local one-shot HTTP server on a free port.
|
|
121
|
+
* 2. Open `${cloudUrl}/auth/cli/auth?callback=http://localhost:{port}/` in the browser.
|
|
122
|
+
* 3. Cloud dashboard signs a short-lived JWT and redirects back with `?token=…`.
|
|
123
|
+
* 4. Store the token in `~/.config/airdraft/credentials.json`.
|
|
124
|
+
*/
|
|
125
|
+
export declare function loginCloud(opts?: LoginOptions): Promise<void>;
|
|
126
|
+
export interface CreateUserOptions {
|
|
127
|
+
email: string;
|
|
128
|
+
password: string;
|
|
129
|
+
role: Role;
|
|
130
|
+
name?: string;
|
|
131
|
+
/** Target directory whose `.airdraft/users.json` will be written. Defaults to cwd. */
|
|
132
|
+
cwd?: string;
|
|
133
|
+
log?: (msg: string) => void;
|
|
134
|
+
}
|
|
135
|
+
export declare function createUser(opts: CreateUserOptions): Promise<void>;
|
|
136
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|