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 CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
# Changelog

## 0.11.0

### Removed

- **AI Summary feature temporarily removed** — the Copilot-powered AI summary generation has been fully removed pending a safer rollout (see [issue #20](https://github.com/Nimblesite/CommandTree/issues/20)). Reason: the previous activation path could silently fan out one Copilot request per discovered command on install and on every script edit, picking the first available model (often a premium one), which could consume a large share of a user's Copilot quota without warning. The feature will return once request volume is bounded, premium models are gated behind explicit consent, and the user is asked before any Copilot quota is spent.
- `commandtree.enableAiSummaries` and `commandtree.aiModel` settings (no longer wired)
- `commandtree.generateSummaries` and `commandtree.selectModel` commands (no longer wired)
- All Copilot integration code (`semantic/summariser.ts`, `semantic/modelSelection.ts`) and the AI portions of `semantic/summaryPipeline.ts` and `summaryOrchestration.ts`

### Notes

- Tooltips still render any summaries already stored in the local SQLite DB; only generation is removed
- Command discovery, registration, tagging, Quick Launch, and execution are unchanged

## 0.9.0

### Changed
Expand Down
2 changes: 1 addition & 1 deletion Claude.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

## Project Overview

CommandTree is a VS Code extension that discovers and organizes runnable tasks (npm scripts, Makefiles, shell scripts, launch configs, etc.) into a unified tree view sidebar. It supports tagging, quick launch, AI-generated summaries, and 20+ task discovery providers.
CommandTree is a VS Code extension that discovers and organizes runnable tasks (npm scripts, Makefiles, shell scripts, launch configs, etc.) into a unified tree view sidebar. It supports tagging, quick launch, and 20+ task discovery providers. (Copilot-powered AI summaries were temporarily removed in 0.11.0 — see issue #20.)

**Primary language(s):** TypeScript
**Build command:** `make ci`
Expand Down
10 changes: 3 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# CommandTree

**One sidebar. Every command. AI-powered.**
**One sidebar. Every command.**

**[commandtree.dev](https://commandtree.dev/)**

Expand All @@ -10,15 +10,12 @@

CommandTree scans your project and surfaces all runnable commands across 22 tool types in a single tree view. Filter by tag, and run in terminal or debugger.

## AI Summaries (powered by GitHub Copilot)
## AI Summaries — temporarily removed

When [GitHub Copilot](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot) is installed, CommandTree automatically generates plain-language summaries of every discovered command. Hover over any command to see what it does, without reading the script. Commands that perform dangerous operations (like `rm -rf` or force-push) are flagged with a security warning.

Summaries are stored locally and only regenerate when the underlying script changes.
The Copilot-powered AI summary feature has been **temporarily removed** in 0.11.0 while a safer rollout is designed (see [issue #20](https://github.com/Nimblesite/CommandTree/issues/20)). It will return once the extension can guarantee request volume is bounded, premium models are not used silently, and the user is asked before any Copilot quota is spent.

## Features

- **AI Summaries** - GitHub Copilot describes each command in plain language, with security warnings for dangerous operations
- **Auto-discovery** - 22 command types including shell scripts, npm, Make, Python, PowerShell, Gradle, Cargo, Maven, Docker Compose, .NET, C# Script, F# Script, Mise, and more
- **Quick Launch** - Pin frequently-used commands to a dedicated panel at the top
- **Tagging** - Right-click any command to add or remove tags
Expand Down Expand Up @@ -80,7 +77,6 @@ Open a workspace and the CommandTree panel appears in the sidebar. All discovere

| Setting | Description | Default |
|---------|-------------|---------|
| `commandtree.enableAiSummaries` | Copilot-powered plain-language summaries and security warnings | `true` |
| `commandtree.excludePatterns` | Glob patterns to exclude from discovery | `**/node_modules/**`, `**/.git/**`, etc. |
| `commandtree.sortOrder` | Sort commands by `folder`, `name`, or `type` | `folder` |

Expand Down
8 changes: 4 additions & 4 deletions coverage-thresholds.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"_agent_pmo": "f481f8d",
"_doc": "Single source of truth for code coverage thresholds. See REPO-STANDARDS-SPEC [COVERAGE-THRESHOLDS-JSON]. Enforced by tools/check-coverage.mjs via `make test`. Ratchet UP only. Extended format (per-metric) overrides the spec's single default_threshold to enforce both line AND branch coverage per [COVERAGE-THRESHOLDS] (VS Code extension: 80% line / 70% branch — measured values here are well above).",
"lines": 92.11,
"functions": 93.87,
"branches": 87.33,
"statements": 92.11
"lines": 91.94,
"functions": 93.65,
"branches": 87.04,
"statements": 91.94
}
20 changes: 0 additions & 20 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -130,16 +130,6 @@
"command": "commandtree.makeExecutable",
"title": "Make Executable",
"icon": "$(unlock)"
},
{
"command": "commandtree.generateSummaries",
"title": "Generate AI Summaries",
"icon": "$(sparkle)"
},
{
"command": "commandtree.selectModel",
"title": "CommandTree: Select AI Model",
"icon": "$(hubot)"
}
],
"menus": {
Expand Down Expand Up @@ -368,16 +358,6 @@
"Sort by command type, then alphabetically by name"
],
"description": "How to sort commands within categories"
},
"commandtree.enableAiSummaries": {
"type": "boolean",
"default": true,
"description": "Use GitHub Copilot to generate plain-language summaries of scripts, enabling semantic search"
},
"commandtree.aiModel": {
"type": "string",
"default": "",
"description": "Copilot model ID to use for summaries (e.g. 'gpt-4o-mini'). Leave empty to be prompted on first use."
}
}
},
Expand Down
38 changes: 5 additions & 33 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,11 @@ import { TaskRunner } from "./runners/TaskRunner";
import { QuickTasksProvider } from "./QuickTasksProvider";
import { logger } from "./utils/logger";
import { initDb, disposeDb } from "./db/lifecycle";
import { forceSelectModel } from "./semantic/summariser";
import { syncTagsFromConfig } from "./tags/tagSync";
import { setupFileWatchers } from "./watchers";
import { PrivateTaskDecorationProvider } from "./tree/PrivateTaskDecorationProvider";
import { appState } from "./state";
import {
initAiSummaries,
registerDiscoveredCommands,
runSummarisation,
syncAndSummarise,
} from "./summaryOrchestration";
import { registerDiscoveredCommands, syncAndSummarise } from "./summaryOrchestration";
import type { SummaryDeps } from "./summaryOrchestration";

const MAKE_EXECUTABLE_COMMAND = "commandtree.makeExecutable";
Expand Down Expand Up @@ -87,15 +81,11 @@ export async function activate(context: vscode.ExtensionContext): Promise<Extens
}

function runBackgroundStartup(workspaceRoot: string): void {
initialDiscovery(workspaceRoot)
.then(() => {
initAiSummaries(getSummaryDeps(workspaceRoot));
})
.catch((e: unknown) => {
logger.error("Initial discovery failed", {
error: e instanceof Error ? e.message : String(e),
});
initialDiscovery(workspaceRoot).catch((e: unknown) => {
logger.error("Initial discovery failed", {
error: e instanceof Error ? e.message : String(e),
});
});
}

async function initDatabaseSafe(workspaceRoot: string): Promise<void> {
Expand Down Expand Up @@ -201,24 +191,6 @@ function registerFilterCommands(context: vscode.ExtensionContext): void {
vscode.commands.registerCommand("commandtree.clearFilter", () => {
getTreeProvider().clearFilters();
updateFilterContext();
}),
vscode.commands.registerCommand("commandtree.generateSummaries", async () => {
const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath;
if (workspaceRoot !== undefined) {
await runSummarisation(getSummaryDeps(workspaceRoot));
}
}),
vscode.commands.registerCommand("commandtree.selectModel", async () => {
const result = await forceSelectModel();
if (result.ok) {
vscode.window.showInformationMessage(`CommandTree: AI model set to ${result.value}`);
const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath;
if (workspaceRoot !== undefined) {
await runSummarisation(getSummaryDeps(workspaceRoot));
}
} else {
vscode.window.showWarningMessage(`CommandTree: ${result.error}`);
}
})
);
}
Expand Down
106 changes: 0 additions & 106 deletions src/semantic/modelSelection.ts

This file was deleted.

Loading
Loading