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
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ VS Code extension targeting `^1.85.0`. Entry: `src/extension.ts` → `out/extens
- `src/issueManager.ts` — in-memory store keyed by file URI; emits `onChange`
- `src/decorationProvider.ts` — listens to `issueManager.onChange`, applies gutter decorations; skips re-apply when issue IDs unchanged to preserve VS Code's shifted-range tracking
- `src/historyManager.ts` — fingerprints issues (native > derived > volatile) for trend diffing
- `src/actionManager.ts` — `onSave` wired via `vscode.workspace.onDidSaveTextDocument`; actions chain via `then[]`
- `src/actionManager.ts` — `onSave` wired via `vscode.workspace.onDidSaveTextDocument`; actions chain via `before[]` (run before own command) and `then[]` (run after)

**Webview assets:** `media/webview.js` + `media/webview.css` — bundled as-is (no build step). Communication is message-passing: extension ↔ webview.

Expand All @@ -45,7 +45,7 @@ VS Code extension targeting `^1.85.0`. Entry: `src/extension.ts` → `out/extens
`.vscode/codeclimate-visualiser.json` — validated by `schemas/codeclimate-visualiser.schema.json`:
- `reportPatterns` — glob strings or `PatternEntry` objects (`glob`, `regex`, `values`) for loading reports and populating custom columns
- `customColumns` — extra table columns; can extract values from issue fields via `fromField` + `fieldRegex`
- `actions` — shell/VS Code commands triggerable from the Actions tab or on file save
- `actions` — shell/VS Code commands triggerable from the Actions tab or on file save; an action with `forEach` (`{ dirs: glob, as }` or `{ values: [], as }`) is a template expanded at config load (`src/actionExpand.ts`) into one action per match, with `${as}` substituted in every string field and a `then` ref to the template id fanning out to all generated children. An action's `groups: string[]` lists `/`-separated group paths (multi-membership; each path segment is a nested group, group exists iff named); the Actions webview builds a tree. Groups are collapsed by default and render as action-card-shaped cells (name + description); expanding one (click) makes it a full-width container card holding its sub-groups and member actions, with a "Run all" button (`runActionGroup` message → sequential `runAction` over all descendant action ids). Group colour + description come from `ProjectConfig.groupStyles` (name→`{color?, description?}`, default colour otherwise); forEach children default `groups` to `[templateId]`
- `historyPath` — override for the history NDJSON file path

`testdata/.vscode/codeclimate-visualiser.json` is the canonical example of all features in use.
Expand Down
42 changes: 42 additions & 0 deletions media/webview.css
Original file line number Diff line number Diff line change
Expand Up @@ -968,6 +968,47 @@ button { font-family: inherit; color: inherit; background: none; border: none; c
gap: var(--gap);
padding: 4px 0;
}
/* Collapsed group = action-card-shaped cell with a colour accent; click to expand. */
.action-card.action-group-collapsed {
--group-color: var(--border-strong);
border-left: 3px solid var(--group-color);
cursor: pointer;
}
.action-card.action-group-collapsed:hover { background: var(--surface-hover); }

/* Expanded group = full-width container card (spans every grid column). */
.action-group-card.expanded {
--group-color: var(--border-strong);
grid-column: 1 / -1;
background: var(--surface);
border: 1px solid var(--border);
border-left: 3px solid var(--group-color);
border-radius: var(--r-md);
}
.action-group-header {
display: flex; align-items: center; gap: 8px;
padding: 10px 12px; cursor: pointer; user-select: none;
}
.action-group-caret {
display: inline-flex; color: var(--fg-muted); transition: transform 0.12s;
}
.action-group-caret svg { width: 14px; height: 14px; }
.action-group-caret.collapsed { transform: rotate(-90deg); }
.action-group-swatch {
width: 9px; height: 9px; border-radius: 2px; flex-shrink: 0;
background: var(--group-color);
}
.action-group-title {
font-weight: 600; font-size: 13px; color: var(--fg);
}
.action-group-count {
font-size: 11px; color: var(--fg-dim);
background: color-mix(in srgb, var(--group-color) 16%, transparent);
border-radius: 999px; padding: 1px 7px; flex: 0 0 auto;
}
.action-group-run { margin-left: auto; flex-shrink: 0; }
.action-group-run span { font-size: 11px; }
.action-group-body { padding: 0 12px 12px 12px; }
.action-card {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--r-md); padding: 14px 16px;
Expand Down Expand Up @@ -1007,6 +1048,7 @@ button { font-family: inherit; color: inherit; background: none; border: none; c
}
.action-status--idle { background: var(--fg-dim); }
.action-status--running { background: var(--sev-minor); animation: action-pulse 1s infinite; }
.action-status--waiting { background: var(--sev-major); animation: action-pulse 1.4s infinite; }
.action-status--success { background: #4ade80; }
.action-status--error { background: var(--sev-critical); }
@keyframes action-pulse {
Expand Down
Loading
Loading