This commit is contained in:
2026-06-23 05:02:15 +08:00
commit e6f1776d4f
264 changed files with 54215 additions and 0 deletions
+86
View File
@@ -0,0 +1,86 @@
import type {
Event,
ExtensionContext,
TreeDataProvider,
TreeItem,
} from 'vscode'
import { EventEmitter, commands, window } from 'vscode'
import { KanbanWebviewPanel } from './panel/KanbanPanel'
import { webhookCoordinator } from './webhook/coordinator'
/**
* 侧边栏 TreeView 永远没有 item —— 它存在的唯一目的是接住活动栏图标
* 点击事件,触发"开 Kanban panel + 切回 File Explorer"的自动跳转。
*/
class EmptyTreeProvider implements TreeDataProvider<never> {
private readonly _onDidChangeTreeData = new EventEmitter<void>()
readonly onDidChangeTreeData: Event<void> = this._onDidChangeTreeData.event
getTreeItem(): TreeItem {
throw new Error('unreachable')
}
getChildren(): never[] {
return []
}
}
export function activate(context: ExtensionContext): void {
// Start the webhook server immediately so PR callbacks are received even
// when the Kanban panel is closed. Disposed automatically via subscriptions.
webhookCoordinator.init(context)
context.subscriptions.push({
dispose: () => { void webhookCoordinator.dispose() },
})
const treeView = window.createTreeView('superpowers.kanban', {
treeDataProvider: new EmptyTreeProvider(),
showCollapseAll: false,
})
let wasVisible = treeView.visible
let isAutoOpening = false
const autoOpenPanelFromActivityBar = async (): Promise<void> => {
if (isAutoOpening)
return
isAutoOpening = true
try {
KanbanWebviewPanel.createOrShow(context)
// 立刻把 sidebar 切回 File Explorer,让 superpowers 的空 sidebar 一闪而过
try {
await commands.executeCommand('workbench.view.explorer')
}
catch {
// 不存在 explorer 视图时静默忽略
}
}
finally {
isAutoOpening = false
}
}
treeView.onDidChangeVisibility(async (e) => {
const isVisible = e.visible
// 仅当从不可见变可见(即用户点击了活动栏图标)时触发
if (isVisible && !wasVisible && !isAutoOpening)
await autoOpenPanelFromActivityBar()
wasVisible = isVisible
})
context.subscriptions.push(
treeView,
commands.registerCommand('superpowers.openKanban', () => {
KanbanWebviewPanel.createOrShow(context)
}),
commands.registerCommand('superpowers.refresh', () => {
KanbanWebviewPanel.refresh()
}),
commands.registerCommand('superpowers.setGiteaToken', () => {
KanbanWebviewPanel.createOrShow(context)
KanbanWebviewPanel.requestEditAuth()
}),
)
}
export function deactivate(): void {}