Maister Lens
Explore Maister AI development workflows, tasks, artifacts and follow-ups inside VS Code.
Maister Lens works exclusively with Maister and requires a workspace containing
Maister-generated files.
Maister writes its work into .maister/tasks/<type>/<date>-<slug>/ — a state file, markdown
artifacts, an HTML dashboard. Maister Lens reads those folders and answers "what is my task
doing?" from the sidebar, opens every artifact rendered instead of as source, and hands the
next /maister:* command to an assistant or a terminal.
Maister Lens never writes files itself: it never edits a task file or state and never runs a
workflow. Editing happens in VS Code's own editor.
Maister Lens is an independent extension by Jakub Ochremiak. It is not an official
Maister product and does not imply affiliation with or endorsement by the Maister owners.
Many thanks to the creators of Maister for building
the tools and workflows that this extension helps you explore.
Getting started
Requires desktop VS Code 1.90 or newer and a local or remote filesystem workspace.
- Open Extensions in VS Code (
Ctrl+Shift+X on Windows/Linux, Cmd+Shift+X on macOS).
- Search for Maister Lens by Jakub Ochremiak and click Install.
You can also install it from the Visual Studio Marketplace.
Alternatively, install from the command line:
code --install-extension jakub-ochremiak.maister-lens
Open the folder containing .maister/tasks/<type>/<task>/orchestrator-state.yml, then
select the Maister Lens icon in the Activity Bar. Use Overview → Dashboard for
all tasks, Now for unfinished work, and Tasks to search and filter.
Maister Lens reads existing Maister task files; it does not install Maister or create
workflows by itself. To execute /maister:* commands, configure Maister in your chosen
assistant. Viewing tasks does not require an AI account. Git attribution requires Git.
Only trust workspaces whose HTML and scripts you are comfortable running.
Light, dark and high-contrast themes
The Activity Bar uses a monochrome SVG that VS Code colors for the active theme.
Built-in Tasks, Dashboard, Follow-ups, fallback Task and Markdown views use VS Code theme
colors. Native controls follow the light/dark theme; focus outlines remain visible.
The Marketplace icon intentionally keeps its black tile, white lens and turquoise
AI accent in both themes; it is separate from the Activity Bar icon.
Hosted task dashboards and HTML companions keep their authored styles and may follow
OS color preferences instead of the editor theme. Switch an HTML artifact to Markdown
for the theme-aware reader. See release checks for the visual checklist.
| View |
What it shows |
| Overview (tree) |
A single row that opens the cross-task Dashboard panel. |
| Now (tree) |
Every unfinished task (in_progress, pending, blocked), newest write first. Each task expands to its progress line, its last recorded decision and up to five recently modified artifacts. The view badge carries the unfinished count. An inline ▶ runs the task's next action. |
| Tasks (webview) |
Orientation and the full portfolio in one column: a search box over task titles, descriptions, tags, recorded decisions, risks and artifact TL;DRs; Mine / Everyone; STATUS, TYPE and ATTENTION filter tiles; and the filtered task list grouped by type, status, author or month. |
Now and Tasks render from an in-memory index of the workspace — they never read files
themselves.
Overview sits above them only on a fresh profile. VS Code remembers each user's own sidebar
arrangement, so after an update the view is added where your profile has room rather than at the
top. To restore the intended order, run Views: Reset View Locations from the Command Palette.
The panel modes
One panel (Maister · …) is reused for everything, with its own back/forward history in the
editor title bar.
| Mode |
What it shows |
| Task |
Maister's own dashboard.html for that task, hosted verbatim in a sandboxed webview. When the file is missing or of an unrecognised vintage, a built-in fallback view renders the same facts from the state file: banner, phases, decisions, risks, artifacts and the raw state. |
| Artifact |
A markdown artifact rendered as a document — breadcrumb, key-artifact chips, a pinned summary card and the body, with an Edit button at the top right. An artifact with an .html companion can be toggled between the two with Toggle Styled / Markdown View. |
| Dashboard |
A cross-task dashboard: four KPI tiles, the active filter chips, four charts and a task table. It shares one filter with Tasks, so a tile pressed in the sidebar is reflected here. |
| Follow-ups |
What completed tasks left open, across all tasks or scoped to one, in collapsible per-task groups under a passed / passed-with-issues / failed verdict breakdown. Each row is an unfixed verification issue (with severity), an unresolved risk, a deferred follow-up decision or an E2E follow-up. Issue and E2E rows open the task dashboard; Risk and Deferred rows open the task. |
| Project |
Opened from the Project sidebar item: a TL;DR (goal from project/vision.md, tech stack from INDEX.md) and every .maister/docs file grouped by folder. A doc opens rendered with a ← Project link and an Edit button, and the page refreshes live as the docs change. |
Artifacts and docs are always shown rendered through the extension's own navigation. Two
explicit hand-offs reach the underlying text in a normal editor: the Edit button at the top
right of every markdown page (task artifacts and .maister/docs standards and project docs), and
Open Source File in the editor title bar for artifacts. Both open the file in the same editor
group, and the rendered page refreshes after you save.
Task mode adds a ← Dashboard link at the top of the view. In a hosted dashboard.html that
link is injected once, when the page loads: a dashboard whose own script later replaces
document.body wholesale will remove it. That case is not supported and no re-injection is
attempted — the Open Dashboard button in the editor title bar is always present, so the
dashboard stays one click away regardless.
Settings
| Setting |
Type |
Default |
Meaning |
maisterLens.staleness.quietDays |
number (1–365) |
3 |
An unfinished task is flagged quiet after this many days without activity. |
maisterLens.attribution.enabled |
boolean |
true |
Derive task authors from git history. Turning it off hides Mine / Everyone and leaves every task's author unknown. |
maisterLens.launch.targetOrder |
array |
["claudeCode", "copilotChat", "terminal", "clipboard"] |
Launch destination preference order; the first available target is used. |
maisterLens.launch.autoSubmit |
boolean |
false |
Submit launched commands immediately where the target allows it. Claude Code always pre-fills. |
maisterLens.launch.terminalName |
string |
"" |
Preferred terminal name for the terminal launch target. |
Launching workflows
Maister Lens composes /maister:* commands and hands them to an assistant or a terminal. It
never writes a task file and never runs a workflow itself.
maisterLens.launch.targetOrder sets the preference order; the first available target is used,
and a target that fails hands the command to the next one. The clipboard always succeeds, so a
launch never fails silently. After every dispatch a status-bar message names the destination.
| Target |
What happens |
claudeCode |
Opens a new Claude Code conversation with the command pre-filled. Press Enter to run it. |
copilotChat |
Puts the command in the Copilot Chat box. /maister:* commands are Claude Code plugin skills, so Copilot can only carry the workflow out if your Copilot setup provides Maister's skills. |
terminal |
Types the command into the terminal you choose, or into a new terminal that starts Claude Code. maisterLens.launch.autoSubmit decides whether it is submitted. |
clipboard |
Copies the command. |
Known limitation — the Claude Code URI entry point. When the Claude Code extension is
installed but its editor command is missing or fails, Maister Lens falls back to a
…://anthropic.claude-code/open?prompt=… URI. That URI is handled by Claude Code's primary
editor — the prompt lands in the existing Claude Code editor rather than in a new tab like the
command path. VS Code cannot report whether a URI was handled at all, so this attempt is always
treated as a success and the launch chain ends there; it is only ever tried when the Claude Code
extension is installed.
Known limitation — Copilot Chat availability. workbench.action.chat.open is registered
even when Copilot cannot answer a /maister:* command, so availability detection is weak.
Maister Lens shows a one-time notice the first time it dispatches there.
Workspace Trust
In an untrusted workspace Maister Lens keeps working, with two capabilities withdrawn:
- No model-authored HTML is executed. Maister's own
dashboard.html and HTML companions
contain model-written scripts, so Task mode always uses the built-in fallback view and
artifacts render in the markdown variant only.
- No launching. Every launch command is hidden, and the commands themselves refuse if
invoked another way.
Indexing, all sidebar views, Dashboard mode, Follow-ups mode and markdown reading are unaffected.
Maister Lens declares "extensionKind": ["workspace"], so under Remote-SSH, WSL or Dev
Containers it runs where the files live. Virtual workspaces are not supported: attribution
shells out to git, and indexing needs a real filesystem watcher.
Runtime dependencies
Exactly two, both load-bearing:
yaml — Maister's state files are YAML, including flow mappings and multi-line scalars.
Hand-rolling that parser was the alternative.
markdown-it — CommonMark + GFM tables for the artifact reader. It is configured
html: false, which escapes any raw HTML in the markdown; that is the sanitization strategy,
so no HTML sanitizer dependency is needed.
Development
Requires Node.js 22.18 or newer and npm. Run from this repository:
npm ci
npm run build # esbuild bundle into dist/
npm run watch
npm run lint
| Script |
What it runs |
npm test |
Unit tests (mocha, no VS Code host) over the parsers, query engine, link rewriting, shell quoting and launch target order. |
npm run test:integration |
Integration tests in a real extension host (@vscode/test-electron, pinned stable build): activation, indexing, watcher, tree contents, panel messages, Workspace Trust gating. |
npm run test:min |
The same integration suite against the declared engine floor, VS Code 1.90.0. |
npm run test:dom |
Structural DOM tests (Playwright over each webview bundle's generated HTML). The first run needs npx playwright install chromium. |
npm run bench |
The non-gating performance benchmark over 300 generated task folders. |
Criteria that no harness can reach — hosted-dashboard rendering, the Claude Code pre-fill against
a real installation, the four themes, a screen-reader pass and mockup comparison — remain manual release checks; see the release checklist.
Do not treat automated test results as manual sign-off.
Install a local build
To test a development build in VS Code:
npm run package
code --install-extension ./maister-lens-0.3.0.vsix
Alternatively, run Extensions: Install from VSIX… in VS Code and select the package.
Run Developer: Reload Window after updating an existing installation.
npm run package builds the extension automatically before creating the VSIX.
Benchmark
Measured on Darwin arm64 over 300 generated task folders. Reported, not a gate:
| Measurement |
Result |
Target |
| Cold index |
229.3 ms |
< 5 s |
| Warm start from the cached snapshot |
14.1 ms |
< 300 ms |
| Decision-text query |
1.3 ms |
< 100 ms |
Known limitations
- Standalone
.maister/tasks/mockups/* folders have no state file and are not listed.
quick-dev, quick-plan and quick-bugfix leave no task directory, so they are invisible.
- Maister's hosted dashboard and HTML companions follow the OS light/dark setting, not the
VS Code theme. Only extension-built surfaces use VS Code's theme variables.
- No full-text search over artifact bodies — search covers task titles, descriptions, tags,
recorded decisions, risks and the TL;DR of each summarised artifact.
- No syntax highlighting and no Mermaid rendering; both render as plain code blocks.
- Remote images and fonts are not loaded; an image that cannot be shown is replaced by its alt
text.
- Attribution credits whoever first committed a task's state file.
- A skipped phase and an unrecorded completion are indistinguishable — both read
"not recorded".
- The workflow registry is pinned to Maister 2.2.3. A newer phase id renders by its raw id with
a warning rather than a friendly name.
- The Claude Code launch target relies on an undocumented command,
claude-vscode.editor.open.
It ignores the prompt when that Claude Code session is already open, which is why the target
is attempted only when the extension is installed.
- Copilot Chat can carry out Maister commands only if your Copilot setup provides Maister's
skills.
npm run test:min runs its untrusted-workspace pass on the pinned VS Code build rather than
on 1.90.0 — the untrusted host launcher reads the pinned version. The engine-floor claim is
unaffected (the untrusted assertions are not version-sensitive), but the gap is real.
Packaging and support
License
MIT. See LICENSE.