@telebort/question-banks 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/schemas/question.ts","../../src/schemas/course.ts","../../src/schemas/assessment.ts","../../src/cli/utils/formatters.ts","../../src/cli/utils/error-handler.ts","../../src/cli/commands/validate.ts","../../src/index.ts","../../src/cli/utils/sdk-loader.ts","../../src/cli/commands/stats.ts","../../src/cli/commands/quiz.ts","../../src/cli/index.ts"],"names":["z","readFile","basename","readdir","join","stat","query","path","resolve","Command"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from 'zod'\n\n// ============================================================================\n// Feedback Schema (v1.1 enhancement)\n// ============================================================================\n\n/**\n * Structured feedback following the \"Not Yet\" protocol\n * - short: Brief acknowledgment (1 sentence)\n * - detailed: Full explanation of the misconception\n * - socraticHint: Optional guiding question for discovery learning\n */\nexport const FeedbackSchema = z.object({\n short: z.string().min(1).max(200),\n detailed: z.string().min(1).max(1000),\n socraticHint: z.string().max(300).optional(),\n})\n\nexport type Feedback = z.infer<typeof FeedbackSchema>\n\n// ============================================================================\n// Option Schema\n// ============================================================================\n\nexport const OptionKeySchema = z.enum(['A', 'B', 'C', 'D'])\n\nexport type OptionKey = z.infer<typeof OptionKeySchema>\n\n/**\n * Answer option with optional misconception tracking (v1.1)\n */\nexport const OptionSchema = z.object({\n key: OptionKeySchema,\n text: z.string().min(1),\n isCorrect: z.boolean(),\n // v1.1 fields - optional for backward compatibility\n misconceptionId: z.string().optional(),\n feedback: FeedbackSchema.optional(),\n})\n\nexport type Option = z.infer<typeof OptionSchema>\n\n// ============================================================================\n// Question Type Enums\n// ============================================================================\n\nexport const QuestionTypeSchema = z.enum([\n 'vocabulary',\n 'code_understanding',\n 'problem_solving',\n 'application',\n 'reflection',\n])\n\nexport type QuestionType = z.infer<typeof QuestionTypeSchema>\n\n/**\n * Question archetype for pedagogical classification\n * - vocabulary: Definition/terminology questions\n * - trace: Code tracing (mental execution)\n * - bebras: Logic-first, computational thinking\n * - blockmodel: Surface/flow/purpose analysis\n * - parsons: Code block reordering (future)\n */\nexport const QuestionArchetypeSchema = z.enum([\n 'vocabulary',\n 'trace',\n 'bebras',\n 'blockmodel',\n 'parsons',\n])\n\nexport type QuestionArchetype = z.infer<typeof QuestionArchetypeSchema>\n\nexport const DifficultySchema = z.enum(['easy', 'medium', 'hard', 'challenge'])\n\nexport type Difficulty = z.infer<typeof DifficultySchema>\n\nexport const BloomsTaxonomySchema = z.enum([\n 'remember',\n 'understand',\n 'apply',\n 'analyze',\n 'evaluate',\n 'create',\n])\n\nexport type BloomsTaxonomy = z.infer<typeof BloomsTaxonomySchema>\n\n// ============================================================================\n// Question Metadata Schema\n// ============================================================================\n\nexport const QuestionMetadataSchema = z.object({\n difficulty: DifficultySchema,\n estimatedTime: z.number().int().positive(), // seconds\n bloomsTaxonomy: BloomsTaxonomySchema,\n tags: z.array(z.string()),\n source: z.string().default('exit-ticket'),\n version: z.string().default('1.1'),\n createdDate: z.string().optional(),\n lastModified: z.string().optional(),\n})\n\nexport type QuestionMetadata = z.infer<typeof QuestionMetadataSchema>\n\n// ============================================================================\n// Question Schema (v1.1)\n// ============================================================================\n\n/**\n * Full question schema with v1.1 enhancements:\n * - questionArchetype: Pedagogical classification\n * - misconceptionTargets: Expected misconceptions this question probes\n * - options with misconceptionId and structured feedback\n */\nexport const QuestionSchema = z.object({\n // Identifiers\n questionId: z.string().regex(/^[a-z0-9-]+-l\\d+-q\\d+$/),\n globalId: z.string().regex(/^exit-ticket-\\d{4}$/),\n questionNumber: z.number().int().positive().max(5),\n\n // Classification\n questionType: QuestionTypeSchema,\n questionTypeLabel: z.string(),\n questionArchetype: QuestionArchetypeSchema.optional(), // v1.1\n\n // Content\n prompt: z.string().min(10),\n hasCodeBlock: z.boolean(),\n codeLanguage: z.string().nullable(),\n codeContent: z.string().nullable(),\n\n // Misconception targeting (v1.1)\n misconceptionTargets: z.array(z.string()).optional(),\n\n // Answer options (exactly 4)\n options: z.array(OptionSchema).length(4),\n\n // Correct answer\n correctAnswer: OptionKeySchema,\n correctAnswerText: z.string(),\n\n // Metadata\n metadata: QuestionMetadataSchema,\n})\n\nexport type Question = z.infer<typeof QuestionSchema>\n\n// ============================================================================\n// Question without answer (for Standard tier - no answer leakage)\n// ============================================================================\n\nexport const QuestionWithoutAnswerSchema = QuestionSchema.omit({\n correctAnswer: true,\n correctAnswerText: true,\n}).extend({\n options: z.array(\n OptionSchema.omit({\n isCorrect: true,\n feedback: true,\n misconceptionId: true,\n })\n ).length(4),\n})\n\nexport type QuestionWithoutAnswer = z.infer<typeof QuestionWithoutAnswerSchema>\n","import { z } from 'zod'\nimport { QuestionSchema } from './question'\n\n// ============================================================================\n// Course Domain & Tier\n// ============================================================================\n\nexport const CourseDomainSchema = z.enum([\n // AI & Data Science\n 'ai_data_science',\n 'ai_ml_cv',\n 'ai_generative',\n 'ai_advanced',\n // Web Development\n 'web_development',\n // Mobile Development\n 'mobile_development',\n 'mobile',\n // Block-based Programming\n 'block_based',\n 'python_programming',\n 'design',\n // Foundation\n 'foundation',\n 'creative_computing',\n])\n\nexport type CourseDomain = z.infer<typeof CourseDomainSchema>\n\nexport const CourseTierSchema = z.enum([\n 'foundation',\n 'intermediate',\n 'advanced',\n])\n\nexport type CourseTier = z.infer<typeof CourseTierSchema>\n\n// ============================================================================\n// Lesson Schema\n// ============================================================================\n\nexport const LessonSchema = z.object({\n lessonId: z.string(), // e.g., \"ai-1-lesson-1\"\n lessonNumber: z.number().int().positive(),\n lessonTitle: z.string(),\n lessonSlug: z.string().optional(),\n totalQuestions: z.number().int().positive().default(5),\n questions: z.array(QuestionSchema),\n})\n\nexport type Lesson = z.infer<typeof LessonSchema>\n\n// ============================================================================\n// Course Schema\n// ============================================================================\n\nexport const CourseSchema = z.object({\n courseId: z.string(), // e.g., \"ai-1\"\n courseName: z.string(), // e.g., \"AI-1 Data Analysis and Data Science\"\n courseCode: z.string(), // e.g., \"AI1\"\n domain: CourseDomainSchema,\n tier: CourseTierSchema,\n difficulty: z.number().int().min(1).max(5),\n totalLessons: z.number().int().positive(),\n totalQuestions: z.number().int().positive(),\n sourceFile: z.string().optional(),\n lessons: z.array(LessonSchema),\n})\n\nexport type Course = z.infer<typeof CourseSchema>\n\n// ============================================================================\n// Course Summary (without questions - for listing)\n// ============================================================================\n\nexport const CourseSummarySchema = CourseSchema.omit({ lessons: true }).extend({\n lessons: z.array(\n LessonSchema.omit({ questions: true })\n ).optional(),\n})\n\nexport type CourseSummary = z.infer<typeof CourseSummarySchema>\n","import { z } from 'zod'\nimport { OptionKeySchema, FeedbackSchema } from './question'\n\n// ============================================================================\n// User Response Schema\n// ============================================================================\n\n/**\n * A single user response to a question\n */\nexport const UserResponseSchema = z.object({\n questionId: z.string(),\n selectedAnswer: OptionKeySchema,\n timeSpent: z.number().int().nonnegative().optional(), // milliseconds\n submittedAt: z.string().datetime().optional(),\n})\n\nexport type UserResponse = z.infer<typeof UserResponseSchema>\n\n// ============================================================================\n// Assessment Submission Schema\n// ============================================================================\n\n/**\n * An assessment submission containing multiple responses\n */\nexport const AssessmentSubmissionSchema = z.object({\n assessmentId: z.string().uuid().optional(), // Generated if not provided\n userId: z.string().optional(), // For authenticated users\n sessionId: z.string().optional(), // For anonymous sessions\n courseId: z.string(),\n lessonId: z.string().optional(),\n responses: z.array(UserResponseSchema).min(1),\n submittedAt: z.string().datetime(),\n metadata: z.record(z.unknown()).optional(), // Custom metadata\n})\n\nexport type AssessmentSubmission = z.infer<typeof AssessmentSubmissionSchema>\n\n// ============================================================================\n// Graded Response Schema (Premium tier)\n// ============================================================================\n\n/**\n * Result of grading a single response\n */\nexport const GradedResponseSchema = z.object({\n questionId: z.string(),\n selectedAnswer: OptionKeySchema,\n correctAnswer: OptionKeySchema,\n isCorrect: z.boolean(),\n misconceptionId: z.string().nullable(), // For incorrect answers\n feedback: FeedbackSchema.optional(),\n timeSpent: z.number().int().nonnegative().optional(),\n})\n\nexport type GradedResponse = z.infer<typeof GradedResponseSchema>\n\n// ============================================================================\n// Misconception Report Schema (Premium tier)\n// ============================================================================\n\n/**\n * Aggregated misconception analysis for an assessment\n */\nexport const MisconceptionReportSchema = z.object({\n misconceptionId: z.string(),\n count: z.number().int().positive(),\n percentage: z.number().min(0).max(100),\n questionIds: z.array(z.string()),\n description: z.string().optional(),\n})\n\nexport type MisconceptionReport = z.infer<typeof MisconceptionReportSchema>\n\n// ============================================================================\n// Graded Assessment Schema (Premium tier)\n// ============================================================================\n\n/**\n * Complete graded assessment with scores and misconception analysis\n */\nexport const GradedAssessmentSchema = z.object({\n assessmentId: z.string().uuid(),\n userId: z.string().optional(),\n courseId: z.string(),\n lessonId: z.string().optional(),\n\n // Scores\n totalQuestions: z.number().int().positive(),\n correctCount: z.number().int().nonnegative(),\n incorrectCount: z.number().int().nonnegative(),\n score: z.number().min(0).max(100), // Percentage\n passed: z.boolean(), // Based on threshold (default 70%)\n\n // Detailed results\n responses: z.array(GradedResponseSchema),\n\n // Misconception analysis (v1.1 feature)\n misconceptions: z.array(MisconceptionReportSchema).optional(),\n topMisconceptions: z.array(z.string()).max(3).optional(),\n\n // Timing\n totalTimeSpent: z.number().int().nonnegative().optional(), // milliseconds\n averageTimePerQuestion: z.number().nonnegative().optional(),\n submittedAt: z.string().datetime(),\n gradedAt: z.string().datetime(),\n})\n\nexport type GradedAssessment = z.infer<typeof GradedAssessmentSchema>\n\n// ============================================================================\n// Validation Result Schema (Standard tier - no answer leakage)\n// ============================================================================\n\n/**\n * Result of validating an assessment submission\n * Does NOT reveal correct answers - only schema compliance\n */\nexport const ValidationResultSchema = z.object({\n valid: z.boolean(),\n errors: z.array(z.object({\n path: z.array(z.union([z.string(), z.number()])),\n message: z.string(),\n code: z.string().optional(),\n })).optional(),\n isComplete: z.boolean(), // All questions answered\n questionCount: z.number().int(),\n answeredCount: z.number().int(),\n})\n\nexport type ValidationResult = z.infer<typeof ValidationResultSchema>\n","import type { Question } from '../../schemas'\nimport type { Statistics } from '../../types'\n\n// ANSI color codes (chalk-free for simpler dependencies)\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n}\n\nexport function green(text: string): string {\n return `${colors.green}${text}${colors.reset}`\n}\n\nexport function red(text: string): string {\n return `${colors.red}${text}${colors.reset}`\n}\n\nexport function yellow(text: string): string {\n return `${colors.yellow}${text}${colors.reset}`\n}\n\nexport function cyan(text: string): string {\n return `${colors.cyan}${text}${colors.reset}`\n}\n\nexport function bold(text: string): string {\n return `${colors.bold}${text}${colors.reset}`\n}\n\nexport function dim(text: string): string {\n return `${colors.dim}${text}${colors.reset}`\n}\n\n/**\n * Format a question for terminal display\n */\nexport function formatQuestion(q: Question, index: number): string {\n const difficultyColors: Record<string, string> = {\n easy: colors.green,\n medium: colors.yellow,\n hard: colors.red,\n challenge: colors.magenta,\n }\n\n const diffColor = difficultyColors[q.metadata.difficulty] || colors.white\n const diffLabel = `${diffColor}${q.metadata.difficulty}${colors.reset}`\n\n let output = `\\n${colors.bold}Q${index + 1}${colors.reset} [${diffLabel}] ${q.prompt}\\n`\n\n // Show code block if present\n if (q.hasCodeBlock && q.codeContent) {\n output += `${colors.dim}┌─ ${q.codeLanguage || 'code'} ─────────────────${colors.reset}\\n`\n const codeLines = q.codeContent.split('\\n')\n for (const line of codeLines) {\n output += `${colors.dim}│${colors.reset} ${line}\\n`\n }\n output += `${colors.dim}└────────────────────────────${colors.reset}\\n`\n }\n\n // Show options\n for (const opt of q.options) {\n output += ` ${colors.cyan}${opt.key})${colors.reset} ${opt.text}\\n`\n }\n\n return output\n}\n\n/**\n * Format statistics for terminal display\n */\nexport function formatStats(stats: Statistics, title?: string): string {\n let output = '\\n'\n\n if (title) {\n output += `${colors.bold}${colors.cyan}${title}${colors.reset}\\n`\n output += `${'─'.repeat(40)}\\n\\n`\n }\n\n output += `${colors.bold}Overview${colors.reset}\\n`\n output += ` Total Courses: ${stats.totalCourses}\\n`\n output += ` Total Lessons: ${stats.totalLessons}\\n`\n output += ` Total Questions: ${stats.totalQuestions}\\n\\n`\n\n output += `${colors.bold}Questions by Difficulty${colors.reset}\\n`\n const difficulties = ['easy', 'medium', 'hard', 'challenge']\n for (const diff of difficulties) {\n const count = stats.byDifficulty[diff] || 0\n const pct = stats.totalQuestions > 0\n ? Math.round((count / stats.totalQuestions) * 100)\n : 0\n const bar = '█'.repeat(Math.floor(pct / 5))\n output += ` ${diff.padEnd(10)} ${String(count).padStart(4)} ${colors.dim}${bar}${colors.reset} ${pct}%\\n`\n }\n output += '\\n'\n\n output += `${colors.bold}Questions by Type${colors.reset}\\n`\n const types = Object.entries(stats.byQuestionType).sort((a, b) => b[1] - a[1])\n for (const [type, count] of types) {\n output += ` ${type.padEnd(20)} ${count}\\n`\n }\n output += '\\n'\n\n output += `${colors.bold}Code Blocks${colors.reset}\\n`\n output += ` With Code: ${stats.withCodeBlocks}\\n`\n output += ` Without Code: ${stats.withoutCodeBlocks}\\n`\n\n return output\n}\n\n/**\n * Format validation error for terminal display\n */\nexport function formatValidationError(\n filePath: string,\n errors: Array<{ path: (string | number)[]; message: string }>\n): string {\n let output = `\\n${colors.red}✗${colors.reset} ${filePath}\\n`\n\n for (const error of errors) {\n const path = error.path.join('.')\n output += ` ${colors.dim}→${colors.reset} ${path}: ${error.message}\\n`\n }\n\n return output\n}\n\n/**\n * Format validation success for terminal display\n */\nexport function formatValidationSuccess(\n filePath: string,\n lessonCount: number,\n questionCount: number\n): string {\n return `${colors.green}✓${colors.reset} ${filePath}\\n` +\n ` ${colors.dim}${lessonCount} lessons, ${questionCount} questions${colors.reset}\\n`\n}\n\n/**\n * Format a summary line\n */\nexport function formatSummary(passed: number, failed: number): string {\n const total = passed + failed\n if (failed === 0) {\n return `\\n${colors.green}${colors.bold}All ${total} files valid${colors.reset}\\n`\n }\n return `\\n${colors.red}${colors.bold}${failed}/${total} files failed validation${colors.reset}\\n`\n}\n","import { red, bold } from './formatters'\n\n/**\n * Exit codes following Unix conventions\n */\nexport const EXIT_CODES = {\n SUCCESS: 0,\n VALIDATION_ERROR: 1,\n USAGE_ERROR: 2,\n FATAL_ERROR: 3,\n}\n\n/**\n * Handle errors consistently across the CLI\n */\nexport function handleError(error: Error): never {\n console.error(`\\n${red(bold('Error:'))} ${error.message}\\n`)\n\n if (process.env.DEBUG) {\n console.error(error.stack)\n }\n\n process.exit(EXIT_CODES.FATAL_ERROR)\n}\n\n/**\n * Setup global error handlers\n */\nexport function setupErrorHandlers(): void {\n process.on('uncaughtException', (error) => {\n console.error(`\\n${red(bold('Uncaught Exception:'))} ${error.message}`)\n if (process.env.DEBUG) {\n console.error(error.stack)\n }\n process.exit(EXIT_CODES.FATAL_ERROR)\n })\n\n process.on('unhandledRejection', (reason) => {\n const message = reason instanceof Error ? reason.message : String(reason)\n console.error(`\\n${red(bold('Unhandled Rejection:'))} ${message}`)\n if (process.env.DEBUG && reason instanceof Error) {\n console.error(reason.stack)\n }\n process.exit(EXIT_CODES.FATAL_ERROR)\n })\n}\n","import { readFile, readdir, stat } from 'fs/promises'\nimport { join, basename } from 'path'\nimport { CourseSchema } from '../../schemas'\nimport {\n formatValidationError,\n formatValidationSuccess,\n formatSummary,\n green,\n cyan,\n bold,\n} from '../utils/formatters'\nimport { EXIT_CODES } from '../utils/error-handler'\n\nexport interface ValidateOptions {\n all?: boolean\n verbose?: boolean\n}\n\n/**\n * Validate a single course JSON file\n */\nasync function validateFile(filePath: string, verbose?: boolean): Promise<boolean> {\n try {\n const content = await readFile(filePath, 'utf-8')\n const data = JSON.parse(content)\n const result = CourseSchema.safeParse(data)\n\n if (result.success) {\n const lessonCount = result.data.lessons?.length ?? 0\n const questionCount = result.data.lessons?.reduce(\n (sum, l) => sum + (l.questions?.length ?? 0),\n 0\n ) ?? 0\n console.log(formatValidationSuccess(basename(filePath), lessonCount, questionCount))\n return true\n } else {\n const errors = result.error.issues.map(issue => ({\n path: issue.path,\n message: issue.message,\n }))\n console.log(formatValidationError(basename(filePath), verbose ? errors : errors.slice(0, 5)))\n if (!verbose && errors.length > 5) {\n console.log(` ... and ${errors.length - 5} more errors (use --verbose to see all)\\n`)\n }\n return false\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.log(formatValidationError(basename(filePath), [\n { path: [], message: `Parse error: ${message}` },\n ]))\n return false\n }\n}\n\n/**\n * Validate all JSON files in a directory\n */\nasync function validateDirectory(dirPath: string, verbose?: boolean): Promise<boolean> {\n const files = await readdir(dirPath)\n const jsonFiles = files.filter(f => f.endsWith('.json'))\n\n if (jsonFiles.length === 0) {\n console.log(`No JSON files found in ${dirPath}`)\n return false\n }\n\n console.log(`\\n${cyan(bold('Validating'))} ${jsonFiles.length} files in ${dirPath}\\n`)\n\n let passed = 0\n let failed = 0\n\n for (const file of jsonFiles.sort()) {\n const filePath = join(dirPath, file)\n const success = await validateFile(filePath, verbose)\n if (success) {\n passed++\n } else {\n failed++\n }\n }\n\n console.log(formatSummary(passed, failed))\n return failed === 0\n}\n\n/**\n * Main validate command handler\n */\nexport async function validateCommand(\n fileOrDir: string,\n options: ValidateOptions\n): Promise<void> {\n try {\n const stats = await stat(fileOrDir)\n\n if (stats.isDirectory()) {\n const success = await validateDirectory(fileOrDir, options.verbose)\n process.exit(success ? EXIT_CODES.SUCCESS : EXIT_CODES.VALIDATION_ERROR)\n } else if (stats.isFile()) {\n console.log(`\\n${cyan(bold('Validating'))} ${basename(fileOrDir)}\\n`)\n const success = await validateFile(fileOrDir, options.verbose)\n if (success) {\n console.log(`\\n${green(bold('Valid!'))} File passed schema validation.\\n`)\n }\n process.exit(success ? EXIT_CODES.SUCCESS : EXIT_CODES.VALIDATION_ERROR)\n } else {\n console.error(`Invalid path: ${fileOrDir}`)\n process.exit(EXIT_CODES.USAGE_ERROR)\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n console.error(`File or directory not found: ${fileOrDir}`)\n process.exit(EXIT_CODES.USAGE_ERROR)\n }\n throw error\n }\n}\n","/**\n * @telebort/exit-tickets - Exit Tickets SDK\n *\n * Three-tier access to exit ticket questions and assessments:\n *\n * ## Free Tier - Schemas\n * ```typescript\n * import { QuestionSchema } from '@telebort/exit-tickets/schemas'\n * ```\n *\n * ## Standard Tier - Validation API\n * ```typescript\n * import { ValidationClient } from '@telebort/exit-tickets/validation'\n * ```\n *\n * ## Premium Tier - Full Access\n * ```typescript\n * import { PremiumClient } from '@telebort/exit-tickets/premium'\n * ```\n *\n * ## SDK Factory (for custom data sources)\n * ```typescript\n * import { createExitTicketsSDK } from '@telebort/exit-tickets'\n *\n * const sdk = createExitTicketsSDK({\n * dataSource: {\n * async loadCourses() {\n * return myQuestionData\n * }\n * }\n * })\n * ```\n */\n\n// Re-export schemas (Free Tier)\nexport * from './schemas'\n\n// Re-export types\nexport * from './types'\n\n// Re-export core interfaces\nexport * from './core'\n\n// SDK Factory\nimport type { Course, Question, Lesson } from './schemas'\nimport type { ExitTicketsConfig, QuestionFilters, QuizCriteria, SearchOptions, Statistics } from './types'\nimport type { QueryResult } from './core/interfaces'\n\n/**\n * Exit Tickets SDK instance\n */\nexport interface ExitTicketsSDK {\n /**\n * Data access methods\n */\n data: {\n getCourses(): Promise<Course[]>\n getCourse(courseId: string): Promise<Course | null>\n getLesson(courseId: string, lessonNumber: number): Promise<Lesson | null>\n getQuestion(questionId: string): Promise<Question | null>\n getAllQuestions(): Promise<Question[]>\n }\n\n /**\n * Query methods\n */\n query: {\n filterQuestions(filters: QuestionFilters): Promise<QueryResult<Question>>\n getRandomQuestions(count: number, filters?: QuestionFilters): Promise<Question[]>\n }\n\n /**\n * Quiz generation\n */\n quiz: {\n generateQuiz(criteria: QuizCriteria): Promise<{ questions: Question[]; metadata: Record<string, unknown> }>\n getLessonQuiz(courseId: string, lessonNumber: number): Promise<Question[]>\n }\n\n /**\n * Search\n */\n search: {\n search(options: SearchOptions): Promise<QueryResult<Question & { relevanceScore: number }>>\n searchByTags(tags: string[], matchAll?: boolean): Promise<Question[]>\n }\n\n /**\n * Analytics\n */\n analytics: {\n getStatistics(): Promise<Statistics>\n getCourseStatistics(courseId: string): Promise<Statistics & { courseId: string }>\n }\n\n /**\n * Answer validation (requires question data loaded)\n */\n validate: {\n checkAnswer(\n questionId: string,\n answer: string,\n mode: 'formative' | 'summative'\n ): Promise<{\n isCorrect: boolean\n feedback?: { short: string; detailed?: string; socraticHint?: string }\n misconceptionId?: string | null\n correctAnswer?: string\n }>\n }\n}\n\n/**\n * Create an Exit Tickets SDK instance\n *\n * @param config - SDK configuration with data source\n * @returns SDK instance with all services\n *\n * @example\n * ```typescript\n * // Using static JSON import\n * import coursesData from './data/courses.json'\n *\n * const sdk = createExitTicketsSDK({\n * dataSource: {\n * async loadCourses() {\n * return coursesData\n * }\n * }\n * })\n *\n * const questions = await sdk.query.filterQuestions({ courseId: 'ai-1' })\n * ```\n */\nexport function createExitTicketsSDK(config: ExitTicketsConfig): ExitTicketsSDK {\n // Internal state\n let courses: Course[] | null = null\n const questionsById = new Map<string, Question>()\n const questionsByGlobalId = new Map<string, string>()\n // Note: config.passingThreshold is available for future quiz scoring features\n\n // Helper: Ensure data is loaded\n async function ensureLoaded(): Promise<Course[]> {\n if (courses === null) {\n courses = await config.dataSource.loadCourses()\n\n // Build indexes\n for (const course of courses) {\n for (const lesson of course.lessons) {\n for (const question of lesson.questions) {\n questionsById.set(question.questionId, question)\n questionsByGlobalId.set(question.globalId, question.questionId)\n }\n }\n }\n }\n return courses\n }\n\n // Data access methods\n const data: ExitTicketsSDK['data'] = {\n async getCourses() {\n return ensureLoaded()\n },\n\n async getCourse(courseId) {\n const all = await ensureLoaded()\n return all.find(c => c.courseId === courseId) ?? null\n },\n\n async getLesson(courseId, lessonNumber) {\n const course = await data.getCourse(courseId)\n return course?.lessons.find(l => l.lessonNumber === lessonNumber) ?? null\n },\n\n async getQuestion(questionId) {\n await ensureLoaded()\n return questionsById.get(questionId) ?? null\n },\n\n async getAllQuestions() {\n await ensureLoaded()\n return Array.from(questionsById.values())\n },\n }\n\n // Query methods\n const query: ExitTicketsSDK['query'] = {\n async filterQuestions(filters) {\n const all = await data.getAllQuestions()\n let filtered = all\n\n if (filters.courseId) {\n filtered = filtered.filter(q => q.questionId.startsWith(filters.courseId!))\n }\n if (filters.lessonNumber) {\n filtered = filtered.filter(q => q.questionId.includes(`-l${filters.lessonNumber}-`))\n }\n if (filters.questionType) {\n filtered = filtered.filter(q => q.questionType === filters.questionType)\n }\n if (filters.difficulty) {\n filtered = filtered.filter(q => q.metadata.difficulty === filters.difficulty)\n }\n if (filters.hasCodeBlock !== undefined) {\n filtered = filtered.filter(q => q.hasCodeBlock === filters.hasCodeBlock)\n }\n if (filters.tags?.length) {\n filtered = filtered.filter(q =>\n filters.tags!.some(tag => q.metadata.tags.includes(tag))\n )\n }\n\n const total = filtered.length\n const offset = filters.offset ?? 0\n const limit = filters.limit ?? 20\n const paginated = filtered.slice(offset, offset + limit)\n\n return {\n data: paginated,\n total,\n limit,\n offset,\n hasMore: offset + limit < total,\n }\n },\n\n async getRandomQuestions(count, filters) {\n const result = await query.filterQuestions({ ...filters, limit: 1000 })\n const shuffled = [...result.data].sort(() => Math.random() - 0.5)\n return shuffled.slice(0, count)\n },\n }\n\n // Quiz generation\n const quiz: ExitTicketsSDK['quiz'] = {\n async generateQuiz(criteria) {\n const questions = await query.getRandomQuestions(criteria.questionCount, {\n courseId: criteria.courseIds?.[0],\n difficulty: criteria.difficulty,\n questionType: criteria.questionTypes?.[0],\n hasCodeBlock: criteria.includeCodeBlocks,\n })\n\n return {\n questions,\n metadata: {\n distribution: questions.reduce((acc, q) => {\n acc[q.questionType] = (acc[q.questionType] ?? 0) + 1\n return acc\n }, {} as Record<string, number>),\n timestamp: new Date().toISOString(),\n },\n }\n },\n\n async getLessonQuiz(courseId, lessonNumber) {\n const lesson = await data.getLesson(courseId, lessonNumber)\n return lesson?.questions ?? []\n },\n }\n\n // Search\n const search: ExitTicketsSDK['search'] = {\n async search(options) {\n const all = await data.getAllQuestions()\n const query = options.query.toLowerCase()\n\n const scored = all\n .map(q => {\n let score = 0\n if (q.prompt.toLowerCase().includes(query)) score += 3\n if (q.options.some(o => o.text.toLowerCase().includes(query))) score += 1\n return { ...q, relevanceScore: score }\n })\n .filter(q => q.relevanceScore > 0)\n .sort((a, b) => b.relevanceScore - a.relevanceScore)\n\n const offset = options.offset ?? 0\n const limit = options.limit ?? 20\n\n return {\n data: scored.slice(offset, offset + limit),\n total: scored.length,\n limit,\n offset,\n hasMore: offset + limit < scored.length,\n }\n },\n\n async searchByTags(tags, matchAll = false) {\n const all = await data.getAllQuestions()\n return all.filter(q => {\n if (matchAll) {\n return tags.every(tag => q.metadata.tags.includes(tag))\n }\n return tags.some(tag => q.metadata.tags.includes(tag))\n })\n },\n }\n\n // Analytics\n const analytics: ExitTicketsSDK['analytics'] = {\n async getStatistics() {\n const all = await ensureLoaded()\n const questions = await data.getAllQuestions()\n\n const stats: Statistics = {\n totalCourses: all.length,\n totalLessons: all.reduce((sum, c) => sum + c.lessons.length, 0),\n totalQuestions: questions.length,\n byDifficulty: {},\n byQuestionType: {},\n byBloomsTaxonomy: {},\n withCodeBlocks: 0,\n withoutCodeBlocks: 0,\n }\n\n for (const q of questions) {\n stats.byDifficulty[q.metadata.difficulty] = (stats.byDifficulty[q.metadata.difficulty] ?? 0) + 1\n stats.byQuestionType[q.questionType] = (stats.byQuestionType[q.questionType] ?? 0) + 1\n stats.byBloomsTaxonomy[q.metadata.bloomsTaxonomy] = (stats.byBloomsTaxonomy[q.metadata.bloomsTaxonomy] ?? 0) + 1\n if (q.hasCodeBlock) stats.withCodeBlocks++\n else stats.withoutCodeBlocks++\n }\n\n return stats\n },\n\n async getCourseStatistics(courseId) {\n const course = await data.getCourse(courseId)\n if (!course) throw new Error(`Course not found: ${courseId}`)\n\n const questions = course.lessons.flatMap(l => l.questions)\n\n const stats = {\n courseId,\n totalCourses: 1,\n totalLessons: course.lessons.length,\n totalQuestions: questions.length,\n byDifficulty: {} as Record<string, number>,\n byQuestionType: {} as Record<string, number>,\n byBloomsTaxonomy: {} as Record<string, number>,\n withCodeBlocks: 0,\n withoutCodeBlocks: 0,\n }\n\n for (const q of questions) {\n stats.byDifficulty[q.metadata.difficulty] = (stats.byDifficulty[q.metadata.difficulty] ?? 0) + 1\n stats.byQuestionType[q.questionType] = (stats.byQuestionType[q.questionType] ?? 0) + 1\n stats.byBloomsTaxonomy[q.metadata.bloomsTaxonomy] = (stats.byBloomsTaxonomy[q.metadata.bloomsTaxonomy] ?? 0) + 1\n if (q.hasCodeBlock) stats.withCodeBlocks++\n else stats.withoutCodeBlocks++\n }\n\n return stats\n },\n }\n\n // Validation\n const validate: ExitTicketsSDK['validate'] = {\n async checkAnswer(questionId, answer, mode) {\n const question = await data.getQuestion(questionId)\n if (!question) throw new Error(`Question not found: ${questionId}`)\n\n const selectedOption = question.options.find(o => o.key === answer)\n if (!selectedOption) throw new Error(`Invalid answer: ${answer}`)\n\n const isCorrect = selectedOption.isCorrect\n\n return {\n isCorrect,\n feedback: selectedOption.feedback,\n misconceptionId: !isCorrect ? selectedOption.misconceptionId : null,\n correctAnswer: mode === 'formative' ? question.correctAnswer : undefined,\n }\n },\n }\n\n return {\n data,\n query,\n quiz,\n search,\n analytics,\n validate,\n }\n}\n","import { readdir, readFile } from 'fs/promises'\nimport { join, resolve } from 'path'\nimport { createExitTicketsSDK, type ExitTicketsSDK } from '../../index'\nimport type { Course } from '../../schemas'\n\nexport interface LoadSDKOptions {\n dataDir?: string\n}\n\n// Cache SDK instance per data directory\nconst sdkCache = new Map<string, ExitTicketsSDK>()\n\n/**\n * Detect the exports directory containing course JSON files\n */\nexport async function detectDataDir(): Promise<string> {\n // Common locations to check\n const possiblePaths = [\n // Relative to SDK\n '../exit-tickets-api/data/courses',\n // Relative to current working directory\n './data/courses',\n '../data/courses',\n // Absolute common locations\n join(process.cwd(), 'data', 'courses'),\n ]\n\n for (const path of possiblePaths) {\n try {\n const resolved = resolve(path)\n const files = await readdir(resolved)\n const jsonFiles = files.filter(f => f.endsWith('.json'))\n if (jsonFiles.length > 0) {\n return resolved\n }\n } catch {\n // Directory doesn't exist or not readable, continue\n }\n }\n\n throw new Error(\n 'Could not find data directory. Use --data-dir to specify the path to course JSON files.'\n )\n}\n\n/**\n * Load all course JSON files from a directory\n */\nexport async function loadCoursesFromDir(dir: string): Promise<Course[]> {\n const files = await readdir(dir)\n const jsonFiles = files.filter(f => f.endsWith('.json'))\n\n if (jsonFiles.length === 0) {\n throw new Error(`No JSON files found in ${dir}`)\n }\n\n const courses: Course[] = []\n\n for (const file of jsonFiles) {\n try {\n const content = await readFile(join(dir, file), 'utf-8')\n const data = JSON.parse(content)\n courses.push(data)\n } catch (error) {\n // Skip invalid JSON files\n console.warn(`Warning: Could not parse ${file}`)\n }\n }\n\n return courses\n}\n\n/**\n * Load SDK instance with courses from data directory\n */\nexport async function loadSDK(options?: LoadSDKOptions): Promise<ExitTicketsSDK> {\n const dataDir = options?.dataDir || await detectDataDir()\n const cacheKey = resolve(dataDir)\n\n // Return cached instance if available\n if (sdkCache.has(cacheKey)) {\n return sdkCache.get(cacheKey)!\n }\n\n const sdk = createExitTicketsSDK({\n dataSource: {\n async loadCourses() {\n return loadCoursesFromDir(dataDir)\n },\n },\n })\n\n sdkCache.set(cacheKey, sdk)\n return sdk\n}\n\n/**\n * Clear SDK cache (useful for testing)\n */\nexport function clearSDKCache(): void {\n sdkCache.clear()\n}\n","import { loadSDK, detectDataDir } from '../utils/sdk-loader'\nimport { formatStats, cyan, bold, red } from '../utils/formatters'\nimport { EXIT_CODES } from '../utils/error-handler'\n\nexport interface StatsOptions {\n course?: string\n json?: boolean\n dataDir?: string\n}\n\n/**\n * Main stats command handler\n */\nexport async function statsCommand(options: StatsOptions): Promise<void> {\n try {\n const dataDir = options.dataDir || await detectDataDir()\n const sdk = await loadSDK({ dataDir })\n\n if (options.course) {\n // Course-specific statistics\n try {\n const stats = await sdk.analytics.getCourseStatistics(options.course)\n\n if (options.json) {\n console.log(JSON.stringify(stats, null, 2))\n } else {\n console.log(formatStats(stats, `Course: ${options.course}`))\n }\n } catch (error) {\n console.error(`${red('Error:')} Course not found: ${options.course}`)\n console.error('Use --data-dir to specify the path to course files.')\n process.exit(EXIT_CODES.USAGE_ERROR)\n }\n } else {\n // Global statistics\n const stats = await sdk.analytics.getStatistics()\n\n if (options.json) {\n console.log(JSON.stringify(stats, null, 2))\n } else {\n console.log(formatStats(stats, 'Exit Tickets Statistics'))\n }\n }\n\n process.exit(EXIT_CODES.SUCCESS)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.error(`${red('Error:')} ${message}`)\n process.exit(EXIT_CODES.FATAL_ERROR)\n }\n}\n","import { loadSDK, detectDataDir } from '../utils/sdk-loader'\nimport { formatQuestion, cyan, bold, red, green } from '../utils/formatters'\nimport { EXIT_CODES } from '../utils/error-handler'\nimport type { Difficulty, QuestionType } from '../../schemas'\n\nexport interface QuizOptions {\n course?: string\n count: number\n difficulty?: string\n type?: string\n json?: boolean\n showAnswers?: boolean\n dataDir?: string\n}\n\n/**\n * Main quiz command handler\n */\nexport async function quizCommand(options: QuizOptions): Promise<void> {\n try {\n const dataDir = options.dataDir || await detectDataDir()\n const sdk = await loadSDK({ dataDir })\n\n // Generate quiz using SDK\n const quiz = await sdk.quiz.generateQuiz({\n questionCount: options.count,\n courseIds: options.course ? [options.course] : undefined,\n difficulty: options.difficulty as Difficulty | undefined,\n questionTypes: options.type ? [options.type as QuestionType] : undefined,\n })\n\n if (quiz.questions.length === 0) {\n console.error(`${red('Error:')} No questions found matching criteria.`)\n if (options.course) {\n console.error(`Check if course \"${options.course}\" exists.`)\n }\n process.exit(EXIT_CODES.USAGE_ERROR)\n }\n\n if (options.json) {\n // Output as JSON\n const output = {\n questions: options.showAnswers\n ? quiz.questions\n : quiz.questions.map(q => ({\n ...q,\n correctAnswer: undefined,\n correctAnswerText: undefined,\n options: q.options.map(o => ({\n key: o.key,\n text: o.text,\n })),\n })),\n metadata: quiz.metadata,\n }\n console.log(JSON.stringify(output, null, 2))\n } else {\n // Pretty print for terminal\n const title = options.course\n ? `Sample Quiz (${quiz.questions.length} questions from ${options.course})`\n : `Sample Quiz (${quiz.questions.length} questions)`\n\n console.log(`\\n${cyan(bold(title))}\\n`)\n\n for (let i = 0; i < quiz.questions.length; i++) {\n const q = quiz.questions[i]\n console.log(formatQuestion(q, i))\n\n if (options.showAnswers) {\n console.log(` ${green('Answer:')} ${q.correctAnswer}) ${q.correctAnswerText}\\n`)\n }\n }\n\n // Show distribution\n console.log(`\\n${bold('Distribution:')}`)\n for (const [type, count] of Object.entries(quiz.metadata.distribution as Record<string, number>)) {\n console.log(` ${type}: ${count}`)\n }\n console.log()\n }\n\n process.exit(EXIT_CODES.SUCCESS)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.error(`${red('Error:')} ${message}`)\n process.exit(EXIT_CODES.FATAL_ERROR)\n }\n}\n","#!/usr/bin/env node\n/**\n * Exit Tickets CLI\n *\n * Command-line tools for validating, analyzing, and generating exit ticket quizzes.\n *\n * Usage:\n * exit-tickets validate <file|dir> Validate course JSON files\n * exit-tickets stats Show statistics\n * exit-tickets quiz Generate a sample quiz\n */\n\nimport { Command } from 'commander'\nimport { validateCommand } from './commands/validate'\nimport { statsCommand } from './commands/stats'\nimport { quizCommand } from './commands/quiz'\nimport { setupErrorHandlers } from './utils/error-handler'\n\n// Setup global error handlers\nsetupErrorHandlers()\n\n// Create CLI program\nconst program = new Command()\n\nprogram\n .name('exit-tickets')\n .description('CLI tools for Exit Tickets SDK')\n .version('1.0.0')\n\n// Validate command\nprogram\n .command('validate <path>')\n .description('Validate course JSON files against schemas')\n .option('-v, --verbose', 'Show all validation errors')\n .action(async (path: string, options) => {\n await validateCommand(path, options)\n })\n\n// Stats command\nprogram\n .command('stats')\n .description('Show exit ticket statistics')\n .option('-c, --course <id>', 'Show statistics for a specific course')\n .option('--json', 'Output as JSON')\n .option('-d, --data-dir <path>', 'Path to course data directory')\n .action(async (options) => {\n await statsCommand(options)\n })\n\n// Quiz command\nprogram\n .command('quiz')\n .description('Generate a sample quiz')\n .option('-c, --course <id>', 'Filter by course ID')\n .option('-n, --count <number>', 'Number of questions', '5')\n .option('--difficulty <level>', 'Filter by difficulty (easy, medium, hard, challenge)')\n .option('--type <type>', 'Filter by question type')\n .option('--json', 'Output as JSON')\n .option('-a, --show-answers', 'Show correct answers')\n .option('-d, --data-dir <path>', 'Path to course data directory')\n .action(async (options) => {\n await quizCommand({\n ...options,\n count: parseInt(options.count, 10),\n })\n })\n\n// Export for programmatic use\nexport function createCLI(): Command {\n return program\n}\n\n// Run CLI (called by bin/exit-tickets.js shim)\nexport async function run(argv?: string[]): Promise<void> {\n await program.parseAsync(argv ?? process.argv)\n}\n"]}
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+
4
+ /**
5
+ * Exit Tickets CLI
6
+ *
7
+ * Command-line tools for validating, analyzing, and generating exit ticket quizzes.
8
+ *
9
+ * Usage:
10
+ * exit-tickets validate <file|dir> Validate course JSON files
11
+ * exit-tickets stats Show statistics
12
+ * exit-tickets quiz Generate a sample quiz
13
+ */
14
+
15
+ declare function createCLI(): Command;
16
+ declare function run(argv?: string[]): Promise<void>;
17
+
18
+ export { createCLI, run };
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+
4
+ /**
5
+ * Exit Tickets CLI
6
+ *
7
+ * Command-line tools for validating, analyzing, and generating exit ticket quizzes.
8
+ *
9
+ * Usage:
10
+ * exit-tickets validate <file|dir> Validate course JSON files
11
+ * exit-tickets stats Show statistics
12
+ * exit-tickets quiz Generate a sample quiz
13
+ */
14
+
15
+ declare function createCLI(): Command;
16
+ declare function run(argv?: string[]): Promise<void>;
17
+
18
+ export { createCLI, run };