Skip to content

VS Code interactive tutorial with narrated lesson films; semantics for files outside the solution - #413

Merged
MelbourneDeveloper merged 55 commits into
mainfrom
chore/video-lessons
Oct 20, 2026
Merged

MelbourneDeveloper merged 55 commits into
mainfrom
chore/video-lessons

Conversation

@MelbourneDeveloper

@MelbourneDeveloper MelbourneDeveloper commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

TLDR

Adds an interactive VS Code tutorial whose steps tick off on real SharpLsp answers, beside narrated films for every step. Also fixes semantics for files outside the loaded solution (#414) and F# document-symbol selection (#415).

Closes #412. Closes #414. Closes #415.

Details

VS Code interactive tutorial (docs/specs/VSCODE-TUTORIAL-SPEC.md, model docs/models/vscode-tutorial.td → tutorial/model.generated.ts)

  • Two Get Started walkthroughs, F# first and then C#. Each has seven steps: open a file, hover, completion, go to definition, find references, a code action, and the Solution Explorer.
  • tutorial/detect.ts: a step ticks only when SharpLsp sends a meaningful answer to the user's own request. The automatic lightbulb never ticks the code-action step.
  • tutorial/panel.ts, panel-view.ts and media/tutorial/*: a locked-down webview that plays each step's chapter of the MP4 from sharplsp.dev beside the live editor, or from a pinned commit until the site deploys it. No video ships in the VSIX. VS Code only autoplays muted until the viewer clicks, so a narrated film starts muted and shows a 🔊 Sound on button.
  • tutorial/progress.ts: progress is ordered, idempotent, validated when restored, and resettable.
  • Settings and strings in en, ja and zh (package.nls*.json).

Sidecars

Film toolset (src/website/tools/profiler-film → src/website/tools/video)

  • Every film lives in films/<name>/ (film.mjs, plus narration.json when narrated). Shared code is in kit/, and the README covers the whole toolset.
    • One entry point: film.mjs <name> [--publish|--preview].
    • Templates for walkthroughs and lessons are in templates/.
  • New kit modules:
    • zoom.mjs: an auto-zoom camera that follows the pointer and caret.
    • chapters.mjs: chapter tracks.
    • lesson/*: the slide-deck lesson renderer.
    • frames.mjs, publish.mjs, timeline.js, track.mjs and vtt.mjs.
    • Duplicate helpers were merged into centre, writeSettings, fade and ease.
  • Lesson deck fix: each item now carries one class attribute, so an item appears on its own narration line.

Website

  • New /docs/tutorial/ pages in en, ja and zh, playing the narrated, chaptered vscode-tutorial film (3:49, captions in en, ja and zh). Each chapter link opens that step.
  • /docs/refactoring/ is expanded into a lesson, with the new refactoring-lesson film (3:49). The Blazor film is recut.
  • videos.json, video-figure.js and video-pages.js support chapter tracks.

Tooling

  • tools/vsix/tutorial-model.mjs checks the generated tutorial model. tools/vsix/vscode-profiles.mjs, with its test tools/make/vsix-profiles.test.mjs, assigns VS Code test profiles.

How Do The Automated Tests Prove It Works?

  • tutorial.test.ts (VS Code e2e):
    • [TUTORIAL-DETECT-LSP] only a meaningful SharpLsp answer ticks a step
    • … only a code action the user invoked ticks, never the automatic lightbulb
    • [TUTORIAL-DETECT] carrying out the F# steps in the live editor ticks each one, and no C# step
    • [TUTORIAL-PANEL] every film is an MP4 from the website or its pinned commit, never a WebM
    • [TUTORIAL-PANEL] opening the tutorial shows the first F# step, its film and a locked-down webview (it also asserts the film reports muted and that the Sound on button is offered)
    • [TUTORIAL-PROGRESS] progress is ordered, idempotent and validated when restored
    • [TUTORIAL-PROGRESS] reset returns every step and the panel to the start
    • [TUTORIAL-OPEN-FILE] the file the tutorial opens is one SharpLsp answers hover in
  • C# sidecar, WorkspaceManagerOwningProjectTests:
    • A_file_outside_the_loaded_project_answers_hover_from_the_project_that_owns_it
    • A_file_whose_owning_project_was_never_restored_answers_once_it_is
  • F# sidecar:
    • FSharpOwningProjectTests: a file outside the loaded workspace answers hover from the project that owns it and a file whose project lost its restored packages answers hover once they are restored
    • FSharpSymbolsTests: documentSymbols selects each declaration's name, never its doc comment
  • Website (Playwright, desktop and phone):
    • site-videos.spec.js, 375 tests. /docs/tutorial/ in en, ja and zh is now a narrated walkthrough: the narration is not muted and captions are in all three languages, with the page's language as the default. Chapter lists link each step to its time (?t=0, ?t=12).
    • film-camera.spec.js: the zoom camera pushes in on the pointer, never shows past the workbench edge, and paces fast-forwarded clips.
    • film-chapters.spec.js: one span per chapter, timed with every hold before it. A chapter marked twice, apart, fails the film.

dependabot Bot and others added 29 commits October 14, 2026 17:34
Bumps the rust-host group with 3 updates: [tree-sitter](https://github.com/tree-sitter/tree-sitter), [serde_json](https://github.com/serde-rs/json) and [toml](https://github.com/toml-rs/toml).


Updates `tree-sitter` from 0.27.0 to 0.27.1
- [Release notes](https://github.com/tree-sitter/tree-sitter/releases)
- [Commits](tree-sitter/tree-sitter@v0.27.0...v0.27.1)

Updates `serde_json` from 1.0.151 to 1.0.154
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](serde-rs/json@v1.0.151...v1.0.154)

Updates `toml` from 1.1.6+spec-1.1.0 to 1.1.8+spec-1.1.0
- [Commits](toml-rs/toml@toml-v1.1.6...toml-v1.1.8)

---
updated-dependencies:
- dependency-name: tree-sitter
  dependency-version: 0.27.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-host
- dependency-name: serde_json
  dependency-version: 1.0.154
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-host
- dependency-name: toml
  dependency-version: 1.1.8+spec-1.1.0
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-host
...

Signed-off-by: dependabot[bot] <[email protected]>
Bumps the rust-zed group in /src/editors/zed with 1 update: [toml](https://github.com/toml-rs/toml).


Updates `toml` from 1.1.6+spec-1.1.0 to 1.1.8+spec-1.1.0
- [Commits](toml-rs/toml@toml-v1.1.6...toml-v1.1.8)

---
updated-dependencies:
- dependency-name: toml
  dependency-version: 1.1.8+spec-1.1.0
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-zed
...

Signed-off-by: dependabot[bot] <[email protected]>
…t-upgrades/rust-zed-1725422218 into dependabot-upgrades
Bumps the github-actions group with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [taiki-e/install-action](https://github.com/taiki-e/install-action) | `2.87.23` | `2.87.27` |
| [actions/setup-node](https://github.com/actions/setup-node) | `7.0.0` | `7.1.0` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `8.0.1` | `8.0.2` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `7.0.1` | `7.0.2` |
| [github/codeql-action/init](https://github.com/github/codeql-action) | `4.38.2` | `4.38.3` |
| [github/codeql-action/analyze](https://github.com/github/codeql-action) | `4.38.2` | `4.38.3` |


Updates `taiki-e/install-action` from 2.87.23 to 2.87.27
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](taiki-e/install-action@861a07c...ab68953)

Updates `actions/setup-node` from 7.0.0 to 7.1.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](actions/setup-node@8207627...949feb2)

Updates `actions/download-artifact` from 8.0.1 to 8.0.2
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@3e5f45b...9000827)

Updates `actions/upload-artifact` from 7.0.1 to 7.0.2
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@043fb46...cf430e0)

Updates `github/codeql-action/init` from 4.38.2 to 4.38.3
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@2892aa5...24c5418)

Updates `github/codeql-action/analyze` from 4.38.2 to 4.38.3
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@2892aa5...24c5418)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-version: 2.87.27
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: actions/setup-node
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: actions/download-artifact
  dependency-version: 8.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: github/codeql-action/init
  dependency-version: 4.38.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: github/codeql-action/analyze
  dependency-version: 4.38.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <[email protected]>
Bumps the website group in /src/website with 1 update: [@playwright/test](https://github.com/microsoft/playwright).


Updates `@playwright/test` from 1.63.0 to 1.64.0
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](microsoft/playwright@v1.63.0...v1.64.0)

---
updated-dependencies:
- dependency-name: "@playwright/test"
  dependency-version: 1.64.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: website
...

Signed-off-by: dependabot[bot] <[email protected]>
…des/github-actions-c88aa5ffdc into dependabot-upgrades
…abot-upgrades/website-3c101cf53b into dependabot-upgrades
Bumps the vscode-extension group in /src/editors/vscode with 7 updates:

| Package | From | To |
| --- | --- | --- |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.6.4` | `26.6.5` |
| [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `8.71.0` | `8.71.1` |
| [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `8.71.0` | `8.71.1` |
| [playwright](https://github.com/microsoft/playwright) | `1.63.0` | `1.64.0` |
| [prettier](https://github.com/prettier/prettier) | `3.9.9` | `3.9.10` |
| [typescript](https://github.com/microsoft/TypeScript) | `6.0.3` | `7.0.2` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.71.0` | `8.71.1` |


Updates `@types/node` from 26.6.4 to 26.6.5
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@typescript-eslint/eslint-plugin` from 8.71.0 to 8.71.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.71.1/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.71.0 to 8.71.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.71.1/packages/parser)

Updates `playwright` from 1.63.0 to 1.64.0
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](microsoft/playwright@v1.63.0...v1.64.0)

Updates `prettier` from 3.9.9 to 3.9.10
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](prettier/prettier@3.9.9...3.9.10)

Updates `typescript` from 6.0.3 to 7.0.2
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](microsoft/TypeScript@v6.0.3...v7.0.2)

Updates `typescript-eslint` from 8.71.0 to 8.71.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.71.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.6.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vscode-extension
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.71.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vscode-extension
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.71.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vscode-extension
- dependency-name: playwright
  dependency-version: 1.64.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: vscode-extension
- dependency-name: prettier
  dependency-version: 3.9.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vscode-extension
- dependency-name: typescript
  dependency-version: 7.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: vscode-extension
- dependency-name: typescript-eslint
  dependency-version: 8.71.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: vscode-extension
...

Signed-off-by: dependabot[bot] <[email protected]>
…/dependabot-upgrades/vscode-extension-9912a3cfe6 into dependabot-upgrades
Bumps Fantomas.Core from 8.0.7 to 8.0.8
Bumps FSharp.Compiler.Service from 43.12.401 to 43.12.402
Bumps FSharp.Core from 10.1.401 to 10.1.402
Bumps MessagePack from 3.1.11 to 3.1.12
Bumps Microsoft.CodeAnalysis.NetAnalyzers from 10.0.401 to 10.0.402
Bumps Microsoft.NET.Test.Sdk from 18.10.1 to 18.11.0
Bumps System.Security.Cryptography.Xml from 10.0.12 to 10.0.13
Bumps xunit.runner.visualstudio from 4.0.0 to 4.0.1

---
updated-dependencies:
- dependency-name: Fantomas.Core
  dependency-version: 8.0.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: FSharp.Compiler.Service
  dependency-version: 43.12.402
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: FSharp.Core
  dependency-version: 10.1.402
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: FSharp.Core
  dependency-version: 10.1.402
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: MessagePack
  dependency-version: 3.1.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: MessagePack
  dependency-version: 3.1.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: Microsoft.CodeAnalysis.NetAnalyzers
  dependency-version: 10.0.402
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: Microsoft.NET.Test.Sdk
  dependency-version: 18.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: dotnet-sidecars
- dependency-name: Microsoft.NET.Test.Sdk
  dependency-version: 18.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: dotnet-sidecars
- dependency-name: System.Security.Cryptography.Xml
  dependency-version: 10.0.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: xunit.runner.visualstudio
  dependency-version: 4.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
- dependency-name: xunit.runner.visualstudio
  dependency-version: 4.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-sidecars
...

Signed-off-by: dependabot[bot] <[email protected]>
…bot-upgrades/dotnet-sidecars-61cedddb46 into dependabot-upgrades
profiler-film/ held every video on the site, not just the profiler's. It is now
src/website/tools/video/, and the blog hero page moves into video/heroes/. The
frame-stepping renderer the profiler film used is now kit/frames.mjs, so every
composited film renders through the same code.

AGENTS.md: large files go in Git LFS; commit and push after each major change.
A lesson is a narrated slide deck (kit/lesson/) around real footage cut from a
feature's published walkthrough, so no editor frame is mocked. Slides hold
until their lines are spoken, and each item appears as its line starts.

The sound kit is shared by both kinds of film: a script now picks its voice
speed, its pacing and its score, and kit/sound/drive.mjs is a new energetic
score for the lessons. kit/publish.mjs is the one place films are encoded and
narrated. First lesson: refactoring-lesson (Code Actions), in film.mjs.
Ported from SharpLspRazorClaude1's main-tree work by FilmMaker2: each clip is
shot with its track, and publishing frames it through an auto-zoom camera
(kit/zoom.mjs, kit/track.mjs) with its step captions laid over the cut
(kit/captions.mjs), per [WEB-DESIGN-MEDIA-CAMERA]. The Blazor film is
re-published through it. Walkthroughs narrate through kit/publish.mjs.
Every film is now films/<name>/, holding only its own words, timings and
edits (film.mjs, and narration.json when narrated); all shared code stays in
kit/. film.mjs finds films by folder.

templates/lesson/ is the starting point for every new lesson, with each slide
layout used once; films/refactoring-lesson/ is the reference. The README maps
the folder and says how to make a lesson, and [WEB-DESIGN-MEDIA] gains its
Lessons rule. Blazor assets: the newest re-render.
The re-published Blazor WebM was copied mid-encode and has no duration, and
its poster, card and captions came from an older publish. Back to main's set
until the Blazor film is published again through the camera.
The page (en/ja/zh) now leads with the refactoring-lesson film and teaches
the feature step by step: the shortcut, where actions come from, an F# match
completed, the F# fixes by diagnostic with code to try, rename across files,
C# generate-method and add-using, list-then-resolve underneath, and what is
not a code action. The one-take walkthrough closes the page. Tests expect the
lesson first and as the page's social preview. Footage slides sit lower.
Docs stills come only from tools/video/films/doc-stills ([WEB-DESIGN-MEDIA]).
The e2e suites no longer call takeScreenshot, openSharpLspPanel or
settleForScreenshot, and drop the env-gated blocks that staged pictures. No
assertion is removed.
…ers, and a film panel beside the editor (#412)

Spec [TUTORIAL] and its typeDiagram model; the model's TypeScript is
generated and checked in _lint-vsix. A sendRequest middleware ticks
hover, completion, definition and references only on meaningful
responses; opening a file and showing the Solution Explorer tick from
editor events. Progress is one Signal, persisted and mirrored into the
walkthrough's context keys. F# first. Tests and plan follow.
Republished from its shoot's clips and tracks: every clip is framed by the
camera that follows the pointer and the text cursor (2 to 6 moves a clip), with
the step captions laid over the cut. 158.4 s; both encodes decode end to end.
The rules, the manifest's walkthroughs, the panel and its policy, and
the F# steps carried out in the live editor, each ticking only its own
step; the Solution Explorer ticking both languages, and reset.
refactoring-lesson, 3:49 at 1920x1080: twelve slides around real footage cut
from the refactoring walkthrough, narrated by Kokoro's af_bella at 1.12x over
the drive score, mixed to -16 LUFS, captioned in en/ja/zh. Catalogued before
the walkthrough, so the docs page leads with it and previews it. The Blazor
film carries its new upload date.

A caption now never lingers into the next line's cue.
…video-lessons

# Conflicts:
#	.github/workflows/ci-audit.yml
#	.github/workflows/ci-build.yml
#	.github/workflows/ci-test-editors.yml
#	.github/workflows/ci-test-rust.yml
#	.github/workflows/ci-test-tooling.yml
#	.github/workflows/ci.yml
#	.github/workflows/deploy-pages.yml
#	.github/workflows/release.yml
#	Cargo.lock
#	src/editors/vscode/package-lock.json
#	src/editors/vscode/package.json
#	src/sidecars/SharpLsp.Sidecar.FSharp/SharpLsp.Sidecar.FSharp.fsproj
#	src/website/package-lock.json
#	src/website/package.json
…its language's chapter

The panel starts refactoring-lesson at the F# or C# chapter of the lesson,
and the step ticks off on the first meaningful codeAction response.
Both walkthroughs gain 'Fix code with a code action', ticked only by a
code action request the user invoked (Cmd+. / Ctrl+.), never the
automatic lightbulb. The panel plays FilmMaker1's refactoring-lesson
from its F# (0:44) or C# (1:56) chapter via a media fragment. Films
the site has not deployed yet stream from GitHub at a pinned commit;
the VSIX carries no video.
@MelbourneDeveloper
MelbourneDeveloper enabled auto-merge (squash) October 20, 2026 08:00
…tight README

film.mjs runs three kinds of film by what their film.mjs exports: a
walkthrough (scenes), a lesson (lesson) or a composite (shoot, publish,
preview). The profiler film is now a composite: film.mjs profiler shoots
and renders it into out/profiler/, like every other film.

Filming fixes: the Shop set leaves out the Blazor demo, whose solution
SharpLsp loaded instead of Shop.slnx, and the film editor switches the
in-app tutorial off so it never opens on camera.
… Code tutorial

Every walkthrough publishes <id>.chapters.vtt: one cue per chapter its scenes
mark, identified by the tutorial step it shows (FSharp.Hover, SolutionExplorer),
so the panel plays and loops that step's run. Captions and chapters share one
WebVTT writer. films/vscode-tutorial shoots one step per shot, F# first.
Each language carries its own article, found driving the built
extension in browser VS Code.
launchVsCode opened every editor on CDP port 9241, so two shoots side by side
drove, and closed, each other's VS Code. Each editor now gets a free port.
Thirteen shots, F# then C#: open a file, hover, complete, go to definition,
find references, apply a code action, and open the Solution Explorer, each
framed by the camera. vscode-tutorial.chapters.vtt names every shot by its
tutorial step, so the panel plays and loops exactly the step in hand.
…camera, with chapters

The three films the tutorial plays for its open-file and completion steps
are shot again through the camera, and hover is published again so each
of the four carries its chapters track. Their catalogue entries take the
new lengths.
…he editor already open

Quick-opening the active editor left it holding the Cmd of Cmd+P, whose
key-up went to Quick Open, so its next click ran as a Cmd+click and never
moved the cursor: F12 then asked for the definition of line 1. openFile
now leaves an editor that is already in front alone.
Comment thread src/website/tools/video/kit/workbench.mjs Fixed
…actly

Any sharplsp id ending in .open was dropped as a workbench view command,
which swallowed the tutorial's sharplsp.tutorial.open (71 !== 72 in the
VS Code debug shard). Match only the contributed views' own commands.
…oaded

VS Code's Electron has no WebM demuxer, so every film failed with
DEMUXER_ERROR_COULD_NOT_OPEN; the panel now plays the site's MP4s.
The webview reports each film's ready/error state to the log.
"Open one for me" picked the first *.fs on disk, often a file in no
loaded project, where hover answers nothing; it now opens a file of the
loaded solution, or of a workspace project when none is loaded.
CodeQL: film URLs checked against the allowed origins, message origin
checked, model generator reads without an exists/read race.
The CLI installs into the default profile only, so a window whose
workspace uses another profile kept loading the old build after
make reinstall-vsix. The loop now lists the profiles holding their own
copy of SharpLsp before it uninstalls, and installs into each.
…k and reports it

An extension host older than the panel script sent the film under its
old field; the script found no URL and rendered nothing, silently.
… chapter by chapter

The Set up group gains Tutorial (en/ja/zh), led by the catalogued vscode-tutorial
film with its chapters track, and a list of its chapters titled as the VS Code
walkthrough titles each step, each opening the watch page at that second.
Getting Started links to it. Implements [WEB-DESIGN-MEDIA-CHAPTERS].
FCS widens a type's or module's navigation range over its doc comment, and the
sidecar sent that as the LSP selectionRange, so revealing a symbol, or hovering
where it starts, landed on ///. The name token is now found with FCS's lexer
inside that range. The tutorial's hover test waits for a declaration inside the
namespace, not the namespace alone. Fixes 415.
…, restored if its packages are gone

Opening or editing a .fs file no loaded project compiles loads its owning .fsproj
in the background beside the workspace's projects (#414). Before any F# project
loads, it is restored again when its assets file names packages no package folder
holds: MSBuild trusts the build's assets cache and would report a command line
without FSharp.Core or the netstandard reference pack, and FCS aborts every check.
The tests' dotnet runner is shared instead of copied.
…en/ja/zh

The docs tutorial pages are now walkthroughs, so their tests check that the narration plays and that captions are in every language. Same chapters (the panel's steps are unchanged); 3:49.
@MelbourneDeveloper MelbourneDeveloper changed the title VS Code interactive tutorial with lesson films (#412) VS Code interactive tutorial with narrated lesson films; semantics for files outside the solution Oct 20, 2026
@MelbourneDeveloper
MelbourneDeveloper merged commit 7f92852 into main Oct 20, 2026
107 of 111 checks passed
@MelbourneDeveloper
MelbourneDeveloper deleted the chore/video-lessons branch October 20, 2026 12:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants