@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.
Files changed (52) hide show
  1. package/README.md +400 -89
  2. package/dist/client.d.ts +7 -1
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +53 -19
  5. package/dist/client.js.map +1 -1
  6. package/dist/commands/agent.d.ts +3 -0
  7. package/dist/commands/agent.d.ts.map +1 -0
  8. package/dist/commands/agent.js +123 -0
  9. package/dist/commands/agent.js.map +1 -0
  10. package/dist/commands/auth.d.ts.map +1 -1
  11. package/dist/commands/auth.js +48 -45
  12. package/dist/commands/auth.js.map +1 -1
  13. package/dist/commands/config.d.ts.map +1 -1
  14. package/dist/commands/config.js +34 -45
  15. package/dist/commands/config.js.map +1 -1
  16. package/dist/commands/course.d.ts.map +1 -1
  17. package/dist/commands/course.js +61 -75
  18. package/dist/commands/course.js.map +1 -1
  19. package/dist/commands/evaluate.d.ts.map +1 -1
  20. package/dist/commands/evaluate.js +49 -55
  21. package/dist/commands/evaluate.js.map +1 -1
  22. package/dist/commands/module.d.ts +3 -0
  23. package/dist/commands/module.d.ts.map +1 -0
  24. package/dist/commands/module.js +108 -0
  25. package/dist/commands/module.js.map +1 -0
  26. package/dist/commands/platform.d.ts +3 -0
  27. package/dist/commands/platform.d.ts.map +1 -0
  28. package/dist/commands/platform.js +36 -0
  29. package/dist/commands/platform.js.map +1 -0
  30. package/dist/commands/slide.d.ts.map +1 -1
  31. package/dist/commands/slide.js +65 -76
  32. package/dist/commands/slide.js.map +1 -1
  33. package/dist/commands/test.d.ts +3 -0
  34. package/dist/commands/test.d.ts.map +1 -0
  35. package/dist/commands/test.js +119 -0
  36. package/dist/commands/test.js.map +1 -0
  37. package/dist/commands/video.d.ts.map +1 -1
  38. package/dist/commands/video.js +66 -78
  39. package/dist/commands/video.js.map +1 -1
  40. package/dist/index.js +24 -2
  41. package/dist/index.js.map +1 -1
  42. package/dist/types.d.ts +75 -0
  43. package/dist/types.d.ts.map +1 -1
  44. package/dist/utils/output.d.ts +15 -2
  45. package/dist/utils/output.d.ts.map +1 -1
  46. package/dist/utils/output.js +66 -22
  47. package/dist/utils/output.js.map +1 -1
  48. package/dist/utils/runtime.d.ts +39 -0
  49. package/dist/utils/runtime.d.ts.map +1 -0
  50. package/dist/utils/runtime.js +105 -0
  51. package/dist/utils/runtime.js.map +1 -0
  52. package/package.json +18 -2
@@ -6,108 +6,94 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.courseCommand = courseCommand;
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 courseCommand() {
15
14
  const course = new commander_1.Command('course').description('Manage courses');
16
15
  course
17
16
  .command('create')
18
17
  .argument('[prompt]', 'Prompt describing the course content')
19
- .option('-l, --lessons <number>', 'Number of lessons (default: 8)', '8')
20
- .option('-lang, --language <lang>', 'Language code (default: en)', 'en')
21
- .action(async (prompt, options) => {
22
- try {
23
- const config = await (0, config_1.readConfig)();
24
- if (!config.apiKey) {
25
- console.log(chalk_1.default.red('✗ Not authenticated. Run "tutorflow auth login" first.'));
26
- return;
27
- }
28
- const client = await client_1.ApiClient.create();
29
- const coursePrompt = prompt || (await (0, prompts_1.text)({ message: 'Describe the course content:' }));
30
- if (!coursePrompt || typeof coursePrompt === 'symbol') {
31
- console.log(chalk_1.default.gray('Cancelled'));
32
- return;
18
+ .option('-l, --lessons <number>', 'Number of lessons', '8')
19
+ .option('-lang, --language <lang>', 'Language code', 'en')
20
+ .option('--open', 'Open the result in a browser when done (TTY only)')
21
+ .action((0, runtime_1.command)(async (prompt, options) => {
22
+ let coursePrompt = prompt;
23
+ if (!coursePrompt) {
24
+ (0, runtime_1.requireInteractive)('Pass a prompt argument: tutorflow course create "Beginner Python"');
25
+ const result = await (0, prompts_1.text)({ message: 'Describe the course content:' });
26
+ if (typeof result === 'symbol') {
27
+ throw new runtime_1.CliError('Cancelled', { code: 'ECANCELLED', exitCode: 130 });
33
28
  }
34
- const s = (0, prompts_1.spinner)();
35
- s.start('Creating course...');
36
- const response = await client.request('POST', '/v1/platform/courses', {
29
+ coursePrompt = result;
30
+ }
31
+ const client = await client_1.ApiClient.createAuthenticated();
32
+ const s = (0, runtime_1.isJsonMode)() || !(0, runtime_1.isInteractive)() ? null : (0, prompts_1.spinner)();
33
+ s?.start('Creating course...');
34
+ let response;
35
+ try {
36
+ response = await client.request('POST', '/v1/platform/courses', {
37
37
  prompt: coursePrompt,
38
38
  lessonCount: parseInt(options.lessons, 10),
39
39
  language: options.language,
40
40
  mode: 'sync',
41
41
  });
42
- s.stop('Course created!');
43
- console.log(chalk_1.default.green('✓ Course created successfully'));
44
- console.log(chalk_1.default.gray(` ID: ${response.id}`));
45
- console.log(chalk_1.default.gray(` Status: ${response.status}`));
46
- if (response.previewUrl) {
47
- console.log(chalk_1.default.gray(` Edit: ${response.previewUrl}`));
48
- }
42
+ }
43
+ finally {
44
+ s?.stop('Done');
45
+ }
46
+ (0, output_1.printResult)(response);
47
+ if (options.open && response.previewUrl && (0, runtime_1.isInteractive)()) {
49
48
  const shouldOpen = await (0, prompts_1.confirm)({ message: 'Open in browser?' });
50
- if (shouldOpen && response.previewUrl) {
49
+ if (shouldOpen === true)
51
50
  await (0, open_1.default)(response.previewUrl);
52
- }
53
- }
54
- catch (error) {
55
- console.error(chalk_1.default.red('✗ Failed to create course'), error);
56
51
  }
57
- });
52
+ }));
58
53
  course
59
54
  .command('list')
60
- .option('-l, --limit <number>', 'Number of results (default: 10)', '10')
61
- .action(async (options) => {
62
- try {
63
- const config = await (0, config_1.readConfig)();
64
- if (!config.apiKey) {
65
- console.log(chalk_1.default.red('✗ Not authenticated'));
66
- return;
67
- }
68
- const client = await client_1.ApiClient.create();
69
- const response = await client.request('GET', `/v1/platform/courses?limit=${options.limit}`);
70
- const courses = response.data || [];
71
- if (courses.length === 0) {
72
- console.log(chalk_1.default.gray('No courses found'));
73
- return;
74
- }
75
- const tableData = courses.map((c) => ({
76
- ID: c.id.slice(0, 8),
55
+ .option('-l, --limit <number>', 'Number of results', '10')
56
+ .action((0, runtime_1.command)(async (options) => {
57
+ const client = await client_1.ApiClient.createAuthenticated();
58
+ const response = await client.request('GET', `/v1/platform/courses?limit=${options.limit}`);
59
+ const courses = response.data ?? [];
60
+ if ((0, runtime_1.isJsonMode)()) {
61
+ (0, output_1.printResult)(courses);
62
+ }
63
+ else {
64
+ (0, output_1.printResult)(courses.map((c) => ({
65
+ ID: c.id,
77
66
  Title: c.title || 'Untitled',
78
67
  Status: c.status,
79
68
  Created: new Date(c.createdAt).toLocaleDateString(),
80
- }));
81
- console.log((0, output_1.formatTable)(tableData));
82
- }
83
- catch (error) {
84
- console.error(chalk_1.default.red('✗ Failed to list courses'), error);
69
+ })));
85
70
  }
86
- });
71
+ }));
72
+ course
73
+ .command('get <id>')
74
+ .description('Fetch a single course by ID')
75
+ .action((0, runtime_1.command)(async (id) => {
76
+ const client = await client_1.ApiClient.createAuthenticated();
77
+ const response = await client.request('GET', `/v1/platform/courses/${id}`);
78
+ (0, output_1.printResult)(response);
79
+ }));
87
80
  course
88
81
  .command('open <id>')
89
82
  .description('Open a course in the browser')
90
- .action(async (id) => {
91
- try {
92
- const config = await (0, config_1.readConfig)();
93
- if (!config.apiKey) {
94
- console.log(chalk_1.default.red('✗ Not authenticated'));
95
- return;
96
- }
97
- const client = await client_1.ApiClient.create();
98
- const response = await client.request('GET', `/v1/platform/courses/${id}`);
99
- if (response.previewUrl) {
100
- await (0, open_1.default)(response.previewUrl);
101
- console.log(chalk_1.default.green('✓ Opening in browser...'));
102
- }
103
- else {
104
- console.log(chalk_1.default.red('✗ No preview URL available'));
105
- }
106
- }
107
- catch (error) {
108
- console.error(chalk_1.default.red('✗ Failed to open course'), error);
83
+ .action((0, runtime_1.command)(async (id) => {
84
+ const client = await client_1.ApiClient.createAuthenticated();
85
+ const response = await client.request('GET', `/v1/platform/courses/${id}`);
86
+ if (!response.previewUrl) {
87
+ throw new runtime_1.CliError('No preview URL available for this course', {
88
+ code: 'ENOPREVIEW',
89
+ exitCode: 1,
90
+ });
109
91
  }
110
- });
92
+ if ((0, runtime_1.isInteractive)())
93
+ await (0, open_1.default)(response.previewUrl);
94
+ (0, output_1.printResult)({ previewUrl: response.previewUrl });
95
+ (0, output_1.printStatus)('Opening in browser...', 'success');
96
+ }));
111
97
  return course;
112
98
  }
113
99
  //# sourceMappingURL=course.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"course.js","sourceRoot":"","sources":["../../src/commands/course.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"course.js","sourceRoot":"","sources":["../../src/commands/course.ts"],"names":[],"mappings":";;;;;AAkBA,sCA2GC;AA7HD,yCAAoC;AACpC,4CAAwD;AACxD,gDAAwB;AACxB,sCAAsC;AACtC,4CAA2D;AAC3D,8CAAoG;AAapG,SAAgB,aAAa;IAC3B,MAAM,MAAM,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAEnE,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,UAAU,EAAE,sCAAsC,CAAC;SAC5D,MAAM,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,GAAG,CAAC;SAC1D,MAAM,CAAC,0BAA0B,EAAE,eAAe,EAAE,IAAI,CAAC;SACzD,MAAM,CAAC,QAAQ,EAAE,mDAAmD,CAAC;SACrE,MAAM,CACL,IAAA,iBAAO,EAAC,KAAK,EAAE,MAA0B,EAAE,OAA4B,EAAE,EAAE;QACzE,IAAI,YAAY,GAAG,MAAM,CAAC;QAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAA,4BAAkB,EAAC,mEAAmE,CAAC,CAAC;YACxF,MAAM,MAAM,GAAG,MAAM,IAAA,cAAI,EAAC,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAC;YACvE,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,MAAM,IAAI,kBAAQ,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YACzE,CAAC;YACD,YAAY,GAAG,MAAM,CAAC;QACxB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,kBAAS,CAAC,mBAAmB,EAAE,CAAC;QACrD,MAAM,CAAC,GAAG,IAAA,oBAAU,GAAE,IAAI,CAAC,IAAA,uBAAa,GAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,iBAAO,GAAE,CAAC;QAC9D,CAAC,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAE/B,IAAI,QAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAiB,MAAM,EAAE,sBAAsB,EAAE;gBAC9E,MAAM,EAAE,YAAY;gBACpB,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;QAED,IAAA,oBAAW,EAAC,QAAQ,CAAC,CAAC;QAEtB,IAAI,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,UAAU,IAAI,IAAA,uBAAa,GAAE,EAAE,CAAC;YAC3D,MAAM,UAAU,GAAG,MAAM,IAAA,iBAAO,EAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAClE,IAAI,UAAU,KAAK,IAAI;gBAAE,MAAM,IAAA,cAAI,EAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEJ,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,IAAI,CAAC;SACzD,MAAM,CACL,IAAA,iBAAO,EAAC,KAAK,EAAE,OAA0B,EAAE,EAAE;QAC3C,MAAM,MAAM,GAAG,MAAM,kBAAS,CAAC,mBAAmB,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CACnC,KAAK,EACL,8BAA8B,OAAO,CAAC,KAAK,EAAE,CAC9C,CAAC;QAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;QACpC,IAAI,IAAA,oBAAU,GAAE,EAAE,CAAC;YACjB,IAAA,oBAAW,EAAC,OAAO,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAA,oBAAW,EACT,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClB,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,UAAU;gBAC5B,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE;aACpD,CAAC,CAAC,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEJ,MAAM;SACH,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CACL,IAAA,iBAAO,EAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,MAAM,kBAAS,CAAC,mBAAmB,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAiB,KAAK,EAAE,wBAAwB,EAAE,EAAE,CAAC,CAAC;QAC3F,IAAA,oBAAW,EAAC,QAAQ,CAAC,CAAC;IACxB,CAAC,CAAC,CACH,CAAC;IAEJ,MAAM;SACH,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CACL,IAAA,iBAAO,EAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,MAAM,kBAAS,CAAC,mBAAmB,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CACnC,KAAK,EACL,wBAAwB,EAAE,EAAE,CAC7B,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YACzB,MAAM,IAAI,kBAAQ,CAAC,0CAA0C,EAAE;gBAC7D,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;QACL,CAAC;QACD,IAAI,IAAA,uBAAa,GAAE;YAAE,MAAM,IAAA,cAAI,EAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrD,IAAA,oBAAW,EAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACjD,IAAA,oBAAW,EAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC;IAClD,CAAC,CAAC,CACH,CAAC;IAEJ,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/commands/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,eAAe,IAAI,OAAO,CA+DzC"}
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/commands/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,eAAe,IAAI,OAAO,CA2DzC"}
@@ -1,68 +1,62 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.evaluateCommand = evaluateCommand;
7
4
  const commander_1 = require("commander");
8
5
  const prompts_1 = require("@clack/prompts");
9
- const chalk_1 = __importDefault(require("chalk"));
10
6
  const client_1 = require("../client");
11
- const config_1 = require("../config");
7
+ const output_1 = require("../utils/output");
8
+ const runtime_1 = require("../utils/runtime");
9
+ const VALID_TYPES = ['exact', 'rubric', 'open-ended'];
12
10
  function evaluateCommand() {
13
- const evaluate = new commander_1.Command('evaluate')
11
+ return new commander_1.Command('evaluate')
14
12
  .description('Evaluate student responses')
15
- .option('-t, --type <type>', 'Evaluation type: exact, rubric, open-ended')
16
- .action(async (options) => {
17
- try {
18
- const config = await (0, config_1.readConfig)();
19
- if (!config.apiKey) {
20
- console.log(chalk_1.default.red('✗ Not authenticated. Run "tutorflow auth login" first.'));
21
- return;
22
- }
23
- let evalType = options.type;
24
- if (!evalType) {
25
- evalType = (await (0, prompts_1.select)({
26
- message: 'Select evaluation type:',
27
- options: [
28
- { value: 'exact', label: 'Exact Match' },
29
- { value: 'rubric', label: 'Rubric-based' },
30
- { value: 'open-ended', label: 'Open-ended AI Evaluation' },
31
- ],
32
- }));
33
- }
34
- if (!evalType || typeof evalType === 'symbol') {
35
- console.log(chalk_1.default.gray('Cancelled'));
36
- return;
37
- }
38
- const question = await (0, prompts_1.text)({ message: 'Enter the question:' });
39
- if (!question || typeof question === 'symbol')
40
- return;
41
- const studentAnswer = await (0, prompts_1.text)({ message: 'Enter the student answer:' });
42
- if (!studentAnswer || typeof studentAnswer === 'symbol')
43
- return;
44
- let expectedAnswer;
45
- if (evalType !== 'open-ended') {
46
- const expected = await (0, prompts_1.text)({ message: 'Enter the expected answer:' });
47
- if (!expected || typeof expected === 'symbol')
48
- return;
49
- expectedAnswer = expected;
50
- }
51
- const client = await client_1.ApiClient.create();
52
- const response = await client.request('POST', '/v1/platform/evaluate', {
53
- evaluationType: evalType,
54
- question,
55
- studentAnswer,
56
- expectedAnswer,
13
+ .option('-t, --type <type>', `Evaluation type (${VALID_TYPES.join(' | ')})`)
14
+ .option('-q, --question <text>', 'The question being evaluated')
15
+ .option('-a, --student-answer <text>', "Student's answer")
16
+ .option('-e, --expected-answer <text>', 'Expected answer (required for exact and rubric)')
17
+ .action((0, runtime_1.command)(async (options) => {
18
+ let evalType = options.type;
19
+ if (!evalType) {
20
+ (0, runtime_1.requireInteractive)(`Pass --type ${VALID_TYPES.join('|')}`);
21
+ const result = await (0, prompts_1.select)({
22
+ message: 'Select evaluation type:',
23
+ options: [
24
+ { value: 'exact', label: 'Exact Match' },
25
+ { value: 'rubric', label: 'Rubric-based' },
26
+ { value: 'open-ended', label: 'Open-ended AI Evaluation' },
27
+ ],
57
28
  });
58
- console.log(chalk_1.default.green('\n✓ Evaluation Complete\n'));
59
- console.log(chalk_1.default.gray(`Score: ${response.score}`));
60
- console.log(chalk_1.default.gray(`Feedback: ${response.feedback}`));
29
+ if (typeof result === 'symbol') {
30
+ throw new runtime_1.CliError('Cancelled', { code: 'ECANCELLED', exitCode: 130 });
31
+ }
32
+ evalType = result;
33
+ }
34
+ if (!VALID_TYPES.includes(evalType)) {
35
+ throw new runtime_1.CliError(`Invalid --type "${evalType}". Must be one of: ${VALID_TYPES.join(', ')}`, { code: 'EINVAL', exitCode: 2 });
61
36
  }
62
- catch (error) {
63
- console.error(chalk_1.default.red('✗ Evaluation failed'), error);
37
+ const question = options.question ?? (await promptOrThrow('Enter the question:', '--question'));
38
+ const studentAnswer = options.studentAnswer ??
39
+ (await promptOrThrow('Enter the student answer:', '--student-answer'));
40
+ let expectedAnswer = options.expectedAnswer;
41
+ if (evalType !== 'open-ended' && !expectedAnswer) {
42
+ expectedAnswer = await promptOrThrow('Enter the expected answer:', '--expected-answer');
64
43
  }
65
- });
66
- return evaluate;
44
+ const client = await client_1.ApiClient.createAuthenticated();
45
+ const response = await client.request('POST', '/v1/platform/evaluate', {
46
+ evaluationType: evalType,
47
+ question,
48
+ studentAnswer,
49
+ expectedAnswer,
50
+ });
51
+ (0, output_1.printResult)(response);
52
+ }));
53
+ }
54
+ async function promptOrThrow(message, flagHint) {
55
+ (0, runtime_1.requireInteractive)(`Pass ${flagHint} <text>.`);
56
+ const result = await (0, prompts_1.text)({ message });
57
+ if (!result || typeof result === 'symbol') {
58
+ throw new runtime_1.CliError('Cancelled', { code: 'ECANCELLED', exitCode: 130 });
59
+ }
60
+ return result;
67
61
  }
68
62
  //# sourceMappingURL=evaluate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/commands/evaluate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/commands/evaluate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function moduleCommand(): Command;
3
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/commands/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC,wBAAgB,aAAa,IAAI,OAAO,CAsGvC"}
@@ -0,0 +1,108 @@
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.moduleCommand = moduleCommand;
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 moduleCommand() {
14
+ const module = new commander_1.Command('module').description('Manage standalone lesson modules');
15
+ module
16
+ .command('create')
17
+ .argument('[prompt]', 'Prompt describing the standalone lesson module')
18
+ .option('--title <title>', 'Override generated title')
19
+ .option('--description <description>', 'Override generated description')
20
+ .option('--target <target>', 'Target learner audience')
21
+ .option('--type <type>', 'Module type', 'lesson')
22
+ .option('--locale <locale>', 'Locale code', 'en')
23
+ .option('--language <language>', 'Language code', 'en')
24
+ .option('--slug <slug>', 'Optional module slug')
25
+ .option('--private', 'Create as non-public')
26
+ .option('--no-quiz', 'Disable generated quiz')
27
+ .option('--idempotency-key <key>', 'Idempotency key for safe retries')
28
+ .option('--open', 'Open the public URL in a browser when done (TTY only)')
29
+ .action((0, runtime_1.command)(async (prompt, options) => {
30
+ const modulePrompt = await promptOrThrow(prompt, 'Describe the standalone lesson module:', 'Pass a prompt argument: tutorflow module create "Fractions for 5th grade"');
31
+ const client = await client_1.ApiClient.createAuthenticated();
32
+ const response = await client.request('POST', '/v1/platform/modules', compact({
33
+ prompt: modulePrompt,
34
+ title: options.title,
35
+ description: options.description,
36
+ target: options.target,
37
+ type: options.type,
38
+ locale: options.locale,
39
+ language: options.language,
40
+ slug: options.slug,
41
+ isPublic: options.private ? false : true,
42
+ hasQuiz: options.quiz,
43
+ }), idempotencyHeaders(options.idempotencyKey));
44
+ (0, output_1.printResult)(response);
45
+ if (options.open && response.publicUrl && (0, runtime_1.isInteractive)()) {
46
+ await (0, open_1.default)(response.publicUrl);
47
+ (0, output_1.printStatus)('Opening in browser...', 'success');
48
+ }
49
+ }));
50
+ module
51
+ .command('list')
52
+ .option('-l, --limit <number>', 'Number of results', '20')
53
+ .option('-o, --offset <number>', 'Number of rows to skip', '0')
54
+ .option('-s, --search <text>', 'Search term')
55
+ .action((0, runtime_1.command)(async (options) => {
56
+ const client = await client_1.ApiClient.createAuthenticated();
57
+ const qs = new URLSearchParams({ limit: options.limit, offset: options.offset });
58
+ if (options.search)
59
+ qs.set('search', options.search);
60
+ const response = await client.request('GET', `/v1/platform/modules?${qs.toString()}`);
61
+ (0, output_1.printResult)(response);
62
+ }));
63
+ module
64
+ .command('get <id>')
65
+ .description('Fetch a single module by ID')
66
+ .action((0, runtime_1.command)(async (id) => {
67
+ const client = await client_1.ApiClient.createAuthenticated();
68
+ const response = await client.request('GET', `/v1/platform/modules/${id}`);
69
+ (0, output_1.printResult)(response);
70
+ }));
71
+ module
72
+ .command('open <id>')
73
+ .description('Open a module public URL in the browser')
74
+ .action((0, runtime_1.command)(async (id) => {
75
+ const client = await client_1.ApiClient.createAuthenticated();
76
+ const response = await client.request('GET', `/v1/platform/modules/${id}`);
77
+ if (!response.publicUrl) {
78
+ throw new runtime_1.CliError('No public URL available for this module', {
79
+ code: 'ENOPREVIEW',
80
+ exitCode: 1,
81
+ });
82
+ }
83
+ if ((0, runtime_1.isInteractive)())
84
+ await (0, open_1.default)(response.publicUrl);
85
+ (0, output_1.printResult)({ publicUrl: response.publicUrl });
86
+ (0, output_1.printStatus)('Opening in browser...', 'success');
87
+ }));
88
+ return module;
89
+ }
90
+ async function promptOrThrow(value, message, hint) {
91
+ if (value?.trim())
92
+ return value.trim();
93
+ (0, runtime_1.requireInteractive)(hint);
94
+ const result = await (0, prompts_1.text)({ message });
95
+ if (!result || typeof result === 'symbol') {
96
+ throw new runtime_1.CliError('Cancelled', { code: 'ECANCELLED', exitCode: 130 });
97
+ }
98
+ return result;
99
+ }
100
+ function compact(input) {
101
+ return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined && value !== ''));
102
+ }
103
+ function idempotencyHeaders(key) {
104
+ if (!key)
105
+ return undefined;
106
+ return { 'Idempotency-Key': key };
107
+ }
108
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/commands/module.ts"],"names":[],"mappings":";;;;;AA4BA,sCAsGC;AAlID,yCAAoC;AACpC,4CAAsC;AACtC,gDAAwB;AACxB,sCAAsC;AACtC,4CAA2D;AAC3D,8CAAwF;AAuBxF,SAAgB,aAAa;IAC3B,MAAM,MAAM,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,kCAAkC,CAAC,CAAC;IAErF,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,UAAU,EAAE,gDAAgD,CAAC;SACtE,MAAM,CAAC,iBAAiB,EAAE,0BAA0B,CAAC;SACrD,MAAM,CAAC,6BAA6B,EAAE,gCAAgC,CAAC;SACvE,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACtD,MAAM,CAAC,eAAe,EAAE,aAAa,EAAE,QAAQ,CAAC;SAChD,MAAM,CAAC,mBAAmB,EAAE,aAAa,EAAE,IAAI,CAAC;SAChD,MAAM,CAAC,uBAAuB,EAAE,eAAe,EAAE,IAAI,CAAC;SACtD,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC;SAC/C,MAAM,CAAC,WAAW,EAAE,sBAAsB,CAAC;SAC3C,MAAM,CAAC,WAAW,EAAE,wBAAwB,CAAC;SAC7C,MAAM,CAAC,yBAAyB,EAAE,kCAAkC,CAAC;SACrE,MAAM,CAAC,QAAQ,EAAE,uDAAuD,CAAC;SACzE,MAAM,CACL,IAAA,iBAAO,EAAC,KAAK,EAAE,MAA0B,EAAE,OAA4B,EAAE,EAAE;QACzE,MAAM,YAAY,GAAG,MAAM,aAAa,CACtC,MAAM,EACN,wCAAwC,EACxC,2EAA2E,CAC5E,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,kBAAS,CAAC,mBAAmB,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CACnC,MAAM,EACN,sBAAsB,EACtB,OAAO,CAAC;YACN,MAAM,EAAE,YAAY;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YACxC,OAAO,EAAE,OAAO,CAAC,IAAI;SACtB,CAAC,EACF,kBAAkB,CAAC,OAAO,CAAC,cAAc,CAAC,CAC3C,CAAC;QAEF,IAAA,oBAAW,EAAC,QAAQ,CAAC,CAAC;QAEtB,IAAI,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,SAAS,IAAI,IAAA,uBAAa,GAAE,EAAE,CAAC;YAC1D,MAAM,IAAA,cAAI,EAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC/B,IAAA,oBAAW,EAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEJ,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,IAAI,CAAC;SACzD,MAAM,CAAC,uBAAuB,EAAE,wBAAwB,EAAE,GAAG,CAAC;SAC9D,MAAM,CAAC,qBAAqB,EAAE,aAAa,CAAC;SAC5C,MAAM,CACL,IAAA,iBAAO,EAAC,KAAK,EAAE,OAA0B,EAAE,EAAE;QAC3C,MAAM,MAAM,GAAG,MAAM,kBAAS,CAAC,mBAAmB,EAAE,CAAC;QACrD,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACjF,IAAI,OAAO,CAAC,MAAM;YAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CACnC,KAAK,EACL,wBAAwB,EAAE,CAAC,QAAQ,EAAE,EAAE,CACxC,CAAC;QACF,IAAA,oBAAW,EAAC,QAAQ,CAAC,CAAC;IACxB,CAAC,CAAC,CACH,CAAC;IAEJ,MAAM;SACH,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CACL,IAAA,iBAAO,EAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,MAAM,kBAAS,CAAC,mBAAmB,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAiB,KAAK,EAAE,wBAAwB,EAAE,EAAE,CAAC,CAAC;QAC3F,IAAA,oBAAW,EAAC,QAAQ,CAAC,CAAC;IACxB,CAAC,CAAC,CACH,CAAC;IAEJ,MAAM;SACH,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CACL,IAAA,iBAAO,EAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,MAAM,kBAAS,CAAC,mBAAmB,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAiB,KAAK,EAAE,wBAAwB,EAAE,EAAE,CAAC,CAAC;QAC3F,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,kBAAQ,CAAC,yCAAyC,EAAE;gBAC5D,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;QACL,CAAC;QACD,IAAI,IAAA,uBAAa,GAAE;YAAE,MAAM,IAAA,cAAI,EAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpD,IAAA,oBAAW,EAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;QAC/C,IAAA,oBAAW,EAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC;IAClD,CAAC,CAAC,CACH,CAAC;IAEJ,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,KAAyB,EACzB,OAAe,EACf,IAAY;IAEZ,IAAI,KAAK,EAAE,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IAEvC,IAAA,4BAAkB,EAAC,IAAI,CAAC,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,IAAA,cAAI,EAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,kBAAQ,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,OAAO,CAAC,KAA8B;IAC7C,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CACjF,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAuB;IACjD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function platformCommand(): Command;
3
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/commands/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,eAAe,IAAI,OAAO,CA2CzC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.platformCommand = platformCommand;
4
+ const commander_1 = require("commander");
5
+ const client_1 = require("../client");
6
+ const output_1 = require("../utils/output");
7
+ const runtime_1 = require("../utils/runtime");
8
+ function platformCommand() {
9
+ const platform = new commander_1.Command('platform').description('Inspect TutorFlow Platform metadata');
10
+ platform
11
+ .command('manifest')
12
+ .description('Read the public agent discovery manifest')
13
+ .action((0, runtime_1.command)(async () => {
14
+ const client = await client_1.ApiClient.create();
15
+ const response = await client.request('GET', '/v1/platform/.well-known/agent.json');
16
+ (0, output_1.printResult)(response);
17
+ }));
18
+ platform
19
+ .command('pricing')
20
+ .description('Read the public platform pricing catalog')
21
+ .action((0, runtime_1.command)(async () => {
22
+ const client = await client_1.ApiClient.create();
23
+ const response = await client.request('GET', '/v1/platform/pricing-catalog');
24
+ (0, output_1.printResult)(response);
25
+ }));
26
+ platform
27
+ .command('health')
28
+ .description('Check the active Platform API key')
29
+ .action((0, runtime_1.command)(async () => {
30
+ const client = await client_1.ApiClient.createAuthenticated();
31
+ const response = await client.request('GET', '/v1/platform/health');
32
+ (0, output_1.printResult)(response);
33
+ }));
34
+ return platform;
35
+ }
36
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/commands/platform.ts"],"names":[],"mappings":";;AAKA,0CA2CC;AAhDD,yCAAoC;AACpC,sCAAsC;AACtC,4CAA8C;AAC9C,8CAA2C;AAE3C,SAAgB,eAAe;IAC7B,MAAM,QAAQ,GAAG,IAAI,mBAAO,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,qCAAqC,CAAC,CAAC;IAE5F,QAAQ;SACL,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CACL,IAAA,iBAAO,EAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,kBAAS,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CACnC,KAAK,EACL,qCAAqC,CACtC,CAAC;QACF,IAAA,oBAAW,EAAC,QAAQ,CAAC,CAAC;IACxB,CAAC,CAAC,CACH,CAAC;IAEJ,QAAQ;SACL,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CACL,IAAA,iBAAO,EAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,kBAAS,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAY,KAAK,EAAE,8BAA8B,CAAC,CAAC;QACxF,IAAA,oBAAW,EAAC,QAAQ,CAAC,CAAC;IACxB,CAAC,CAAC,CACH,CAAC;IAEJ,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CACL,IAAA,iBAAO,EAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,kBAAS,CAAC,mBAAmB,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CACnC,KAAK,EACL,qBAAqB,CACtB,CAAC;QACF,IAAA,oBAAW,EAAC,QAAQ,CAAC,CAAC;IACxB,CAAC,CAAC,CACH,CAAC;IAEJ,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"slide.d.ts","sourceRoot":"","sources":["../../src/commands/slide.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,wBAAgB,YAAY,IAAI,OAAO,CAqHtC"}
1
+ {"version":3,"file":"slide.d.ts","sourceRoot":"","sources":["../../src/commands/slide.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,wBAAgB,YAAY,IAAI,OAAO,CA8GtC"}