Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions extension/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,20 @@

All notable changes to the **AI Stack Kit** VS Code extension are documented here.

## [1.1.6] - 2026-05-18

### Fixed

- **Activity Bar view order** default is now Modules → Catalog → Outputs.
- **Globe (skill browser) button** opens the hosted [skill browser](https://deb-adarsh.github.io/ai-stack-kit/) in your browser instead of re-focusing the sidebar.
- **Show Catalog** command reveals the AI Stack Kit sidebar and Catalog panel reliably.

## [1.1.5] - 2026-05-18

### Fixed

- **Activity Bar icon** uses separate light/dark SVGs (single-path, no `opacity`/`currentColor`) so VS Code renders stacked bars instead of a gray placeholder square.

## [1.1.4] - 2026-05-18

### Fixed
Expand Down
6 changes: 6 additions & 0 deletions extension/media/activity-bar-icon-dark.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions extension/media/activity-bar-icon-light.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 0 additions & 5 deletions extension/media/activity-bar-icon.svg

This file was deleted.

2 changes: 1 addition & 1 deletion extension/media/catalog.json

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions extension/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

32 changes: 22 additions & 10 deletions extension/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "ai-stack-kit",
"displayName": "AI Stack Kit",
"description": "Manage AI skills, subagents, and hooks from spec.yaml — search catalogs, sync to Cursor, Copilot, and Claude.",
"version": "1.1.4",
"version": "1.1.6",
"publisher": "deb-adarsh",
"license": "Apache-2.0",
"repository": {
Expand All @@ -24,7 +24,14 @@
"categories": ["Other", "Machine Learning"],
"keywords": ["ai", "copilot", "cursor", "claude", "skills", "agents"],
"icon": "media/icon.png",
"activationEvents": ["onView:aistack.modules", "workspaceContains:spec.yaml"],
"activationEvents": [
"onView:aistack.modules",
"onView:aistack.catalog",
"onView:aistack.outputs",
"onCommand:aistack.openCatalog",
"onCommand:aistack.openSkillBrowser",
"workspaceContains:spec.yaml"
],
"main": "./dist/extension.js",
"contributes": {
"viewsContainers": {
Expand All @@ -33,8 +40,8 @@
"id": "aistack",
"title": "AI Stack Kit",
"icon": {
"light": "media/activity-bar-icon.svg",
"dark": "media/activity-bar-icon.svg"
"light": "media/activity-bar-icon-light.svg",
"dark": "media/activity-bar-icon-dark.svg"
Comment on lines 42 to +44
}
}
]
Expand All @@ -45,14 +52,14 @@
"id": "aistack.modules",
"name": "Modules"
},
{
"id": "aistack.outputs",
"name": "Outputs"
},
{
"type": "webview",
"id": "aistack.catalog",
"name": "Catalog"
},
{
"id": "aistack.outputs",
"name": "Outputs"
}
]
},
Expand Down Expand Up @@ -89,7 +96,12 @@
},
{
"command": "aistack.openCatalog",
"title": "AI Stack Kit: Open Skill Browser",
"title": "AI Stack Kit: Show Catalog Panel",
"icon": "$(list-tree)"
},
{
"command": "aistack.openSkillBrowser",
"title": "AI Stack Kit: Open Skill Browser (Web)",
"icon": "$(globe)"
},
{
Expand Down Expand Up @@ -135,7 +147,7 @@
"group": "navigation@2"
},
{
"command": "aistack.openCatalog",
"command": "aistack.openSkillBrowser",
"when": "view == aistack.catalog",
"group": "navigation@1"
}
Expand Down
5 changes: 4 additions & 1 deletion extension/src/constants.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
export const EXTENSION_ID = 'deb-adarsh.ai-stack-kit';
export const VIEW_CONTAINER = 'aistack';
export const VIEW_MODULES = 'aistack.modules';
export const VIEW_OUTPUTS = 'aistack.outputs';
export const VIEW_CATALOG = 'aistack.catalog';
export const VIEW_OUTPUTS = 'aistack.outputs';
/** Hosted skill browser (GitHub Pages). */
export const SKILL_BROWSER_URL = 'https://deb-adarsh.github.io/ai-stack-kit/';
27 changes: 23 additions & 4 deletions extension/src/extension.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
import * as vscode from 'vscode';
import * as path from 'node:path';
import { VIEW_CATALOG, VIEW_MODULES, VIEW_OUTPUTS } from './constants.js';
import {
SKILL_BROWSER_URL,
VIEW_CATALOG,
VIEW_CONTAINER,
VIEW_MODULES,
VIEW_OUTPUTS,
} from './constants.js';
import { ModulesTreeProvider, ModuleTreeItem } from './views/modulesTreeProvider.js';
import { OutputsTreeProvider } from './views/outputsTreeProvider.js';
import { CatalogWebviewProvider } from './views/catalogWebviewProvider.js';
Expand Down Expand Up @@ -80,9 +86,8 @@ export function activate(context: vscode.ExtensionContext): void {
register('aistack.search', () => runSearch());
register('aistack.add', () => runAdd());
register('aistack.switchClient', () => runSwitchClient());
register('aistack.openCatalog', async () => {
await vscode.commands.executeCommand(`${VIEW_CATALOG}.focus`);
});
register('aistack.openCatalog', () => focusCatalogPanel());
register('aistack.openSkillBrowser', () => openSkillBrowserWeb());
register('aistack.refreshCatalog', () => runRefreshCatalogList());
register('aistack.openSpec', () => openSpec());
register('aistack.modules.refresh', () => refreshAll());
Expand Down Expand Up @@ -142,6 +147,20 @@ async function updateStatusBar(): Promise<void> {
}
}

async function focusCatalogPanel(): Promise<void> {
try {
await vscode.commands.executeCommand(`workbench.view.extension.${VIEW_CONTAINER}`);
await vscode.commands.executeCommand(`${VIEW_CATALOG}.focus`);
} catch (e) {
log('error', e instanceof Error ? e.message : String(e));
void vscode.window.showErrorMessage('Could not open the Catalog panel.');
}
}

function openSkillBrowserWeb(): void {
void vscode.env.openExternal(vscode.Uri.parse(SKILL_BROWSER_URL));
}

function asModuleTreeItem(item: unknown): ModuleTreeItem | undefined {
return item instanceof ModuleTreeItem ? item : undefined;
}
Expand Down
5 changes: 5 additions & 0 deletions extension/src/views/catalogWebviewProvider.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as vscode from 'vscode';
import * as fs from 'node:fs';
import * as path from 'node:path';
import { SKILL_BROWSER_URL } from '../constants.js';
import { requireWorkspace } from '../services/workspaceService.js';
import { applyGithubTokenFromSettings } from '../services/configService.js';
import { prepareWebviewHtml } from '../utils/webview.js';
Expand Down Expand Up @@ -30,6 +31,10 @@ export class CatalogWebviewProvider implements vscode.WebviewViewProvider {
}

webviewView.webview.onDidReceiveMessage(async (msg: { type: string; id?: string; text?: string }) => {
if (msg.type === 'openSkillBrowser') {
await vscode.env.openExternal(vscode.Uri.parse(SKILL_BROWSER_URL));
return;
}
if (msg.type === 'copy' && msg.text) {
await vscode.env.clipboard.writeText(msg.text);
void webviewView.webview.postMessage({ type: 'toast', text: 'Copied!' });
Expand Down
26 changes: 25 additions & 1 deletion extension/webview-ui/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,22 @@ app.innerHTML = `
border-color: var(--vscode-focusBorder, #007fd4);
}
select { min-width: 7.5rem; }
.header-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
margin-bottom: 4px;
}
.header-row a {
font-size: 0.85em;
color: var(--vscode-textLink-foreground);
text-decoration: none;
white-space: nowrap;
}
.header-row a:hover {
text-decoration: underline;
}
.meta {
display: flex;
justify-content: space-between;
Expand Down Expand Up @@ -128,7 +144,10 @@ app.innerHTML = `
box-shadow: 0 2px 8px rgba(0,0,0,0.25);
}
</style>
<h2>Catalog</h2>
<div class="header-row">
<h2>Catalog</h2>
<a href="#" id="open-web">Full skill browser ↗</a>
</div>
<div class="toolbar">
<div class="search-row">
<input type="search" id="q" placeholder="Search by name, publisher, description…" autocomplete="off" spellcheck="false" />
Expand Down Expand Up @@ -267,6 +286,11 @@ document.getElementById('q')!.addEventListener('input', () => {
});
document.getElementById('type')!.addEventListener('change', render);

document.getElementById('open-web')!.addEventListener('click', (e) => {
e.preventDefault();
vscode.postMessage({ type: 'openSkillBrowser' });
});

window.addEventListener('message', (e) => {
if (e.data?.type === 'toast') {
const t = document.getElementById('toast')!;
Expand Down
Loading