Usora DockA standalone, read-only VS Code extension that lists the Agent Skills discoverable on this machine through Usora Dock: Global, Workspace, and Usora Hub. It is a companion viewer, not a Hub backend and not a skill marketplace. What it doesThe Usora Dock panel is the single view of the data — the extension contributes an Activity Bar
launcher, while the command opens a dedicated panel with a
navigation rail (brand row, The panel:
ThemingColours resolve through
Avatars, chip icons, group icons and related-skill icons all paint through six High contrast themes are handled explicitly rather than approximated: accents collapse to
What it deliberately does NOT do
InstallFrom a local
|
| Command | Description |
|---|---|
Usora Dock: Open Usora Dock Panel |
Open the three-column panel. |
Usora Dock: Refresh |
Rescan every enabled source. |
Usora Dock: Open Skill File |
Open SKILL.md in the editor. |
Usora Dock: Preview Skill |
Open the native Markdown preview. |
Usora Dock: Copy Skill Path |
Copy the absolute path to the clipboard. |
Usora Dock: Open Source Folder |
Reveal the skill root in the OS file manager. |
All commands are read-only.
Settings
| Setting | Default | Description |
|---|---|---|
usoraSkillsExplorer.enabledSources.global |
true |
Scan global Agent directories. |
usoraSkillsExplorer.enabledSources.workspace |
true |
Scan the current workspace folders. |
usoraSkillsExplorer.enabledSources.usoraHub |
true |
Scan the local Usora Hub. |
usoraSkillsExplorer.globalSkillDirectories |
every known Agent root (66 entries, see Directory discovery) | Global skill roots. ~ is expanded. Each root is scanned one level deep. |
usoraSkillsExplorer.workspaceSkillDirectories |
every known Agent project root (53 entries) | Roots relative to each workspace folder. |
usoraSkillsExplorer.usoraHome |
"" |
Usora knowledge directory. Empty means auto-detect. |
usoraSkillsExplorer.followSymbolicLinks |
false |
Follow symlinks while scanning. |
usoraSkillsExplorer.maxMetadataFileSizeKb |
256 |
Size ceiling for metadata reads. |
Directory discovery
Scanning is intentionally shallow: only the configured roots and their direct children. The home
directory, node_modules, build output and .git are never walked recursively. A child directory is
only a Skill when its SKILL.md exists; ordinary folders are ignored instead of becoming broken rows.
Global Skills
The default roots are the Agent directories known to npx skills (vercel-labs/skills), plus the
layouts documented by the tools themselves. They are best-effort conventions, not a guarantee that a
given tool version reads them.
| Root | Agent |
|---|---|
~/.agents/skills |
Open Agent Skills format (Cline, Codex, Warp, …) |
~/.claude/skills |
Claude Code |
~/.codex/skills |
Codex |
~/.codebuddy/skills |
CodeBuddy |
~/.cursor/skills |
Cursor |
~/.copilot/skills |
GitHub Copilot |
~/.codeium/windsurf/skills |
Windsurf |
~/.gemini/skills |
Gemini CLI |
~/.gemini/antigravity*/skills |
Antigravity |
~/.roo/skills |
Roo Code |
~/.config/{opencode,agents,crush,goose,devin} |
OpenCode, Amp, Crush, Goose, Devin |
~/.trae/skills, ~/.trae-cn/skills |
Trae |
~/.kiro/skills |
Kiro CLI |
~/.qwen/skills, ~/.qoder*/skills |
Qwen Code, Qoder |
…plus the remaining agents from the npx skills table (~/.augment, ~/.continue, ~/.aider-desk,
~/.kilo, ~/.factory, ~/.bob, ~/.hermes, ~/.forge, ~/.junie, ~/.zencoder, and more). The
lists live in one place — src/discovery/agents.ts — and a unit test keeps the package.json
defaults in sync with it.
All entries are ordinary settings values. Remove or add entries to match your machine; missing directories are skipped silently.
Workspace Skills
The same registry's project roots, resolved against each workspace folder. Multi-root workspaces are
scanned per folder and grouped under Workspace · <folder>. Absolute entries are accepted only when
you configure them yourself.
Generic folder names (skills, data/skills, agent/skills) are deliberately not defaults:
in an unrelated repository they would match ordinary folders.
Usora Hub
Verified against Usora Foundry plugins/foundry/src/core/storage.ts and core/skills.ts:
- Skills live in the knowledge directory:
<knowledgeHome>/skills. knowledgeHomeisUSORA_HOMEwhen set, otherwise~/.usora.config.hub_pathmoves the host data (activities,sessions,runtime) and deliberately does not move skills. This extension therefore does not readconfig.jsonat all — readinghub_pathwould point at host data and miss every skill.
Resolution order: usoraSkillsExplorer.usoraHome → USORA_HOME → ~/.usora.
Codex system Skills
Codex-managed built-ins are stored under <global Codex root>/.system/<skill>/SKILL.md and are
recognized only when .system/.codex-system-skills.marker exists. They are shown under the explicit
Codex · .system source label. The marker is a support rule, not a reason to hide diagnostics; a
present but unreadable SKILL.md remains visible with its warning.
Hub entries are built from skill.json (name, description, state, revision, updated_at)
and enriched from SKILL.md. state is displayed verbatim (DRAFT, EVALUATED, REJECTED,
PUBLISHED); it is never translated into "enabled" or "installed". A missing SKILL.md is reported
as a warning and never generated.
If no Hub is found, the group says so and tells you where to set the path. Nothing is initialised.
Known limitations
USORA_HOMEis read from the Extension Host process environment, which is inherited from the VS Code launcher. A variable exported only in another shell will not be visible. UseusoraSkillsExplorer.usoraHomein that case.~expands toos.homedir(). On Windows with a redirected profile, set an explicit path.- Descriptions come from frontmatter, or fall back to the first heading and paragraph. Nested YAML, anchors and complex structures are intentionally not parsed; such files are still listed, with a warning.
- Very large
SKILL.mdfiles abovemaxMetadataFileSizeKbare listed without a parsed description. - Symbolic links are not followed by default; enabling the setting can surface duplicate paths for the same physical skill.
- File watching is global for
**/SKILL.mdand debounced by 500 ms. - Hub
statesemantics were verified against Foundry source at implementation time. A future schema change may require an update; unknown fields are ignored rather than guessed.
Requirements
- VS Code
^1.85.0 - Node.js 18+ for building
- Git only if you want the hooks; a checkout without git still builds, tests and packages normally.
Design provenance
Generated brand assets
The current panel references one generated raster mark; the rail footer itself is drawn with HTML/CSS so its text and spacing remain editable:
| Asset | Use |
|---|---|
media/usora-dock-mark.png |
Header and rail brand mark; transparent background. |
media/usora-dock-background.png |
Text-free light fluid background for the editable HTML/CSS rail brand card. |
The existing media/usora-dock-mark.png is used as the Marketplace icon and the in-panel Usora brand mark.
The Activity Bar uses the restored monochrome resources/usora-skills.svg variant so VS Code can theme it correctly at small sizes.
Built against the handoff package one directory up:
| Source | Used for |
|---|---|
reference/*.png |
The authoritative UI target. Header with mark + tagline, left rail (brand row, Skills Explorer, source counts, gradient Usora hero card), centre column (search toolbar with shortcut hint and 来源 menu, agent chip row, N 项 group headers with collapse toggles, gradient avatars, tag pills), right detail pane (avatar + name + source, tag row, summary, three-column fact card, 详情/文档/使用示例/相关技能 tabs, diagnostics and footer action pair). |
figma-import/screens/usora-dock-*.svg |
Earlier, lower-fidelity boards. Used for exact geometry (three columns 250 / 660 / 402, 720 tall panels, 36 row avatars, 42 primary action) and to confirm the light and dark boards are structurally identical, i.e. one theme-driven implementation is correct. |
spec/design-tokens.json |
Spacing, radius and type scale applied verbatim; the colour palette is mapped onto VS Code theme variables plus a scoped brand accent layer rather than hardcoded throughout. |
spec/implementation-handoff.md |
Theme rules, read-only constraint, acceptance criteria. |
src/webview/icons.ts |
Local Lucide-style utility icon geometry with a shared 24px viewBox, 2px rounded stroke and currentColor; the Usora mark remains the brand exception. |
media/usora-dock-mark.png |
Usora Dock brand mark used by the Marketplace listing and the panel header/hero card. |
resources/usora-skills.svg |
Monochrome Activity Bar variant using currentColor for VS Code theme integration. |
Two deliberate deviations:
- The mockups show a green
已安装(installed) badge on every row. That badge is not reproduced: this extension can read a directory but it cannot know what any Agent has enabled, and the plan explicitly forbids reporting discovery as installation. Usora Hub rows show their real lifecycle state (DRAFT/EVALUATED/REJECTED/PUBLISHED) on a tinted pill instead, and other rows show a warning marker only when their metadata is incomplete.相关技能is implemented, but from what is actually verifiable: sibling skills discovered in the same source, not a relationship index this extension has no way to read. - The activity bar icon uses
currentColorrather than the fixed brand gradient, because a fixed gradient disappears against a light or high-contrast activity bar. Inside the panel, where the background is ours, the gradient is used. The original asset is untouched.
Development
The staged audit and implementation checklist is kept in
IMPLEMENTATION_PLAN.md.
Bun is the package manager and the runtime for every script: it installs dependencies, runs
TypeScript directly and provides the test runner, so no node, npm, npx or tsx is needed.
bun install # install devDependencies, write bun.lock, install husky hooks
bun run typecheck # tsc --noEmit
bun run lint # oxlint
bun run test # bun test (runs test/*.test.ts, node:test-compatible)
bun run format # prettier
bun run check # typecheck + lint + test
bun run build # esbuild -> dist/extension.js
bun run watch # rebuild on change
bun run package:vsix
bun run release # check, preview, package and publish to the Marketplace
bun.lock is committed; package-lock.json is not used and no longer exists.
To inspect the panel layout without launching VS Code, render it to files and open them in a browser:
bun run preview:panel # writes out/panel-preview*.html
bun run package:preview # preview first, then package the VSIX
One-click release
The release command uses semantic-release for version calculation, CHANGELOG generation, Git tags and GitHub Releases. It builds the VSIX and attaches it to the GitHub Release, but does not upload the extension to the Visual Studio Marketplace. The pipeline runs typecheck, lint, tests, panel preview generation and VSIX packaging.
Run:
# PowerShell
bun run release # calculates the next version and creates the GitHub Release
# macOS / Linux
bun run release
Use Conventional Commits so semantic-release can calculate the next version:
fix: correct skill path diagnostics -> patch
feat: add a source filter -> minor
feat!: change the extension contract -> major
The GitHub workflow runs on main, creates the release tag and GitHub Release, and attaches the
VSIX. No Marketplace token is required. GITHUB_TOKEN is supplied by GitHub Actions; upload the
attached VSIX to the Marketplace manually when you are ready.
Use bun run release:dry-run locally to inspect the calculated release without publishing.
Those files are generated from the real renderView() with illustrative fixtures — one per detail
tab, plus a dark-theme variant — so a layout regression shows up as a diff there. The fixture injects
the vscode-light / vscode-dark body class and the --vscode-* variables the host normally
provides, because outside VS Code neither exists.
Husky + lint-staged run Prettier and oxlint on staged files before each commit, and bun run check
before each push. The hooks install themselves on bun install and require a git repository (create
one with git init if needed).
License
MIT