Repository navigation
VS Code interactive tutorial with narrated lesson films; semantics for files outside the solution - #413
Merged
Conversation
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
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.
…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.
…e centre(box), one score fade
…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.
…, restored if it never was
…s only muted until a click
…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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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, modeldocs/models/vscode-tutorial.td→tutorial/model.generated.ts)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.tsandmedia/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.package.nls*.json).Sidecars
WorkspaceManager.OwningProject.cs,DotnetRestore.csandFileBasedPackageResolver.cs. A file outside the loaded solution answers from the project that owns it, restoring that project first if it was never restored (Hover (and all semantics) return null for files outside the loaded solution #414).FSharpOwningProject.fsandFSharpAssets.fsdo the same for F#.FSharpSymbols.fsnow selects a declaration's name, not its doc comment (F# document symbols select the doc comment, not the name #415).Film toolset (
src/website/tools/profiler-film→src/website/tools/video)films/<name>/(film.mjs, plusnarration.jsonwhen narrated). Shared code is inkit/, and the README covers the whole toolset.film.mjs <name> [--publish|--preview].templates/.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.mjsandvtt.mjs.centre,writeSettings,fadeandease.Website
/docs/tutorial/pages in en, ja and zh, playing the narrated, chapteredvscode-tutorialfilm (3:49, captions in en, ja and zh). Each chapter link opens that step./docs/refactoring/is expanded into a lesson, with the newrefactoring-lessonfilm (3:49). The Blazor film is recut.videos.json,video-figure.jsandvideo-pages.jssupport chapter tracks.Tooling
tools/vsix/tutorial-model.mjschecks the generated tutorial model.tools/vsix/vscode-profiles.mjs, with its testtools/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 reportsmutedand 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 inWorkspaceManagerOwningProjectTests:A_file_outside_the_loaded_project_answers_hover_from_the_project_that_owns_itA_file_whose_owning_project_was_never_restored_answers_once_it_isFSharpOwningProjectTests:a file outside the loaded workspace answers hover from the project that owns itanda file whose project lost its restored packages answers hover once they are restoredFSharpSymbolsTests:documentSymbols selects each declaration's name, never its doc commentsite-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.