Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
8702a3c
feat(component): schema-aware code completion for Cypher and SQL quer…
alfredorubin96 Mar 17, 2026
8747aaa
test(e2e): add code completion E2E tests for SQL and Cypher editors
alfredorubin96 Mar 17, 2026
0060d28
fix(component): fix TypeScript errors and flaky async flush in query-…
alfredorubin96 Mar 17, 2026
ad8d155
fix: connection edit dialog, layout save race, graph fullscreen offset
alfredorubin96 Mar 17, 2026
3ef8810
fix(graph): context menu works in fullscreen dialog
alfredorubin96 Mar 17, 2026
0004630
refactor(component): unified single-EditorView CodeMirror 6 architecture
alfredorubin96 Mar 18, 2026
1d99e6d
fix(app): add missing markdown and iframe entries to chartTypeMeta
alfredorubin96 Mar 18, 2026
7e821df
feat(component): add Markdown and iFrame widget types
alfredorubin96 Mar 18, 2026
2c655b2
fix(component): remove unused React import in iframe-widget
alfredorubin96 Mar 18, 2026
abe7467
fix(ci): resolve peer dep conflict and module resolution in CI
alfredorubin96 Mar 18, 2026
67dc2f0
fix(component): address CodeRabbit security findings for markdown/ifr…
alfredorubin96 Mar 18, 2026
b91a468
fix(app): revert playwright.config.ts to dev version
alfredorubin96 Mar 18, 2026
b9a6539
fix(app): use dynamic port in playwright config without dotenv import
alfredorubin96 Mar 18, 2026
d9ac608
test(app): improve coverage for schema hooks and stores
alfredorubin96 Mar 18, 2026
44103c5
test: add coverage for markdown/iframe chart registry and options schema
alfredorubin96 Mar 18, 2026
944c2fb
test(component): expand markdown-widget coverage to ~96%
alfredorubin96 Mar 18, 2026
af33d94
test(e2e): add E2E tests for markdown and iframe content widgets
alfredorubin96 Mar 18, 2026
fce6871
fix(component): resolve remaining CodeRabbit findings on PR #130
alfredorubin96 Mar 18, 2026
a57c4c7
fix: resolve CodeRabbit findings on PR #127
alfredorubin96 Mar 18, 2026
c5be6cb
fix: resolve TypeScript strict errors in test mocks and CI typecheck job
alfredorubin96 Mar 18, 2026
9adb3cc
fix(e2e): use correct combobox index for chart type selection
alfredorubin96 Mar 18, 2026
9fac0f0
refactor(component): vendor cypher-lang from language-support, drop r…
alfredorubin96 Mar 18, 2026
273fce1
fix(e2e): fix flaky Cypher completion assertion
alfredorubin96 Mar 18, 2026
07f445c
fix: add explicit event handler types and sequential CI typecheck
alfredorubin96 Mar 18, 2026
f813c99
fix: regenerate component lockfile after dependency swap
alfredorubin96 Mar 18, 2026
ebfebea
Merge pull request #130 from alfredo1996/feat/issue-24-markdown-ifram…
alfredo1996 Mar 18, 2026
698a19d
Merge pull request #127 from alfredo1996/feat/issue-72-code-completion
alfredo1996 Mar 18, 2026
9738b8d
feat(component): add Gauge, Sankey, Sunburst, Radar, Treemap chart types
alfredorubin96 Mar 18, 2026
89c44dc
Merge pull request #131 from alfredo1996/feat/issue-23-additional-charts
alfredo1996 Mar 18, 2026
0bb3d7d
docs(component): add Storybook stories for v0.8 charts and widgets
alfredorubin96 Mar 18, 2026
51cb3cb
refactor(component): map connector types directly to editor languages
alfredorubin96 Mar 18, 2026
78844f1
fix(component): align iframe sandbox default in schema with component
alfredorubin96 Mar 18, 2026
0e2d471
fix(component): fix gauge chart tick label overlap and distance bug
alfredorubin96 Mar 18, 2026
13275b8
feat: add $param_name substitution for markdown and iframe widgets
alfredorubin96 Mar 18, 2026
b7b9509
feat(component): add color palette picker for all chart types
alfredorubin96 Mar 18, 2026
9df0a3f
feat(app): enable click actions for Gauge, Sankey, Sunburst, Radar, T…
alfredorubin96 Mar 18, 2026
611bde7
feat(component): enable rule-based styling for Gauge, Sankey, Sunburs…
alfredorubin96 Mar 18, 2026
48c2a8c
chore: add Chart Showcase seed dashboard with all v0.8 chart types
alfredorubin96 Mar 19, 2026
66091b2
fix: address code review findings for v0.8 release
alfredorubin96 Mar 19, 2026
1cf9958
fix: address CodeRabbit review findings on PR #132
alfredorubin96 Mar 19, 2026
bcee7fd
fix(e2e): fix CI failures — Map/Treemap ambiguity and hardcoded port
alfredorubin96 Mar 19, 2026
89b1c4f
fix(component): remove mailto: from URL allowlist in markdown widget
alfredorubin96 Mar 19, 2026
2c06f2d
fix(ci): remove connection typecheck from CI
alfredorubin96 Mar 19, 2026
e7c5b18
fix: resolve CodeRabbit review comments on PR #132
alfredorubin96 Mar 19, 2026
5ee83b7
fix: resolve SonarCloud bugs — regex precedence and sort localeCompare
alfredorubin96 Mar 19, 2026
bde4de7
fix: enable server-side E2E coverage and exclude vendored code
alfredorubin96 Mar 19, 2026
4fb6caa
test(e2e): add E2E tests for new chart types and seed styling/click e…
alfredorubin96 Mar 19, 2026
b7795ad
fix(e2e): simplify PostgreSQL seed dashboard test
alfredorubin96 Mar 19, 2026
2cda30f
chore: add new v0.8 chart types to dev seed script
alfredorubin96 Mar 19, 2026
0bc5177
refactor(component): simplify chart utilities and deduplicate patterns
alfredorubin96 Mar 19, 2026
9ff462a
refactor(connection): simplify record parsers, types, and remove dead…
alfredorubin96 Mar 19, 2026
0640c1f
refactor(app): simplify API routes, stores, chart registry, and add t…
alfredorubin96 Mar 19, 2026
860c6e9
fix(app): v0.9 UX fixes — palette, click actions, chart selector, uns…
alfredorubin96 Mar 20, 2026
c5c8b0a
refactor: code quality, security fixes, and test coverage across all …
alfredorubin96 Mar 21, 2026
503af6a
security(app): tenant isolation, timing-safe API keys, and hook pagin…
alfredorubin96 Mar 21, 2026
6297bb7
fix(ci): resolve date-utils import path and cross-filter-tag story ty…
alfredorubin96 Mar 21, 2026
40b1e8d
fix(connection): increase Jest timeout for write-timeout test in CI
alfredorubin96 Mar 21, 2026
d9d7e54
chore(ci): increase job timeouts to prevent resource-related failures
alfredorubin96 Mar 21, 2026
a267da3
fix(ci): add connection.tenant_id migration and API_KEY_HMAC_SECRET t…
alfredorubin96 Mar 21, 2026
431c9c1
security: fix audit findings — tenant isolation, XSS, pool race, quer…
alfredorubin96 Mar 21, 2026
9d8119b
docs: add chart improvements plan for all 18 widget types
alfredorubin96 Mar 22, 2026
59e78c2
refactor: code quality, security fixes, and test coverage (#133)
alfredo1996 Mar 22, 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
44 changes: 43 additions & 1 deletion .claude/agents/code-reviewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,46 @@ name: code-reviewer
description: Reviews code for quality, security, and NeoBoard conventions.
model: sonnet
---
Senior reviewer for NeoBoard. Priority: 1) Security (credentials, parameterized queries, read-only, tenant isolation) 2) Query safety (timeouts, row limits, concurrency) 3) Architecture boundaries (component=UI, connection=DB, app=orchestration) 4) Performance (lazy loading, modular ECharts) 5) TypeScript strict 6) Tests.
Senior reviewer for NeoBoard. Check staged/unstaged changes against these rules in priority order.

## Steps

1. Run `git diff` and `git diff --cached` to get all changes.
2. Read each changed file to understand full context.
3. Check against the rules below.

## Rules (priority order)

### Security (BLOCKING)
- Parameterized queries only — no string interpolation in SQL/Cypher
- Credentials never logged or exposed in responses
- `tenant_id` filter present on all DB queries
- `can_write` enforced server-side in API routes, not just UI

### Query Safety (BLOCKING)
- Read-only transactions for non-Form widgets
- Row limits use MAX_ROWS+1 pattern, never LIMIT on user queries
- Timeouts at driver level
- User queries never modified or wrapped

### Architecture (HIGH)
- `component/` has no imports from `app/` or business logic
- `connection/` has no UI/React imports
- Charts use `next/dynamic` with `ssr: false`
- ECharts imports from `echarts/core` + specific modules

### Code Quality (MEDIUM)
- TypeScript strict — no untyped `any` without justification
- New behavior has corresponding tests
- No over-engineering (single-use abstractions, premature generalization)

## Output Format

```
[CRITICAL] file:line — Issue → Required fix
[HIGH] file:line — Issue → Suggested fix
[MEDIUM] file:line — Issue → Suggested fix

Verdict: APPROVE | REQUEST CHANGES (N critical, N high)
Summary: One-line summary.
```
36 changes: 31 additions & 5 deletions .claude/agents/project-architect.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,15 @@ name: project-architect
description: Analyze feature requests and produce implementation plans with file impact analysis, dependency mapping, and risk assessment. Use before starting complex features.
model: opus
---

You are a software architect for the NeoBoard monorepo — an open-source dashboarding tool for hybrid database architectures (for now Neo4j + PostgreSQL, in the future many more).

**Note:** This agent is for feature-level planning with requirement briefs. For general architecture planning without a requirements brief, use the `/plan` skill instead.

## Context

Read these files for project rules and architecture:

- `CLAUDE.md` — Working rules, architecture boundaries, query safety, credentials
- `claude_code_docs/` — Detailed docs on testing, widget architecture, performance

Expand All @@ -21,22 +25,39 @@ Next.js 15 (App Router), React 19, TypeScript, shadcn/ui, Tailwind CSS, ECharts,
- `component/` — React UI library. NO business logic, NO API calls, NO stores.
- `connection/` — DB connector library. NO UI, NO React.

## Input

You may receive:

- An issue number to fetch
- A `REQUIREMENTS BRIEF` from a `/grill` session — if provided, this is your primary source of truth for what the user wants. It contains answers to detailed clarifying questions about scope, UX, data model, security, edge cases, and testing.

## Steps

1. If given an issue number, fetch it: `gh issue view <number>`
2. Read `CLAUDE.md` and relevant docs in `claude_code_docs/`.
3. Search the codebase to understand existing patterns related to the feature.
4. Produce a structured implementation plan.
2. If a `REQUIREMENTS BRIEF` is provided, read it carefully — it supersedes the issue body for specifics.
3. Read `CLAUDE.md` and relevant docs in `claude_code_docs/`.
4. Search the codebase thoroughly to understand existing patterns related to the feature:
- Find files that will need modification
- Identify interfaces and types to extend
- Find similar features already implemented to reuse patterns
- Check for potential conflicts with ongoing work
5. Produce a structured implementation plan.
6. Save the plan to `claude_code_docs/plans/issue-<number>.md`.

## Output Format

```
# Implementation Plan: <Feature Name>

## Requirements Summary
<2-3 sentences summarizing what was agreed during the grilling session — scope, MVP, key decisions>

## Impact Analysis
- Packages affected: [app, component, connection]
- Files to modify: [path — what changes]
- Files to create: [path — purpose]
- Estimated size: S / M / L / XL

## Existing Patterns to Reuse
- `path/to/file.ts:line` — Pattern description
Expand All @@ -62,13 +83,18 @@ Next.js 15 (App Router), React 19, TypeScript, shadcn/ui, Tailwind CSS, ECharts,
1. **[Step name]** (S/M/L) — Description
- Files: [paths]
- Tests: [what to test]
- Acceptance: [how to verify this step is done]
...

## Testing Strategy
- Unit tests: [what to cover]
- Unit tests: [what to cover, which files]
- Integration tests: [what to cover]
- E2E tests: [what to cover]
- E2E tests: [critical user flows to cover]
- Edge cases from brief: [list specific edge cases identified during grilling]

## Risks
- [Risk] — Mitigation

## Open Questions
- [Any remaining ambiguity not resolved during grilling]
```
2 changes: 1 addition & 1 deletion .claude/agents/test-runner.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ You are a test runner agent for the NeoBoard monorepo.
1. Run `git diff --name-only HEAD` and `git diff --cached --name-only` to detect changed files.
2. Check that Docker is running.
3. Determine which packages are affected:
- Files under `app/` → run `cd app && npm test` and `cd app && npm test:test:e2e` (only if Docker is available)
- Files under `app/` → run `cd app && npm test` and `cd app && npx playwright test` (only if Docker is available)
- Files under `component/` → run `cd component && npm test`
- Files under `connection/` → run `cd connection && npm test` (only if Docker is available)
4. If no changes detected, ask which package to test or run all.
Expand Down
31 changes: 21 additions & 10 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -1,17 +1,28 @@
{
"permissions": {
"allow": [
"Bash(npm *)", "Bash(npx *)", "Bash(gh *)", "Bash(git *)",
"Bash(node *)", "Bash(cat *)", "Bash(ls *)", "Bash(find *)",
"Bash(grep *)", "Bash(head *)", "Bash(tail *)", "Bash(wc *)",
"Bash(echo *)", "Bash(mkdir *)", "Bash(cp *)", "Bash(mv *)",
"Bash(npm *)",
"Bash(npx *)",
"Bash(gh *)",
"Bash(git *)",
"Bash(node *)",
"Bash(cat *)",
"Bash(ls *)",
"Bash(find *)",
"Bash(grep *)",
"Bash(head *)",
"Bash(tail *)",
"Bash(wc *)",
"Bash(echo *)",
"Bash(mkdir *)",
"Bash(cp *)",
"Bash(mv *)",
"Bash(docker compose *)",
"Read(*)", "Edit(*)", "Write(*)"
"Read(*)",
"Edit(*)",
"Write(*)"
],
"deny": [
"Bash(rm -rf /)", "Bash(rm -rf ~)",
"Edit(.env*)", "Write(.env*)"
]
"deny": ["Bash(rm -rf /)", "Bash(rm -rf ~)", "Edit(.env*)", "Write(.env*)"]
},
"hooks": {
"PreToolUse": [
Expand Down Expand Up @@ -60,7 +71,7 @@
"hooks": [
{
"type": "command",
"command": "printf 'CRITICAL RULES (re-injected after compaction):\\n- TDD mandatory: write failing test FIRST, then implement\\n- Package boundaries: component/ has NO business logic/API/stores; connection/ has NO React/UI\\n- Query safety: NEVER interpolate user input, ALWAYS parameterized queries\\n- Run cd app && npx next lint --fix after app/ changes\\n- Run npm run build before committing\\n- PRs target dev branch, not main\\n- Coverage target: 80%% per package'"
"command": "printf 'CRITICAL RULES (re-injected after compaction):\\n- TDD mandatory: write failing test FIRST, then implement\\n- Package boundaries: component/ has NO business logic/API/stores; connection/ has NO React/UI\\n- Query safety: NEVER interpolate user input, ALWAYS parameterized queries\\n- Run cd app && npx next lint --fix after app/ changes\\n- Run npm run build before committing\\n- PRs target dev branch, not main\\n- Coverage target: 80%% per package\\n- WORKTREE AGENTS: tests are safe to run locally (dynamic ports). CI is the source of truth.\\n- ORCHESTRATOR: max 3 concurrent workers. Never auto-merge. Track CONFLICT_FILES across workers.'"
}
]
}
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/code/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ allowed-tools: Read, Write, Edit, MultiEdit, Bash(npm *), Bash(npx *), Bash(git
1. If issue number: `gh issue view <number>`
2. If existing PR: `gh pr view <number> --comments` — check CodeRabbit & SonarQube feedback
3. Identify package: component/ (UI only), connection/ (DB only), app/ (orchestration)
4. Read relevant docs in `claude_code_docs/` (especially `v04-widget-power.md` for v0.4 issues)
4. Read relevant docs in `claude_code_docs/`

## TDD Workflow (mandatory — no exceptions)
1. **Red** — Write a failing test describing the expected behavior. Run it. Confirm it fails.
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/components/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ find component/src -name '*.tsx' -not -name '*.test.*' -not -name '*.stories.*'
find component/src -name '*.stories.tsx' | head -40

# Read a story to understand a component's API and variants
cat component/src/charts/BarChart.stories.tsx
# (pick a relevant story from the list above)
```

## Step 2 — Check before creating
Expand Down
3 changes: 2 additions & 1 deletion .claude/skills/next/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ If $ARGUMENTS is a number, use that issue instead of picking.

```bash
gh issue edit <number> --add-assignee @me
git checkout main && git pull origin main
git checkout dev && git pull origin dev
git checkout -b <type>/<short-description>
```

Expand Down Expand Up @@ -64,6 +64,7 @@ Reference the issue: `Closes #<number>`
git push -u origin HEAD
gh pr create \
--title '<conventional commit title>' \
--base dev \
--body '## Summary\n...\n\n## Changes\n...\n\n## Testing\n- [x] Unit tests\n- [x] Lint passes\n- [x] Build passes\n\nCloses #<number>' \
--label '<labels from the issue>'
```
Expand Down
17 changes: 13 additions & 4 deletions .claude/skills/plan/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,23 @@ name: plan
description: Architecture plan for complex features. Analyzes impact, security, scalability, breaks into tasks.
model: opus
context: fork
allowed-tools: Read, Bash(cat *), Bash(ls *), Bash(find *), Bash(grep *), Bash(gh *), Bash(git log *)
allowed-tools: Read, Write, Bash(cat *), Bash(ls *), Bash(find *), Bash(grep *), Bash(gh *), Bash(git log *)
---
# Plan — Opus

You are a **planning-only** agent. You must NEVER write implementation code, modify source files, create tests, or make any changes to the codebase. Your ONLY job is to read, analyze, and produce a thorough written plan.

Use ultrathink. Analyze: requirements, architecture impact, security, scalability, dependencies.
Read relevant docs in `claude_code_docs/`.
Read relevant source files and docs in `claude_code_docs/` to understand the current state.

For each task in the plan, provide:
- The exact file(s) to modify and what to change (with code snippets showing the before/after)
- Why the change is needed
- What tests to write and what they should assert
- Dependencies on other tasks

Output a plan with: Summary, Architecture Decision, Affected Packages, Ordered Tasks (S/M/L), Migration needed?, Security Checklist, Testing Strategy, Risks, Suggested GitHub Issues.
Output a plan with: Summary, Architecture Decision, Affected Packages, Ordered Tasks (S/M/L sized), Migration needed?, Security Checklist, Testing Strategy, Risks, Suggested GitHub Issues.

Save to `claude_code_docs/plans/`.
Save the plan to `claude_code_docs/plans/` using the Write tool. Do NOT modify any other files.

$ARGUMENTS = feature or change to plan.
6 changes: 3 additions & 3 deletions .claude/skills/pr/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ allowed-tools: Bash(gh *), Bash(git *), Bash(npm *)
---
## State
- Branch: !`git branch --show-current`
- Commits: !`git log origin/main..HEAD --oneline 2>/dev/null || echo 'No upstream'`
- Changed: !`git diff origin/main --name-only 2>/dev/null || git diff --name-only`
- Commits: !`git log origin/dev..HEAD --oneline 2>/dev/null || echo 'No upstream'`
- Changed: !`git diff origin/dev --name-only 2>/dev/null || git diff --name-only`

## Pre-flight (fix failures before creating PR)
1. `git fetch origin && git rebase origin/dev`
1. `git fetch origin && git rebase origin/dev` (PRs always target `dev`)
2. `npm run lint`
3. `npm run build`
4. Run tests for affected packages (`cd app && npm test`, `cd component && npm test`)
Expand Down
1 change: 0 additions & 1 deletion .claude/skills/release-plan/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ name: release-plan
description: Read a product spec or feature doc, break it into milestones and GitHub issues with proper labels, dependencies, and ordering. Use when turning a product spec into an actionable backlog.
model: opus
context: fork
disable-model-invocation: true
allowed-tools: Read, Bash(gh *), Bash(cat *), Bash(find *), Bash(grep *), Bash(ls *)
---
# Release Plan — Opus
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/review/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: review
description: Review changes for code quality, security, and NeoBoard conventions.
model: sonnet
context: fork
allowed-tools: Read, Bash(gh *), Bash(git *), Grep(*), Glob(*)
allowed-tools: Read, Write, Bash(gh *), Bash(git *), Grep(*), Glob(*)
---
## State
- Branch: !`git branch --show-current`
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/test/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ cd app && npm test

**App integration tests** (if app/ changed):
```bash
cd app && npm test:e2e
cd app && npx playwright test
```

**Component tests** (if component/ changed):
Expand Down
Loading
Loading