Changelog¶
Changelog¶
All notable changes to the LessonKit monorepo are documented here.
@lessonkit/*— core platform (tagv*.*.*)@lessonkit/studio-schema,@lessonkit/studio-renderer,@lessonkit/studio-builder,@lessonkit/studio-ui,@lessonkit/studio-codegen— Studio authoring (tagstudio-v*, same@lessonkitorg)
Unreleased¶
No changes yet.
studio-v0.3.2 - 2026-06-03¶
Studio packages at 0.3.2, pinned to framework 1.2.0 at publish time.
Added¶
@lessonkit/studio-schema: Registry/catalog tests; H5P-familiar palette labels for 1.2 blocks (
Question Set,Find the Hotspot, etc.).@lessonkit/studio-renderer / @lessonkit/studio-codegen: 1.2 compound and Tier C/D block parity with
@lessonkit/react.
Changed¶
All Studio packages bumped to 0.3.2; export defaults pin
@lessonkit/*1.2.0 and@lessonkit/studio-*0.3.2.
1.2.0 - 2026-06-03¶
Framework 1.2.x — Compound containers, resume state, and Tier C/D P0 blocks. @lessonkit/core, @lessonkit/react, @lessonkit/lxpack, @lessonkit/xapi, @lessonkit/themes, and @lessonkit/accessibility ship at 1.2.0.
Added¶
@lessonkit/core:
CompoundHandle,CompoundResumeState, compound session storage v2,compoundAllowlists, telemetry catalog v3 (book_page_viewed, content interaction events).@lessonkit/react:
Page,InteractiveBook,Text,Heading,Image; Tier C/D blocks (Accordion,DialogCards,Flashcards,ImageHotspots,ImageSlider,FindHotspot,FindMultipleHotspots);AssessmentSequenceimplementsCompoundHandle;block-catalog.v3.json(defaultbuildBlockCatalog({ version: 3 })).@lessonkit/lxpack:
findHotspot/findMultipleHotspotsassessment descriptor kinds.Example:
examples/interactive-book,examples/framework-12-showcase(full 1.2 catalog),examples/framework-11-showcase(full 1.1 foundation + P0 assessments).Docs: MIGRATION-1.1-to-1.2.md; ROADMAP 1.2.x milestone; H5P capability map updates; onboarding funnel (Getting started in 5 minutes, Glossary, API reference index, ARCHITECTURE.md, CODE_OF_CONDUCT.md, good first contributions).
Library Skills remote installer:
library-skills/install-remote.sh.GitHub Actions workflow to publish Storybook to GitHub Pages (
.github/workflows/storybook-pages.yml).@lessonkit/core: Headless
createLessonkitRuntimeruns plugin telemetry hooks andscoreAssessment;buildPluginContextexported.
Changed¶
buildBlockCatalog()defaults to catalog v3 (use{ version: 2 }to keep the 1.1.x shape).AssessmentSequenceimplementsCompoundHandleand may surface parent-level scores when using a ref.persistCompoundStatedefaults totrue; provide a uniqueblockIdon each compound container to avoid sharedsessionStoragekeys.runtimeVersion: "v1"logs a development deprecation warning; v2 remains the default.README and quickstart: npm-first funnel,
npm run dev, Studio live-demo path, package install table, examples index.npm package
homepagefields point to Read the Docs.lessonkit inittemplate pins^1.2.0for@lessonkit/*; CLI template Vitest aligned to v4.x.
studio-v0.3.1 - 2026-06-03¶
Maintenance release for all five Studio packages at 0.3.1 (framework 1.1.0 on main; npm publish pins framework at release time).
Fixed¶
@lessonkit/studio-schema:
validateStudioProjectmatchesparseconstraints; duplicatecheckId; scenario nesting depth.@lessonkit/studio-builder: Autosave skips projects with validation errors.
@lessonkit/studio-codegen: JSX export parity with renderer (button, input, checklist, video); multi-page LXPack warning; default export pins
@lessonkit/*1.1.0.@lessonkit/studio-renderer: Invalid projects always show validation panel (not dev-only); checklist/video blocks in
media.tsx.@lessonkit/studio-ui: Export panel shows multi-page LXPack warnings.
Changed¶
All Studio packages bumped to 0.3.1.
1.1.0 - 2026-06-03¶
Framework 1.1.x — Assessment contract and Tier B P0 blocks. All seven @lessonkit/* packages ship at 1.1.0 (no Studio package changes in this release).
Added¶
@lessonkit/core:
AssessmentHandle,AssessmentBehaviour,AssessmentXAPIData,AssessmentInteractionType; telemetry eventsassessment_answeredandassessment_completed;telemetry-catalog.v2.jsonandbuildTelemetryCatalogV2().@lessonkit/react:
TrueFalse,FillInTheBlanks,DragAndDrop,DragTheWords,MarkTheWords,AssessmentSequence;useAssessmentState;block-catalog.v2.jsonandblock-contract.v2.json(blockCatalogVersion2 viabuildBlockCatalog({ version: 2 }), default).@lessonkit/xapi: xAPI mapping for
assessment_answered/assessment_completed.@lessonkit/lxpack: Discriminated
AssessmentDescriptor(mcq,trueFalse,fillInBlanks);trueFalseconverts to MCQ for LMS shell packaging;assessment_completedforwards to LXPack bridge.Example:
examples/assessments-p0— golden path for P0 blocks and SCORM 1.2 packaging.Docs: MIGRATION-1.0-to-1.1.md.
Changed¶
lessonkit inittemplate pins^1.1.0for@lessonkit/*.Quiz/KnowledgeCheckprops remainMcqAssessmentDescriptor(unchanged MCQ shape).
Fixed¶
@lessonkit/react:
TrueFalsefeedback respects pluginpassed;passingScoreapplied inscoreFromCustom;autoCheckdedupesassessment_answered; empty FIB/DragTheWords templates and zero-tokenMarkTheWordsshow author-facing errors.Docs / policy: Version badges, SECURITY supported versions, README migration link, broken CHANGELOG paths.
studio-v0.3.0 - 2026-06-01¶
Code generation and export: @lessonkit/studio-codegen, export panel in studio-web, canvas performance, and SCORM integration test. Requires @lessonkit/core, @lessonkit/react, and @lessonkit/themes at 1.0.2 (pinned at publish time).
Added¶
@lessonkit/studio-codegen (0.3.0):
generateExportFiles, renderer + JSX React/Vite export,studioProjectToDescriptor, Node helpers (writeReactViteProject,writeLxpackProjectFromStudio,packageStudioProject).@lessonkit/studio-ui (0.3.0):
ExportPanel; lazy block previews; virtualized canvas for large pages.apps/studio-web: React/Vite zip download (JSZip); export options in header.
Integration test: Studio codegen → Vite build → SCORM 1.2 package.
Docs: Studio export guide;
examples/studio-export.
Changed¶
All Studio packages bumped to 0.3.0; Studio Release publishes five packages.
Not included: GitHub sync, hosted Studio,
lessonkit-studioCLI (see STUDIO_READINESS.md).
[studio-v0.2.0] - 2026-06-01¶
Visual editor MVP: headless builder, React editor UI, and local apps/studio-web. Requires @lessonkit/core, @lessonkit/react, and @lessonkit/themes at 1.0.2 (pinned at publish time).
Added¶
@lessonkit/studio-builder (0.2.0): editor store,
dispatchcommands, undo/redo,subscribeAutosave, tree helpers,createDefaultBlock.@lessonkit/studio-ui (0.2.0):
StudioEditorwith palette, dnd-kit canvas (nested containers), property inspector, preview pane.apps/studio-web: local Vite editor;
localStorageautosave; import/export JSON.Docs: Studio editor guide.
Changed¶
@lessonkit/studio-schema / @lessonkit/studio-renderer (0.2.0): checklist and video blocks use minimal real preview UI (replacing 0.1 stubs).
Monorepo:
build:packagesand Studio Release workflow include builder and ui.
Not included: codegen, GitHub sync, hosted Studio,
lessonkit-studioCLI (see STUDIO_READINESS.md).
[studio-v0.1.0] - 2026-06-01¶
First public preview of LessonKit Studio packages. Requires @lessonkit/core, @lessonkit/react, and @lessonkit/themes at 1.0.2 (pinned at publish time from packages/core on the release commit).
Added¶
@lessonkit/studio-schema:
schemaVersion: 1project model;parseStudioProject,validateStudioProject,normalizeStudioProject,migrateStudioProject,loadStudioProject,buildStudioBlockCatalog; shippedstudio-project.v1.jsonandstudio-block-catalog.v1.json.@lessonkit/studio-renderer:
StudioRenderermapping Studio blocks to@lessonkit/react(Course,Lesson,Quiz,Scenario) and presentational primitives; checklist/video stubs.Monorepo:
examples/studio-minimal, Studio project format v1, Studio Release workflow (studio-v*tags).
Not included in 0.1.0: visual editor app,
lessonkit-studioCLI, builder/codegen packages (planned 0.2+). See STUDIO_READINESS.md.
[1.0.2] - 2026-06-01¶
Patch release: telemetry and course-lifecycle correctness, contributor DX, integration test determinism, session storage hardening, and Vitest 4 security upgrade.
Fixed¶
@lessonkit/react:
course_startedtracking dedupe is marked only aftertracking.flush()so batchedbatchSinkdelivery cannot be lost while session storage blocks retry.@lessonkit/react:
Lessonauto-complete on unmount no longer emitslesson_completedunder the wrongcourseIdwhen the provider switches courses (conditional lesson trees /key={courseId}).@lessonkit/react:
course_startednon-tracking pipeline awaits asyncextraSinksbefore marking pipeline delivery (failures retry).@lessonkit/react: Dev-only
<Quiz>outside<Lesson>no longer violates Rules of Hooks (wrapper +QuizInner).@lessonkit/react:
completeLessonaccepts optional{ courseId }and ignores completions when the live provider course differs.@lessonkit/xapi: Duplicate
send()while an in-flight statement fails schedules a retry after the flight completes (success path still dedupes in-flight sends).@lessonkit/core:
createTrackingClient()throws whenbatchSinkis set withbatch.enabled: false.@lessonkit/core:
createSessionStoragePort()falls back to in-memory storage whensessionStorageisnullor throws on access (embedded / restricted contexts).@lessonkit/lxpack: Bridge resolution falls back to
parent.lxpackBridge.v1when the SDK helper returns null.@lessonkit/lxpack: Descriptor validation failures report
courseDiras the staged course directory (outDir), not the packaging output path.Integration tests:
package --no-buildfailure test removes copieddist/so a local fixture build cannot make the test pass spuriously.
Changed¶
Monorepo: Root
pretestrunsbuild:packagesbeforenpm testso workspace tests use current@lessonkit/*dist artifacts.DevDependencies: Vitest and
@vitest/coverage-v8upgraded to 4.1.8 (addresses GHSA-5xrq-8626); removed deprecatedcoverage.allfrom Vitest configs.lessonkit inittemplate: Pins^1.0.2for@lessonkit/*.
[1.0.1] - 2026-05-31¶
Patch release: stronger TypeScript typing across the monorepo with no intended runtime API breaks.
Fixed¶
@lessonkit/react: Do not mark
course_startedas delivered to the tracking sink when a telemetry plugin filters the event; retries when tracking enables after xAPI bootstrap or when the filter is removed.@lessonkit/react: Strict
course_starteddelivery for lxpack bridge andextraSinkswith a pipeline dedupe flag; retry bridge/extraSinkswhen session and tracking marks are set but pipeline delivery failed; honor telemetry plugins in xAPI bootstrap; avoid duplicate xAPI bootstrap after pipeline delivery.@lessonkit/xapi:
flush()awaits in-flight direct transport sends, not only the queued batch.@lessonkit/lxpack: Validate
outDir, manifest paths,output, and absolute--outoverrides withrealpath(blocks symlink escapes); harden promote with unique temp dirs and clear errors for legacy.bak/.tmp-promoteartifacts.@lessonkit/lxpack: Reject Windows drive-relative SPA paths (
C:foo); coerce manifestschemaVersion: "1"(string); trim manifestname; rejectpaths.spaDistDirof.only.@lessonkit/lxpack: Case-insensitive path-under-root checks and
path.relativeremapping for Windows-style artifact paths.@lessonkit/cli: Forward extra Vite CLI args on
lessonkit build;package --no-buildfails fast whendist/is missing;--forcerequires--here.@lessonkit/core:
hasCourseStartedPipelineDelivered/markCourseStartedPipelineDeliveredsession helpers (used by React provider retries).Integration tests: Await golden-example Vite build in
beforeAllsolessonkit package --target standalonedoes not race a missingdist/.
Changed¶
All
@lessonkit/*packages: Discriminated telemetry/CLI result types, ID parse helpers,validateDescriptor(unknown), stricter theme validation, exported component prop types, and@typescript-eslint/no-explicit-anyenforcement.lessonkit inittemplate: Pins^1.0.1for@lessonkit/*.
[1.0.0] - 2026-05-30¶
Stable public API — Studio development gate is open. See MIGRATION-0.x-to-1.0.md.
Fixed¶
@lessonkit/react: Emit
course_startedto the tracking sink when xAPI bootstraps first and tracking is enabled later (without duplicating xAPI statements).@lessonkit/core: Track
course_starteddelivery to the tracking sink separately from xAPI/session dedupe marks.@lessonkit/xapi: Coalesce concurrent
flush()calls so queued statements are not sent twice.@lessonkit/react: Default
QuizpassingScoreto the assessment pluginmaxScorewhen the prop is omitted.@lessonkit/lxpack: Fix cross-platform
remapArtifactPathsprefix checks and Windows output path joining.@lessonkit/lxpack: Restore staged package content when promote fails and
outDirdid not exist yet.library-skills: Fix
install.shdefault (global only),validate.shpath inlessonkit-author, and packaging output path notes.Tooling: Add ESLint (flat config) with CI lint step and library-skills install/validate smoke in packaging CI.
Post-release maintenance (1.0.0 line)¶
Shipped on main without a semver bump (packages remain 1.0.0): Node 18+ for LMS packaging; quiz/lesson/provider hardening; LXPack staging validation; library-skills and CI template parity; items previously listed here through the first 1.0.0 release.
Fixed (1.0.0 maintenance)¶
@lessonkit/core: Isolate sync and async telemetry sink failures so one sink cannot block others or crash callers.
@lessonkit/core: Catch async rejections from non-batch
tracking.sink(dev warning).@lessonkit/core: Skip duplicate
lesson_startedwhen re-activating an already completed lesson (headless runtime).@lessonkit/react: Bootstrap xAPI
course_startedon new clients after remount (Strict Mode / transport swap).@lessonkit/react: Reset headless runtime and progress when
runtimeVersiontoggles between v1 and v2.@lessonkit/react: Skip duplicate
lesson_startedwhen remounting a completed lesson (v1 progress path).@lessonkit/lxpack: Reject
coursearrays inparseLessonkitManifest(clear validation message).@lessonkit/lxpack: Preserve failed promote builds as
.lk-failed-promote-*whenoutDiralready exists.@lessonkit/lxpack: Resolve SPA and
outputBaseDirpaths withrealpathunderprojectRoot.@lessonkit/lxpack: Swallow host bridge throws when forwarding telemetry (dev warning).
@lessonkit/xapi: Map
quiz_answered.correctto xAPIresult.success.@lessonkit/xapi: Skip duplicate in-flight
send()calls for the same statementid.@lessonkit/cli: Clarify
--forcehelp text; README points at bundled template source.@lessonkit/xapi: Add Node 18+
engines; README notes header aligned with 1.0.0.@lessonkit/react: Split
course_startedbootstrap so tracking dedupe is marked before xAPI/bridge pipeline retries (no duplicate tracking events on partial failure).@lessonkit/react: Forward
course_startedto lxpack bridge andextraSinkswhen tracking enables after xAPI bootstrap.@lessonkit/cli: Launch Vite via
node …/vite/bin/vite.jssodevandbuildwork on Windows (no.cmdspawn).@lessonkit/lxpack:
loadLessonkitManifestFromFileaccepts optionalprojectRootfor path validation; trim manifestpaths.*values; reject unsafe relativeoutputwithoutprojectRoot.@lessonkit/lxpack: Promote double-failure throws a recovery message listing
.lk-backup-*and.lk-failed-promote-*paths.Docs: Fix staged packaging example in
docs/PACKAGING.mdfor 1.0validatePackageInputsAPI.
Added¶
Library Skills (
library-skills/) — Agent Skills (SKILL.md) for Cursor, Claude Code, and compatible agents:lessonkit-author,lessonkit-packaging,lessonkit-telemetry,lessonkit-migrate;install.shand docs/guides/library-skills.md.Storybook for
@lessonkit/react(npm run storybook) — Course/Lesson layouts, Quiz states, block stories; CIbuild-storybookjob.Docs: Core reference, LXPack bridge reference; updated plugins, packaging, and migration guides.
Changed¶
runtimeVersion: "v2"is the default headless runtime in@lessonkit/react.Monorepo packages bumped to 1.0.0;
lessonkit inittemplate pins^1.0.0.
Removed (breaking)¶
buildTrackEvent/tryBuildTrackEvent— usebuildTelemetryEvent/tryBuildTelemetryEvent.defineLessonkitPlugin/createPluginHost— use segregated plugin helpers andcreatePluginRegistry.setLxpackBridgeMode— bridge mode is per-call via@lessonkit/lxpack/bridge.
[1.0.0-beta.1] - 2026-05-29¶
SOLID monorepo refactor: headless runtime, telemetry pipeline, segregated plugins, LXPack manifest/packaging stages.
Added¶
@lessonkit/core:buildTelemetryEvent,TelemetryPipeline, segregated plugin types (TelemetryPlugin,AssessmentPlugin,LifecyclePlugin),createPluginRegistry,createLessonkitRuntime, sharedports/progress/sessionmodules.@lessonkit/lxpack:parseLessonkitManifest,dispatchBridgeAction,forwardTelemetryToBridge, packaging stagesvalidatePackageInputs,buildStagingPackage,promoteStagingToOutDir.Docs: MIGRATION-0.x-to-1.0.md.
Changed¶
@lessonkit/react:LessonkitProviderdelegates touseLessonkitProviderRuntime;runtimeVersion: "v2"andsinksconfig; bridge via@lessonkit/lxpack/bridge.@lessonkit/cli: Manifest parsing delegates to@lessonkit/lxpack.Monorepo packages bumped to 1.0.0-beta.1.
Deprecated (removed in 1.0.0)¶
defineLessonkitPlugin/createPluginHost— use segregated plugin helpers andcreatePluginRegistry.React-local
buildTrackEvent— usebuildTelemetryEventfrom core.Legacy
tracking/xapisplit config — useTelemetryPipelineSink[].
[0.9.3] - 2026-05-29¶
Changed¶
Monorepo packages bumped to 0.9.3.
Quiz/KnowledgeCheck: OptionalpassingScoreprop (default1) forwarded to telemetry and the LXPack bridge.
Fixed¶
@lessonkit/cli:
lessonkit inituses@lessonkit/coreslugifyId()so numeric or invalid directory names produce validcourseIdvalues (e.g.9th-grade→id-9th-grade).@lessonkit/core:
composeTrackingSinkpreserves stateful wrapper closures across events while still refreshing context whencourseId/ session changes.@lessonkit/react:
wrapTrackingSinkno longer re-composes the sink on every telemetry event (fixes broken stateful analytics wrappers).@lessonkit/react:
Quizresets answer state whencourseIdchanges in-app.@lessonkit/react: Provider unmount captures the xAPI client before async flush (avoids remount race).
@lessonkit/react:
completeCourse()completes the active in-progress lesson before marking the course complete.@lessonkit/lxpack:
per-lesson-spalessonSpaDirspaths are validated underprojectRootwhen set.
[0.9.2] - 2026-05-29¶
Added¶
@lessonkit/integration: Vitest integration workspace (npm run test:integration) — real CLIinit/build/packagepipeline, golden target matrix, descriptor parity guards.E2E: Playwright launch specs for SCORM 2004 (
API_1484_11mock), xAPI, and cmi5 packages; global-setup packages all golden LMS artifacts.CI: Integration (Node 20) job in
.github/workflows/checks.yml.
Changed¶
Monorepo packages bumped to 0.9.2.
examples/lxpack-golden:tracking.xapi.activityIrifor xAPI / cmi5 packaging and export parity.
Fixed¶
@lessonkit/react: Plugin
onTelemetryBatchandwrapTrackingSinkuse freshcourseId/ session context at delivery time (fixes stale context after in-appcourseIdchanges with batched tracking).@lessonkit/react: Flush batched telemetry before emitting
course_startedwhencourseIdchanges.@lessonkit/react:
Quizfeedback reflectsscoreAssessmentresult (not onlyprops.answer).@lessonkit/react:
scoreAssessmentwithout explicitpassedand withmaxScore0 or unset falls back to answer matching (no longer treats anyscore > 0as pass).@lessonkit/react:
course_startedsession dedupe is marked only after a successful emit (sink failures can retry).@lessonkit/cli: Stricter
lessonkit.jsonvalidation (pathstypes,course.lessons/course.assessmentsarrays,course.spaDistDirvspaths.spaDistDirconflict).@lessonkit/cli:
react-vitepackage target usesINVALID_PROJECTwhendistis missing after build.@lessonkit/lxpack: Reject
outputpaths outsideprojectRootwhenprojectRootis set (direct API use).@lessonkit/cli:
lessonkit initresolves bundled template when CLI runs fromdist/bin.js(fixes template path for published CLI).
[0.9.1] - 2026-05-29¶
Added¶
E2E telemetry harness (
e2e/fixtures/telemetry-harness/): Playwright project for telemetry batching and xAPI queue behavior viawindow.__e2e.E2E: Expanded keyboard coverage on golden Vite (lesson nav, knowledge check).
Docs: Conformance matrix table and CI job map in export parity guide; expanded
e2e/README.md; contributing E2E section.PluginHost.deliverTelemetryBatch: batch flush hook for events already filtered at emit time (avoids doubleonTelemetrypasses).
Changed¶
Monorepo packages bumped to 0.9.1; 0.9.x conformance harness milestone complete per ROADMAP.
@lessonkit/core:TrackingClient.flush/disposemay returnPromise<void>; batcheddisposedrains the buffer after in-flight flushes complete.@lessonkit/react: Provider unmount awaits tracking flush/dispose;setActiveLessonflushes batched telemetry after auto-completing the previous lesson.
Fixed¶
@lessonkit/react: Duplicate course-level xAPI
initializedwhen tracking starts disabled and is enabled later with a transport (bootstrap now markscourse_startedin session storage).@lessonkit/react: Plugin
batchSinkno longer re-runsonTelemetryon buffered events (prevents silent drops from stateful plugins).@lessonkit/react:
Quiz/KnowledgeCheckhonorscoreAssessmentplugins fromLessonkitProvider.@lessonkit/react: Dev warning and flush when
courseIdchanges with an injectedconfig.xapi.client.@lessonkit/lxpack: Validate
outDir/outputBaseDirwhenprojectRootis set; allow./dist-style paths; log promote restore failures.@lessonkit/cli: Pass
projectRootinto packaging; map unsafe--outpaths toCliError(INVALID_PROJECT); hardenlessonkit initJSX string escaping.E2E: Telemetry harness batching spec drains startup lifecycle events before asserting quiz batch coalescing.
[0.9.0] - 2026-05-29¶
Added¶
Plugin architecture (v1) in
@lessonkit/core/@lessonkit/react:LessonkitPlugin,createPluginHost,config.pluginsonLessonkitProvider(telemetry hooks, sink wrapping, assessment scoring slot).Docs: plugins reference, plugin cookbook, example
consoleAnalyticsPlugin.Conformance harness (
e2e/): Playwright e2e forexamples/lxpack-goldenon Vite preview, standalone, and SCORM 1.2 (LMS API mock).CI:
@lxpack/conformancepackaging matrix, golden package matrix, andtest:e2ejob (Node 20).Docs: export parity guide,
e2e/README.md, contributor notes for conformance.
Changed¶
Monorepo packages bumped to 0.9.0; focus milestone is export parity before framework 1.0.
Fixed¶
@lessonkit/react: Emit one course-level xAPI
initializedstatement when both tracking and xAPI transport are configured (removed duplicate bootstrap send on provider mount).
[0.8.2] - 2026-05-29¶
Changed¶
@lessonkit/lxpack: Bump
@lxpack/api,@lxpack/spa-bridge,@lxpack/validators, and@lxpack/tracking-schemato ^0.6.0;packageLessonkitCourse()uses LXPackpackageLessonkit()instead of hand-built YAML + separate validate/build.@lessonkit/lxpack:
descriptorToInterchange()includesruntime,assessments, and interchange types from@lxpack/validators;writeLxpackProject()delegates tomaterializeLessonkitProject()(removed local YAML emitters).@lessonkit/lxpack/bridge: Re-export
@lxpack/spa-bridgeandmapLessonkitTelemetryToBridgeActionfrom@lxpack/tracking-schema;telemetryEventToLessonkit()adapts@lessonkit/coreevents.@lessonkit/react: Forward telemetry to the LXPack bridge via the shared tracking map (replacing hand-rolled switch).
@lessonkit/lxpack: Export
materializeLessonkitProject,parseLessonkitInterchange, andlessonkitInterchangeSchemafor advanced tooling.
[0.8.1] - 2026-05-29¶
Fixed¶
@lessonkit/react: Reset progress synchronously on
courseIdchange so child<Lesson>effects cannot emit completions under the wrong course id.@lessonkit/react: Revert to tab/auto
sessionIdwhensession.sessionIdis cleared from config.@lessonkit/react: Skip
course_startedstorage/delivery whiletracking.enabledisfalse; emit when tracking is re-enabled.@lessonkit/react: Reset
Quizstate whenanswerorquestionchanges; cancel pending dispose timers on provider remount.@lessonkit/react: Remove stale
course_startedstorage keys after session id migration.@lessonkit/cli: Validate
lessonkit.jsonpaths.*andpackage --outstay under the project root.@lessonkit/cli:
init --forceonly allowed when the target directory is empty or contains dotfiles only; template uses{{courseId}}/{{courseTitle}}placeholders.@lessonkit/lxpack:
validateProjectPaths,resolveSafePackageOutputOverride; validate custom theme and completion threshold invalidateDescriptor;writeLxpackProjectresolves relativespaDistDirunder optionalprojectRoot.@lessonkit/lxpack/bridge: Scale
passingScoreto 0–1 whenmaxScoreis provided (matchesnormalizeAssessmentScore); clamp normalized scores to 1.@lessonkit/lxpack: Atomic promote of packaged
outDirso a failedrenamedoes not delete the previous course tree.@lessonkit/lxpack: Validate
passingScoreas absolute points (not capped by choice count); remap nestedbuild.outputPath/outputDirafter staging promote.@lessonkit/react: Emit
course_startedbeforelesson_startedwhencourseIdchanges; reset xAPI queue oncourseIdchange.@lessonkit/react: Harden tracking client dispose on provider unmount.
@lessonkit/react: Skip xAPI client creation when no transport/client unless
xapi.enabled: true; flush batched tracking oncompleteCourse; migratecourse_starteddedup whensession.sessionIdchanges.@lessonkit/cli: Honor
--no-buildforreact-vitepackage target; clarifyinit --force(only with--here).Examples:
lessonkit.jsonfor react-vite, data-privacy, and customer-service; goldencourse.descriptor.tssync;examples/lxpack-golden/README.mddocumentssingle-spalesson ids.Docs: README license Apache-2.0; ROADMAP framework status 0.8.1.
@lessonkit/react: Migrate
course_starteddedup whensession.sessionIdis first supplied after a tab auto-id (including from stored tab session).@lessonkit/react: Reset
Quizcompletion state whencheckIdchanges on a mounted instance.@lessonkit/react: Ignore stale xAPI flush work after transport/client/courseId layout effect cleanup.
Examples:
react-vitemanifest theme preset matches App (brand);lxpack-goldenrenames in-SPA lessonsafety-signoff(distinct from assessmentcheckId) and aligns welcome lesson title with the app.Docs: CLI and guide version callouts updated to 0.8.1.
[0.8.0] - 2026-05-28¶
Added¶
@lessonkit/react: Runtime block catalog v1 —
buildBlockCatalog(),getBlockCatalogEntry(),BLOCK_CATALOG,blockCatalogVersion.@lessonkit/react: Machine-readable
@lessonkit/react/block-catalog.v1.jsonand JSON Schema@lessonkit/react/block-contract.v1.json.Docs:
docs/BLOCK_CATALOG.mdand block catalog reference.Examples:
examples/lxpack-goldendemonstrates every catalog block (KnowledgeCheck, optionalblockIdon Scenario/Reflection).
Changed¶
Monorepo packages bumped to 0.8.0.
Docs:
STUDIO_READINESS.md0.8.x checklist complete; vibe-coding and components guides link to block catalog.
[0.7.0] - 2026-05-28¶
Added¶
@lessonkit/cli: Real
init,dev,build, andpackagecommands with dual export (react-vite+ LMS targets via@lessonkit/lxpack).lessonkit.jsonv1: Canonical project manifest for packaging and future Studio alignment.CLI: Structured errors, stable exit codes,
--jsonoutput mode,--skip-install/--forcefor automation.Template bundling: Vite + React starter copied into
@lessonkit/cliforlessonkit init.Docs:
docs/CLI.md.CI: CLI packaging smoke step on golden example.
Changed¶
Monorepo packages bumped to 0.7.0.
examples/lxpack-golden: Packaging scripts uselessonkit packageinstead of customtsxscript.templates/vite-reactand golden example includelessonkit.json.Starter template:
ThemeProviderdefaults topreset="default"/mode="light"to matchlessonkit.json.
Fixed¶
@lessonkit/cli:
paths.outputBaseDiris honored when resolving package artifacts;lessonkit buildpasses Vite--outDirwhenpaths.spaDistDiris notdist.@lessonkit/cli: Project discovery requires
schemaVersion: 1(ignores LXPack interchangelessonkit.jsonunder.lxpack/course).@lessonkit/cli:
lessonkit initpatchessrc/App.tsxcourseIdand course title to match the manifest; rejectsper-lesson-spaforlessonkit package.@lessonkit/lxpack: Descriptor validation requires
layoutand validatestheme.preset.@lessonkit/react:
completeLessonclearsactiveLessonId; provider unmount flushes pending lesson completions before disposing the active tracking client;courseIdchanges re-activate mounted lessons.
[0.6.0] - 2026-05-28¶
Added¶
@lessonkit/lxpack: New package —
LessonkitCourseDescriptor,writeLxpackProject,packageLessonkitCourse,validateLessonkitProject,buildLessonkitProject;themeToLxpackRuntime;single-spaandper-lesson-spalayouts; assessment export; browser bridge (@lessonkit/lxpack/bridge).@lessonkit/react: Forwards
lesson_completed,course_completed, andquiz_completedtowindow.parent.lxpackBridge.v1when embedded (config.lxpack.bridge, defaultauto).Examples:
examples/lxpack-golden— build + SCORM 1.2 / standalone packaging scripts.CI: Node 20 packaging smoke job (golden example → SCORM ZIP).
Docs:
docs/PACKAGING.md; LXPack id mapping indocs/IDENTITY.md; theme parity indocs/THEMING.md.
Changed¶
Monorepo packages bumped to 0.6.0.
Root
build:packagesincludes@lessonkit/lxpack(requires Node 20+ for consumers of the adapter).@lessonkit/react: Depends on
@lessonkit/lxpackfor shared LXPack bridge score normalization.
Fixed¶
@lessonkit/lxpack: Reject unsafe
spaPathvalues and verify copy destinations stay inside the project root.@lessonkit/lxpack: Normalize trimmed ids/titles in validated descriptors; validate
spaLessonId, duplicatespaPath, and assessmentpassingScore/ choices.@lessonkit/lxpack: Clear stale SPA output before re-copy; stage packaging in a temp dir so failed runs do not overwrite a good
outDir.@lessonkit/lxpack: Export
normalizeAssessmentScore/normalizeAssessmentPassingScorefrom@lessonkit/lxpack/bridge.@lessonkit/react: LXPack bridge skips
submitAssessmentwhenquiz_completedhas no finite score (no longer defaults to 100%).@lessonkit/react: Lifecycle telemetry uses canonical
lessonIdwhendata.lessonIdconflicts.@lessonkit/react: Reset progress and emit
course_startedwhencourseIdchanges; sendcourse_startedto xAPI when the client is enabled after mount.@lessonkit/xapi: Dev warning when xAPI transport fails and a statement is re-queued.
0.5.0 - 2026-05-28¶
Added¶
@lessonkit/core: Identity v1 —
validateId,slugifyId,deriveId,buildLessonkitUrn; typedTelemetryEventpayloads;TELEMETRY_EVENT_CATALOG/telemetry-catalog.v1.json;identity-contract.v1.json.@lessonkit/xapi:
telemetryEventToXAPIStatement()— canonical mapping from telemetry to xAPI object URNs.Docs:
docs/IDENTITY.md,docs/TELEMETRY.md.
Changed¶
@lessonkit/react: xAPI emission goes through the telemetry mapper after each
track()(single path for lifecycle and quiz events).@lessonkit/xapi:
createXAPIClientusescourseIdand the mapper internally for lifecycle helpers.
Breaking¶
@lessonkit/react:
courseIdrequired onCourseandLessonkitProvider;lessonIdrequired onLesson(removeduseId()lesson fallback);checkIdrequired onQuiz/KnowledgeCheck.@lessonkit/react:
useQuizState().answer/.completerequirecheckIdin their payloads.@lessonkit/react: Removed exported
sanitizeLessonId.@lessonkit/core: All telemetry events require
courseId; eventdatashapes are discriminated by event name.@lessonkit/xapi: Clients without
courseIdno longer emit lifecycle statements; defaulturn:lessonkitbase id removed.
Fixed¶
@lessonkit/react:
setActiveLessoncompletes the previously active lesson when switching ids (tab/programmatic navigation).@lessonkit/react:
<Lesson>defers completion on unmount so React Strict Mode does not emit spuriouslesson_completedevents in development.@lessonkit/react: Progress state uses
createProgressController()(single implementation shared with tests).@lessonkit/react: Dev-only warnings for invalid
courseId/lessonId/checkId; xAPI mapping skips invalid ids with a dev warning instead of throwing.@lessonkit/core: Test asserts
identity-contract.v1.jsonidPatternmatchesID_PATTERN.
Migration¶
See docs/IDENTITY.md: add courseId, lessonId, and checkId to your components; preserve IDs in source when regenerating.
0.4.0 - 2026-05-28¶
Added¶
@lessonkit/themes: Token schema v1 (colors, spacing, typography, radius, shadows),
validateTheme,mergeThemes,themeToCssVariables, presets (default,light,dark,brand),buildThemeCatalog, publishedtheme-contract.v1.json/theme-catalog.v1.json, optionalbase.css.@lessonkit/react:
ThemeProvider,useTheme, and theme types; injects--lk-*CSS variables on:rootor a scoped element.Docs:
docs/THEMING.md— CSS variable contract, merge precedence, generator catalog paths.Examples/templates: Showcase theme toggle (light / dark / system); styles migrated to
--lk-*variables.
Changed¶
@lessonkit/themes:
LessonkitThemeis now an alias for the fullLessonkitThemeV1schema (breaking if you relied on the old partial shape without other token groups).
Fixed¶
@lessonkit/themes / @lessonkit/react:
preset="brand"no longer forces dark palette colors whenmodeislightorsystem(brand mergesbrandThemeOverridesonto the active mode base).@lessonkit/react:
LessonkitProvideruses sharedcreateXapiClientFromConfigfromruntime/xapi(no duplicate factory logic).Docs: Package READMEs and root example updated for 0.4.0;
SPEC.mdimports@lessonkit/react; theming docs clarifypreset="default"vsdefaultTheme.
0.3.1 - 2026-05-28¶
Fixed¶
@lessonkit/react: Use an isomorphic layout effect in
LessonkitProviderto avoid SSRuseLayoutEffectwarnings while preserving client-side lifecycle behavior.Repo: Make
npm run typecheckdeterministic by building workspace package declarations first.@lessonkit/react: Silence expected React error output in the “missing provider” test while keeping the assertion.
@lessonkit/core: Call
unref()on batched telemetry flush timers so Node test runners and CLIs can exit cleanly.
Changed¶
@lessonkit/core, @lessonkit/xapi, @lessonkit/react: Internal module split (types, tracking client, xAPI queue/client, runtime session ports) with no intended public API changes.
@lessonkit/react: Session and course-started persistence now go through a storage port (
runtime/session).
0.3.0 - 2026-05-28¶
Fixed¶
@lessonkit/react: Move tracking and xAPI client lifecycle to
useLayoutEffect(no dispose side effects inuseMemo); stabilize batch config dependencies on primitive fields.@lessonkit/react: Persist tab-scoped
sessionIdviasessionStoragewhensession.sessionIdis omitted; dedupecourse_startedacross React Strict Mode remounts.@lessonkit/react: Flush shared xAPI queue when
xapi.transportchanges so queued statements are not dropped.@lessonkit/react: Flush batched telemetry on provider unmount; idempotent
completeLesson/completeCoursetelemetry.@lessonkit/react:
Quizemitsquiz_completedon first correct answer; fieldset legend uses bundled visually-hidden styles (no.sr-onlyCSS required).
Added¶
@lessonkit/accessibility:
visuallyHiddenStyleexport for screen-reader-only UI without app CSS.@lessonkit/react: Depends on
@lessonkit/accessibilityfor Quiz legend styling.
Changed¶
Root build order builds
@lessonkit/accessibilitybefore@lessonkit/react.Documentation updated for 0.3.0 (ROADMAP status, React README notes on lesson unmount and sessions).
[0.2.0] - (unreleased on npm; included in 0.3.0)¶
Analytics and tracking milestone (shipped in repo before 0.3.0 hardening):
Session-aware telemetry, optional batching (
@lessonkit/core,@lessonkit/react).LessonkitProviderruntime config (tracking sink,xapi.transport, session metadata).xAPI in-memory queue, richer lesson completion results (
@lessonkit/xapi).Vite React example and template with telemetry/xAPI wiring.
[0.1.1] - 2026-05-27¶
Last version published to npm before 0.2.x.
Initial public packages:
@lessonkit/core,@lessonkit/react,@lessonkit/xapi,@lessonkit/accessibility,@lessonkit/themes,@lessonkit/cli.Tag-based publish workflow and CI checks (build, typecheck, test, coverage).