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-itemis replaced bymodules 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 --fromwithout --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 calendarfor 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¶
- Remove Linear tracking (cdbd9ff)
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 viewto 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 backupandcass 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-ghfor 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)