Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
ba052c6
feat: define command palette contracts
verbaux Jul 19, 2026
003b73e
feat: add contextual command registry provider
verbaux Jul 19, 2026
ccf86ae
feat: add spotlight-style command palette UI
verbaux Jul 19, 2026
fc8acd4
feat: wire contextual action search shortcut
verbaux Jul 19, 2026
81ff125
refactor: share spotlight palette shell
verbaux Jul 19, 2026
d33212f
refactor: trim command palette foundation
verbaux Jul 19, 2026
5d1a4c7
fix: clear command execution state explicitly
verbaux Jul 19, 2026
a3940c5
fix: preserve table context type narrowing
verbaux Jul 19, 2026
c0f50ef
refactor: migrate object search into palette host
verbaux Jul 20, 2026
fb2de72
refactor: split command palette controller state
verbaux Jul 23, 2026
a177e13
fix: resolve commands through active editor scope
verbaux Jul 23, 2026
4fa8a8c
refactor: unify command palette item pipeline
verbaux Jul 23, 2026
3951529
fix: keep palette keyboard handling at dialog scope
verbaux Jul 23, 2026
a097981
fix: satisfy command palette build types
verbaux Jul 23, 2026
758178e
fix: preserve palette grouping and selection visibility
verbaux Jul 23, 2026
b8ae934
fix: preserve object definition error details
verbaux Jul 24, 2026
97d1745
refactor: remove superseded palette search pipelines
verbaux Jul 24, 2026
bf22e37
feat(ui): add opt-in backdrop close to Modal
verbaux Jul 27, 2026
0c09f53
feat(layout): resolve the rendered split layout for a route
verbaux Jul 27, 2026
06a1878
refactor: unify command palette around database object navigation
verbaux Jul 27, 2026
4ad6c01
feat(i18n): translate command palette strings into pt-BR
verbaux Jul 27, 2026
1216181
fix(palette): name the object dialog and render footer keys as caps
verbaux Jul 28, 2026
4192a96
feat(palette): show which palette mode is open in the header
verbaux Aug 3, 2026
f0081b3
feat(palette): add connection and table commands to the action palette
verbaux Aug 3, 2026
fd533a2
docs(palette): drop a stale and a duplicated comment
verbaux Aug 3, 2026
030baa2
feat(palette): scope palette actions to the connection that owns them
verbaux Aug 6, 2026
c620a62
chore(tooling): refresh gitnexus rules and ignore local artifacts
verbaux Aug 6, 2026
7e56085
test(layout): isolate MainLayout from the production banner
verbaux Aug 6, 2026
b6d19ca
fix(palette): keep the selection off whatever the cursor rests on
verbaux Aug 6, 2026
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
2 changes: 1 addition & 1 deletion .claude/skills/tabularis-pr-review/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ For each factual assertion in the description, prove it:
- "Reads `default_port` from the manifest" → check the type (`src/types/plugins.ts`) — is it nullable? What's the fallback?
- New Tauri command → confirm it's registered in `src-tauri/src/lib.rs` `invoke_handler`.

### 4. Impact analysis (per CLAUDE.md)
### 4. Impact analysis (per AGENTS.md)
For each non-trivial symbol the PR touches, run `gitnexus_impact({target, direction: "upstream"})` and note blast radius / risk. Flag HIGH/CRITICAL.

### 5. Check out the PR branch — this is mandatory before running tests
Expand Down
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,13 @@ plugins/**/target
.pi/
.atl/
.opencode/

# foglamp scan (scan.lock.json contains a secret edit token)
.foglamp/

.grove/
.groverc.json
.pnpm-store/
skills-lock.json
tasks/
*.local.md
19 changes: 9 additions & 10 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,24 @@ Adhere to the rules defined in the [rules directory](./.rules/):
<!-- gitnexus:start -->
# GitNexus — Code Intelligence

This project is indexed by GitNexus as **tabularis** (10537 symbols, 25156 relationships, 300 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely.
This project is indexed by GitNexus as **tabularis** (15600 symbols, 29759 relationships, 300 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely.

> Index stale? Run `node .gitnexus/run.cjs analyze` from the project root — it auto-selects an available runner. No `.gitnexus/run.cjs` yet? `npx gitnexus analyze` (npm 11 crash → `npm i -g gitnexus`; #1939).
> If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first.

## Always Do

- **MUST run impact analysis before editing any symbol.** Before modifying a function, class, or method, run `impact({target: "symbolName", direction: "upstream"})` and report the blast radius (direct callers, affected processes, risk level) to the user.
- **MUST run `detect_changes()` before committing** to verify your changes only affect expected symbols and execution flows. For regression review, compare against the default branch: `detect_changes({scope: "compare", base_ref: "main"})`.
- **MUST run impact analysis before editing any symbol.** Before modifying a function, class, or method, run `gitnexus_impact({target: "symbolName", direction: "upstream"})` and report the blast radius (direct callers, affected processes, risk level) to the user.
- **MUST run `gitnexus_detect_changes()` before committing** to verify your changes only affect expected symbols and execution flows.
- **MUST warn the user** if impact analysis returns HIGH or CRITICAL risk before proceeding with edits.
- When exploring unfamiliar code, use `query({search_query: "concept"})` to find execution flows instead of grepping. It returns process-grouped results ranked by relevance.
- When you need full context on a specific symbol — callers, callees, which execution flows it participates in — use `context({name: "symbolName"})`.
- For security review, `explain({target: "fileOrSymbol"})` lists taint findings (source→sink flows; needs `analyze --pdg`).
- When exploring unfamiliar code, use `gitnexus_query({query: "concept"})` to find execution flows instead of grepping. It returns process-grouped results ranked by relevance.
- When you need full context on a specific symbol — callers, callees, which execution flows it participates in — use `gitnexus_context({name: "symbolName"})`.

## Never Do

- NEVER edit a function, class, or method without first running `impact` on it.
- NEVER edit a function, class, or method without first running `gitnexus_impact` on it.
- NEVER ignore HIGH or CRITICAL risk warnings from impact analysis.
- NEVER rename symbols with find-and-replace — use `rename` which understands the call graph.
- NEVER commit changes without running `detect_changes()` to check affected scope.
- NEVER rename symbols with find-and-replace — use `gitnexus_rename` which understands the call graph.
- NEVER commit changes without running `gitnexus_detect_changes()` to check affected scope.

## Resources

Expand Down
81 changes: 81 additions & 0 deletions src/components/layout/CommandPaletteScopeBridge.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import { useMemo } from "react";
import { useLocation, useNavigate } from "react-router-dom";

import { useDatabase } from "../../hooks/useDatabase";
import { useEditor } from "../../hooks/useEditor";
import { useRegisterCommandPaletteScope } from "../../hooks/useCommandPaletteScope";
import { resolveCommandTable } from "../../utils/commandTable";
import { openEditor as navigateToEditor } from "../../utils/editorNavigation";
import type {
CommandRuntime,
CommandScope,
} from "../../types/commands";

interface CommandPaletteScopeBridgeProps {
scopeId: string;
openEditor?: CommandRuntime["openEditor"];
}

export const CommandPaletteScopeBridge = ({
scopeId,
openEditor,
}: CommandPaletteScopeBridgeProps) => {
const location = useLocation();
const navigate = useNavigate();
const {
activeConnectionId,
activeDriver,
activeSchema,
} = useDatabase();
const { activeTab } = useEditor();
const activeTable = activeTab?.activeTable ?? null;
const activeTabSchema = activeTab?.schema;
const activeTabType = activeTab?.type;

const table = useMemo(
() =>
resolveCommandTable({
pathname: location.pathname,
activeConnectionId,
activeSchema,
activeTab: activeTabType
? {
type: activeTabType,
activeTable,
schema: activeTabSchema,
}
: null,
}),
[
activeConnectionId,
activeSchema,
activeTable,
activeTabSchema,
activeTabType,
location.pathname,
],
);

const runtime = useMemo<CommandRuntime>(
() => ({
navigate: (path) => navigate(path),
openEditor:
openEditor ??
((request) => navigateToEditor(navigate, request)),
}),
[navigate, openEditor],
);

const scope = useMemo<CommandScope>(
() => ({
connectionId: activeConnectionId,
driver: activeDriver,
table,
runtime,
}),
[activeConnectionId, activeDriver, runtime, table],
);

useRegisterCommandPaletteScope(scopeId, scope);
return null;
};
Loading