@tutorflow/cli 0.1.2 → 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 +400 -89
- package/dist/client.d.ts +7 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +53 -19
- package/dist/client.js.map +1 -1
- package/dist/commands/agent.d.ts +3 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +123 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +48 -45
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +34 -45
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/course.d.ts.map +1 -1
- package/dist/commands/course.js +61 -75
- package/dist/commands/course.js.map +1 -1
- package/dist/commands/evaluate.d.ts.map +1 -1
- package/dist/commands/evaluate.js +49 -55
- package/dist/commands/evaluate.js.map +1 -1
- package/dist/commands/module.d.ts +3 -0
- package/dist/commands/module.d.ts.map +1 -0
- package/dist/commands/module.js +108 -0
- package/dist/commands/module.js.map +1 -0
- package/dist/commands/platform.d.ts +3 -0
- package/dist/commands/platform.d.ts.map +1 -0
- package/dist/commands/platform.js +36 -0
- package/dist/commands/platform.js.map +1 -0
- package/dist/commands/slide.d.ts.map +1 -1
- package/dist/commands/slide.js +65 -76
- package/dist/commands/slide.js.map +1 -1
- package/dist/commands/test.d.ts +3 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +119 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/video.d.ts.map +1 -1
- package/dist/commands/video.js +66 -78
- package/dist/commands/video.js.map +1 -1
- package/dist/index.js +24 -2
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +75 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/output.d.ts +15 -2
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +66 -22
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/runtime.d.ts +39 -0
- package/dist/utils/runtime.d.ts.map +1 -0
- package/dist/utils/runtime.js +105 -0
- package/dist/utils/runtime.js.map +1 -0
- package/package.json +18 -2
package/dist/commands/slide.js
CHANGED
|
@@ -6,111 +6,100 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.slideCommand = slideCommand;
|
|
7
7
|
const commander_1 = require("commander");
|
|
8
8
|
const prompts_1 = require("@clack/prompts");
|
|
9
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
10
9
|
const open_1 = __importDefault(require("open"));
|
|
11
10
|
const client_1 = require("../client");
|
|
12
|
-
const config_1 = require("../config");
|
|
13
11
|
const output_1 = require("../utils/output");
|
|
12
|
+
const runtime_1 = require("../utils/runtime");
|
|
14
13
|
function slideCommand() {
|
|
15
14
|
const slide = new commander_1.Command('slide').description('Manage slides');
|
|
16
15
|
slide
|
|
17
16
|
.command('create')
|
|
18
|
-
.argument('[prompt]', 'Prompt describing the slide content')
|
|
19
|
-
.option('-n, --count <number>', 'Number of slides
|
|
20
|
-
.option('-l, --language <lang>', 'Language code
|
|
17
|
+
.argument('[prompt]', 'Prompt describing the slide content (or pipe via --json)')
|
|
18
|
+
.option('-n, --count <number>', 'Number of slides', '10')
|
|
19
|
+
.option('-l, --language <lang>', 'Language code', 'en')
|
|
21
20
|
.option('-t, --theme <theme>', 'Theme for slides')
|
|
22
|
-
.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const slidePrompt = prompt || (await (0, prompts_1.text)({ message: 'Describe the slide content:' }));
|
|
31
|
-
if (!slidePrompt || typeof slidePrompt === 'symbol') {
|
|
32
|
-
console.log(chalk_1.default.gray('Cancelled'));
|
|
33
|
-
return;
|
|
21
|
+
.option('--open', 'Open the result in a browser when done (TTY only)')
|
|
22
|
+
.action((0, runtime_1.command)(async (prompt, options) => {
|
|
23
|
+
let slidePrompt = prompt;
|
|
24
|
+
if (!slidePrompt) {
|
|
25
|
+
(0, runtime_1.requireInteractive)('Pass a prompt argument: tutorflow slide create "Photosynthesis" -n 12');
|
|
26
|
+
const result = await (0, prompts_1.text)({ message: 'Describe the slide content:' });
|
|
27
|
+
if (typeof result === 'symbol') {
|
|
28
|
+
throw new runtime_1.CliError('Cancelled', { code: 'ECANCELLED', exitCode: 130 });
|
|
34
29
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
30
|
+
slidePrompt = result;
|
|
31
|
+
}
|
|
32
|
+
const client = await client_1.ApiClient.createAuthenticated();
|
|
33
|
+
const s = (0, runtime_1.isJsonMode)() || !(0, runtime_1.isInteractive)() ? null : (0, prompts_1.spinner)();
|
|
34
|
+
s?.start('Creating slide...');
|
|
35
|
+
let response;
|
|
36
|
+
try {
|
|
37
|
+
response = await client.request('POST', '/v1/platform/slides', {
|
|
38
38
|
prompt: slidePrompt,
|
|
39
39
|
slideCount: parseInt(options.count, 10),
|
|
40
40
|
language: options.language,
|
|
41
41
|
theme: options.theme,
|
|
42
42
|
mode: 'sync',
|
|
43
43
|
});
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
s?.stop('Done');
|
|
47
|
+
}
|
|
48
|
+
(0, output_1.printResult)(response);
|
|
49
|
+
if (options.open && response.previewUrl && (0, runtime_1.isInteractive)()) {
|
|
51
50
|
const shouldOpen = await (0, prompts_1.confirm)({ message: 'Open in browser?' });
|
|
52
|
-
if (shouldOpen
|
|
51
|
+
if (shouldOpen === true)
|
|
53
52
|
await (0, open_1.default)(response.previewUrl);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
catch (error) {
|
|
57
|
-
console.error(chalk_1.default.red('✗ Failed to create slide'), error);
|
|
58
53
|
}
|
|
59
|
-
});
|
|
54
|
+
}));
|
|
60
55
|
slide
|
|
61
56
|
.command('list')
|
|
62
|
-
.option('-l, --limit <number>', 'Number of results
|
|
57
|
+
.option('-l, --limit <number>', 'Number of results', '10')
|
|
63
58
|
.option('-s, --status <status>', 'Filter by status')
|
|
64
|
-
.action(async (options) => {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
const tableData = slides.map((s) => ({
|
|
79
|
-
ID: s.id.slice(0, 8),
|
|
59
|
+
.action((0, runtime_1.command)(async (options) => {
|
|
60
|
+
const client = await client_1.ApiClient.createAuthenticated();
|
|
61
|
+
const qs = new URLSearchParams({ limit: options.limit });
|
|
62
|
+
if (options.status)
|
|
63
|
+
qs.set('status', options.status);
|
|
64
|
+
const response = await client.request('GET', `/v1/platform/slides?${qs.toString()}`);
|
|
65
|
+
const slides = response.data ?? [];
|
|
66
|
+
if ((0, runtime_1.isJsonMode)()) {
|
|
67
|
+
(0, output_1.printResult)(slides);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
(0, output_1.printResult)(slides.map((s) => ({
|
|
71
|
+
ID: s.id,
|
|
80
72
|
Title: s.title || 'Untitled',
|
|
81
73
|
Status: s.status,
|
|
82
74
|
Created: new Date(s.createdAt).toLocaleDateString(),
|
|
83
|
-
}));
|
|
84
|
-
console.log((0, output_1.formatTable)(tableData));
|
|
85
|
-
}
|
|
86
|
-
catch (error) {
|
|
87
|
-
console.error(chalk_1.default.red('✗ Failed to list slides'), error);
|
|
75
|
+
})));
|
|
88
76
|
}
|
|
89
|
-
});
|
|
77
|
+
}));
|
|
78
|
+
slide
|
|
79
|
+
.command('get <id>')
|
|
80
|
+
.description('Fetch a single slide by ID')
|
|
81
|
+
.action((0, runtime_1.command)(async (id) => {
|
|
82
|
+
const client = await client_1.ApiClient.createAuthenticated();
|
|
83
|
+
const response = await client.request('GET', `/v1/platform/slides/${id}`);
|
|
84
|
+
(0, output_1.printResult)(response);
|
|
85
|
+
}));
|
|
90
86
|
slide
|
|
91
87
|
.command('open <id>')
|
|
92
88
|
.description('Open a slide in the browser')
|
|
93
|
-
.action(async (id) => {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const response = await client.request('GET', `/v1/platform/slides/${id}`);
|
|
102
|
-
if (response.previewUrl) {
|
|
103
|
-
await (0, open_1.default)(response.previewUrl);
|
|
104
|
-
console.log(chalk_1.default.green('✓ Opening in browser...'));
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
console.log(chalk_1.default.red('✗ No preview URL available'));
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
catch (error) {
|
|
111
|
-
console.error(chalk_1.default.red('✗ Failed to open slide'), error);
|
|
89
|
+
.action((0, runtime_1.command)(async (id) => {
|
|
90
|
+
const client = await client_1.ApiClient.createAuthenticated();
|
|
91
|
+
const response = await client.request('GET', `/v1/platform/slides/${id}`);
|
|
92
|
+
if (!response.previewUrl) {
|
|
93
|
+
throw new runtime_1.CliError('No preview URL available for this slide', {
|
|
94
|
+
code: 'ENOPREVIEW',
|
|
95
|
+
exitCode: 1,
|
|
96
|
+
});
|
|
112
97
|
}
|
|
113
|
-
|
|
98
|
+
if ((0, runtime_1.isInteractive)())
|
|
99
|
+
await (0, open_1.default)(response.previewUrl);
|
|
100
|
+
(0, output_1.printResult)({ previewUrl: response.previewUrl });
|
|
101
|
+
(0, output_1.printStatus)('Opening in browser...', 'success');
|
|
102
|
+
}));
|
|
114
103
|
return slide;
|
|
115
104
|
}
|
|
116
105
|
//# sourceMappingURL=slide.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slide.js","sourceRoot":"","sources":["../../src/commands/slide.ts"],"names":[],"mappings":";;;;;AAoBA,
|
|
1
|
+
{"version":3,"file":"slide.js","sourceRoot":"","sources":["../../src/commands/slide.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BpC,wBAAgB,WAAW,IAAI,OAAO,CAuHrC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.testCommand = testCommand;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const prompts_1 = require("@clack/prompts");
|
|
9
|
+
const open_1 = __importDefault(require("open"));
|
|
10
|
+
const client_1 = require("../client");
|
|
11
|
+
const output_1 = require("../utils/output");
|
|
12
|
+
const runtime_1 = require("../utils/runtime");
|
|
13
|
+
function testCommand() {
|
|
14
|
+
const test = new commander_1.Command('test').description('Manage generated tests');
|
|
15
|
+
test
|
|
16
|
+
.command('create')
|
|
17
|
+
.argument('[prompt]', 'Prompt describing the test to generate')
|
|
18
|
+
.option('--title <title>', 'Override generated title')
|
|
19
|
+
.option('--description <description>', 'Override generated description')
|
|
20
|
+
.option('-l, --language <language>', 'Language code', 'en')
|
|
21
|
+
.option('--level <level>', 'Difficulty level')
|
|
22
|
+
.option('--subject <subject>', 'Subject area')
|
|
23
|
+
.option('-n, --items <number>', 'Target number of test items')
|
|
24
|
+
.option('--time-limit <minutes>', 'Time limit in minutes')
|
|
25
|
+
.option('--classroom-id <id>', 'Classroom ID to create the test in')
|
|
26
|
+
.option('--tier <tier>', 'Pricing tier', 'standard')
|
|
27
|
+
.option('--mode <mode>', 'Execution mode: sync or async', 'sync')
|
|
28
|
+
.option('--idempotency-key <key>', 'Idempotency key for safe retries')
|
|
29
|
+
.option('--open', 'Open the preview URL in a browser when done (TTY only)')
|
|
30
|
+
.action((0, runtime_1.command)(async (prompt, options) => {
|
|
31
|
+
const testPrompt = await promptOrThrow(prompt, 'Describe the test to generate:', 'Pass a prompt argument: tutorflow test create "Algebra quiz"');
|
|
32
|
+
const client = await client_1.ApiClient.createAuthenticated();
|
|
33
|
+
const response = await client.request('POST', '/v1/platform/tests', compact({
|
|
34
|
+
prompt: testPrompt,
|
|
35
|
+
title: options.title,
|
|
36
|
+
description: options.description,
|
|
37
|
+
language: options.language,
|
|
38
|
+
level: options.level,
|
|
39
|
+
subject: options.subject,
|
|
40
|
+
itemCount: options.items ? parseInt(options.items, 10) : undefined,
|
|
41
|
+
timeLimit: options.timeLimit ? parseInt(options.timeLimit, 10) : undefined,
|
|
42
|
+
classroomId: options.classroomId,
|
|
43
|
+
tier: options.tier,
|
|
44
|
+
mode: options.mode,
|
|
45
|
+
}), idempotencyHeaders(options.idempotencyKey));
|
|
46
|
+
(0, output_1.printResult)(response);
|
|
47
|
+
if (options.open && response.previewUrl && (0, runtime_1.isInteractive)()) {
|
|
48
|
+
await (0, open_1.default)(response.previewUrl);
|
|
49
|
+
(0, output_1.printStatus)('Opening in browser...', 'success');
|
|
50
|
+
}
|
|
51
|
+
}));
|
|
52
|
+
test
|
|
53
|
+
.command('list')
|
|
54
|
+
.option('-l, --limit <number>', 'Number of results', '20')
|
|
55
|
+
.option('-o, --offset <number>', 'Number of rows to skip', '0')
|
|
56
|
+
.option('-s, --status <status>', 'Filter by status')
|
|
57
|
+
.action((0, runtime_1.command)(async (options) => {
|
|
58
|
+
const client = await client_1.ApiClient.createAuthenticated();
|
|
59
|
+
const qs = new URLSearchParams({ limit: options.limit, offset: options.offset });
|
|
60
|
+
if (options.status)
|
|
61
|
+
qs.set('status', options.status);
|
|
62
|
+
const response = await client.request('GET', `/v1/platform/tests?${qs.toString()}`);
|
|
63
|
+
(0, output_1.printResult)(response);
|
|
64
|
+
}));
|
|
65
|
+
test
|
|
66
|
+
.command('get <id>')
|
|
67
|
+
.description('Fetch a single test by ID')
|
|
68
|
+
.action((0, runtime_1.command)(async (id) => {
|
|
69
|
+
const client = await client_1.ApiClient.createAuthenticated();
|
|
70
|
+
const response = await client.request('GET', `/v1/platform/tests/${id}`);
|
|
71
|
+
(0, output_1.printResult)(response);
|
|
72
|
+
}));
|
|
73
|
+
test
|
|
74
|
+
.command('edit-token <id>')
|
|
75
|
+
.description('Generate a fresh edit token for a test')
|
|
76
|
+
.action((0, runtime_1.command)(async (id) => {
|
|
77
|
+
const client = await client_1.ApiClient.createAuthenticated();
|
|
78
|
+
const response = await client.request('POST', `/v1/platform/tests/${id}/edit-token`);
|
|
79
|
+
(0, output_1.printResult)(response);
|
|
80
|
+
}));
|
|
81
|
+
test
|
|
82
|
+
.command('open <id>')
|
|
83
|
+
.description('Open a test preview URL in the browser')
|
|
84
|
+
.action((0, runtime_1.command)(async (id) => {
|
|
85
|
+
const client = await client_1.ApiClient.createAuthenticated();
|
|
86
|
+
const response = await client.request('GET', `/v1/platform/tests/${id}`);
|
|
87
|
+
const url = response.previewUrl ?? response.publicUrl;
|
|
88
|
+
if (!url) {
|
|
89
|
+
throw new runtime_1.CliError('No preview URL available for this test', {
|
|
90
|
+
code: 'ENOPREVIEW',
|
|
91
|
+
exitCode: 1,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if ((0, runtime_1.isInteractive)())
|
|
95
|
+
await (0, open_1.default)(url);
|
|
96
|
+
(0, output_1.printResult)({ previewUrl: url });
|
|
97
|
+
(0, output_1.printStatus)('Opening in browser...', 'success');
|
|
98
|
+
}));
|
|
99
|
+
return test;
|
|
100
|
+
}
|
|
101
|
+
async function promptOrThrow(value, message, hint) {
|
|
102
|
+
if (value?.trim())
|
|
103
|
+
return value.trim();
|
|
104
|
+
(0, runtime_1.requireInteractive)(hint);
|
|
105
|
+
const result = await (0, prompts_1.text)({ message });
|
|
106
|
+
if (!result || typeof result === 'symbol') {
|
|
107
|
+
throw new runtime_1.CliError('Cancelled', { code: 'ECANCELLED', exitCode: 130 });
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
function compact(input) {
|
|
112
|
+
return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined && value !== ''));
|
|
113
|
+
}
|
|
114
|
+
function idempotencyHeaders(key) {
|
|
115
|
+
if (!key)
|
|
116
|
+
return undefined;
|
|
117
|
+
return { 'Idempotency-Key': key };
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,wBAAgB,YAAY,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,wBAAgB,YAAY,IAAI,OAAO,CAiHtC"}
|
package/dist/commands/video.js
CHANGED
|
@@ -6,36 +6,36 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.videoCommand = videoCommand;
|
|
7
7
|
const commander_1 = require("commander");
|
|
8
8
|
const prompts_1 = require("@clack/prompts");
|
|
9
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
10
9
|
const open_1 = __importDefault(require("open"));
|
|
11
10
|
const client_1 = require("../client");
|
|
12
|
-
const config_1 = require("../config");
|
|
13
11
|
const output_1 = require("../utils/output");
|
|
12
|
+
const runtime_1 = require("../utils/runtime");
|
|
14
13
|
function videoCommand() {
|
|
15
14
|
const video = new commander_1.Command('video').description('Manage videos');
|
|
16
15
|
video
|
|
17
16
|
.command('create')
|
|
18
17
|
.argument('[prompt]', 'Prompt describing the video content')
|
|
19
|
-
.option('-s, --scenes <number>', 'Number of scenes
|
|
20
|
-
.option('-r, --ratio <ratio>', 'Aspect ratio (
|
|
21
|
-
.option('-d, --duration <seconds>', 'Target duration
|
|
22
|
-
.option('-l, --language <lang>', 'Language code
|
|
23
|
-
.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const videoPrompt = prompt || (await (0, prompts_1.text)({ message: 'Describe the video content:' }));
|
|
32
|
-
if (!videoPrompt || typeof videoPrompt === 'symbol') {
|
|
33
|
-
console.log(chalk_1.default.gray('Cancelled'));
|
|
34
|
-
return;
|
|
18
|
+
.option('-s, --scenes <number>', 'Number of scenes', '5')
|
|
19
|
+
.option('-r, --ratio <ratio>', 'Aspect ratio (16:9, 9:16, 1:1)', '16:9')
|
|
20
|
+
.option('-d, --duration <seconds>', 'Target duration in seconds', '60')
|
|
21
|
+
.option('-l, --language <lang>', 'Language code', 'en')
|
|
22
|
+
.option('--open', 'Open the result in a browser when done (TTY only)')
|
|
23
|
+
.action((0, runtime_1.command)(async (prompt, options) => {
|
|
24
|
+
let videoPrompt = prompt;
|
|
25
|
+
if (!videoPrompt) {
|
|
26
|
+
(0, runtime_1.requireInteractive)('Pass a prompt argument: tutorflow video create "Newton\'s laws"');
|
|
27
|
+
const result = await (0, prompts_1.text)({ message: 'Describe the video content:' });
|
|
28
|
+
if (typeof result === 'symbol') {
|
|
29
|
+
throw new runtime_1.CliError('Cancelled', { code: 'ECANCELLED', exitCode: 130 });
|
|
35
30
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
31
|
+
videoPrompt = result;
|
|
32
|
+
}
|
|
33
|
+
const client = await client_1.ApiClient.createAuthenticated();
|
|
34
|
+
const s = (0, runtime_1.isJsonMode)() || !(0, runtime_1.isInteractive)() ? null : (0, prompts_1.spinner)();
|
|
35
|
+
s?.start('Creating video...');
|
|
36
|
+
let response;
|
|
37
|
+
try {
|
|
38
|
+
response = await client.request('POST', '/v1/platform/videos', {
|
|
39
39
|
prompt: videoPrompt,
|
|
40
40
|
sceneCount: parseInt(options.scenes, 10),
|
|
41
41
|
aspectRatio: options.ratio,
|
|
@@ -43,78 +43,66 @@ function videoCommand() {
|
|
|
43
43
|
language: options.language,
|
|
44
44
|
mode: 'sync',
|
|
45
45
|
});
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
console.log(chalk_1.default.gray(` Edit: ${response.previewUrl}`));
|
|
53
|
-
}
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
s?.stop('Done');
|
|
49
|
+
}
|
|
50
|
+
(0, output_1.printResult)(response);
|
|
51
|
+
if (options.open && response.previewUrl && (0, runtime_1.isInteractive)()) {
|
|
54
52
|
const shouldOpen = await (0, prompts_1.confirm)({ message: 'Open in browser?' });
|
|
55
|
-
if (shouldOpen
|
|
53
|
+
if (shouldOpen === true)
|
|
56
54
|
await (0, open_1.default)(response.previewUrl);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
catch (error) {
|
|
60
|
-
console.error(chalk_1.default.red('✗ Failed to create video'), error);
|
|
61
55
|
}
|
|
62
|
-
});
|
|
56
|
+
}));
|
|
63
57
|
video
|
|
64
58
|
.command('list')
|
|
65
|
-
.option('-l, --limit <number>', 'Number of results
|
|
59
|
+
.option('-l, --limit <number>', 'Number of results', '10')
|
|
66
60
|
.option('-s, --status <status>', 'Filter by status')
|
|
67
|
-
.action(async (options) => {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
const tableData = videos.map((v) => ({
|
|
82
|
-
ID: v.id.slice(0, 8),
|
|
61
|
+
.action((0, runtime_1.command)(async (options) => {
|
|
62
|
+
const client = await client_1.ApiClient.createAuthenticated();
|
|
63
|
+
const qs = new URLSearchParams({ limit: options.limit });
|
|
64
|
+
if (options.status)
|
|
65
|
+
qs.set('status', options.status);
|
|
66
|
+
const response = await client.request('GET', `/v1/platform/videos?${qs.toString()}`);
|
|
67
|
+
const videos = response.data ?? [];
|
|
68
|
+
if ((0, runtime_1.isJsonMode)()) {
|
|
69
|
+
(0, output_1.printResult)(videos);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
(0, output_1.printResult)(videos.map((v) => ({
|
|
73
|
+
ID: v.id,
|
|
83
74
|
Title: v.title || 'Untitled',
|
|
84
75
|
Status: v.status,
|
|
85
76
|
Scenes: v.sceneCount?.toString() || '—',
|
|
86
77
|
Created: new Date(v.createdAt).toLocaleDateString(),
|
|
87
|
-
}));
|
|
88
|
-
console.log((0, output_1.formatTable)(tableData));
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
console.error(chalk_1.default.red('✗ Failed to list videos'), error);
|
|
78
|
+
})));
|
|
92
79
|
}
|
|
93
|
-
});
|
|
80
|
+
}));
|
|
81
|
+
video
|
|
82
|
+
.command('get <id>')
|
|
83
|
+
.description('Fetch a single video by ID')
|
|
84
|
+
.action((0, runtime_1.command)(async (id) => {
|
|
85
|
+
const client = await client_1.ApiClient.createAuthenticated();
|
|
86
|
+
const response = await client.request('GET', `/v1/platform/videos/${id}`);
|
|
87
|
+
(0, output_1.printResult)(response);
|
|
88
|
+
}));
|
|
94
89
|
video
|
|
95
90
|
.command('open <id>')
|
|
96
91
|
.description('Open a video in the browser')
|
|
97
|
-
.action(async (id) => {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const response = await client.request('GET', `/v1/platform/videos/${id}`);
|
|
106
|
-
if (response.previewUrl) {
|
|
107
|
-
await (0, open_1.default)(response.previewUrl);
|
|
108
|
-
console.log(chalk_1.default.green('✓ Opening in browser...'));
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
console.log(chalk_1.default.red('✗ No preview URL available'));
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
catch (error) {
|
|
115
|
-
console.error(chalk_1.default.red('✗ Failed to open video'), error);
|
|
92
|
+
.action((0, runtime_1.command)(async (id) => {
|
|
93
|
+
const client = await client_1.ApiClient.createAuthenticated();
|
|
94
|
+
const response = await client.request('GET', `/v1/platform/videos/${id}`);
|
|
95
|
+
if (!response.previewUrl) {
|
|
96
|
+
throw new runtime_1.CliError('No preview URL available for this video', {
|
|
97
|
+
code: 'ENOPREVIEW',
|
|
98
|
+
exitCode: 1,
|
|
99
|
+
});
|
|
116
100
|
}
|
|
117
|
-
|
|
101
|
+
if ((0, runtime_1.isInteractive)())
|
|
102
|
+
await (0, open_1.default)(response.previewUrl);
|
|
103
|
+
(0, output_1.printResult)({ previewUrl: response.previewUrl });
|
|
104
|
+
(0, output_1.printStatus)('Opening in browser...', 'success');
|
|
105
|
+
}));
|
|
118
106
|
return video;
|
|
119
107
|
}
|
|
120
108
|
//# sourceMappingURL=video.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":";;;;;AAqBA,
|
|
1
|
+
{"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -8,19 +8,41 @@ const video_1 = require("./commands/video");
|
|
|
8
8
|
const course_1 = require("./commands/course");
|
|
9
9
|
const evaluate_1 = require("./commands/evaluate");
|
|
10
10
|
const config_1 = require("./commands/config");
|
|
11
|
+
const agent_1 = require("./commands/agent");
|
|
12
|
+
const module_1 = require("./commands/module");
|
|
13
|
+
const test_1 = require("./commands/test");
|
|
14
|
+
const platform_1 = require("./commands/platform");
|
|
15
|
+
const runtime_1 = require("./utils/runtime");
|
|
11
16
|
const package_json_1 = require("../package.json");
|
|
12
17
|
commander_1.program
|
|
13
18
|
.name('tutorflow')
|
|
14
19
|
.description('TutorFlow CLI - Create AI-powered educational content')
|
|
15
|
-
.version(package_json_1.version)
|
|
20
|
+
.version(package_json_1.version)
|
|
21
|
+
.option('--json', 'Output machine-readable JSON to stdout (errors to stderr)')
|
|
22
|
+
.option('--debug', 'Print stack traces on errors (also via DEBUG=1)')
|
|
23
|
+
.hook('preAction', (cmd) => {
|
|
24
|
+
const opts = cmd.opts();
|
|
25
|
+
if (opts.json)
|
|
26
|
+
(0, runtime_1.setJsonMode)(true);
|
|
27
|
+
if (opts.debug)
|
|
28
|
+
(0, runtime_1.setDebugMode)(true);
|
|
29
|
+
});
|
|
16
30
|
commander_1.program.addCommand((0, auth_1.authCommand)());
|
|
17
31
|
commander_1.program.addCommand((0, slide_1.slideCommand)());
|
|
18
32
|
commander_1.program.addCommand((0, video_1.videoCommand)());
|
|
19
33
|
commander_1.program.addCommand((0, course_1.courseCommand)());
|
|
20
34
|
commander_1.program.addCommand((0, evaluate_1.evaluateCommand)());
|
|
21
35
|
commander_1.program.addCommand((0, config_1.configCommand)());
|
|
22
|
-
commander_1.program.
|
|
36
|
+
commander_1.program.addCommand((0, agent_1.agentCommand)());
|
|
37
|
+
commander_1.program.addCommand((0, module_1.moduleCommand)());
|
|
38
|
+
commander_1.program.addCommand((0, test_1.testCommand)());
|
|
39
|
+
commander_1.program.addCommand((0, platform_1.platformCommand)());
|
|
40
|
+
commander_1.program.parseAsync(process.argv).catch(() => {
|
|
41
|
+
// commander already prints its own errors; keep this as a safety net.
|
|
42
|
+
process.exit(1);
|
|
43
|
+
});
|
|
23
44
|
if (!process.argv.slice(2).length) {
|
|
24
45
|
commander_1.program.outputHelp();
|
|
46
|
+
process.exit(1);
|
|
25
47
|
}
|
|
26
48
|
//# sourceMappingURL=index.js.map
|