Skip to content

feat(editor): Add dev-panel for DOM-annotated feedback prompts (no-changelog)#28761

Merged
aalises merged 24 commits intomasterfrom
feat/dev-panel-claude-channel
Apr 29, 2026
Merged

feat(editor): Add dev-panel for DOM-annotated feedback prompts (no-changelog)#28761
aalises merged 24 commits intomasterfrom
feat/dev-panel-claude-channel

Conversation

@Tuukkaa
Copy link
Copy Markdown
Contributor

@Tuukkaa Tuukkaa commented Apr 21, 2026

Summary

Adds a dev-only overlay to the editor-ui that lets developers pick DOM
elements (single click, shift-click multi-select, or drag-to-select), attach
a free-form prompt to each, and copy the whole batch as formatted markdown
to paste into Claude Code (or any other tool).

Highlights

  • Pick + annotate + copy workflow: numbered markers overlay each
    annotated element; the copy button emits a markdown block with page path,
    viewport, DOM path, source file/line (via
    vite-plugin-vue-inspector),
    Vue component name, test id, and the user's prompt.
  • Persistent annotations: stored in localStorage with a 7-day TTL so
    they survive refresh and HMR; re-resolved against the current DOM when
    navigation or mutations shift things around.
  • Feature flag overrides: a flag button in the toolbar opens a panel that
    lists all PostHog flags discovered in the SDK + persisted blobs, lets you
    set/clear overrides (boolean or variant, with custom-value input), and
    writes them to the same N8N_EXPERIMENT_OVERRIDES localStorage key the
    Playwright suite already uses. Reload-and-apply button included.
  • Hidden by default: toggle with Ctrl+Shift+D
    (uses event.ctrlKey + event.key so it works on macOS and on
    non-QWERTY layouts like Colemak). Visibility is remembered across reloads.
  • Dev-only: mounted behind import.meta.env.DEV, so Vite tree-shakes it
    out of production bundles. No backend, no extra process.

Preview

image image image

Why

Speeds up the "I noticed something on this screen, let me describe it
precisely to an AI" loop. Copying N annotations at once beats round-tripping
a single screenshot, and every annotation carries enough source metadata
that an AI assistant can usually jump straight to the right file.

The flag override panel folds in a workflow that previously lived in a
bookmarklet, so toggling experiments no longer requires editing
localStorage by hand or keeping a separate snippet around.

Reviewer notes

  • No production code paths are affected. Nothing new in `packages/cli`,
    `nodes-base`, etc.

Related Linear tickets, Github issues, and Community forum posts

N/A — internal dev tooling.

Review / Merge checklist

  • I have seen this code, I have run this code, and I take responsibility for this code.
  • PR title and summary are descriptive.
  • Docs updated or follow-up ticket created.
  • Tests included. (manual only for now — the overlay is behind `import.meta.env.DEV`)
  • PR Labeled with `Backport to Beta`, `Backport to Stable`, or `Backport to v1` — N/A

Tuukkaa and others added 6 commits April 17, 2026 15:36
…no-changelog)

Adds a dev-only overlay that lets developers pick any DOM element in the
editor, describe a change in a popover, and either send it to a running
Claude Code session via Claude Channels or copy the prompt + element
context to the clipboard for use with other tools.

- packages/@n8n/dev-panel-channel: MCP stdio server that exposes a local
  HTTP endpoint and pushes notifications/claude/channel events into the
  running Claude session.
- packages/frontend/editor-ui/src/app/dev/dev-panel: Vue overlay with
  element picker, prompt popover, clipboard formatter, and channel
  health polling. Mounted only when import.meta.env.DEV is true.
- Root scripts: dev:claude-panel launches Claude with the channel loaded.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ed markers and inline editing (no-changelog)

Reworks the dev panel into a collapsible black FAB that expands into an
icon toolbar, and adds multi-annotation capture with clipboard export.

- Collect annotations across picks instead of sending one-off prompts.
  Each capture drops a numbered marker on its anchor element; clicking
  a marker reopens the popover pre-filled for editing.
- Copy all annotations at once as Agentation-style markdown, with page
  path, viewport, DOM breadcrumb, source file:line:col, Vue component,
  test id, and feedback text per item. Source paths are trimmed to
  start at packages/ or src/. CSS-module hashes of the form
  `_name_hash_line` are stripped from selectors and class lists so the
  pasted context remains greppable.
- Single black circular FAB with channel-health dot and annotation
  count badge; clicking expands into a toolbar (pick / copy / clear /
  close) and enters picking mode. ESC on the popover cancels without
  dropping out of annotation mode.
- Markers only render while the panel is expanded, and swap the number
  for a pen icon on hover to signal editability.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
… TTL (no-changelog)

Annotations are stored in localStorage keyed by page pathname and render
from captured bounding-box coordinates instead of re-resolving DOM
element references — so markers stay put across reloads and SPA
navigation even when selectors can't match (CSS-module class hashing,
duplicate selectors, async-rendered content).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ngelog)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…d Ctrl+Shift+D (no-changelog)

Drop the MCP channel server and Claude send-now flow; the first version
only needs to copy annotations as markdown. Hide the panel by default so
it does not interfere with regular app testing, and toggle it with
Ctrl+Shift+D (uses event.key so it works across keyboard layouts like
Colemak). Visibility persists in localStorage.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 21, 2026

Performance Comparison

Comparing currentlatest master14-day baseline

Memory consumption baseline with starter plan resources

Metric Current Latest Master Baseline (avg) vs Master vs Baseline Status
memory-heap-used-baseline 114.82 MB 118.45 MB 115.30 MB (σ 1.79) -3.1% -0.4%
memory-rss-baseline 288.29 MB 295.84 MB 290.89 MB (σ 29.40) -2.6% -0.9%

docker-stats

Metric Current Latest Master Baseline (avg) vs Master vs Baseline Status
docker-image-size-n8n 1280.00 MB 1280.00 MB 1277.44 MB (σ 12.68) +0.0% +0.2%
docker-image-size-runners 388.00 MB 388.00 MB 390.69 MB (σ 8.62) +0.0% -0.7%

Idle baseline with Instance AI module loaded

Metric Current Latest Master Baseline (avg) vs Master vs Baseline Status
instance-ai-heap-used-baseline 186.75 MB 191.66 MB 187.42 MB (σ 1.77) -2.6% -0.4%
instance-ai-rss-baseline 345.62 MB 352.70 MB 367.22 MB (σ 21.72) -2.0% -5.9%
How to read this table
  • Current: This PR's value (or latest master if PR perf tests haven't run)
  • Latest Master: Most recent nightly master measurement
  • Baseline: Rolling 14-day average from master
  • vs Master: PR impact (current vs latest master)
  • vs Baseline: Drift from baseline (current vs rolling avg)
  • Status: ✅ within 1σ | ⚠️ 1-2σ | 🔴 >2σ regression

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 21, 2026

Bundle Report

Changes will decrease total bundle size by 533.22kB (-1.17%) ⬇️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
editor-ui-esm 45.23MB -533.22kB (-1.17%) ⬇️

Affected Assets, Files, and Routes:

view changes for bundle: editor-ui-esm

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/typescript.worker-*.js -12.62kB 10.87MB -0.12%
assets/constants-*.js 181.06kB 3.32MB 5.76% ⚠️
assets/worker-*.js -3.15MB 17.9kB -99.43%
assets/worker-*.js 3.14MB 3.15MB 17515.52% ⚠️
assets/src-*.js 2.78kB 2.43MB 0.11%
assets/DataTableTable-*.js 506 bytes 1.61MB 0.03%
assets/index-*.js 2.0kB 1.32MB 0.15%
assets/ParameterInputList-*.js 2.15kB 1.28MB 0.17%
assets/users.store-*.js -196.16kB 862.06kB -18.54%
assets/index-*.css 955 bytes 821.15kB 0.12%
assets/core-*.js 1.28kB 629.48kB 0.2%
assets/src-*.css 1.15kB 496.87kB 0.23%
assets/useCanvasMapping-*.js 518 bytes 464.23kB 0.11%
assets/InstanceAiView-*.js 33.86kB 385.5kB 9.63% ⚠️
assets/RunData-*.js 459 bytes 346.33kB 0.13%
assets/useImportCurlCommand-*.js 37 bytes 324.3kB 0.01%
assets/ParameterInputList-*.css -158 bytes 208.11kB -0.08%
assets/WorkflowDiffView-*.js 40 bytes 207.2kB 0.02%
assets/WorkflowsView-*.js 714 bytes 202.43kB 0.35%
assets/InstanceAiView-*.css 7.33kB 174.37kB 4.39%
assets/usePostMessageHandler-*.js 250 bytes 138.1kB 0.18%
assets/NodeView-*.js 622 bytes 138.04kB 0.45%
assets/useRootStore-*.js -257 bytes 131.07kB -0.2%
assets/WorkflowLayout-*.js 2.03kB 129.95kB 1.58%
assets/router-*.js 962 bytes 120.77kB 0.8%
assets/canvas.eventBus-*.js 300 bytes 117.7kB 0.26%
assets/SettingsSso-*.js -128 bytes 106.24kB -0.12%
assets/NodeCreator-*.js 338 bytes 104.38kB 0.32%
assets/builder.store-*.js (New) 101.69kB 101.69kB 100.0% 🚀
assets/useCanvasOperations-*.js 604 bytes 95.98kB 0.63%
assets/VirtualSchema-*.js 228 bytes 94.69kB 0.24%
assets/NodeSettings-*.js -123 bytes 84.98kB -0.14%
assets/settings.store-*.js 164 bytes 80.2kB 0.2%
assets/CanvasRunWorkflowButton-*.js 535 bytes 78.81kB 0.68%
assets/ProjectSettings-*.js 390 bytes 74.46kB 0.53%
assets/FixedCollectionParameter-*.js -4 bytes 73.75kB -0.01%
assets/SettingsLdapView-*.js 81 bytes 71.46kB 0.11%
assets/WorkflowHistory-*.js 97 bytes 71.12kB 0.14%
assets/ChatGreetings-*.js 46 bytes 68.75kB 0.07%
assets/CreditWarningBanner-*.js 1.8kB 59.92kB 3.09%
assets/TriggerPanel-*.js 102 bytes 59.35kB 0.17%
assets/RunDataJsonActions-*.js 40 bytes 59.31kB 0.07%
assets/ChatView-*.js 943 bytes 58.95kB 1.63%
assets/SettingsMCPView-*.js 813 bytes 49.52kB 1.67%
assets/chat.store-*.js 167 bytes 49.44kB 0.34%
assets/TemplatesSearchView-*.js 87 bytes 47.38kB 0.18%
assets/NodeDetailsView-*.js 214 bytes 42.67kB 0.5%
assets/useLogsTreeExpand-*.js 34 bytes 41.28kB 0.08%
assets/readyToRunWorkflows.store-*.js 47 bytes 40.78kB 0.12%
assets/AppSidebar-*.js -3.3kB 39.95kB -7.63%
assets/NodeDetailsViewV2-*.js 196 bytes 38.23kB 0.52%
assets/ExecutionsView-*.js 330 bytes 36.38kB 0.92%
assets/SettingsInstanceAiView-*.js -10.29kB 36.17kB -22.14%
assets/AgentEditorModal-*.js 82 bytes 34.66kB 0.24%
assets/WorkflowExecutionsView-*.js 423 bytes 33.7kB 1.27%
assets/ProjectRoleView-*.js 82 bytes 32.71kB 0.25%
assets/SettingsUsersView-*.js 82 bytes 32.66kB 0.25%
assets/usePushConnection-*.js 909 bytes 32.45kB 2.88%
assets/RunDataTable-*.js 133 bytes 31.94kB 0.42%
assets/WorkflowExecutionsPreview-*.js 133 bytes 31.38kB 0.43%
assets/SettingsSecretsProviders.ee-*.js 82 bytes 28.81kB 0.29%
assets/useRunWorkflow-*.js 98 bytes 27.96kB 0.35%
assets/SettingsChatHubView-*.js 82 bytes 27.93kB 0.29%
assets/WorkerView-*.js 40 bytes 27.86kB 0.14%
assets/ProjectHeader-*.js -376 bytes 27.05kB -1.37%
assets/ResourceCenterView-*.js 9.88kB 25.64kB 62.7% ⚠️
assets/CredentialsView-*.js 42 bytes 24.8kB 0.17%
assets/SettingsSourceControl-*.js 82 bytes 24.76kB 0.33%
assets/useMessage-*.js (New) 24.21kB 24.21kB 100.0% 🚀
assets/RecommendedTemplateCard-*.js 1 bytes 24.07kB 0.0%
assets/ResourceCenterView-*.css 11.41kB 23.31kB 95.91% ⚠️
assets/EvaluationsRootView-*.js 44 bytes 23.0kB 0.19%
assets/readyToRun.store-*.js 93 bytes 22.91kB 0.41%
assets/ChatLayout-*.js 82 bytes 21.56kB 0.38%
assets/useCustomAgent-*.js 36 bytes 20.8kB 0.17%
assets/ProjectVariables-*.js 82 bytes 20.53kB 0.4%
assets/AddDataTableModal-*.js 40 bytes 20.23kB 0.2%
assets/assistant.store-*.js -4 bytes 19.36kB -0.02%
assets/ToolsManagerModal-*.js 82 bytes 19.19kB 0.43%
assets/SettingsUsageAndPlan-*.js 40 bytes 19.14kB 0.21%
assets/instanceAiSettings.store-*.js 3.27kB 19.0kB 20.76% ⚠️
assets/EvaluationsView-*.js 40 bytes 18.84kB 0.21%
assets/SettingsInstanceAiView-*.css -5.16kB 18.73kB -21.59%
assets/MainSidebarHeader-*.js 181 bytes 18.46kB 0.99%
assets/DataTableActions-*.js 82 bytes 18.36kB 0.45%
assets/SettingsLogStreamingView-*.js 624 bytes 18.1kB 3.57%
assets/SecuritySettings-*.js 40 bytes 18.07kB 0.22%
assets/ComputerUseSetupContent-*.js (New) 18.03kB 18.03kB 100.0% 🚀
assets/TestRunDetailView-*.js 46 bytes 17.96kB 0.26%
assets/useToast-*.js (New) 17.78kB 17.78kB 100.0% 🚀
assets/SettingsPersonalView-*.js 87 bytes 17.24kB 0.51%
assets/WorkflowExecutionsView-*.css 63 bytes 16.7kB 0.38%
assets/SettingsCommunityNodesView-*.js 88 bytes 16.56kB 0.53%
assets/AppSidebar-*.css -1.75kB 15.88kB -9.91%
assets/dialog-*.js -8 bytes 15.26kB -0.05%
assets/DataTableView-*.js 40 bytes 15.01kB 0.27%
assets/ProviderSettingsModal-*.js 40 bytes 14.86kB 0.27%
assets/DataTableDetailsView-*.js 40 bytes 14.61kB 0.27%
assets/shuffle-*.js 94 bytes 14.43kB 0.66%
assets/useQuickConnect-*.js 81 bytes 14.35kB 0.57%
assets/CredentialPicker-*.js 82 bytes 13.91kB 0.59%
assets/SettingsApiView-*.js 129 bytes 13.89kB 0.94%
assets/ProjectRolesView-*.js 82 bytes 13.75kB 0.6%
assets/TemplatesCollectionView-*.js 95 bytes 13.57kB 0.71%
assets/SigninView-*.js 40 bytes 13.38kB 0.3%
assets/SetupTemplateFormStep-*.js -46 bytes 12.97kB -0.35%
assets/templates.store-*.js (New) 12.81kB 12.81kB 100.0% 🚀
assets/SetupWorkflowFromTemplateView-*.js 149 bytes 12.75kB 1.18%
assets/MigrationRuleDetail-*.js 6 bytes 12.24kB 0.05%
assets/InstanceAiOptinModal-*.js 368 bytes 12.19kB 3.11%
assets/RunDataTable-*.css -38 bytes 12.12kB -0.31%
assets/SettingsExternalSecrets-*.js 40 bytes 11.3kB 0.36%
assets/collaboration.store-*.js 45 bytes 11.26kB 0.4%
assets/SettingsAiGatewayView-*.js 1.21kB 11.21kB 12.12% ⚠️
assets/NodeCreation-*.js 93 bytes 10.95kB 0.86%
assets/MCPConnectWorkflowsModal-*.js 40 bytes 10.71kB 0.37%
assets/useActions-*.js -24 bytes 10.38kB -0.23%
assets/DependencyPill-*.js 6 bytes 10.2kB 0.06%
assets/OAuthConsentView-*.js 39 bytes 10.04kB 0.39%
assets/InstanceAiOptinModal-*.css 10 bytes 9.29kB 0.11%
assets/focusPanel.store-*.js (New) 9.25kB 9.25kB 100.0% 🚀
assets/usePinnedData-*.js -42 bytes 9.09kB -0.46%
assets/InsightsTableWorkflows-*.js 6 bytes 8.55kB 0.07%
assets/WorkflowExecutionsInfoAccordion-*.js 56 bytes 8.51kB 0.66%
assets/NodeDetailsViewV2-*.css 51 bytes 8.46kB 0.61%
assets/WorkflowPreview-*.js 171 bytes 8.35kB 2.09%
assets/RunDataJson-*.js 48 bytes 8.31kB 0.58%
assets/TagsDropdown-*.js -4 bytes 8.27kB -0.05%
assets/RunDataParsedAiContent-*.js -4 bytes 7.88kB -0.05%
assets/cloudPlan.store-*.js (New) 7.81kB 7.81kB 100.0% 🚀
assets/versions.store-*.js 40 bytes 7.8kB 0.52%
assets/ChatPersonalAgentsView-*.js 82 bytes 7.8kB 1.06%
assets/dist-*.js (New) 7.66kB 7.66kB 100.0% 🚀
assets/ExternalSecretsProviderConnectionSwitch.ee-*.js -4 bytes 7.6kB -0.05%
assets/WorkflowLocation-*.js 6 bytes 7.49kB 0.08%
assets/Modal-*.js 41 bytes 7.23kB 0.57%
assets/setupPanel.utils-*.js -38 bytes 7.23kB -0.52%
assets/useCredentialResolvers-*.js 88 bytes 7.23kB 1.23%
assets/useGlobalEntityCreation-*.js 87 bytes 7.18kB 1.23%
assets/chatPanel.store-*.js 86 bytes 6.92kB 1.26%
assets/TemplatesWorkflowView-*.js 95 bytes 6.89kB 1.4%
assets/en-*.js -17 bytes 6.86kB -0.25%
assets/overlay-*.js (New) 6.86kB 6.86kB 100.0% 🚀
assets/ProjectHeader-*.css -56 bytes 6.8kB -0.82%
assets/SettingsAIView-*.js 82 bytes 6.74kB 1.23%
assets/MainSidebarHeader-*.css 81 bytes 6.73kB 1.22%
assets/useCodeDiff-*.js (New) 6.49kB 6.49kB 100.0% 🚀
assets/ComputerUseSetupContent-*.css (New) 6.38kB 6.38kB 100.0% 🚀
assets/useWorkflowActivate-*.js 88 bytes 6.34kB 1.41%
assets/InsightsSummary-*.css -101 bytes 6.22kB -1.6%
assets/BrowserUseSetupModal-*.css (New) 5.96kB 5.96kB 100.0% 🚀
assets/ContactAdministratorToInstall-*.js -4 bytes 5.91kB -0.07%
assets/mcp.store-*.js 818 bytes 5.89kB 16.13% ⚠️
assets/useExecutionDebugging-*.js 31 bytes 5.66kB 0.55%
assets/ChatWorkflowAgentsView-*.js 6 bytes 5.6kB 0.11%
assets/LoadingView-*.js 40 bytes 5.44kB 0.74%
assets/resourceCenter.store-*.js -429 bytes 5.41kB -7.35%
assets/useWorkflowState-*.js (New) 4.96kB 4.96kB 100.0% 🚀
assets/ChangePasswordView-*.js 315 bytes 4.76kB 7.09% ⚠️
assets/AuthView-*.js -4 bytes 4.75kB -0.08%
assets/nodeIcon-*.js -26 bytes 4.7kB -0.55%
assets/SetupWorkflowCredentialsButton-*.js 2 bytes 4.31kB 0.05%
assets/WorkflowExecutionsLandingPage-*.js 12 bytes 4.29kB 0.28%
assets/usePageRedirectionHelper-*.js 134 bytes 4.21kB 3.29%
assets/templateTransforms-*.js -2 bytes 4.15kB -0.05%
assets/SettingsAiGatewayView-*.css 141 bytes 4.1kB 3.56%
assets/SignupView-*.js 315 bytes 4.05kB 8.42% ⚠️
assets/CredentialIcon-*.js 472 bytes 3.89kB 13.82% ⚠️
assets/NodeIcon-*.js 702 bytes 3.84kB 22.39% ⚠️
assets/FileSaver.min-*.js (New) 3.77kB 3.77kB 100.0% 🚀
assets/templateActions-*.js -46 bytes 3.68kB -1.24%
assets/BrowserUseSetupModal-*.js (New) 3.55kB 3.55kB 100.0% 🚀
assets/emptyStateBuilderPrompt.store-*.js 59 bytes 3.47kB 1.73%
assets/useCalloutHelpers-*.js -48 bytes 3.39kB -1.4%
assets/DemoLayout-*.js -157 bytes 3.35kB -4.48%
assets/useExecutionHelpers-*.js -12 bytes 3.32kB -0.36%
assets/SetupView-*.js 201 bytes 3.26kB 6.57% ⚠️
assets/CopyInput-*.js -4 bytes 3.25kB -0.12%
assets/ForgotMyPasswordView-*.js 40 bytes 3.04kB 1.33%
assets/ConnectionTracker-*.js 1 bytes 2.85kB 0.04%
assets/ComputerUseSetupModal-*.css (New) 2.7kB 2.7kB 100.0% 🚀
assets/WorkflowOnboardingView-*.js 53 bytes 2.3kB 2.35%
assets/useFreeAiCredits-*.js 77 bytes 2.26kB 3.52%
assets/SamlOnboarding-*.js 40 bytes 2.22kB 1.84%
assets/useExpressionResolveCtx-*.js -55 bytes 1.63kB -3.27%
assets/useAiGateway-*.js 45 bytes 1.41kB 3.29%
assets/SignoutView-*.js 40 bytes 1.12kB 3.69%
assets/useExternalHooks-*.js (New) 1.1kB 1.1kB 100.0% 🚀
assets/useActivationError-*.js 204 bytes 1.03kB 24.7% ⚠️
assets/ComputerUseSetupModal-*.js (New) 965 bytes 965 bytes 100.0% 🚀
assets/useStyles-*.js (New) 930 bytes 930 bytes 100.0% 🚀
assets/event-*.js (New) 845 bytes 845 bytes 100.0% 🚀
assets/useWorkflowId-*.js (New) 756 bytes 756 bytes 100.0% 🚀
assets/mcp.constants-*.js -1 bytes 508 bytes -0.2%
assets/6270-*.png (Deleted) -110.77kB 0 bytes -100.0% 🗑️
assets/6270-*.png (Deleted) -94.54kB 0 bytes -100.0% 🗑️
assets/8527-*.png (Deleted) -85.87kB 0 bytes -100.0% 🗑️
assets/8527-*.png (Deleted) -77.57kB 0 bytes -100.0% 🗑️
assets/3050-*.png (Deleted) -38.8kB 0 bytes -100.0% 🗑️
assets/3050-*.png (Deleted) -42.1kB 0 bytes -100.0% 🗑️
assets/7639-*.png (Deleted) -40.03kB 0 bytes -100.0% 🗑️
assets/7639-*.png (Deleted) -42.06kB 0 bytes -100.0% 🗑️
assets/7177-*.png (Deleted) -28.43kB 0 bytes -100.0% 🗑️
assets/7177-*.png (Deleted) -26.25kB 0 bytes -100.0% 🗑️
assets/4966-*.png (Deleted) -24.37kB 0 bytes -100.0% 🗑️
assets/4966-*.png (Deleted) -20.85kB 0 bytes -100.0% 🗑️
assets/8779-*.png (Deleted) -23.02kB 0 bytes -100.0% 🗑️
assets/8779-*.png (Deleted) -17.96kB 0 bytes -100.0% 🗑️
assets/resourceCenterData-*.js (Deleted) -21.59kB 0 bytes -100.0% 🗑️
assets/3100-*.png (Deleted) -15.35kB 0 bytes -100.0% 🗑️
assets/3100-*.png (Deleted) -17.53kB 0 bytes -100.0% 🗑️
assets/summarize-*.png (Deleted) -15.53kB 0 bytes -100.0% 🗑️
assets/summarize-*.png (Deleted) -17.17kB 0 bytes -100.0% 🗑️
assets/resourceCenterData-*.css (Deleted) -16.0kB 0 bytes -100.0% 🗑️
assets/chat-*.png (Deleted) -11.29kB 0 bytes -100.0% 🗑️
assets/chat-*.png (Deleted) -12.23kB 0 bytes -100.0% 🗑️
assets/ResourceCenterSectionView-*.js (Deleted) -8.63kB 0 bytes -100.0% 🗑️
assets/ResourceCenterSectionView-*.css (Deleted) -4.46kB 0 bytes -100.0% 🗑️
assets/nodeTransforms-*.js (Deleted) -3.03kB 0 bytes -100.0% 🗑️
assets/useProvideWorkflowId-*.js (Deleted) -618 bytes 0 bytes -100.0% 🗑️

Files in assets/index-*.js:

  • ./src/main.ts → Total Size: 365 bytes

Tuukkaa and others added 2 commits April 21, 2026 09:47
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@Tuukkaa
Copy link
Copy Markdown
Contributor Author

Tuukkaa commented Apr 21, 2026

/size-limit-override

@Tuukkaa Tuukkaa marked this pull request as ready for review April 21, 2026 07:54
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5 issues found across 8 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/frontend/editor-ui/src/app/dev/dev-panel/DevPanel.vue">

<violation number="1" location="packages/frontend/editor-ui/src/app/dev/dev-panel/DevPanel.vue:131">
P2: Editing a multi-element annotation collapses it to a single element because the existing multi-selection is cleared before save.</violation>

<violation number="2" location="packages/frontend/editor-ui/src/app/dev/dev-panel/DevPanel.vue:634">
P2: Custom agent: **Design System Tokens**

Extensive hard-coded color values (`#2563eb`, `#1a1a1a`, `#fff`, `#10b981`, `#1d4ed8`, and multiple `rgb()` values) throughout the component CSS. Per the design system style rules §2, hard-coded colors are a strong warning — use semantic or primitive color tokens instead. The file already uses tokens for spacing, typography, and some semantic colors (`--color--success`, `--color--danger`), so the color hardcoding is inconsistent. Even for a dev-only overlay, keeping token usage consistent avoids drift if this pattern is copied elsewhere.</violation>

<violation number="3" location="packages/frontend/editor-ui/src/app/dev/dev-panel/DevPanel.vue:806">
P2: Custom agent: **Design System Tokens**

Hard-coded `font-size: 10px` — use `var(--font-size--2xs)` for consistency with the same file's `.dev-panel-marker` and `.dev-panel-fab-badge` classes.</violation>
</file>

<file name="packages/frontend/editor-ui/src/app/dev/dev-panel/PromptPopover.vue">

<violation number="1" location="packages/frontend/editor-ui/src/app/dev/dev-panel/PromptPopover.vue:78">
P2: Remove the global resize/scroll listeners on unmount to avoid accumulating duplicate handlers when the popover is opened/closed multiple times.</violation>
</file>

<file name="packages/frontend/editor-ui/src/app/dev/dev-panel/formatPrompt.ts">

<violation number="1" location="packages/frontend/editor-ui/src/app/dev/dev-panel/formatPrompt.ts:45">
P2: Multi-select prompts lose the metadata for all but the first selected element.</violation>
</file>
Architecture diagram
sequenceDiagram
    participant User
    participant Main as main.ts
    participant Panel as DevPanel.vue
    participant Picker as useElementPicker.ts
    participant Context as collectElementContext.ts
    participant Storage as annotationStorage.ts
    participant Clipboard as Clipboard API

    Note over Main,Panel: NEW: Dev-only overlay injection
    Main->>Panel: NEW: import & mountDevPanel() (if import.meta.env.DEV)
    Panel->>Storage: NEW: loadAnnotations(path)
    Storage-->>Panel: Returns stored annotations (7-day TTL)

    Note over User,Picker: Activation & Element Selection
    User->>Panel: Press Ctrl+Shift+D
    Panel->>Picker: NEW: start() element picking
    Picker->>Picker: Add DOM event listeners (mousedown, mousemove, click)
    
    alt Single Click
        User->>Picker: Click DOM Element
    else Shift-Click / Drag
        User->>Picker: Multi-select elements
    end

    Picker-->>Panel: NEW: emit selectedElement(s)
    Panel->>Panel: Show PromptPopover.vue at element position

    Note over User,Storage: Annotation & Context Extraction
    User->>Panel: Input feedback text + Save (Cmd+Enter)
    Panel->>Context: NEW: collectElementContext(Element)
    
    Context->>Context: Read [data-v-inspector] (Source File/Line)
    Context->>Context: Read [data-testid] & Vue Component Name
    Context->>Context: Generate CSS Selector & DOM Path
    Context-->>Panel: Returns Metadata Object

    Panel->>Storage: NEW: saveAnnotations(path, data)
    Storage->>Storage: JSON.stringify to localStorage
    
    Note over User,Clipboard: Export Flow
    User->>Panel: Click "Copy to Clipboard"
    Panel->>Panel: formatAnnotationsForClipboard()
    Panel->>Clipboard: NEW: Write formatted Markdown block
    Clipboard-->>User: Feedback ready for Claude Code/LLM
Loading

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review, or fix all with cubic.

Comment thread packages/frontend/editor-ui/src/app/dev/dev-panel/DevPanel.vue Outdated
Comment thread packages/frontend/editor-ui/src/app/dev/dev-panel/DevPanel.vue
Comment thread packages/frontend/editor-ui/src/app/dev/dev-panel/DevPanel.vue
Comment thread packages/frontend/editor-ui/src/app/dev/dev-panel/PromptPopover.vue
Comment thread packages/frontend/editor-ui/src/app/dev/dev-panel/formatPrompt.ts Outdated
@n8n-assistant n8n-assistant Bot added the n8n team Authored by the n8n team label Apr 21, 2026
Tuukkaa and others added 7 commits April 21, 2026 11:06
- Preserve multi-element selection when editing an annotation
- Emit source/vue/testid metadata for every element in multi-select
  clipboard output
- Remove resize/scroll listeners in PromptPopover onUnmounted
- Use --font-size--2xs token for toolbar badge

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…no-changelog)

Swap hex and rgb() colors in DevPanel.vue for design-system tokens,
using color-mix() for the translucent overlays and shadows.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…changelog)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ay (no-changelog)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
… (no-changelog)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…over (no-changelog)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…nd theme-stable styling (no-changelog)

- Use neutral primitives for FAB/toolbar so they stay dark in both themes
- Swap custom popover textarea and buttons for N8nInput/N8nButton
- Swap theme-aware shadows for black-alpha primitives
- Animate copy-button icon swap to a checkmark on success and drop the success toast
- Enlarge copy-button annotation-count badge

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 2 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/frontend/editor-ui/src/app/dev/dev-panel/PromptPopover.vue">

<violation number="1" location="packages/frontend/editor-ui/src/app/dev/dev-panel/PromptPopover.vue:106">
P2: Attach the keyboard shortcut handler to the dialog container, not just the textarea, so Esc/Cmd+Enter still work after tabbing to the buttons.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review, or fix all with cubic.

Comment thread packages/frontend/editor-ui/src/app/dev/dev-panel/PromptPopover.vue Outdated
Tuukkaa and others added 2 commits April 21, 2026 13:04
…n dev-panel popover (no-changelog)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…es textarea (no-changelog)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Comment on lines +233 to +243
patchHistory();
loadForPath(currentPath.value);
domObserver = new MutationObserver(scheduleReresolve);
domObserver.observe(document.body, { childList: true, subtree: true });
});

onUnmounted(() => {
window.removeEventListener('scroll', scheduleBump, true);
window.removeEventListener('resize', scheduleBump);
window.removeEventListener('keyup', handleShiftKeyUp, true);
window.removeEventListener('keydown', handleToggleShortcut, true);
Copy link
Copy Markdown
Contributor

@aalises aalises Apr 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Panel is hidden by default, but the MutationObserver on document.body, scroll/resize listeners, and history patch are installed unconditionally on mount.

For devs who never open the panel, this is constant overhead on every app-wide DOM mutation. Can we gate these on visible (attach on togglin on the panel, detach on toggle-off)?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in fc47feb — observers (scroll, resize, keyup, MutationObserver, router subscription) are now attached lazily inside an activateObservers helper that runs when visible flips true and tears down on toggle-off. Only the Ctrl+Shift+D keydown listener stays mounted unconditionally so the toggle still works.

Comment on lines +150 to +162
expanded.value = false;
stop();
clearSelection();
pendingMulti.value = [];
editingId.value = null;
}
}

function updatePath() {
currentPath.value = window.location.pathname;
}

let restoreHistory: (() => void) | null = null;
Copy link
Copy Markdown
Contributor

@aalises aalises Apr 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ctrl+Shift+D iirc is "Bookmark all tabs" in Chrome/Edge on Windows/Linux, and the handler doesn't check the event target, so pressing it while typing in an input silently eats the keystroke. Could we either pick a less-claimed chord, or early-return when event.target is editable?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in fc47feb — added an isEditableTarget check that early-returns when the event target is an <input>, <textarea>, <select>, or anything contenteditable, so the chord no longer eats keystrokes during typing. Keeping Ctrl+Shift+D for now since the panel is dev-only and the editable check covers the main hazard.

Comment on lines +170 to +187
return result;
};
history.replaceState = function (...args) {
const result = originalReplace(...args);
updatePath();
return result;
};
restoreHistory = () => {
history.pushState = originalPush;
history.replaceState = originalReplace;
};
}

function loadForPath(path: string) {
const stored = loadAnnotations(path);
annotations.value = stored.map((a) => ({
...a,
elements: a.contexts
Copy link
Copy Markdown
Contributor

@aalises aalises Apr 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wouldn't monkey-patch history.pushState/replaceState globally which is fragile. Since good ole' vue-router is already in the app, using useRouter().afterEach(...) would give us the same without touching the global.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in fc47feb — dropped the pushState/replaceState monkey-patch and now subscribe via router.afterEach (importing the router singleton from @/app/router). popstate is also no longer needed since the router already handles browser back/forward.

Tuukkaa added 2 commits April 27, 2026 09:41
- Gate global observers (scroll/resize/MutationObserver/router) on `visible`
  so they're only active while the dev panel is open
- Replace history.pushState/replaceState monkey-patch with router.afterEach
- Skip Ctrl+Shift+D toggle when target is editable (input/textarea/contenteditable)
Adds a flag toolbar button that opens a panel listing PostHog flags and lets
you set N8N_EXPERIMENT_OVERRIDES per flag. Detects boolean vs variant flags
from the SDK + persisted PostHog blob, supports custom variant strings, and
reloads to apply.
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 3 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/frontend/editor-ui/src/app/dev/dev-panel/FlagPanel.vue">

<violation number="1" location="packages/frontend/editor-ui/src/app/dev/dev-panel/FlagPanel.vue:281">
P2: Custom agent: **Design System Tokens**

Global overlay/dropdown layers use hard-coded max z-index values instead of design-system layering tokens.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review, or fix all with cubic.

Comment thread packages/frontend/editor-ui/src/app/dev/dev-panel/FlagPanel.vue
…ff (no-changelog)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@cubic-dev-ai
Copy link
Copy Markdown
Contributor

cubic-dev-ai Bot commented Apr 27, 2026

You're iterating quickly on this pull request. To help protect your rate limits, cubic has paused automatic reviews on new pushes for now—when you're ready for another review, comment @cubic-dev-ai review.

@Tuukkaa Tuukkaa requested a review from aalises April 27, 2026 11:50
@aalises
Copy link
Copy Markdown
Contributor

aalises commented Apr 29, 2026

The flag panel should seed from window.featureFlags.getAll() before falling back to PostHog/localStorage; otherwise server-evaluated flags can be missing or the panel can appear empty in normal dev sessions.

I’d put this in packages/frontend/editor-ui/src/app/dev/dev-panel/useFeatureFlags.ts, then merge it into refresh():

function readEvaluatedFlags(): Record<string, FlagValue> {
	try {
		return window.featureFlags?.getAll?.() ?? {};
	} catch {
		return {};
	}
}
const evaluated = readEvaluatedFlags();
const persisted = readPersistedFlags();
const sdk = readSdkFlags();
const ph: Record<string, FlagValue> = { ...persisted, ...sdk, ...evaluated };

…ags (no-changelog)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@Tuukkaa
Copy link
Copy Markdown
Contributor Author

Tuukkaa commented Apr 29, 2026

Good catch — fixed in b2ff9aa. readEvaluatedFlags() reads window.featureFlags.getAll() and is merged with highest priority over the SDK / persisted-blob fallbacks, so server-evaluated flags now show up even when the PostHog client hasn't populated localStorage yet.

Tuukkaa and others added 2 commits April 29, 2026 14:22
…nel (no-changelog)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ling (no-changelog)

- Drag-end now installs a one-shot capture click suppressor so the post-drag
  click can never leak to the underlying app, and the next picker session
  starts with a clean slate.
- Annotation markers compute position from the live element's bounding rect
  when it's connected, falling back to the captured bbox only when the
  element resolution failed. Keeps markers anchored after layout shifts.
- PromptPopover now resyncs its prompt ref when the parent reuses the
  instance for a different annotation.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@aalises aalises added this pull request to the merge queue Apr 29, 2026
Merged via the queue into master with commit e075f85 Apr 29, 2026
48 of 52 checks passed
@aalises aalises deleted the feat/dev-panel-claude-channel branch April 29, 2026 15:31
@n8n-assistant
Copy link
Copy Markdown
Contributor

n8n-assistant Bot commented May 5, 2026

Got released with n8n@2.20.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

n8n team Authored by the n8n team Released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants