بنقرة واحدة
fs-skia-skiaviewer
Work on viewer host contracts and generated product viewer usage.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Work on viewer host contracts and generated product viewer usage.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
| name | fs-skia-skiaviewer |
| description | Work on viewer host contracts and generated product viewer usage. |
Owns src/SkiaViewer/, viewer tests, template/fragments/skiaviewer/, and generated product viewer startup guidance.
The supported API lives in src/SkiaViewer/SkiaViewer.fsi. Surface changes require readiness/surface-baselines/FS.Skia.UI.SkiaViewer.txt.
Run ./fake.sh build -t CapabilityCheck, ./fake.sh build -t DependencyReport, and ./fake.sh build -t PackLocal.
Run dotnet test tests/SkiaViewer.Tests/SkiaViewer.Tests.fsproj and ./fake.sh build -t GeneratedProductCheck.
Capture real viewer command or package evidence under the active feature
readiness package-surface reports. Stable public surface baselines live under
readiness/surface-baselines/. Disclose synthetic native evidence if a
platform window system is unavailable.
Keep native window and render effects at the interpreter edge. Scene descriptions stay in Scene; Elmish adapter behavior stays in Elmish.
Products that select SkiaViewer receive viewer package references, this skill, and product commands that avoid framework gallery checks.
Open the package namespace and drive a bounded, headless-friendly run:
open System
open FS.Skia.UI.Scene
open FS.Skia.UI.SkiaViewer
let options = { Title = "demo"; InitialSize = { Width = 320; Height = 240 } }
let scene = Rectangle((0.0, 0.0, 320.0, 240.0), Colors.rgb 16uy 16uy 24uy)
match Viewer.runUntilFirstFrame options scene with
| Ok evidence -> printfn "frames=%d renderer=%s" evidence.FramesRendered evidence.RendererMode
| Error failure -> printfn "blocked: %A" failure.BlockedStage
Result.Ok/Result.Error shadowed by ViewerDiagnosticLevel. open FS.Skia.UI.SkiaViewer brings ViewerDiagnosticLevel.Error (and its peers
Warning/Info/Debug/Trace) into scope, so a bare Ok/Error in a
match or constructor can bind to the union case instead of the Result case —
e.g. Error msg resolves ambiguously and a bare | Error -> … arm silently
matches the diagnostic level, not a failed Result. Remedy: qualify as
Result.Ok / Result.Error when you mean the result type. This is the same
co-opened-DU collision documented for Unknown in the
[[fs-skia-keyboard-input]] "Common pitfalls" (where ViewerKey.Unknown and
ViewerRunBlockedStage.Unknown collide) — qualify the case when two opened
modules export the same name.When a problem outlasts reasonable in-repo attempts, extensive external research is
mandatory — consult official online docs first (the F#/.NET docs and the driven
library's own documentation/API reference), then community sources (forums, Reddit, Q&A
sites, issue trackers and changelogs). Record the findings and resolving links in the
feature's specs/<feature>/feedback/ folder and, for durable lessons, in this skill's
Sources line. Offline, the mandate degrades to recording "research blocked — "
rather than hard-failing the phase.
Consumer-facing guide to hosting an interactive FS.Skia.UI app — the keyboard/pointer input surface, the preview-vs-tree render distinction, and the windowed-fullscreen blur caveat.
Build Skia-rendered FS.Skia.UI Controls, rich text, chart controls, graph controls, DataGrid, custom wrappers, and generated product examples.
Generated product guidance for Skia-rendered FS.Skia.UI Controls, rich text, chart controls, graph controls, DataGrid, and custom wrappers.
Wire a generated FS.Skia.UI product to the desktop viewer host.
Understand and work with the internal keyed VDOM diff over the lowered Control<'msg> IR (feature 067) — its key-first-then-positional matching, the NodePatch/ChildOp operation set, the totality/determinism/identity-at-rest/round-trip invariants, and the module's disposition (internal, property-tested, wired onto the live render path via RetainedRender in feature 091 and current through feature 103 — layout/bounds cache, injected-delta animation clock, visual-state cross-fade). Use when reading the diff invariants, extending the property tests, or working on the wired retained render path.
Maintainer-facing guide to the FS.Skia.UI.Controls.Elmish interactive-host seam — how runInteractiveApp drives the retained render structure each frame (RetainedRender.step over the keyed diff), advances per-identity animation clocks from an injected Tick delta, stamps runtime visual state pre-reconcile, routes keys focus-first through routeFocusedKey, and resolves pointer hits to a stable identity via retainedHitTest. Use when reading or extending the live controls host loop, the per-frame retained-state/clock/visual-state wiring, or the key/pointer routing seam.