Skip to content

Commit 4f8c4fc

Browse files
release prep
1 parent d111cc1 commit 4f8c4fc

21 files changed

Lines changed: 502 additions & 30 deletions

src/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ async function handleRemoveTag(item: CommandTreeItem | TaskItem | undefined, tag
219219
}
220220

221221
async function handleSemanticSearch(_queryArg: string | undefined, _workspaceRoot: string): Promise<void> {
222-
vscode.window.showInformationMessage('Semantic search is currently disabled');
222+
await vscode.window.showInformationMessage('Semantic search is currently disabled');
223223
}
224224

225225
function setupFileWatcher(context: vscode.ExtensionContext, workspaceRoot: string): void {

src/semantic/embedder.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export async function createEmbedder(_params: {
3333
readonly modelCacheDir: string;
3434
readonly onProgress?: (progress: unknown) => void;
3535
}): Promise<Result<EmbedderHandle, string>> {
36+
await Promise.resolve();
3637
return err('Embedding is disabled');
3738
}
3839

src/semantic/modelSelection.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ export async function resolveModel(
5353

5454
if (savedId !== '') {
5555
const exact = await deps.fetchById(savedId);
56-
if (exact.length > 0) { return ok(exact[0]!); }
56+
const first = exact[0];
57+
if (first !== undefined) { return ok(first); }
5758
}
5859

5960
const allModels = await deps.fetchAll();

src/semantic/summariser.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import type { Result } from '../models/TaskItem';
99
import { ok, err } from '../models/TaskItem';
1010
import { logger } from '../utils/logger';
1111
import { resolveModel, pickConcreteModel } from './modelSelection';
12-
import type { ModelSelectionDeps } from './modelSelection';
12+
import type { ModelSelectionDeps, ModelRef } from './modelSelection';
1313
export type { ModelRef, ModelSelectionDeps } from './modelSelection';
1414
export { resolveModel, pickConcreteModel, AUTO_MODEL_ID } from './modelSelection';
1515

@@ -107,15 +107,15 @@ async function promptModelPicker(
107107
function buildVSCodeDeps(): ModelSelectionDeps {
108108
const config = vscode.workspace.getConfiguration('commandtree');
109109
return {
110-
getSavedId: () => config.get<string>('aiModel', ''),
111-
fetchById: (id) => fetchModels({ vendor: 'copilot', id }),
112-
fetchAll: () => fetchModels({ vendor: 'copilot' }),
113-
promptUser: async () => {
110+
getSavedId: (): string => config.get<string>('aiModel', ''),
111+
fetchById: async (id: string): Promise<readonly ModelRef[]> => await fetchModels({ vendor: 'copilot', id }),
112+
fetchAll: async (): Promise<readonly ModelRef[]> => await fetchModels({ vendor: 'copilot' }),
113+
promptUser: async (): Promise<ModelRef | undefined> => {
114114
const all = await fetchModels({ vendor: 'copilot' });
115115
const picked = await promptModelPicker(all);
116116
return picked !== undefined ? { id: picked.id, name: picked.name } : undefined;
117117
},
118-
saveId: async (id) => { await config.update('aiModel', id, vscode.ConfigurationTarget.Global); }
118+
saveId: async (id: string): Promise<void> => { await config.update('aiModel', id, vscode.ConfigurationTarget.Global); }
119119
};
120120
}
121121

website/eleventy.config.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@ export default function(eleventyConfig) {
4444
return cleaned.replace("</head>", faviconLinks + "\n</head>");
4545
});
4646

47+
eleventyConfig.addTransform("copyright", function(content) {
48+
if (!this.page.outputPath?.endsWith(".html")) {
49+
return content;
50+
}
51+
const year = new Date().getFullYear();
52+
const original = `&copy; ${year} CommandTree`;
53+
const replacement = `&copy; ${year} <a href="https://www.nimblesite.co">Nimblesite Pty Ltd</a>`;
54+
return content.replace(original, replacement);
55+
});
56+
4757
eleventyConfig.addTransform("customScripts", function(content) {
4858
if (!this.page.outputPath?.endsWith(".html")) {
4959
return content;

website/src/_data/site.json

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,17 @@
33
"description": "One sidebar. Every command in your workspace.",
44
"url": "https://commandtree.dev",
55
"stylesheet": "/assets/css/styles.css",
6-
"author": "Christian Findlay"
6+
"author": "Christian Findlay",
7+
"keywords": "VS Code extension, command runner, task runner, script discovery, npm scripts, shell scripts, makefile, workspace automation, developer tools",
8+
"ogImage": "/assets/images/og-image.png",
9+
"ogImageWidth": "1200",
10+
"ogImageHeight": "630",
11+
"organization": {
12+
"name": "Nimblesite Pty Ltd",
13+
"logo": "/assets/images/logo.png",
14+
"sameAs": [
15+
"https://github.com/melbournedeveloper/CommandTree",
16+
"https://marketplace.visualstudio.com/items?itemName=nimblesite.commandtree"
17+
]
18+
}
719
}

website/src/assets/css/styles.css

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,95 @@ li::marker { color: var(--color-primary); }
674674
.blog-post-content { max-width: 65ch; margin: 0 auto; animation: fadeIn 0.6s ease-out; }
675675
.blog-post-footer { border-top: 1px solid var(--color-border); }
676676

677+
/* --- Blog Hero Banner --- */
678+
@keyframes logo-float {
679+
0%, 100% { transform: translate(-50%, -50%) scale(1); }
680+
50% { transform: translate(-50%, calc(-50% - 10px)) scale(1.03); }
681+
}
682+
@keyframes glow-pulse {
683+
0%, 100% { opacity: 0.4; transform: translate(-50%, -50%) scale(1); }
684+
50% { opacity: 0.7; transform: translate(-50%, -50%) scale(1.15); }
685+
}
686+
@keyframes branch-grow-1 {
687+
from { width: 0; opacity: 0; }
688+
to { width: 80px; opacity: 1; }
689+
}
690+
@keyframes branch-grow-2 {
691+
from { width: 0; opacity: 0; }
692+
to { width: 60px; opacity: 1; }
693+
}
694+
@keyframes branch-grow-3 {
695+
from { width: 0; opacity: 0; }
696+
to { width: 50px; opacity: 1; }
697+
}
698+
.blog-hero-banner {
699+
position: relative;
700+
background: var(--gradient-hero);
701+
border-radius: var(--radius-lg);
702+
padding: 4rem 2rem;
703+
margin-bottom: 2.5rem;
704+
overflow: hidden;
705+
min-height: 220px;
706+
}
707+
.blog-hero-glow {
708+
position: absolute;
709+
top: 50%;
710+
left: 50%;
711+
transform: translate(-50%, -50%);
712+
width: 200px;
713+
height: 200px;
714+
border-radius: 50%;
715+
background: radial-gradient(circle, rgba(78, 205, 181, 0.35) 0%, transparent 70%);
716+
animation: glow-pulse 3s ease-in-out infinite;
717+
pointer-events: none;
718+
}
719+
.blog-hero-logo {
720+
position: absolute;
721+
top: 50%;
722+
left: 50%;
723+
transform: translate(-50%, -50%);
724+
width: 120px;
725+
height: 120px;
726+
animation: logo-float 4s ease-in-out infinite;
727+
filter: drop-shadow(0 8px 32px rgba(0, 0, 0, 0.4));
728+
z-index: 2;
729+
}
730+
.blog-hero-branches {
731+
position: absolute;
732+
top: 50%;
733+
left: 50%;
734+
transform: translate(-50%, -50%);
735+
width: 300px;
736+
height: 200px;
737+
pointer-events: none;
738+
z-index: 1;
739+
}
740+
.branch {
741+
position: absolute;
742+
height: 3px;
743+
border-radius: 3px;
744+
background: var(--gradient-accent);
745+
opacity: 0;
746+
}
747+
.branch-1 {
748+
top: 30%;
749+
left: 65%;
750+
transform: rotate(-25deg);
751+
animation: branch-grow-1 0.8s ease-out 0.5s forwards;
752+
}
753+
.branch-2 {
754+
top: 55%;
755+
left: 68%;
756+
transform: rotate(15deg);
757+
animation: branch-grow-2 0.7s ease-out 0.8s forwards;
758+
}
759+
.branch-3 {
760+
top: 70%;
761+
left: 62%;
762+
transform: rotate(40deg);
763+
animation: branch-grow-3 0.6s ease-out 1.1s forwards;
764+
}
765+
677766
/* --- Footer --- */
678767
.site-footer {
679768
background: var(--color-surface);
101 KB
Loading
Lines changed: 55 additions & 0 deletions
Loading

website/src/blog/introducing-commandtree.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
---
22
layout: layouts/blog.njk
3-
title: Introducing CommandTree
3+
title: Introducing CommandTree - Auto-Discover Every Command in VS Code
4+
description: Meet CommandTree — the free VS Code extension that discovers every runnable command in your workspace and puts them in one beautiful tree view.
45
date: 2026-02-07
56
author: Christian Findlay
67
tags: posts
78
excerpt: Meet CommandTree - the VS Code extension that discovers every runnable command in your workspace and puts them in one beautiful tree view.
89
---
910

10-
# Introducing CommandTree
11-
1211
Every project accumulates scripts. Shell scripts in `scripts/`, npm scripts in `package.json`, Makefile targets, VS Code tasks, launch configurations, Python scripts. They scatter across your project like leaves in autumn.
1312

1413
**CommandTree gathers them all into one place.**
@@ -34,15 +33,15 @@ Click the play button. Done.
3433

3534
## AI-Powered Summaries
3635

37-
With [GitHub Copilot](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot) installed, CommandTree goes a step further: it describes each command in plain language. Hover over any command and the tooltip tells you exactly what it does. Scripts that perform dangerous operations are flagged with a security warning so you know before you run.
36+
With [GitHub Copilot](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot) installed, CommandTree goes a step further: it describes each command in plain language. Hover over any command and the tooltip tells you exactly what it does. Scripts that perform dangerous operations are flagged with a security warning so you know before you run. Learn more in the [AI Summaries documentation](/docs/ai-summaries/).
3837

3938
## Quick Launch
4039

41-
Pin your favorites. Click the star icon on any command and it appears in the Quick Launch panel at the top. Your most-used commands are always one click away.
40+
Pin your favorites. Click the star icon on any command and it appears in the [Quick Launch](/docs/configuration/#quick-launch) panel at the top. Your most-used commands are always one click away.
4241

4342
## Tags and Filters
4443

45-
Group related commands with tags. Filter the tree by text or tag. Find exactly what you need, instantly.
44+
Group related commands with tags. Filter the tree by text or tag. Find exactly what you need, instantly. See [Configuration](/docs/configuration/#filtering) for all filtering options.
4645

4746
## Get Started
4847

0 commit comments

Comments
 (0)