Skip to content

fix(workflow): add missing runner types and remove deprecated #86#94

Merged
timoa merged 5 commits intomainfrom
fix/86-update-runner-types
Mar 4, 2026
Merged

fix(workflow): add missing runner types and remove deprecated #86#94
timoa merged 5 commits intomainfrom
fix/86-update-runner-types

Conversation

@timoa
Copy link
Owner

@timoa timoa commented Mar 4, 2026

Description

Update the following runner types that are missing:

  • ubuntu-slim
  • ubuntu-24.04
  • ubuntu-24.04-arm
  • ubuntu-22.04-arm
  • windows-2025
  • windows-2025-vs2026 (public preview)
  • windows-11-arm
  • macos-15-intel
  • macos-26-intel
  • macos-15
  • macos-26

Remove the following deprecated runner types:

  • ubuntu-20.04
  • windows-2019
  • macos-13
  • macos-12

Type of change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that changes existing behaviour)
  • Documentation update
  • Refactor/code quality improvement
  • Dependency update

Checklist

Code quality

  • My commit messages follow Conventional Commits (e.g. feat:, fix:, docs:, chore:)
  • I have not introduced any TypeScript types without justification
  • I have not left debug code, console.log, or commented-out blocks

Testing

  • I have tested the changes locally by pressing F5 in VSCode to launch the Extension Development Host
  • I have run pnpm test, and all tests pass
  • I have run pnpm lint, and there are no lint errors
  • I have added or updated tests to cover my changes (if applicable)

Build & compatibility

  • I have run pnpm run compile and pnpm run webpack without errors
  • The extension works in VSCode (and ideally Cursor/Windsurf)

Documentation

  • I have updated the README.md if my change adds a new feature, keyboard shortcut, or changes existing behaviour
  • I have updated or added JSDoc comments for non-obvious logic (if applicable)

Screenshots/recordings

Summary by CodeRabbit

  • New Features
    • Centralized runner options across the UI with dynamic runner icons and selection.
    • Added new runner choices: Ubuntu Slim, Ubuntu 24.04 (incl. ARM), Ubuntu 22.04 ARM, macOS 26 (incl. Intel), macOS 15 (incl. Intel), Windows 2025 (incl. VS2026), Windows 11 ARM.
  • Removals
    • Removed Windows 2019, macOS 13, macOS 12 from OS options.
  • Tests
    • Added unit tests validating runner configuration and option integrity.
  • Chores
    • Broadened TypeScript project include to cover shared library files.

@timoa timoa self-assigned this Mar 4, 2026
@timoa timoa added the enhancement New feature or request label Mar 4, 2026
@coderabbitai
Copy link

coderabbitai bot commented Mar 4, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 31f3a387-d12a-4062-a248-094244c4be06

📥 Commits

Reviewing files that changed from the base of the PR and between b469ae5 and a2ecf9c.

⛔ Files ignored due to path filters (1)
  • media/main.js.map is excluded by !**/*.map
📒 Files selected for processing (2)
  • media/main.js
  • src/lib/runnerConfig.ts

📝 Walkthrough

Walkthrough

Introduce a shared RUNNER_OPTIONS module with types and tests, switch JobPropertyPanel (both host and webview) to derive runner dropdown entries/icons from RUNNER_OPTIONS, expand CI matrix OS values with new variants and remove deprecated entries, and include the shared lib in the webview tsconfig.

Changes

Cohort / File(s) Summary
Runner config (new + tests)
src/lib/runnerConfig.ts, src/lib/runnerConfig.test.ts
Add exported RUNNER_OPTIONS (frozen array), RunnerIconType and RunnerOptionConfig types; add tests validating allowed runners, deprecated exclusions, iconType constraints, and uniqueness.
Component Runner Options
src/components/JobPropertyPanel.tsx, src/webview/components/JobPropertyPanel.tsx
Replace inline/static runner option arrays with a useMemo mapping of RUNNER_OPTIONS into { value, label, icon }; resolve icon via iconType mapping and preserve selected-option fallback behavior.
Matrix Configuration Updates
src/lib/matrixOptions.ts, src/webview/lib/matrixOptions.ts
Expand COMMON_MATRIX_VARIABLES.os values with new Ubuntu/macOS/Windows and ARM variants (+10) and remove deprecated entries (-3); keep signatures unchanged and synchronize lists across webview and lib.
TypeScript project include
tsconfig.webview.json
Add src/lib/**/* to include so webview TypeScript project compiles the shared runner config. Verify compile scope.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Poem

🐇 I nibble configs in moonlight glow,
New runners line up in tidy rows,
Ubuntu slim and macs that gleam,
Shared options hop into the stream,
CI carrots crunch—test, pass, and go! 🥕

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: adding missing runner types and removing deprecated ones, which aligns perfectly with the changeset.
Description check ✅ Passed The description is comprehensive, covering all required sections with detailed lists of added and removed runner types, properly checked type of change, and mostly completed checklist items.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/86-update-runner-types

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (1)
src/components/JobPropertyPanel.tsx (1)

114-133: Consider centralizing runner labels to avoid future drift.

runnerOptions here and in src/webview/components/JobPropertyPanel.tsx are duplicated literals. Extracting a shared runner-label source would prevent future partial updates like this PR’s Linux mismatch.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/JobPropertyPanel.tsx` around lines 114 - 133, runnerOptions is
duplicated across JobPropertyPanel components causing drift; extract a single
shared constant (e.g., RUNNER_OPTIONS or RUNNER_LABELS) exported from a new
shared module (e.g., runners.ts) and replace the local runnerOptions arrays in
both JobPropertyPanel components with an import. Ensure the shared constant
contains canonical value/label/icon tuples (matching
getLinuxIcon/getMacIcon/getWindowsIcon/getServerIcon usage) and update any
consumers (map/filter) to use the imported constant so future updates are made
in one place.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/JobPropertyPanel.tsx`:
- Around line 115-121: In JobPropertyPanel (the runner options array) replace
the deprecated 'ubuntu-20.04' entry with the missing x64 'ubuntu-24.04' entry
and ensure the ARM variant remains as 'ubuntu-24.04-arm'; update the option
objects so they include the correct value strings ('ubuntu-24.04' and
'ubuntu-24.04-arm') and labels (e.g., "Ubuntu 24.04" and "Ubuntu 24.04 (ARM)")
and keep using getLinuxIcon() for both so UI selection reflects supported
GitHub-hosted runners.

In `@src/lib/matrixOptions.ts`:
- Around line 27-33: The matrix array in src/lib/matrixOptions.ts includes
deprecated and missing GitHub runner labels: remove 'ubuntu-20.04' (no longer
supported) and add the missing x64 image 'ubuntu-24.04' so the matrix contains
the current supported set (e.g., keep
'ubuntu-latest','ubuntu-slim','ubuntu-24.04','ubuntu-24.04-arm','ubuntu-22.04','ubuntu-22.04-arm','windows-latest');
update the array where those string literals appear (the list that currently
contains 'ubuntu-20.04' and only 'ubuntu-24.04-arm') accordingly.

---

Nitpick comments:
In `@src/components/JobPropertyPanel.tsx`:
- Around line 114-133: runnerOptions is duplicated across JobPropertyPanel
components causing drift; extract a single shared constant (e.g., RUNNER_OPTIONS
or RUNNER_LABELS) exported from a new shared module (e.g., runners.ts) and
replace the local runnerOptions arrays in both JobPropertyPanel components with
an import. Ensure the shared constant contains canonical value/label/icon tuples
(matching getLinuxIcon/getMacIcon/getWindowsIcon/getServerIcon usage) and update
any consumers (map/filter) to use the imported constant so future updates are
made in one place.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2a25434f-edbe-4fc0-8101-f4c31cce92d4

📥 Commits

Reviewing files that changed from the base of the PR and between c185eb9 and 5ae9e48.

⛔ Files ignored due to path filters (1)
  • media/main.js.map is excluded by !**/*.map
📒 Files selected for processing (5)
  • media/main.js
  • src/components/JobPropertyPanel.tsx
  • src/lib/matrixOptions.ts
  • src/webview/components/JobPropertyPanel.tsx
  • src/webview/lib/matrixOptions.ts

@codecov
Copy link

codecov bot commented Mar 4, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.77%. Comparing base (30bb050) to head (a2ecf9c).
⚠️ Report is 8 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main      #94      +/-   ##
==========================================
+ Coverage   93.68%   93.77%   +0.09%     
==========================================
  Files           8        9       +1     
  Lines         269      273       +4     
  Branches      101      101              
==========================================
+ Hits          252      256       +4     
  Misses          1        1              
  Partials       16       16              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (3)
src/lib/runnerConfig.test.ts (2)

2-2: Use the @/ alias for this app-code import.

Switching this import to alias form keeps consistency with repo import conventions.

♻️ Suggested change
-import { RUNNER_OPTIONS } from './runnerConfig'
+import { RUNNER_OPTIONS } from '@/lib/runnerConfig'

As per coding guidelines "Prefer @/ for app code: import { parseWorkflow } from '@/lib/parseWorkflow'."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/lib/runnerConfig.test.ts` at line 2, Update the import in
runnerConfig.test.ts to use the app-code alias: replace the current import of
RUNNER_OPTIONS from './runnerConfig' with the '@/lib/runnerConfig' alias so the
test follows the repo convention; ensure the imported symbol RUNNER_OPTIONS
remains unchanged and any relative path usages in this file are converted to the
'@/...' form.

5-13: Strengthen assertions to lock PR runner additions/removals.

Current checks cover a subset. Add explicit assertions for newly introduced values and explicit not.toContain checks for removed deprecated runners to prevent regressions.

🧪 Suggested test expansion
   it('includes common runners', () => {
     const values = RUNNER_OPTIONS.map((opt) => opt.value)
     expect(values).toContain('ubuntu-latest')
+    expect(values).toContain('ubuntu-slim')
     expect(values).toContain('ubuntu-24.04')
     expect(values).toContain('ubuntu-24.04-arm')
+    expect(values).toContain('ubuntu-22.04-arm')
+    expect(values).toContain('windows-2025')
+    expect(values).toContain('windows-2025-vs2026')
+    expect(values).toContain('windows-11-arm')
+    expect(values).toContain('macos-15')
+    expect(values).toContain('macos-15-intel')
+    expect(values).toContain('macos-26')
+    expect(values).toContain('macos-26-intel')
     expect(values).toContain('macos-latest')
     expect(values).toContain('windows-latest')
     expect(values).toContain('self-hosted')
   })
+
+  it('does not include deprecated runners', () => {
+    const values = RUNNER_OPTIONS.map((opt) => opt.value)
+    expect(values).not.toContain('ubuntu-20.04')
+    expect(values).not.toContain('windows-2019')
+    expect(values).not.toContain('macos-13')
+    expect(values).not.toContain('macos-12')
+  })

Also applies to: 23-27

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/lib/runnerConfig.test.ts` around lines 5 - 13, The test "includes common
runners" only asserts a subset of runners; update it to explicitly assert
presence of all allowed PR runner values and explicitly assert absence of any
deprecated/removed runners to prevent accidental additions/removals. Locate
RUNNER_OPTIONS in the test, compute const values = RUNNER_OPTIONS.map((opt) =>
opt.value), then add expect(values).toContain('ubuntu-latest'),
expect(values).toContain('ubuntu-24.04'),
expect(values).toContain('ubuntu-24.04-arm'),
expect(values).toContain('macos-latest'),
expect(values).toContain('windows-latest'),
expect(values).toContain('self-hosted') plus any newly introduced runner strings
added in the diff, and add expect(values).not.toContain('<deprecated-runner-1>')
etc. to explicitly forbid removed/deprecated runners.
src/lib/runnerConfig.ts (1)

15-34: Make RUNNER_OPTIONS immutable to protect the shared source of truth.

Because this array is exported and reused across panels, leaving it mutable increases drift risk from accidental runtime mutation.

♻️ Suggested change
-export const RUNNER_OPTIONS: RunnerOptionConfig[] = [
+export const RUNNER_OPTIONS: ReadonlyArray<RunnerOptionConfig> = [
   { value: 'ubuntu-latest', label: 'Ubuntu Latest', iconType: 'linux' },
   { value: 'ubuntu-slim', label: 'Ubuntu Slim', iconType: 'linux' },
   { value: 'ubuntu-24.04', label: 'Ubuntu 24.04', iconType: 'linux' },
   { value: 'ubuntu-24.04-arm', label: 'Ubuntu 24.04 (ARM)', iconType: 'linux' },
   { value: 'ubuntu-22.04', label: 'Ubuntu 22.04', iconType: 'linux' },
   { value: 'ubuntu-22.04-arm', label: 'Ubuntu 22.04 (ARM)', iconType: 'linux' },
   { value: 'macos-latest', label: 'macOS Latest', iconType: 'mac' },
   { value: 'macos-26', label: 'macOS 26', iconType: 'mac' },
   { value: 'macos-26-intel', label: 'macOS 26 (Intel)', iconType: 'mac' },
   { value: 'macos-15', label: 'macOS 15', iconType: 'mac' },
   { value: 'macos-15-intel', label: 'macOS 15 (Intel)', iconType: 'mac' },
   { value: 'macos-14', label: 'macOS 14', iconType: 'mac' },
   { value: 'windows-latest', label: 'Windows Latest', iconType: 'windows' },
   { value: 'windows-2025', label: 'Windows 2025', iconType: 'windows' },
   { value: 'windows-2025-vs2026', label: 'Windows 2025 VS 2026 (preview)', iconType: 'windows' },
   { value: 'windows-11-arm', label: 'Windows 11 (ARM)', iconType: 'windows' },
   { value: 'windows-2022', label: 'Windows 2022', iconType: 'windows' },
   { value: 'self-hosted', label: 'Self-hosted', iconType: 'server' },
 ]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/lib/runnerConfig.ts` around lines 15 - 34, Make RUNNER_OPTIONS immutable:
change its type to a readonly form (e.g.,
ReadonlyArray<Readonly<RunnerOptionConfig>>) and freeze both the array and each
option object so callers cannot mutate runtime values; update the export of
RUNNER_OPTIONS to construct the array and then Object.freeze every entry and the
array itself (reference RUNNER_OPTIONS and the RunnerOptionConfig items to find
where to apply the freezes).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/lib/runnerConfig.test.ts`:
- Line 2: Update the import in runnerConfig.test.ts to use the app-code alias:
replace the current import of RUNNER_OPTIONS from './runnerConfig' with the
'@/lib/runnerConfig' alias so the test follows the repo convention; ensure the
imported symbol RUNNER_OPTIONS remains unchanged and any relative path usages in
this file are converted to the '@/...' form.
- Around line 5-13: The test "includes common runners" only asserts a subset of
runners; update it to explicitly assert presence of all allowed PR runner values
and explicitly assert absence of any deprecated/removed runners to prevent
accidental additions/removals. Locate RUNNER_OPTIONS in the test, compute const
values = RUNNER_OPTIONS.map((opt) => opt.value), then add
expect(values).toContain('ubuntu-latest'),
expect(values).toContain('ubuntu-24.04'),
expect(values).toContain('ubuntu-24.04-arm'),
expect(values).toContain('macos-latest'),
expect(values).toContain('windows-latest'),
expect(values).toContain('self-hosted') plus any newly introduced runner strings
added in the diff, and add expect(values).not.toContain('<deprecated-runner-1>')
etc. to explicitly forbid removed/deprecated runners.

In `@src/lib/runnerConfig.ts`:
- Around line 15-34: Make RUNNER_OPTIONS immutable: change its type to a
readonly form (e.g., ReadonlyArray<Readonly<RunnerOptionConfig>>) and freeze
both the array and each option object so callers cannot mutate runtime values;
update the export of RUNNER_OPTIONS to construct the array and then
Object.freeze every entry and the array itself (reference RUNNER_OPTIONS and the
RunnerOptionConfig items to find where to apply the freezes).

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 8fa03162-aab4-4660-a409-40e88c68bd18

📥 Commits

Reviewing files that changed from the base of the PR and between 5ae9e48 and 2d4a743.

⛔ Files ignored due to path filters (1)
  • media/main.js.map is excluded by !**/*.map
📒 Files selected for processing (6)
  • media/main.js
  • src/components/JobPropertyPanel.tsx
  • src/lib/runnerConfig.test.ts
  • src/lib/runnerConfig.ts
  • src/webview/components/JobPropertyPanel.tsx
  • tsconfig.webview.json

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/lib/runnerConfig.ts`:
- Line 35: The forEach callback currently uses an expression-bodied arrow that
implicitly returns Object.freeze(opt), which violates the
no-return-in-iterable-callback rule; change the callback to a block-bodied
function so it does not return a value (e.g., replace
runnerOptions.forEach((opt) => Object.freeze(opt)) with a block callback that
calls Object.freeze(opt);), keeping the same runnerOptions and Object.freeze
usage.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 88b87e91-83a7-49a0-9e65-b478cc2ba445

📥 Commits

Reviewing files that changed from the base of the PR and between 2d4a743 and b469ae5.

⛔ Files ignored due to path filters (1)
  • media/main.js.map is excluded by !**/*.map
📒 Files selected for processing (3)
  • media/main.js
  • src/lib/runnerConfig.test.ts
  • src/lib/runnerConfig.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/lib/runnerConfig.test.ts

@github-actions
Copy link

github-actions bot commented Mar 4, 2026

🩺 React Doctor

react-doctor v0.0.29

�[32m✔�[39m Select projects to scan �[2m›�[22m workflow-visual-editor
�[33mNo feature branch or uncommitted changes detected. Running full scan.�[39m

�[2mScanning /home/runner/work/workflow-editor/workflow-editor...�[22m


  �[33m⚠�[39m Enforce a clickable non-interactive element has at least one keyboard event listener.�[33m (20)�[39m
�[2m    Visible, non-interactive elements with click handlers must have one of `keyup`, `keydown`, or `keypress` listener.�[22m
�[2m    src/components/ConfirmDialog.tsx: 30, 37�[22m
�[2m    src/components/RunScriptDialog.tsx: 111, 118�[22m
�[2m    src/webview/App.tsx: 533�[22m
�[2m    src/webview/components/PasteYamlDialog.tsx: 21, 28�[22m
�[2m    src/components/PasteYamlDialog.tsx: 21, 28�[22m
�[2m    src/webview/components/JobPropertyPanel.tsx: 1017�[22m
�[2m    src/components/JobPropertyPanel.tsx: 1017�[22m
�[2m    src/webview/components/SourceCodeDialog.tsx: 160, 167�[22m
�[2m    src/components/SourceCodeDialog.tsx: 146, 153�[22m
�[2m    src/webview/components/ConfirmDialog.tsx: 30, 37�[22m
�[2m    src/webview/components/RunScriptDialog.tsx: 123, 130�[22m
�[2m    src/App.tsx: 489�[22m

  �[33m⚠�[39m Static HTML elements with event handlers require a role.�[33m (10)�[39m
�[2m    Add a role attribute to this element, or use a semantic HTML element instead.�[22m
�[2m    src/components/ConfirmDialog.tsx: 37�[22m
�[2m    src/components/RunScriptDialog.tsx: 118�[22m
�[2m    src/webview/components/PasteYamlDialog.tsx: 28�[22m
�[2m    src/components/PasteYamlDialog.tsx: 28�[22m
�[2m    src/webview/components/JobPropertyPanel.tsx: 1017�[22m
�[2m    src/components/JobPropertyPanel.tsx: 1017�[22m
�[2m    src/webview/components/SourceCodeDialog.tsx: 167�[22m
�[2m    src/components/SourceCodeDialog.tsx: 153�[22m
�[2m    src/webview/components/ConfirmDialog.tsx: 37�[22m
�[2m    src/webview/components/RunScriptDialog.tsx: 130�[22m

  �[33m⚠�[39m "@codemirror/view" is a heavy library — use React.lazy() or next/dynamic for code splitting�[33m (8)�[39m
�[2m    Use `const Component = dynamic(() => import('library'), { ssr: false })` from next/dynamic or React.lazy()�[22m
�[2m    src/components/RunScriptDialog.tsx: 2, 3�[22m
�[2m    src/webview/components/SourceCodeDialog.tsx: 2, 3�[22m
�[2m    src/components/SourceCodeDialog.tsx: 2, 3�[22m
�[2m    src/webview/components/RunScriptDialog.tsx: 2, 3�[22m

  �[33m⚠�[39m A form label must be associated with a control.�[33m (45)�[39m
�[2m    Either give the label a `htmlFor` attribute with the id of the associated control, or wrap the label around the control.�[22m
�[2m    src/components/WorkflowPropertyPanel.tsx: 71, 81, 92�[22m
�[2m    src/components/TriggerPropertyPanel.tsx: 130, 158, 175, 219, 263, 325, 369, 414�[22m
�[2m    src/webview/components/JobPropertyPanel.tsx: 200, 212, 219, 277, 359, 401, 426, 494, 851, 874, 915�[22m
�[2m    src/webview/components/WorkflowPropertyPanel.tsx: 71, 81, 92�[22m
�[2m    src/components/JobPropertyPanel.tsx: 200, 212, 219, 277, 359, 401, 426, 494, 851, 874, 915�[22m
�[2m    src/webview/components/TriggerPropertyPanel.tsx: 130, 158, 175, 219, 263, 325, 369, 414, 432�[22m

  �[33m⚠�[39m Component "AppInner" has 13 useState calls — consider useReducer for related state�[33m (2)�[39m
�[2m    Group related state: `const [state, dispatch] = useReducer(reducer, { field1, field2, ... })`�[22m
�[2m    src/webview/App.tsx: 56�[22m
�[2m    src/App.tsx: 56�[22m

  �[33m⚠�[39m Component "AppInner" is 684 lines — consider breaking it into smaller focused components�[33m (6)�[39m
�[2m    Extract logical sections into focused components: `<UserHeader />`, `<UserActions />`, etc.�[22m
�[2m    src/webview/App.tsx: 56�[22m
�[2m    src/components/TriggerPropertyPanel.tsx: 48�[22m
�[2m    src/webview/components/JobPropertyPanel.tsx: 41�[22m
�[2m    src/components/JobPropertyPanel.tsx: 41�[22m
�[2m    src/webview/components/TriggerPropertyPanel.tsx: 48�[22m
�[2m    src/App.tsx: 56�[22m

  �[33m⚠�[39m 7 setState calls in a single useEffect — consider using useReducer or deriving state�[33m (3)�[39m
�[2m    Combine into useReducer: `const [state, dispatch] = useReducer(reducer, initialState)`�[22m
�[2m    src/webview/App.tsx: 105�[22m
�[2m    src/webview/components/JobPropertyPanel.tsx: 139�[22m
�[2m    src/components/JobPropertyPanel.tsx: 139�[22m

  �[33m⚠�[39m Array index "idx" used as key — causes bugs when list is reordered or filtered�[33m (12)�[39m
�[2m    Use a stable unique identifier: `key={item.id}` or `key={item.slug}` — index keys break on reorder/filter�[22m
�[2m    src/webview/App.tsx: 649�[22m
�[2m    src/components/TriggerPropertyPanel.tsx: 144�[22m
�[2m    src/components/TriggerBadge.tsx: 64�[22m
�[2m    src/webview/components/TriggerNode.tsx: 26�[22m
�[2m    src/components/TriggerNode.tsx: 26�[22m
�[2m    src/webview/components/JobPropertyPanel.tsx: 885�[22m
�[2m    src/components/JobPropertyPanel.tsx: 885�[22m
�[2m    src/webview/components/SourceCodeDialog.tsx: 220�[22m
�[2m    src/webview/components/TriggerPropertyPanel.tsx: 144�[22m
�[2m    src/components/SourceCodeDialog.tsx: 206�[22m
�[2m    src/webview/components/TriggerBadge.tsx: 64�[22m
�[2m    src/App.tsx: 632�[22m

  �[2m┌────────────────────────────────────────────────────┐�[22m
  �[2m│�[22m �[32m┌─────┐�[39m                                            �[2m│�[22m
  �[2m│�[22m �[32m│ ◠ ◠ │�[39m                                            �[2m│�[22m
  �[2m│�[22m �[32m│  ▽  │�[39m                                            �[2m│�[22m
  �[2m│�[22m �[32m└─────┘�[39m                                            �[2m│�[22m
  �[2m│�[22m React Doctor �[2m(www.react.doctor)�[22m                    �[2m│�[22m
  �[2m│�[22m                                                    �[2m│�[22m
  �[2m│�[22m �[32m94�[39m / 100  �[32mGreat�[39m                                    �[2m│�[22m
  �[2m│�[22m                                                    �[2m│�[22m
  �[2m│�[22m �[32m███████████████████████████████████████████████�[39m�[2m░░░�[22m �[2m│�[22m
  �[2m│�[22m                                                    �[2m│�[22m
  �[2m│�[22m �[33m⚠ 106 warnings�[39m  �[2macross 20/69 files�[22m  �[2min 724ms�[22m       �[2m│�[22m
  �[2m└────────────────────────────────────────────────────┘�[22m

�[2m  Full diagnostics written to /tmp/react-doctor-11ce0ad3-e2f3-437d-860e-3e2d30e7a3fc�[22m

�[2m  Share your results: �[36mhttps://www.react.doctor/share?p=workflow-visual-editor&s=94&w=106&f=20�[39m�[22m

@timoa timoa merged commit 74a7bd4 into main Mar 4, 2026
9 checks passed
@timoa timoa deleted the fix/86-update-runner-types branch March 4, 2026 21:41
@timoa-bot
Copy link

timoa-bot bot commented Mar 4, 2026

🎉 This PR is included in version 1.2.38 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

@timoa-bot timoa-bot bot added the released label Mar 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant