一键导入
tpl-backend-vscode-extension
Template do pack (backend/13-vscode-extension.md). Orienta o agente em APIs, servicos e arquitetura backend alinhado a esse contexto.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Template do pack (backend/13-vscode-extension.md). Orienta o agente em APIs, servicos e arquitetura backend alinhado a esse contexto.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | tpl-backend-vscode-extension |
| description | Template do pack (backend/13-vscode-extension.md). Orienta o agente em APIs, servicos e arquitetura backend alinhado a esse contexto. |
| metadata | {"version":"1.0.0","source_template":"backend/13-vscode-extension.md","generated_by":"install_pack_templates_as_claude_skills"} |
Skill gerado a partir do pack templates-claude-code. Arquivo de origem: backend/13-vscode-extension.md. Use como baseline e adapte ao projeto antes de mudancas grandes.
src/
├── extension.ts # activate() / deactivate() - entry point
├── commands/
│ ├── index.ts # All command registrations
│ ├── openPanel.ts
│ └── refreshTree.ts
├── providers/
│ ├── MyTreeProvider.ts # TreeDataProvider implementation
│ └── MyWebviewProvider.ts # WebviewViewProvider implementation
├── views/
│ └── webview/
│ ├── index.html # Webview HTML template
│ └── main.ts # Webview-side script (compiled separately)
├── services/
│ └── config.ts # WorkspaceConfiguration helpers
└── utils/
└── logger.ts # OutputChannel wrapper
test/
├── suite/
│ ├── index.ts # Mocha runner
│ └── tree-provider.test.ts
└── runTests.ts # Test entry
.vscode/
└── launch.json # "Run Extension" + "Extension Tests" configs
package.json # contributes: commands, views, menus
tsconfig.json
esbuild.js # Build script
activate() registers disposables — every vscode.commands.registerCommand, event listener, and provider must be pushed to context.subscriptions."*" activationEvent in package.json; use onCommand, onView, onLanguage, etc.Content-Security-Policy with a unique nonce for <script> tags.ExtensionMessage and WebviewMessage discriminated unions; never send untyped objects.vscode.window.withProgress for long operations.vscode.workspace.workspaceFolders before accessing files; handle multi-root.vscode.* as external in esbuild; dependencies must be bundled.// src/extension.ts
import * as vscode from 'vscode'
import { registerCommands } from './commands/index.js'
import { MyTreeProvider } from './providers/MyTreeProvider.js'
import { Logger } from './utils/logger.js'
export function activate(context: vscode.ExtensionContext): void {
const logger = new Logger('MyExtension')
logger.info('Extension activated')
// Register tree view
const treeProvider = new MyTreeProvider(context)
const treeView = vscode.window.createTreeView('myExtension.treeView', {
treeDataProvider: treeProvider,
showCollapseAll: true,
})
// All registrations pushed to subscriptions
context.subscriptions.push(
treeView,
...registerCommands(context, treeProvider, logger),
)
}
export function deactivate(): void {
// Cleanup handled by context.subscriptions dispose chain
}
// src/commands/index.ts
import * as vscode from 'vscode'
import type { MyTreeProvider } from '../providers/MyTreeProvider.js'
import type { Logger } from '../utils/logger.js'
export function registerCommands(
context: vscode.ExtensionContext,
tree: MyTreeProvider,
logger: Logger,
): vscode.Disposable[] {
return [
vscode.commands.registerCommand('myExtension.refresh', () => {
tree.refresh()
logger.info('Tree refreshed')
}),
vscode.commands.registerCommand('myExtension.openPanel', (item?: MyTreeItem) => {
// Opens webview panel
openWebviewPanel(context, item)
}),
]
}
// src/providers/MyTreeProvider.ts
import * as vscode from 'vscode'
export class MyTreeItem extends vscode.TreeItem {
constructor(
public readonly label: string,
public readonly type: 'group' | 'item',
public readonly data?: unknown,
) {
super(
label,
type === 'group'
? vscode.TreeItemCollapsibleState.Collapsed
: vscode.TreeItemCollapsibleState.None,
)
this.tooltip = this.label
this.contextValue = type
if (type === 'item') {
this.command = {
command: 'myExtension.openPanel',
title: 'Open',
arguments: [this],
}
}
}
}
export class MyTreeProvider implements vscode.TreeDataProvider<MyTreeItem> {
private _onDidChangeTreeData = new vscode.EventEmitter<MyTreeItem | undefined>()
readonly onDidChangeTreeData = this._onDidChangeTreeData.event
constructor(private readonly context: vscode.ExtensionContext) {}
refresh(item?: MyTreeItem): void {
this._onDidChangeTreeData.fire(item)
}
getTreeItem(element: MyTreeItem): MyTreeItem { return element }
async getChildren(element?: MyTreeItem): Promise<MyTreeItem[]> {
const folders = vscode.workspace.workspaceFolders
if (!folders) return []
if (!element) {
return folders.map(f => new MyTreeItem(f.name, 'group'))
}
// Return items under the group
return this.loadItems(element.label as string)
}
private async loadItems(folderName: string): Promise<MyTreeItem[]> {
// Load data for this folder
return [new MyTreeItem(`${folderName}/item-1`, 'item')]
}
}
// src/commands/openPanel.ts
import * as vscode from 'vscode'
import * as crypto from 'node:crypto'
import * as path from 'node:path'
import * as fs from 'node:fs'
export function openWebviewPanel(
context: vscode.ExtensionContext,
item?: unknown,
): void {
const panel = vscode.window.createWebviewPanel(
'myExtension.panel',
'My Panel',
vscode.ViewColumn.Beside,
{
enableScripts: true,
localResourceRoots: [vscode.Uri.joinPath(context.extensionUri, 'dist', 'webview')],
retainContextWhenHidden: true,
},
)
const nonce = crypto.randomBytes(16).toString('base64')
const scriptUri = panel.webview.asWebviewUri(
vscode.Uri.joinPath(context.extensionUri, 'dist', 'webview', 'main.js')
)
panel.webview.html = getHtml(nonce, scriptUri, panel.webview)
// Typed message passing
panel.webview.onDidReceiveMessage((msg: WebviewMessage) => {
if (msg.type === 'READY') {
panel.webview.postMessage({ type: 'INIT', data: item } satisfies ExtensionMessage)
}
}, undefined, context.subscriptions)
}
type WebviewMessage = { type: 'READY' } | { type: 'UPDATE'; value: string }
type ExtensionMessage = { type: 'INIT'; data: unknown } | { type: 'ERROR'; message: string }
function getHtml(nonce: string, scriptUri: vscode.Uri, webview: vscode.Webview): string {
const csp = `default-src 'none'; script-src 'nonce-${nonce}'; style-src ${webview.cspSource} 'unsafe-inline';`
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Security-Policy" content="${csp}">
<title>My Panel</title>
</head>
<body>
<div id="root"></div>
<script nonce="${nonce}" src="${scriptUri}"></script>
</body>
</html>`
}
| Command ID | Trigger | Handler | Action |
|---|---|---|---|
myExtension.refresh | Context menu / button | registerCommands | Refresh tree view |
myExtension.openPanel | Tree item click | openWebviewPanel | Open WebviewPanel |
myExtension.configSet | Command palette | configCommand | Update workspace config |
myExtension.showOutput | Status bar click | logger.show() | Show output channel |
myExtension.runTask | Command palette | taskRunner | vscode.tasks.executeTask |
onDidSaveTextDocument | File save event | auto-handler | Re-analyze on save |
onDidChangeWorkspaceFolders | Workspace change | treeProvider.refresh() | Refresh tree |
onDidChangeConfiguration | Settings change | configWatcher | Apply new config |
myExtension.openSettings | Command palette | — | workbench.action.openSettings |
tsc --noEmit — zero errorsvsce package — VSIX builds without warningspackage.json contributesactivationEvents: ["*"]registerCommand disposable in context.subscriptionsnpm test via @vscode/test-electron passesvsce ls)console.log in activated code — use OutputChannelactivationEvents: ["*"] — lazy activation onlysetTimeout/setInterval without cleanup on deactivateenableScripts: true without CSP + noncevscode.workspace.rootPath (deprecated) — use workspaceFolderscontext.globalState — use context.secrets APIasync/awaitcontext.subscriptionsGenerate custom favicons from logos, text, or brand colours. Produces favicon.svg, favicon.ico, apple-touch-icon.png, icon-192/512.png, and web manifest. Use whenever the user wants a favicon, mentions replacing a CMS default favicon, converting a logo into a favicon, creating branded initials icons, or troubleshooting favicon not displaying / iOS black square / missing manifest.
"Get a second opinion from leading AI models on code, architecture, strategy, prompting, or anything. Queries models via OpenRouter, Gemini, or OpenAI APIs. Supports single opinion, multi-model consensus, and devil's advocate patterns. Use whenever the user says 'brains trust', 'second opinion', 'ask gemini', 'ask gpt', 'peer review', 'consult another model', 'challenge this', or 'devil's advocate'."
Run an independent code review using the OpenAI Codex CLI in headless mode. Gets a second opinion from a different model family (GPT-5/o3) on recent changes, a PR, a commit, or the whole app — covering bugs, regressions, security, data consistency, UX/state bugs, performance risks, and testing gaps. Saves a severity-prioritised report to .jez/reviews/. Triggers: 'codex review', 'review with codex', 'second opinion on this code', 'independent code review', 'what does codex think', 'get codex to review'.
Deep research and discovery before building something new. Explores local projects for reusable code, researches competitors, reads forums and reviews, analyses plugin ecosystems, investigates technical options, and produces a comprehensive research brief. Three depths: focused (30 min), wide (1-2 hours), deep (3-6 hours). Triggers: 'research this', 'deep research', 'discovery', 'explore the space', 'what should I build', 'competitive analysis', 'before I start building', 'research before coding'.
Plan and execute entire application builds. Generates phased delivery roadmaps, then executes them autonomously — phase by phase, committing at milestones, deploying, testing, and continuing until done or stuck. Modes: plan (generate roadmap), start (begin executing), resume (continue from where you left off), status (show progress). Triggers: 'roadmap', 'plan the build', 'start building', 'resume the build', 'keep going', 'build the whole thing', 'execute the roadmap', 'what phase are we on'.
Walk through a live web app AS a real user to find usability + behavioural bugs that static reviews miss. REQUIRES proof of interaction (typing, clicking, sending, observing) before any verdict — a sweep that didn't interact terminates with verdict 'Incomplete'. Walks threads, exercises every element, runs the multi-pane stress matrix, visual polish sweep, component perfection checklist, automated a11y (axe-core), pragmatic performance budget (LCP/CLS/INP), scenario battery (11 scenarios), and stress recipes including the real-flavour data battery. Hard gates: console errors/warnings = 0, network 5xx = 0, layout collapse = 0, axe Critical/Serious = 0, perf budget green. Audit-the-audit meta-check rejects rushed reports. Each finding has reproduction steps, evidence path, and suspected code location. Trigger with 'ux audit', 'walkthrough', 'qa sweep', 'audit the app', 'dogfood this', 'check all pages', 'find what's broken', 'stress the UI'.