@graspful/cli 0.2.1 → 0.2.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 +7 -5
- package/dist/commands/create-brand.d.ts.map +1 -1
- package/dist/commands/create-brand.js +9 -1
- package/dist/commands/create-brand.js.map +1 -1
- package/dist/commands/create-course.d.ts.map +1 -1
- package/dist/commands/create-course.js +2 -0
- package/dist/commands/create-course.js.map +1 -1
- package/dist/commands/describe.d.ts.map +1 -1
- package/dist/commands/describe.js +2 -0
- package/dist/commands/describe.js.map +1 -1
- package/dist/commands/fill-concept.d.ts.map +1 -1
- package/dist/commands/fill-concept.js +3 -1
- package/dist/commands/fill-concept.js.map +1 -1
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +31 -4
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +16 -57
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +31 -52
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +2 -0
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +30 -29
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +8 -349
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +2 -0
- package/dist/commands/validate.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/analytics.d.ts +3 -0
- package/dist/lib/analytics.d.ts.map +1 -0
- package/dist/lib/analytics.js +34 -0
- package/dist/lib/analytics.js.map +1 -0
- package/dist/lib/auth.js +1 -1
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/browser-auth.d.ts +23 -0
- package/dist/lib/browser-auth.d.ts.map +1 -0
- package/dist/lib/browser-auth.js +110 -0
- package/dist/lib/browser-auth.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cliCapture = cliCapture;
|
|
4
|
+
exports.cliShutdown = cliShutdown;
|
|
5
|
+
const posthog_node_1 = require("posthog-node");
|
|
6
|
+
const posthogKey = process.env.POSTHOG_API_KEY || process.env.NEXT_PUBLIC_POSTHOG_KEY;
|
|
7
|
+
let client = null;
|
|
8
|
+
function getClient() {
|
|
9
|
+
if (!posthogKey)
|
|
10
|
+
return null;
|
|
11
|
+
if (!client) {
|
|
12
|
+
client = new posthog_node_1.PostHog(posthogKey, {
|
|
13
|
+
host: process.env.POSTHOG_HOST || process.env.NEXT_PUBLIC_POSTHOG_HOST || 'https://us.i.posthog.com',
|
|
14
|
+
flushAt: 1,
|
|
15
|
+
flushInterval: 0,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return client;
|
|
19
|
+
}
|
|
20
|
+
function distinctId() {
|
|
21
|
+
return process.env.GRASPFUL_USER_ID || process.env.GRASPFUL_API_KEY || 'anonymous-cli';
|
|
22
|
+
}
|
|
23
|
+
function cliCapture(event, properties = {}) {
|
|
24
|
+
getClient()?.capture({
|
|
25
|
+
distinctId: distinctId(),
|
|
26
|
+
event,
|
|
27
|
+
properties: { ...properties, source: 'cli' },
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async function cliShutdown() {
|
|
31
|
+
if (client)
|
|
32
|
+
await client.shutdown();
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/lib/analytics.ts"],"names":[],"mappings":";;AAsBA,gCAMC;AAED,kCAEC;AAhCD,+CAAuC;AAEvC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;AAEtF,IAAI,MAAM,GAAmB,IAAI,CAAC;AAElC,SAAS,SAAS;IAChB,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,sBAAO,CAAC,UAAU,EAAE;YAC/B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,0BAA0B;YACpG,OAAO,EAAE,CAAC;YACV,aAAa,EAAE,CAAC;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,eAAe,CAAC;AACzF,CAAC;AAED,SAAgB,UAAU,CAAC,KAAa,EAAE,aAAsC,EAAE;IAChF,SAAS,EAAE,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,UAAU,EAAE;QACxB,KAAK;QACL,UAAU,EAAE,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;KAC7C,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,WAAW;IAC/B,IAAI,MAAM;QAAE,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;AACtC,CAAC"}
|
package/dist/lib/auth.js
CHANGED
|
@@ -84,7 +84,7 @@ function saveApiKeyCredentials(apiKey, baseUrl) {
|
|
|
84
84
|
function requireAuth() {
|
|
85
85
|
const creds = resolveCredentials();
|
|
86
86
|
if (!creds.apiKey && !creds.jwt) {
|
|
87
|
-
console.error('Not authenticated. Set GRASPFUL_API_KEY or run: graspful login');
|
|
87
|
+
console.error('Not authenticated. Set GRASPFUL_API_KEY or run: graspful login (existing account) / graspful register (new account)');
|
|
88
88
|
process.exit(1);
|
|
89
89
|
}
|
|
90
90
|
return creds;
|
package/dist/lib/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type BrowserAuthMode = 'sign-in' | 'sign-up';
|
|
2
|
+
interface BrowserAuthOptions {
|
|
3
|
+
apiUrl: string;
|
|
4
|
+
mode: BrowserAuthMode;
|
|
5
|
+
email?: string;
|
|
6
|
+
noBrowser?: boolean;
|
|
7
|
+
fetchImpl?: typeof fetch;
|
|
8
|
+
openUrl?: (url: string) => boolean;
|
|
9
|
+
sleep?: (ms: number) => Promise<void>;
|
|
10
|
+
onInfo?: (message: string) => void;
|
|
11
|
+
}
|
|
12
|
+
export interface BrowserAuthResult {
|
|
13
|
+
apiKey: string;
|
|
14
|
+
orgSlug: string;
|
|
15
|
+
userId: string;
|
|
16
|
+
baseUrl: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function deriveWebUrl(apiUrl: string): string;
|
|
19
|
+
export declare function buildCliAuthUrl(apiUrl: string, token: string, mode: BrowserAuthMode, email?: string): string;
|
|
20
|
+
export declare function openExternalUrl(url: string): boolean;
|
|
21
|
+
export declare function runBrowserAuthFlow(options: BrowserAuthOptions): Promise<BrowserAuthResult>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=browser-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-auth.d.ts","sourceRoot":"","sources":["../../src/lib/browser-auth.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,CAAC;AA4BpD,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAanD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ5G;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAiBpD;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAyEhG"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deriveWebUrl = deriveWebUrl;
|
|
4
|
+
exports.buildCliAuthUrl = buildCliAuthUrl;
|
|
5
|
+
exports.openExternalUrl = openExternalUrl;
|
|
6
|
+
exports.runBrowserAuthFlow = runBrowserAuthFlow;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const auth_1 = require("./auth");
|
|
9
|
+
function deriveWebUrl(apiUrl) {
|
|
10
|
+
const url = new URL(apiUrl);
|
|
11
|
+
if ((url.hostname === 'localhost' || url.hostname === '127.0.0.1') && url.port === '3000') {
|
|
12
|
+
url.port = '3001';
|
|
13
|
+
return url.origin;
|
|
14
|
+
}
|
|
15
|
+
if (url.hostname.startsWith('api.')) {
|
|
16
|
+
url.hostname = url.hostname.slice(4);
|
|
17
|
+
}
|
|
18
|
+
return url.origin;
|
|
19
|
+
}
|
|
20
|
+
function buildCliAuthUrl(apiUrl, token, mode, email) {
|
|
21
|
+
const url = new URL('/cli-auth', deriveWebUrl(apiUrl));
|
|
22
|
+
url.searchParams.set('mode', mode);
|
|
23
|
+
if (email) {
|
|
24
|
+
url.searchParams.set('email', email);
|
|
25
|
+
}
|
|
26
|
+
url.hash = `token=${encodeURIComponent(token)}`;
|
|
27
|
+
return url.toString();
|
|
28
|
+
}
|
|
29
|
+
function openExternalUrl(url) {
|
|
30
|
+
const command = (() => {
|
|
31
|
+
if (process.platform === 'darwin')
|
|
32
|
+
return ['open', url];
|
|
33
|
+
if (process.platform === 'win32')
|
|
34
|
+
return ['cmd', '/c', 'start', '', url];
|
|
35
|
+
return ['xdg-open', url];
|
|
36
|
+
})();
|
|
37
|
+
try {
|
|
38
|
+
const child = (0, child_process_1.spawn)(command[0], command.slice(1), {
|
|
39
|
+
detached: true,
|
|
40
|
+
stdio: 'ignore',
|
|
41
|
+
});
|
|
42
|
+
child.unref();
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function runBrowserAuthFlow(options) {
|
|
50
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
51
|
+
const openUrl = options.openUrl ?? openExternalUrl;
|
|
52
|
+
const sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
53
|
+
const onInfo = options.onInfo ?? console.log;
|
|
54
|
+
const baseUrl = options.apiUrl.replace(/\/$/, '');
|
|
55
|
+
const startRes = await fetchImpl(`${baseUrl}/api/v1/auth/cli/sessions`, {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
headers: { 'Content-Type': 'application/json' },
|
|
58
|
+
body: JSON.stringify({ mode: options.mode }),
|
|
59
|
+
});
|
|
60
|
+
if (!startRes.ok) {
|
|
61
|
+
const body = await startRes.text();
|
|
62
|
+
throw new Error(body || `Browser auth failed (${startRes.status})`);
|
|
63
|
+
}
|
|
64
|
+
const startData = (await startRes.json());
|
|
65
|
+
const authUrl = buildCliAuthUrl(baseUrl, startData.token, options.mode, options.email);
|
|
66
|
+
if (!options.noBrowser) {
|
|
67
|
+
const opened = openUrl(authUrl);
|
|
68
|
+
if (!opened) {
|
|
69
|
+
onInfo('Could not open a browser automatically.');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
onInfo([
|
|
73
|
+
options.mode === 'sign-up'
|
|
74
|
+
? 'Complete sign-up in your browser to finish CLI setup.'
|
|
75
|
+
: 'Complete sign-in in your browser to finish CLI setup.',
|
|
76
|
+
`Open this URL if it did not launch automatically:\n${authUrl}`,
|
|
77
|
+
'',
|
|
78
|
+
'Waiting for browser authentication...',
|
|
79
|
+
].join('\n'));
|
|
80
|
+
const expiresAt = new Date(startData.expiresAt).getTime();
|
|
81
|
+
const pollIntervalMs = Math.max(startData.pollIntervalMs, 1_000);
|
|
82
|
+
while (Date.now() < expiresAt) {
|
|
83
|
+
const exchangeRes = await fetchImpl(`${baseUrl}/api/v1/auth/cli/sessions/exchange`, {
|
|
84
|
+
method: 'POST',
|
|
85
|
+
headers: { 'Content-Type': 'application/json' },
|
|
86
|
+
body: JSON.stringify({ token: startData.token }),
|
|
87
|
+
});
|
|
88
|
+
if (!exchangeRes.ok) {
|
|
89
|
+
const body = await exchangeRes.text();
|
|
90
|
+
throw new Error(body || `Browser auth exchange failed (${exchangeRes.status})`);
|
|
91
|
+
}
|
|
92
|
+
const exchangeData = (await exchangeRes.json());
|
|
93
|
+
if (exchangeData.status === 'pending') {
|
|
94
|
+
await sleep(pollIntervalMs);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (exchangeData.status === 'expired') {
|
|
98
|
+
throw new Error('Browser authentication expired. Start again.');
|
|
99
|
+
}
|
|
100
|
+
(0, auth_1.saveApiKeyCredentials)(exchangeData.apiKey, baseUrl);
|
|
101
|
+
return {
|
|
102
|
+
apiKey: exchangeData.apiKey,
|
|
103
|
+
orgSlug: exchangeData.orgSlug,
|
|
104
|
+
userId: exchangeData.userId,
|
|
105
|
+
baseUrl,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
throw new Error('Browser authentication timed out. Start again.');
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=browser-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-auth.js","sourceRoot":"","sources":["../../src/lib/browser-auth.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@graspful/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "Create adaptive learning courses from YAML. CLI and MCP server for AI agents.",
|
|
5
5
|
"keywords": ["course", "learning", "adaptive", "mcp", "mcp-server", "ai", "ai-agent", "agent", "cli", "education", "edtech", "knowledge-graph", "spaced-repetition", "course-creation", "yaml", "adaptive-learning", "lms"],
|
|
6
6
|
"repository": {
|
|
@@ -21,10 +21,11 @@
|
|
|
21
21
|
"lint": "echo 'no lint configured yet'"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@graspful/shared": "0.
|
|
24
|
+
"@graspful/shared": "0.2.2",
|
|
25
25
|
"chalk": "^5.4.0",
|
|
26
26
|
"commander": "^13.0.0",
|
|
27
27
|
"js-yaml": "^4.1.0",
|
|
28
|
+
"posthog-node": "^5.28.8",
|
|
28
29
|
"zod": "^3.24.0"
|
|
29
30
|
},
|
|
30
31
|
"devDependencies": {
|