campus-cli
Advanced tools
+26
-0
@@ -7,2 +7,28 @@ # Changelog | ||
| ## [1.0.2] — 2026-07-15 | ||
| ### Fixed | ||
| - `campus assignments list <courseId>` ahora muestra notas que Blackboard devuelve en `grade.score`, no solo en `grade.displayGrade.score`. | ||
| - `campus assignments list <courseId> --pending` ya no trata tareas calificadas como pendientes cuando la nota viene en `grade.score`. | ||
| - Cuando un curso no tiene pendientes, el CLI ahora muestra `No pending assignments found in this course.` en vez de dejar una salida vacía. | ||
| --- | ||
| ## [1.0.1] — 2026-07-15 | ||
| ### Added | ||
| - `campus assignments list` ahora acepta `courseId` opcional. Sin `courseId`, recorre todos los cursos disponibles del estudiante. | ||
| - `campus assignments list --pending` ahora funciona como vista global de pendientes, ideal después de `campus courses list`. | ||
| - Suite mínima de tests con `node:test` vía `tsx`, cubriendo el uso opcional de `courseId` y el filtro de pendientes. | ||
| ### Fixed | ||
| - `campus assignments list --pending` ya no falla con `missing required argument 'courseId'`. | ||
| - `--pending --json` ahora filtra correctamente las tareas pendientes tanto en modo global como en modo de un solo curso. | ||
| - El paquete npm ya no incluye `.codex/` ni `AGENTS.md` en el tarball publicado. | ||
| ### Changed | ||
| - README reestructurado para facilitar adopción: badges de npm, requisitos, comparación CLI/MCP, configuración mínima MCP, privacidad, troubleshooting y contribución. | ||
| --- | ||
| ## [1.0.0] — 2026-07-13 — renombrado a `campus-cli` | ||
@@ -9,0 +35,0 @@ |
+1
-1
| { | ||
| "name": "campus-cli", | ||
| "version": "1.0.1", | ||
| "version": "1.0.2", | ||
| "description": "CLI/MCP no oficial para el campus universitario (Blackboard, Canvas, Moodle...) — acceso desde la terminal y MCP para IA", | ||
@@ -5,0 +5,0 @@ "main": "run.js", |
@@ -45,5 +45,9 @@ import { Command } from 'commander'; | ||
| export function isPendingAssignment(grade: any) { | ||
| return grade?.displayGrade?.score == null && grade?.status !== 'NeedsGrading'; | ||
| return grade?.displayGrade?.score == null && grade?.score == null && grade?.status !== 'NeedsGrading'; | ||
| } | ||
| function getGradeScore(grade: any) { | ||
| return grade?.displayGrade?.score ?? grade?.score ?? null; | ||
| } | ||
| function formatAssignment(col: any, grade: any, opts: { pending?: boolean; courseName?: string }) { | ||
@@ -58,4 +62,4 @@ const possible = col.score?.possible ?? '?'; | ||
| let gradeStr = chalk.gray('sin entregar'); | ||
| if (grade?.displayGrade?.score != null) { | ||
| const score = grade.displayGrade.score; | ||
| const score = getGradeScore(grade); | ||
| if (score != null) { | ||
| const pct = possible !== '?' ? Math.round((score / Number(possible)) * 100) : null; | ||
@@ -207,6 +211,11 @@ const color = pct == null ? chalk.white : pct >= 60 ? chalk.green : chalk.red; | ||
| console.log(''); | ||
| let printed = 0; | ||
| columns.forEach((col) => { | ||
| const grade = gradeMap.get(col.id) ?? null; | ||
| formatAssignment(col, grade, { pending: opts.pending }); | ||
| if (formatAssignment(col, grade, { pending: opts.pending })) printed++; | ||
| }); | ||
| if (printed === 0 && opts.pending) { | ||
| console.log(chalk.yellow('No pending assignments found in this course.')); | ||
| } | ||
| } catch (err: any) { | ||
@@ -213,0 +222,0 @@ spinner.fail(err.message); |
@@ -21,3 +21,4 @@ import assert from 'node:assert/strict'; | ||
| assert.equal(isPendingAssignment({ displayGrade: { score: 15 } }), false); | ||
| assert.equal(isPendingAssignment({ score: 15 }), false); | ||
| assert.equal(isPendingAssignment({ status: 'NeedsGrading' }), false); | ||
| }); |
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
147311
1.18%2753
0.29%