Skill v1.0.2
currentAutomated scan100/100~2 modified
version: "1.0.2" summary: >- Use when the user asks to control or debug the Locus frontend through TypeScript, or build or edit a Locus View (视图/面板): a Vue UI panel, inspector, table, board, or graph editor. Ignore Unity project View classes, folders, assets, and camera/runtime views. tools:
- execute_typescript
View
Instructions
All operations use the skill-loaded execute_typescript tool, which executes TypeScript in the live Locus frontend. For frontend control without creating a View, read frontend-sdk.md and use locus.ui / locus.workbench directly. For View authoring, follow this workflow.
- Resolve the target View.
- Use
locus.views.list()first when a matching View may already exist. To change an existing View, reuse itspackageRootand continue from step 3. - For a new View, prefer a single Vue file: pass
fileNameand completecomponentsource tolocus.views.create(). Put logic, template and scoped styles in that file. No metadata is required; the file name without.vuebecomes the id and display name. - Read
components.mdto choose existing controls and editors.locus.views.components()lists the native component names. Compose these components in the Vue file; View creation does not select or copy a template.
- Create the package with
locus.views.create().
- Use lowercase kebab-case file names, for example
asset-panel.vue.idcan be omitted whenfileNameis supplied. Alternatively, supplyidand Locus names the file<id>.vue. - A component View contains one root
.vuefile in its ownpackageRoot, with noview.json,main.ts, independent CSS or workspace scaffold. Optional metadata goes in a leading<view>JSON block (seefrontend-sdk.md); omit the whole block when defaults suffice.name,icon,displayPathandunitycreation options are written into that block only when supplied. - Omit
componentto initialize a minimal empty Vue file and write the implementation afterwards. Optionaldirectories, for example["src/components", "unity"], create only those directories insidepackageRoot. There is no template parameter or template catalog. - Set
temporary: truefor one-off display Views. They are written under the app temp directory, stay out ofLocus/Viewandlocus.views.list(), and the requested id gains a unique suffix — use the returned id everywhere afterwards. displayPathonly changes the user-visible View tree path.packageNamepicks the workspace folder underLocus/Viewand defaults to the Unity project name.- Set
unity: trueonly when a connected Unity editor is required. Component selection never implicitly adds a Unity dependency or a C# script.
- Edit only inside the returned
packageRoot.
- Read
detail.manifest.entryto locate the actual Vue entry for a component View; do not assumesrc/App.vue. The returned manifest is derived by Locus from the file name and optional<view>block. Do not write it back asview.jsonor add schema, version, entry or style metadata to the component. - Existing multi-file packages with
view.jsonremain readable; inspect their actual entry and dependencies before editing. All paths remain package-relative with forward slashes. - Additional modules may be created under
src/when needed. Optional Unity scripts live underunity/; declare them in the component's<view>scriptsarray or the legacyview.json. - Code shared across Views in the same workspace lives in the workspace
src/and is imported as@locus/project-view.
- Resolve API details through the stable View contract, in this order:
components.md: reusable component choices and small composition examples. Prefer native component props, slots and events over recreating controls or copying whole pages.runtime-api.mdin this skill package: the quick reference for@locus/view-runtimeservices (Unity property editing, drawers, drag/drop, graph/canvas, session, LLM, storage, fs, logs) and@locus/componentscomponents. Locate it withknowledge_query, thenreadthe returned physical path.- Exported runtime sources under this skill package's
app/view-runtime/src/: exact component props, graph/canvas data shapes, and release behavior. - Locus application sources: only present in a development checkout. Installed releases do not ship them, so never depend on them from package code or instructions.
Typical starting imports:
import { view, unity, property, onEditorUpdate } from "@locus/view-runtime";import { UnitySerializedPropertyTree, GraphView } from "@locus/components";
- Use the right runtime path for Unity data.
SerializedPropertyediting from package code:property.fromPath("asset/<assetPath>/property/<propertyPath>")— alsoselection/…,guid/<assetGuid>/…,scene/…, andprefab/…path forms — thentree.drawDefaultEditor(),tree.require(path).draw(),property.write(target, value), or batchedproperty.apply([...]).- Unknown property paths:
locus.unity.property.discover()before hardcoding any path. Agent-side spot checks and one-off fixes:locus.unity.property.read(),.write(),.apply(). - Custom property rendering:
propertyDrawer.registerValue/registerField/registerAttribute/registerPropertyPath/register, passed aspropertyDrawersintoUnitySerializedPropertyTree,UnityPropertyDraw, orUnityObjectPreview. Whole-object rendering:unityObjectDrawer.register(...), passed asobjectDrawersintoUnityObjectPreview. App-wide drawers (affecting chat fences and the Locus Inspector, not just this View) ship as plugin drawer packages instead — seeruntime-api.md"Plugin Drawer Packages". - Custom Unity logic: declare the C# file in
<view>scripts[](or legacyview.json), then call it withview.callScriptfrom package code orlocus.views.compileScript()+locus.views.callScript()from the agent. - Selection-driven panels:
onEditorUpdate(handler). Unity selection and inspectors:unity.select(...),unity.inspect(...),unity.selectAsset(...),unity.selectSceneObject(...). - Locus <-> Unity drag and drop:
useUnityReferenceDrag,useUnityAssetDropTarget,UnityReferenceChip,UnityDropZone. - LLM-assisted semantic editors:
view.sessionandview.llm.
- Keep the UI aligned with Locus / Unity Editor tool style.
- Prefer panels, split panes, inspectors, tables, trees, toolbars, and workspaces.
- Keep controls compact, neutral, and useful for long editing sessions. Use existing tokens for surfaces, borders, text, hover states, and accent color.
- Use state badges only for strong statuses such as running, error, modified, enabled, or disabled.
- Avoid marketing-style hero areas, decorative gradients, heavy shadows, oversized cards, colorful chip clusters, and continuous animation.
- Validate, debug, and report.
- Run
locus.views.reload()after edits: it validates the manifest and refreshes an open host.locus.views.open()creates and activates a permanent Workbench tab, or activates the existing tab for that View in the current window and checkout. It preserves other tabs and returns a handle bound to the selected instance. - If the View fails to load or misbehaves, locate
debug.mdwithknowledge_query, thenreadthe returned physical path. Reading a registered Skill document activates its debugging tools through the singleexecute_typescriptTypeScript tool. Checkpanel.logs()first for frontend runtime errors. - When the user-facing reply should reference the finished View, put a standalone line in this exact format:
view:<view-id>, using the id returned bylocus.views.create(),locus.views.list(), orlocus.views.reload(). The Locus frontend renders that line as a View reference block with an Open View button. - Report the View id,
packageRoot, actual source file, reload or run result, and the standaloneview:<view-id>reference line.
All View authoring and debugging calls run as TypeScript through execute_typescript. Read frontend-sdk.md for the shared native frontend SDK. Views are ordinary Workbench Vue subtrees; do not create another WebView or app-wide window globals.