Commit Graph
27 Commits
Author SHA1 Message Date
Lucas WintherandClaude Opus 5.5 2d162a4282 fix(studio): review round 1 (symlink-safe writes, remote allowlist, upload cap/types/no-overwrite, owner rule at publish/sync/resolve, studio/repos layout and read-only imports, side-effect-free list)
C1: writes lstat every path component and refuse symlinks (dangling included),
check the parent's real path after mkdir, and open with O_NOFOLLOW.
I1: only https://, ssh:// and git@host: remotes; protocol.file/ext/fd=never on
every fetch and push; global/system git config ignored.
I2: STC_UPLOAD_MAX_MB cap (default 100) by Content-Length and while streaming;
extension allowlist (415); stcourse.yaml refused; 409 unless overwrite=true;
sandboxing CSP on draft raw files.
I3: owner-only visibility/source.kind rule checked on the merged result at
publish and sync, and at resolve; publish also validates the merged tree.
I4: bare repos in <dataDir>/studio/repos/<id>.git; imported courses read-only.
I5: list status comes from the bare repo; drafts are created lazily.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 04:43:53 +01:00
Lucas WintherandClaude Opus 5.5 667f3e814b fix(studio): forbid ext:: remotes; type the per-dialect test table
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 03:27:30 +01:00
Lucas WintherandClaude Opus 5.5 2849d3c911 docs(studio): contract requests (ctx feature factories, worktrees course dir, LessonView swap, web subpath, nav roles, DraftWriter)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 03:26:58 +01:00
Lucas WintherandClaude Opus 5.5 0992df7257 feat(studio): studio web UI (course list, manifest, lessons with live preview, decks, attachments, exercises, conflicts, sync) and dev entry
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 03:26:18 +01:00
Lucas WintherandClaude Opus 5.5 497ce91216 feat(studio): /api/studio routes, author access, acceptance tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 03:18:25 +01:00
Lucas WintherandClaude Opus 5.5 06b6ea6168 feat(studio): published-worktree watcher and DraftWriter API for the AI package
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 03:16:13 +01:00
Lucas WintherandClaude Opus 5.5 c2385b472c feat(studio): publish as merge, update draft, conflict resolution, explicit sync
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 03:15:20 +01:00
Lucas WintherandClaude Opus 5.5 a6f887f31c feat(studio): git wrapper and StudioStore (create course, drafts, save as commit)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 03:14:47 +01:00
Lucas WintherandClaude Opus 5.5 fc37da9789 docs(studio): WP-C implementation plan
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 03:11:41 +01:00
Lucas WintherandClaude Opus 5.5 3ca05fcfbc merge: Phase 0 contract
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 03:07:26 +01:00
Lucas WintherandClaude Opus 5.5 05eee4cd40 feat: server entry and web shell with design tokens
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 03:05:49 +01:00
Lucas WintherandClaude Opus 5.5 7f33169487 feat(core): config, job queue, range media serving, feature composition
Adds aclRepo to @stc/db for canView.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 03:04:46 +01:00
Lucas WintherandClaude Opus 5.5 ea18f18b4f fix(db): use DOUBLE PRECISION for position and progress columns
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 03:01:31 +01:00
Lucas WintherandClaude Opus 5.5 f061e36092 fix(db): jobs.update writes only patched columns; late progress cannot resurrect a finished job
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 03:01:05 +01:00
Lucas WintherandClaude Opus 5.5 4636273d55 feat(db): progress, notes, attempts, library, jobs repositories
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:59:09 +01:00
Lucas WintherandClaude Opus 5.5 738d813fb8 feat(db): Bun.SQL connection and portable migrations
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:57:34 +01:00
Lucas WintherandClaude Opus 5.5 f71a31a5f1 fix(course-format): validate anchor file via requireFile; real throw test for loadCourse catch
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:55:38 +01:00
Lucas WintherandClaude Opus 5.5 a82ab18bee fix(course-format): directories are not lesson files; a failing course never rejects loadAll
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:54:23 +01:00
Lucas WintherandClaude Opus 5.5 b8c65626f9 feat: overlay manifests for the two reference courses
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:52:24 +01:00
Lucas WintherandClaude Opus 5.5 c78c7ec8d8 feat(course-format): markdown extraction, discovery, loading, repository
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:51:26 +01:00
Lucas WintherandClaude Opus 5.5 7a68800f6f test: sample fixture course
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:50:00 +01:00
Lucas WintherandClaude Opus 5.5 7e7ce30535 feat(course-format): stcourse.yaml schema
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:49:42 +01:00
Lucas WintherandClaude Opus 5.5 3b15d87a5f feat(contracts): shared server, exercise, ai, import and web interfaces
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:48:10 +01:00
Lucas WintherandClaude Opus 5.5 9f582b99d2 chore: bun workspace scaffold
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:47:42 +01:00
Lucas WintherandClaude Opus 5.5 830a0cdd9b chore: ignore worktrees
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:46:38 +01:00
Lucas WintherandClaude Opus 5.5 29ba043de7 Add STCourses implementation plan
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:46:28 +01:00
lucasw89andClaude Opus 5.5 ab96addbab Add STCourses design, research report and approved mockup
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:37:38 +01:00