From 7855e37c48cef98eb4fc20e5b27e8391fdee22ca Mon Sep 17 00:00:00 2001
From: Christian Findlay <16697547+MelbourneDeveloper@users.noreply.github.com>
Date: Thu, 26 Mar 2026 21:09:14 +1100
Subject: [PATCH 1/2] Fixes
---
CoveragePlan.md | 124 ---------------------------------
README.md | 7 +-
website/src/docs/discovery.md | 14 +++-
website/src/docs/index.md | 8 ++-
website/src/index.njk | 18 ++++-
website/tests/homepage.spec.ts | 6 +-
6 files changed, 40 insertions(+), 137 deletions(-)
delete mode 100644 CoveragePlan.md
diff --git a/CoveragePlan.md b/CoveragePlan.md
deleted file mode 100644
index 790d80d..0000000
--- a/CoveragePlan.md
+++ /dev/null
@@ -1,124 +0,0 @@
-# Plan: Get Test Coverage to 100%
-
-## Context
-Coverage is at 78% (5187/6634 statements). Major gaps are dead code, unused logger methods, untested semantic/AI features, and uncovered error branches. Strategy: delete dead code first (biggest bang for buck), then add tests for remaining gaps.
-
-## Phase 1: Delete Dead Code (~300+ statements removed)
-
-### 1a. Logger — remove unused methods
-**File:** `src/utils/logger.ts`
-- Delete `tag()` (lines 77-84) — **zero callers** in entire codebase
-- Delete `quick()` (lines 103-112) — **zero callers**
-- Delete `config()` (lines 117-133) — **zero callers**
-- Keep `filter()` — called from `CommandTreeProvider.ts:92`
-
-### 1b. Test helpers — remove unused exports
-**File:** `src/test/helpers/helpers.ts`
-- Delete `getTreeView()` (line 43-46) — returns `undefined`, never imported
-- Delete `filterTasks()` (line 61-65) — never imported by any test
-- Delete `runTask()` (line 76-78) — never imported by any test
-- Delete `waitForCondition()` (line 132-145) — never imported by any test
-- Delete `captureTerminalOutput()` (line 242-255) — never imported, always returns `""`
-- Delete `readFile()` (line 122-125) — never imported (tests use `fs.readFileSync` directly)
-
-### 1c. Test types — remove unused config helpers
-**File:** `src/test/helpers/test-types.ts`
-- Delete `getExcludePatternsDefault()` (line 121-126) — zero callers
-- Delete `getSortOrderDefault()` (line 131-136) — zero callers
-- Delete `getSortOrderEnum()` (line 141-146) — zero callers
-- Delete `getSortOrderEnumDescriptions()` (line 151-156) — zero callers
-
-### 1d. Semantic — remove unused function
-**File:** `src/semantic/modelSelection.ts`
-- Delete `pickConcreteModel()` (line 38-48) — never imported anywhere
-
-### 1e. Extension — inline trivial passthrough
-**File:** `src/extension.ts`
-- Inline `isAiEnabled()` (line 466-468) — just returns its input; replace 2 call sites with direct boolean check
-
-### 1f. Deno — fix duplicate + regex violation
-**File:** `src/discovery/deno.ts`
-- Delete local `removeJsonComments()` (line 96-100) — duplicate of `src/utils/fileUtils.ts` version AND uses illegal regex
-- Import `removeJsonComments` from `../utils/fileUtils` instead
-- Delete local `truncate()` if it exists in a shared util (check first)
-
-## Phase 2: Add Missing Tests
-
-### 2a. Logger unit tests
-- Test `info()`, `warn()`, `error()` with disabled state (`setEnabled(false)`)
-- Test `filter()` method
-- Test with and without `data` parameter
-
-### 2b. fileUtils edge cases
-- Test `removeJsonComments()` with unterminated block comments
-- Test `removeJsonComments()` with strings containing `//` and `/*`
-- Test `readFile()` error path
-- Test `parseJson()` with malformed input
-
-### 2c. TaskRunner param format tests
-- Test `"flag"` format
-- Test `"flag-equals"` format
-- Test `"dashdash-args"` format
-- Test empty param value skipping
-
-### 2d. Discovery branch coverage
-- Test early return when no source files exist (cargo, gradle, maven, deno)
-- Test `readFile` failure path (skip unreadable files)
-- Test non-string script values in npm/deno
-
-### 2e. DB error handling
-- Test `addColumnIfMissing()` when column already exists
-- Test `registerCommand()` upsert conflict path
-- Test `getRow()` null result
-
-### 2f. Config branch coverage
-- Test `load()` when DB returns error
-- Test `addTaskToTag()` when DB fails
-- Test `removeTaskFromTag()` when DB fails
-
-### 2g. Semantic module tests
-- Unit test `resolveModel()` — all branches (saved ID found, saved ID not found, no models, user cancels)
-- Unit test `modelSelection.ts` pure functions
-- Mock-based tests for `summariseScript`, `summaryPipeline` functions
-
-## Phase 3: Verify
-
-- Run `make test` (includes `--coverage`)
-- Check coverage report for remaining gaps
-- Iterate until 100%
-
-## Critical Files
-- `src/utils/logger.ts` — delete 3 methods
-- `src/test/helpers/helpers.ts` — delete 6 functions
-- `src/test/helpers/test-types.ts` — delete 4 functions
-- `src/semantic/modelSelection.ts` — delete 1 function
-- `src/extension.ts` — inline 1 function
-- `src/discovery/deno.ts` — fix regex violation + remove duplicate
-- New/modified test files for Phase 2
-
----
-
-## TODO
-
-### Phase 1: Delete Dead Code
-- [x] 1a. Delete `tag()`, `quick()`, `config()` from `src/utils/logger.ts` — ALREADY DONE
-- [x] 1b. Delete `getTreeView()`, `filterTasks()`, `runTask()`, `waitForCondition()`, `captureTerminalOutput()`, `readFile()` from `src/test/helpers/helpers.ts` — ALREADY DONE
-- [x] 1c. Delete `getExcludePatternsDefault()`, `getSortOrderDefault()`, `getSortOrderEnum()`, `getSortOrderEnumDescriptions()` from `src/test/helpers/test-types.ts` — ALREADY DONE
-- [x] 1d. ~~Delete `pickConcreteModel()`~~ — ACTUALLY USED (summariser.ts + unit tests). Plan was wrong.
-- [x] 1e. ~~Inline `isAiEnabled()`~~ — ALREADY DONE (function no longer exists)
-- [x] 1f. Fix deno.ts — ALREADY DONE (regex `removeJsonComments` deleted, imports from `fileUtils`)
-
-### Phase 2: Add Missing Tests
-- [x] 2a. Logger unit tests — BLOCKED as unit test (vscode dep). Coverage comes from e2e usage.
-- [x] 2b. fileUtils edge cases (unterminated comments, strings with comment chars, malformed JSON) — `src/test/e2e/fileUtils.e2e.test.ts` (8 tests)
-- [x] 2c. TaskRunner param format tests (flag, flag-equals, dashdash-args, empty skip) — `src/test/unit/taskRunner.unit.test.ts` (11 tests, all passing)
-- [x] 2d. Discovery branch coverage — BLOCKED as unit test (vscode dep). Branches exercised by existing e2e fixture tests.
-- [x] 2e. DB error handling (addColumnIfMissing, registerCommand upsert, getRow null) — `src/test/e2e/db.e2e.test.ts` (12 tests)
-- [x] 2f. Config branch coverage — BLOCKED as unit test (vscode dep). Error paths are defensive code, covered by e2e tag tests.
-- [x] 2g. Semantic module tests (resolveModel branches, pure functions, mock summarise tests) — ALREADY DONE in `modelSelection.unit.test.ts`
-
-### Phase 3: Verify
-- [x] Run `npm test` — **217 passing, 7 failing** (all 7 failures are Copilot auth timeouts in headless test env, not code bugs)
-- [ ] Run `npm run test:coverage` for coverage report — needs Copilot auth or skip AI tests
-- [ ] Check coverage report for remaining gaps
-- [ ] Iterate until 100%
diff --git a/README.md b/README.md
index b49e1a5..a285179 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
Recursively scans your workspace for shell scripts, npm scripts, Makefile targets, VS Code commands, launch configs, and Python scripts.
+Recursively scans your workspace for 21 command types including shell scripts, npm, Make, Gradle, Cargo, Docker Compose, .NET, C# Script, F# Script, and more.
.csproj / .fsproj
.csx files
+.fsx files
+