Skip to content

Changelog

All notable changes to cass. Generated by git-cliff from conventional commits.

0.4.2 - 2026-10-12

Bug fixes

  • sync: Create one assignment group when spellings differ only in case (966d8be)
  • submissions: Explain an empty list on an assignment Canvas has just created (5e735cd)

Refactoring

  • sync: Move assignment and group reconciliation into actions (bfcbaaf)

Documentation

  • submissions: Note that a new assignment's submissions arrive a few seconds late (fafa9f1)

Testing

  • live: Wait for Canvas to create submission rows before reading them (5067ffe)

0.4.1 - 2026-10-12

Testing

  • quizzes: Strip ANSI from usage errors that Typer colours on GitHub Actions (d039ccb)

0.4.0 - 2026-10-12

Features

  • config: Resolve CASS_CONFIG from Python and add CanvasClient.from_config (bfe1ef0)
  • canvas: Public course_path, get_all and path-normalizing request (62351df)
  • canvas: Raise CanvasAPIError with Canvas's message for every 4xx/5xx (b94d4dd)
  • canvas: Dry-run client that records writes and returns synthetic responses (f22ee4e)
  • cli: One confirmation helper that refuses to prompt without a TTY (2ae44ef)
  • cli: Add cass canvas api for raw Canvas requests (79ffdc2)
  • cli: Add cass push --dry-run that previews without pushing (3d465bf)
  • cli: Add --dry-run to every Canvas write command (2b1f9d2)
  • canvas: Fail on ambiguous names and add announcement and file resolvers (0b1b729)
  • cli: Keep stdout for data and send hints, prompts and errors to stderr (ffb6ab1)
  • cli: Report every error once at the root and add --debug (844891b)
  • BREAKING cli: Add list subcommands and show commands to every Canvas group (63f813e) — list options (--csv, --save, calendar --from/--to) moved from the bare group to ' list'; 'quizzes --id X', 'modules --id X' and 'assignments --id X' are replaced by ' show X'.
  • BREAKING cli: Move announcement, file and tab verbs under their groups (e08a161) — 'cass canvas announce' is now 'cass canvas announcements create'; 'update-announcement' is 'announcements update'; 'delete-announcement' is 'announcements delete'; 'upload' is 'files upload'; 'delete-file' is 'files delete'; 'show-tab' and 'hide-tab' are 'tabs show' and 'tabs hide'. Update and delete accept an ID or a name.
  • cli: Add --json (JSON Lines) to Canvas list and show commands (d63ce52)
  • cli: Add cass status --json backed by a ProjectStatus dataclass (1689980)
  • canvas: Add folder paths, create_folder and delete_folder to the client (ba5d03c)
  • canvas: Upload files under a name, folder and duplicate policy, optionally locked (e7c4b6a)
  • cli: Add --folder, --name, --on-duplicate and --unpublished to files upload; filter files list by folder (8f41786)
  • cli: Add files mv, rename, publish, unpublish and files folders list/create/delete (d790d12)
  • canvas: Add quiz question and question group write methods (1469d74)
  • quizzes: Add question groups, question ids and default names to quiz files (bf9baf8)
  • quizzes: Create declared question groups when creating a quiz from a file (129bede)
  • quizzes: Export questions in quiz order with ids and groups via fetch_quiz_state (12d73b7)
  • quizzes: Plan question changes by id, unique name, then order (8c48fce)
  • quizzes: Apply question plans in a fixed order and stop on failure (311ed4f)
  • cli: Reconcile quiz questions with quizzes update --questions (42d5178)
  • cli: Add quizzes questions and quizzes preview (f01fa3b)
  • canvas: Add module item update, delete and page/url items, and list_pages (2ae01f7)
  • config: Declare module items with [[canvas.modules.items]] (ba70de5)
  • BREAKING cli: Replace modules add-item with modules items add/update/move/remove (aac75cf) — modules add-item is replaced by modules items add, which accepts only Assignment, Quiz, File, Page, ExternalUrl and SubHeader.
  • modules: Index course content and resolve declared module items (0ca92dc)
  • modules: Plan module item changes from declared items (75684e8)
  • modules: Apply module item plans in a fixed order and stop on failure (8278d8f)
  • cli: Reconcile declared module items in canvas sync, with --prune (370933b)
  • canvas: Add enrollment dates, submission status fields and update_submission (00d9722)
  • people: Filter the roster by enrollment state and enrollment date (3dbed43)
  • submissions: Plan excuse and clear-late changes (4e55a63)
  • submissions: Select excuse and clear-late targets and apply changes (8c70d28)
  • cli: Add canvas submissions list (6d2fe7a)
  • cli: Add submissions excuse and clear-late, dry run unless --apply (9a31b81)
  • skill: Package an agent skill and add cass skill install (912a884)

Bug fixes

  • cli: Report the installed package version (2b34685)
  • quizzes: Trim answers, infer attempt behind an open one, local times (fe74af3)
  • canvas: Skip the real GET for dry-run writes under a placeholder path (cbea825)
  • canvas: Keep dry-run plan lines unwrapped, merge path query in request, quote docs example, don't claim group creation in dry run (3913e32)
  • cli: Send push warnings, failures and dry-run notices to stderr (daf1d4a)
  • cli: Keep ID columns whole and show folder IDs in the file tree (3f41c34)
  • cli: Propagate ambiguous group names, show breaking changes in changelog, keep errors on one line, correct show/--debug docs (4321bd8)
  • files: Default upload to overwrite, complete skip/upload messages, fix test DB flake (0f30923)
  • quizzes: Count group changes in plan summary and harden question planner (77a0c9f)
  • cli: Keep quiz question plan lines unwrapped and report no-op applies (f5d31cc)
  • quizzes: Move questions out of groups before deleting the groups (3795371)
  • quizzes: Rebuild question order without positions and send whole questions on update (ea95b6e)
  • quizzes: Read stored question HTML and check preview by question id (df5ca81)
  • quizzes: Refuse updates to question types cass can't round-trip and keep answer feedback (af72e84)
  • modules: Set every item position on reorder and record each apply request (6fb6d84)
  • cli: Separate sync item lookup and apply errors and escape table markup (ca64352)
  • modules: Link the new file after an overwrite and match Canvas-normalized URLs (0093a84)
  • submissions: Protect teacher grades on missing submissions and blank detail without a due date (cdf049d)
  • submissions: Skip group-graded clear-late and correct late-status docs (2ddb69a)
  • submissions: Report sent changes on auth failure and hedge restored points after resubmission (07f9e19)
  • skill: Correct publish, query and auto-submit guidance and tighten the drift test (cd4ce65)
  • BREAKING sync: Leave live content alone when published or a quiz setting is omitted (3f9712d) — quizzes update --from without --questions no longer sends changes unless --apply is passed.

Refactoring

  • sync: Run sync writes through a dry-run client instead of skipping them (034e66a)
  • quizzes: Build group create bodies in actions and cover group creation and failure (3a42c76)

Documentation

  • Document the raw API, CanvasAPIError and --dry-run (6ee9c0d)
  • Document resource/verb commands, --json, streams and --debug (32a82f6)
  • Clarify from_config sources and --debug usage (2881297)
  • quizzes: Document question editing and add a live round-trip test (87358ce)
  • quizzes: Describe apply order, group deletes and concluded courses (b5d62c7)
  • Tighten quiz question editing and file command prose (eddf927)
  • quizzes: Describe null positions and whole-question updates (e8a39f5)
  • modules: Document declared module items and add a live sync round-trip test (6a28bdb)
  • modules: Tighten module item prose; share the live CLI client fixture (3dc1e47)
  • modules: Correct overwrite, publish and 403 behaviour (aa1a9fd)
  • submissions: Document late-enrollment commands and add a live round-trip test (42d8406)
  • submissions: Tighten late-enrollment prose (8a3aa1b)
  • skill: Write the cass agent skill and its docs page (7b5919f)

Testing

  • cli: Cover status with a populated tmp database and render human status from ProjectStatus (aae3d3c)
  • live: Smoke-test every Canvas list --json against the practice course (b3e79bc)
  • live: Exercise file upload, rename, move, publish and folder deletion; document file commands (64efebe)
  • live: Read the real course's Test Student without creating one (782ee8b)
  • live: Assert the rendered excuse plan and skip without a Test Student (a909b96)

0.3.0 - 2026-09-27

Features

  • quizzes: Download quiz and survey responses (aea6b70)

Bug fixes

  • canvas: Prefer .canvastoken over .canvascreds (1f2773d)

Documentation

  • State live verification steps in CLAUDE.md (33e13fe)

Testing

  • Add live Canvas tests, practice-course seeding, and PR convention (f607467)
  • quizzes: Live tests for downloading quiz responses (83f8ef1)

0.2.0 - 2026-09-16

Features

  • viewer: Generic DB viewer for SQLite/DuckDB files via ibis (32bc409)
  • viewer: Type-aware cell editors in generic DB viewer (5346687)
  • canvas: Authenticate with browser session cookies (000af40)
  • canvas: Add Chrome login support (3390b27)
  • cli: Add cass canvas calendar for calendar event CRUD (8af5b65)
  • cli: Assignment group create/delete and --description flag (8c74890)
  • cli: Fold long table values instead of truncating (86c6952)
  • canvas: Quiz authoring, --config, and course-local times; split CLI and client packages (b13c23f)

Bug fixes

  • viewer: Generic viewer grid renders rows (1ef8f2e)
  • canvas: Bugs found dogfooding against the practice course (00de16d)
  • Stale table references and viewer roster after GitHub removal (5687981)
  • release: Restore bumped files when the release commit fails (0c7183b)
  • release: Reset staged files from HEAD and tag inside the rollback guard (2f8bed9)
  • db: Use an injected connection without resolving project config (8a267ae)

Refactoring

  • viewer: Remove GitHub Classroom surfaces (a744a0e)
  • Remove GitHub Classroom from CLI, pull, database, and config (62e5a41)

Documentation

  • Drop GitHub Classroom from docs and metadata (c771c4f)
  • Drop GH type prefix from CLAUDE.md style notes (a8aede1)
  • Add zensical site with guide, CLI, and API reference (2a9f69d)
  • readme: Name uv as the install prerequisite (0ee4993)
  • Document gate tasks, commit convention, and release flow in CLAUDE.md (32a603d)
  • Regenerate changelog after history rewrite (5f3155f)

Testing

  • Pin terminal width so CLI output assertions are stable (87471c2)
  • canvas: Run browser-session tests on non-macOS runners (02c4ad7)

Build and CI

  • Add deps for duckdb features and clean up (81860d5)
  • Add git-cliff config and generated changelog (711cc42)
  • Add gate workflow and check-only poe tasks (c5311b4)
  • Deploy docs to GitHub Pages (8353099)
  • Release to PyPI via trusted publishing on tag push (abcd87f)
  • Lint scripts/ in the poe gate (784adec)
  • changelog: Render release dates in America/Los_Angeles (25c2122)
  • Build docs in the gate, pin commitizen, pass base_ref via env (e85dc7d)
  • Pin setup-uv to v10.1.0 (583d139)

Miscellaneous

0.1.1 - 2026-03-09

Features

  • Initial cass Python CLI (4336c50)
  • cli: Add db clean/export/import commands and enrich tables with API data (EJO-320) (a39e112)
  • canvas: Add rate limiting, retry transport, and resilient grade push (EJO-322) (08d9673)
  • cli: Add cass view to launch Dataflare on cass.db (EJO-324) (1a34afb)
  • canvas: Add typed API client, CLI subcommands, and expanded models (EJO-325) (74cfee5)
  • cli: Group help panels and style default output (bebf2af)
  • cli: Add interactive setup wizard to cass init (ef7acf4)
  • cli: Add cass backup and cass restore (2c0c90f)
  • viewer: Replace Dataflare with bundled browser-based viewer (8902aac)
  • viewer: Improve UX, add biome linting, drop unified views (schema v7) (fe7ed7a)
  • viewer: Add Canvas sync controls and improve assignments display (schema v8) (20ed142)
  • viewer: Hide IDs, enrich Canvas tables with names, mark generated tables read-only (c98ffec)
  • db: Add MotherDuck support for shared remote database (b565c61)
  • db: Schema v9 with SIS fields, post_manually, grading standards (8b6b1bf)
  • canvas: Bulk grade push via update_grades endpoint (EJO-326) (34b6f05)
  • canvas: Detect post_manually and post grades via GraphQL (EJO-327) (fddc1b7)
  • canvas: EGrades CSV export with letter grade conversion (EJO-328) (882a30f)
  • viewer: Add read-only Elm frontend (b795516)
  • viewer: Make Elm viewer the default and add elm-format (c143f6f)
  • viewer: Column ordering, CSV export, search fix, keyboard shortcuts in Elm viewer (ae38803)
  • viewer: Cell editing and Canvas push modal in Elm viewer (f1ff369)
  • viewer: Dark mode, responsive grid sizing, hidden filter inputs (a152633)
  • viewer: Design token system and elm-build on install (2ae646f)
  • viewer: Replace Elm frontend with Svelte 5, shadcn-svelte, TanStack Table (730d06b)
  • viewer: Replace shadcn and TanStack with DaisyUI, add inline editing (d76ccbb)
  • viewer: Integrate AG Grid data table (35ca17c)
  • viewer: NiceGUI prototype behind --nicegui flag (cf7c5f1)
  • viewer: Sidebar layout, column config, toolbar in NiceGUI viewer (ed6d558)
  • viewer: NiceGUI feature parity, remove Svelte frontend (d9ba4b7)
  • viewer: Revert button, pending badge, toast notifications (e154ad9)
  • viewer: Gradebook pivot, sidebar redesign, markdown export (4e4d286)
  • viewer: Default to gradebook, consolidate student name columns (5c16745)
  • viewer: Cell editors, date autocommit, pending highlights (423c1d2)
  • viewer: Two-row toolbar with sync pill and export buttons (a35dbab)
  • viewer: Setup wizard, auto-pull, state-based routing (7635b14)
  • db: Persist pending Canvas changes via synced shadow tables (731b802)
  • cli: Sectioned status and command summary as default output (ec44181)
  • github: Add cass pull-gh for student repo downloads (EJO-333) (189ba3a)
  • viewer: Pull GH button with limit controls and progress log (f8bc183)
  • viewer: Resizable sidebar with course title (a865777)
  • viewer: Wrap course title, pin badges, widen sidebar (8127290)
  • viewer: Move sync controls to sidebar, add Clone Repos button (88de4c7)
  • github: Excluded checkbox on roster to hide students (13a97d3)
  • viewer: Rename GH Submissions to Recent Commits, reorder sidebar (9ef6121)
  • viewer: Human-readable dates and column order in Recent Commits (7ed1d87)
  • viewer: Link Last Commit date to commit URL (5d4f2b7)
  • viewer: Create/delete assignment modals with Canvas auto-sync (34672f9)

Bug fixes

  • canvas: Assignment creation and CLI subcommand parsing (76db610)
  • github: Use Classroom roster names instead of profile lookups (20eba00)
  • cli: Save course name during CLI pull (241b8e7)
  • github: Show final project in viewer and deduplicate submission fetching (c786385)
  • github: Include GH-only students in submission fetching (856c940)
  • viewer: Show roster as view-only despite editable excluded toggle (cde86a0)
  • github: Use Classroom roster as authoritative source for submissions (ff0f995)
  • github: Format GH-only student names as "Last, First" (706932f)
  • viewer: Keep Clone Repos modal connected by threading git subprocess (bd62fbe)
  • db: Validate table names in SQL-interpolated queries (e81c1c0)
  • tests: Ty unsupported-operator errors in test_integration (7051535)
  • canvas: CanvasEnrollment uses nested grades dict like the real API (a30b61a)
  • viewer: Catch SystemExit in pull handler, hide empty GH sidebar (85cb6d8)
  • viewer: Boolean checkbox toggle bypasses AG Grid edit mode (b8baa33)
  • viewer: Plain commit count for assignments without deadlines (8518425)
  • viewer: Restore editable flag on boolean columns (56701d6)
  • viewer: Human-readable Last Commit dates in GH submissions (768fe28)

Refactoring

  • Remove backward compat, dead deps, and Go references (20e6388)
  • models: Split into package, rename fields, clean up decode path (EJO-319) (5b4279b)
  • canvas: Use CanvasClient and add config-as-data sync (EJO-325) (71edd4b)
  • db: Rename database file to cass.duckdb (3ede0bf)
  • db: Schema v6 with source-specific tables, Canvas-authoritative roster, separate cache (71d3812)
  • viewer: Elm-ui layout and multi-module Elm architecture (dffbf93)
  • Reorganize into cli/, github/, canvas/ subpackages (df4d9f8)
  • viewer: Impossible states, custom types, dedup table logic (755e6de)
  • Remove dead code, deduplicate, consolidate GitHub API path (20e1b8a)
  • Drop underscore prefixes from private functions (d8c10d1)
  • canvas: Shared sync module for CLI and viewer push (0d2a887)
  • viewer: Split into modules, per-table column config (c2f0bea)
  • viewer: Replace custom CSS with Tailwind/Quasar and NiceGUI layouts (68894e6)
  • canvas: Move CLI push logic into canvas/sync.py (47cf525)
  • viewer: Replace custom sidebar and keyboard JS with NiceGUI built-ins (f7d0674)
  • github: Gradebook pivot, enriched queries, schema v12 (3823667)
  • viewer: Move students/assignments to Dev section, remove Combined group (4f0eb02)
  • db: Harden viewer SQL, extract shared functions, add tests (2da6317)
  • viewer: Pull GH modal with student/assignment selects and remove action (99e5a4c)
  • viewer: Class-based modules following NiceGUI pattern (8bfdaaa)
  • viewer: Single CSS file with @layer components (1c24dd8)
  • viewer: Class-based modals and consolidated actions module (bc03d3a)
  • viewer: Split grid.py into data/service/UI layers (42c9255)
  • Migrate to SQLite and restructure into layered packages (3aac040)

Documentation

  • Add Linear project setup and DuckDB CLI notes to CLAUDE.md (4b40533)
  • Recommend Dataflare as interactive DB viewer (EJO-324) (e499e45)
  • Add Google-style docstrings, CLI help text, README, and pdoc setup (EJO-323) (75e4f07)
  • Update README and CLAUDE.md for canvas API layer (EJO-325) (2af8293)
  • Add CLI command reference tables to pdoc root page (6a2bac5)
  • Describe browser-based viewer, drop Dataflare references (ad50750)
  • viewer: Add Elm viewer walkthrough (303f21d)
  • Rewrite CLAUDE.md and README.md for current architecture (b77b9ca)
  • Add svelte CLI instructions to CLAUDE.md (5237c76)
  • Drop Svelte references, consolidate around NiceGUI (b469f6c)
  • Rewrite README with viewer-first, Canvas-primary framing (4db7ff9)
  • Add update instructions to README (c6b3bc5)
  • Update README (8eec0fe)

Testing

  • viewer: Cover setup flow state detection, config, pull (a6e3d61)
  • viewer: Add NiceGUI User-fixture integration tests (d68dea9)
  • Add integration suite with anonymized seed data (a8817ee)
  • viewer: Add Tier 1 UI integration tests (70dc24a)
  • viewer: Tier 2 tests for preview HTML, markdown export, Canvas sync, UI wiring (d9b2f1a)

Build and CI

  • Add pytest-xdist for parallel tests (4832b31)
  • Add PyPI release script and untrack .cass_cache.db (77d2a30)
  • Rename PyPI package to cassroom (98d9dfe)

Miscellaneous

  • Merge canvas API layer branch (EJO-325) (24d2975)
  • Enable basedpyright strict mode with zero errors (0b46813)
  • Add ruff rule config and fix basedpyright leftovers (d23af68)
  • viewer: Remove Elm code after Svelte migration (ae92158)
  • Post-merge cleanup (58aa3d7)