Skip to content

Add ScalaJS engine#448

Merged
Babali42 merged 13 commits into
mainfrom
add-engine
Jun 20, 2026
Merged

Add ScalaJS engine#448
Babali42 merged 13 commits into
mainfrom
add-engine

Conversation

@Babali42

@Babali42 Babali42 commented Jun 14, 2026

Copy link
Copy Markdown
Owner

This work comes from a simple observation: modeling a stateful editor with immutable updates becomes increasingly cumbersome as the domain grows.

The command pattern, undo/redo history, MIDI transformations and state transitions feel much more natural to model with Scala's immutable data structures and algebraic data types.

So I decided to experiment with Scala.js for the domain layer and keep Angular focused on the UI.

The fun part is implementing the command engine. The less fun part is the plumbing between Scala.js and Angular 😄.

I don't know yet if this is the right long-term solution, but I like the direction. It gives me a strongly-typed domain model today, and if I decide to add a Scala backend in the coming months, I'll already have a shared language and a shared model for the application.

Summary by CodeRabbit

Release Notes

  • New Features

    • Undo/Redo for sequencer actions is now fully integrated with engine state updates.
    • Initial sequencer genre/beat selection now syncs reliably with engine state.
  • Bug Fixes

    • Improved sequencer UI behavior so history/future changes reliably update the displayed genre/beat.
  • Documentation

    • Added “How to setup dev env” steps for running the Scala engine and Angular frontend locally.
  • CI / Build

    • Added a Scala engine CI step and a reusable build action; the deploy pipeline now builds, caches, and downloads the Scala.js artifact for the frontend build.

@coderabbitai

coderabbitai Bot commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@Babali42, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 18 minutes and 38 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more credits in the billing tab to continue.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan refill rate.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, the refill rate gradually slows as usage increases. The highest same-day bursts are limited more strictly.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: dc8af534-8fe6-4ead-afd4-911dbd59763c

📥 Commits

Reviewing files that changed from the base of the PR and between 83889da and 1bd9f31.

📒 Files selected for processing (5)
  • engine/src/main/scala/com/drumbeatrepo/sequencer/Command.scala
  • engine/src/main/scala/com/drumbeatrepo/sequencer/SequencerState.scala
  • engine/src/test/scala/com/drumbeatrepo/sequencer/SequencerStateTest.scala
  • frontend/src/app/ui/components/sequencer/sequencer.component.spec.ts
  • frontend/src/app/ui/components/sequencer/sequencer.service.spec.ts
📝 Walkthrough

Walkthrough

Introduces a complete Scala.js sequencer engine (Command, SequencerState, SequencerEngine) with immutable undo/redo state, bridges it to Angular via TypeScript global typings and a new SequencerService, refactors SequencerComponent to OnPush change detection driven by service state, adds functional immutability cleanup across the frontend, and sets up CI to build and publish the Scala.js artifact.

Changes

Scala.js Engine + Angular Integration

Layer / File(s) Summary
Scala engine project setup
engine/.gitignore, engine/build.sbt, engine/project/build.properties, engine/project/plugins.sbt
Creates the SBT build for sequencer-engine: enables ScalaJSPlugin, pins Scala 3.8.4 and sbt 1.12.11, adds sbt-scalajs 1.21.0, redirects linker output to frontend/engine, adds scalatest dependency, and establishes the engine .gitignore.
Scala engine domain: Command, SequencerState, SequencerEngine
engine/src/main/scala/com/drumbeatrepo/sequencer/Command.scala, ...SequencerState.scala, ...SequencerEngine.scala, engine/src/test/scala/.../SequencerStateTest.scala
Defines the Command enum with fromJS JS-to-Scala translation, the immutable SequencerState case class with dispatch/undo/redo history reconstruction, the JS-exported SequencerEngine object exposing dispatch/reset/getState, and the SequencerStateTest suite covering select/undo/redo.
TypeScript global typing and Angular SequencerService
frontend/src/types/engine.d.ts, frontend/src/app/ui/components/sequencer/sequencer.service.ts, ...sequencer.service.spec.ts
Declares the global SequencerEngine TypeScript interface (SequencerState + methods), introduces SequencerService with Command interface, state$ BehaviorSubject, and a dispatch method bridging to SequencerEngine. Adds unit tests covering undo/redo effects and no-op boundary cases.
SequencerComponent OnPush refactor
frontend/src/app/ui/components/sequencer/sequencer.component.ts, ...sequencer.component.html, ...sequencer.component.spec.ts
Refactors SequencerComponent to OnPush change detection; ngOnInit subscribes to state$ to update history/future lengths and trigger markForCheck; beat loading dispatches SELECT_GENRE/SELECT_BEAT via sequencerService; undo/redo template buttons call sequencerService.dispatch; adds test for beat selection via service.
Frontend integration wiring and functional immutability cleanup
frontend/.gitignore, frontend/angular.json, frontend/eslint.config.mjs, frontend/src/app/domain/export-options/..., frontend/src/app/infrastructure/adapters/..., frontend/src/app/ui/app.module.ts, frontend/src/app/ui/router.spec.ts, ...export-audio-modal.component.spec.ts
Adds engine/main.js to Angular build/test scripts, ignores ScalaJS output in .gitignore and ESLint, makes AudioExportOptions/MidiExportOptions properties readonly, refactors getMaxBufferDuration to reduce, adds ESLint suppressions in adapters, updates app.module router wiring from RouterModule to provideRouter, and updates test fixtures for SequencerService/SequencerEngine.reset integration.
CI pipeline and README dev setup docs
.github/actions/scala-test/action.yml, .github/workflows/tests.yml, .github/workflows/angular-deploy-github-pages.yml, README.md
Adds composite scala-test GitHub Action (Java 23/sbt install, cache, sbt fastLinkJS, artifact upload); updates tests.yml with a "Validate Scala" step; updates deploy workflow to download scalajs-artifact before npm build; adds README section with local dev setup commands for the Scala engine and Angular frontend.

Sequence Diagram

sequenceDiagram
    participant User
    participant SequencerComponent
    participant SequencerService
    participant SequencerEngine as SequencerEngine (Scala.js)
    participant SequencerState as SequencerState (Scala)

    User->>SequencerComponent: click undo/redo or select genre/beat
    SequencerComponent->>SequencerService: dispatch({ type: 'UNDO' | 'SELECT_BEAT' | ... })
    SequencerService->>SequencerEngine: SequencerEngine.dispatch(cmd)
    SequencerEngine->>SequencerState: Command.fromJS(cmd) → state.dispatch(command)
    SequencerState-->>SequencerEngine: new SequencerState
    SequencerService->>SequencerEngine: SequencerEngine.getState()
    SequencerEngine-->>SequencerService: {genre, beat, historyLength, futureLength}
    SequencerService->>SequencerService: state$.next(newState)
    SequencerComponent->>SequencerComponent: state$ subscription → cdr.markForCheck()
    SequencerComponent-->>User: updated UI (beat, genre, undo/redo state)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related issues

  • Refacto : Use the command pattern #446: This PR directly implements the SequencerService + BehaviorSubject state$ + dispatch(cmd) architecture proposed in that issue, achieving the described separation of concerns between the Scala.js engine and the Angular component.

Possibly related PRs

  • Babali42/DrumBeatRepo#447: Directly related — that PR adds the undo/redo button UI whose click handlers are now wired in this PR via sequencerService.dispatch({ type: 'UNDO' }) / dispatch({ type: 'REDO' }).
  • Babali42/DrumBeatRepo#263: Modifies the same SequencerComponent selectGenre/selectBeat logic and initial beat selection flow that this PR completely rewires to SequencerService.
  • Babali42/DrumBeatRepo#262: Related through shared refactoring of sequencer.component.ts beat/genre initialization and DI wiring supporting the SequencerService integration.

Poem

🐇 Hoppity-hop through the command queue I go,
Undo and Redo make the state flow just so,
Scala compiles to JavaScript bright,
Angular listens with OnPush delight,
The BehaviorSubject carries each beat,
From sbt fastLinkJS to the UI so neat!
✨ A bunny-built engine, immutable and sweet!

🚥 Pre-merge checks | ✅ 4 | ❌ 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 (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Add ScalaJS engine' clearly and concisely summarizes the main change: introducing a new Scala.js engine to the project.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch add-engine

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@codecov

codecov Bot commented Jun 14, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 86.95652% with 6 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...ture/adapters/audio-export/audio-export.adapter.ts 0.00% 3 Missing ⚠️
...app/ui/components/sequencer/sequencer.component.ts 91.89% 1 Missing and 2 partials ⚠️

📢 Thoughts on this report? Let us know!

@Babali42 Babali42 changed the title Add engine Add ScalaJS engine Jun 14, 2026
@Babali42 Babali42 marked this pull request as ready for review June 14, 2026 18:12

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 9

🧹 Nitpick comments (2)
engine/src/test/scala/com/drumbeatrepo/sequencer/SequencerStateTest.scala (1)

7-25: ⚡ Quick win

Add regression tests for redo invalidation and clear/reset field mapping.

Current tests miss two key invariants: (1) new command after Undo must clear redo future, and (2) ClearAll should reset genre and beat to matching initial fields.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@engine/src/test/scala/com/drumbeatrepo/sequencer/SequencerStateTest.scala`
around lines 7 - 25, The test class SequencerStateTest is missing two regression
tests for critical invariants in the SequencerState dispatch method. Add a new
test that verifies when a new command (like SelectBeat with a different value)
is dispatched after Undo, the redo future is cleared and cannot be recovered.
Additionally, add a test that verifies the ClearAll command properly resets both
the genre and beat fields back to their initial empty string values, confirming
that ClearAll clears these state fields as expected. Both tests should follow
the existing test pattern in the class using dispatch chains and shouldBe
assertions.
frontend/src/app/ui/components/sequencer/sequencer.service.ts (1)

13-18: Encapsulate the writable subject to prevent engine/UI state drift.

state$ is publicly writable, allowing callers to bypass SequencerEngine invariants (as seen in tests at line 38 in sequencer.service.spec.ts). The component only subscribes to it as an observable, so make the subject private and expose a read-only interface via asObservable().

♻️ Proposed refactor
 export class SequencerService {
-
-  state$ = new BehaviorSubject<SequencerState | null>(null);
+  private readonly stateSubject = new BehaviorSubject<SequencerState | null>(null);
+  readonly state$ = this.stateSubject.asObservable();
 
   dispatch(cmd: Command) {
     SequencerEngine.dispatch(cmd);
-    this.state$.next(SequencerEngine.getState());
+    this.stateSubject.next(SequencerEngine.getState());
   }
+
+  syncState(): void {
+    this.stateSubject.next(SequencerEngine.getState());
+  }
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/app/ui/components/sequencer/sequencer.service.ts` around lines
13 - 18, The state$ BehaviorSubject property in the SequencerService is publicly
writable, allowing callers to bypass the SequencerEngine invariants and directly
modify state, as demonstrated by the tests directly writing to it. Make the
state$ field private and expose a read-only observable interface to callers by
creating a public method or getter property that returns state$.asObservable().
This ensures all state changes flow through the dispatch method, maintaining
consistency with the SequencerEngine.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/actions/scala-test/action.yml:
- Around line 19-21: Add SHA-256 checksum verification for the sbt archive
download to prevent supply-chain security risks. After the curl command that
downloads the sbt release to /tmp/sbt.tgz, add a verification step that
downloads the corresponding SHA-256 checksum file and validates the archive
integrity using a command like sha256sum before proceeding to the tar extraction
command. This ensures the archive has not been tampered with or corrupted before
it is extracted into the system path.

In @.github/workflows/angular-deploy-github-pages.yml:
- Around line 33-37: The "Download Scala.js artifact" step references the
scalajs-artifact which is never produced during the workflow run because the
scala-test job that creates this artifact is not invoked. Add the scala-test job
to your workflow before this download step so that the scalajs-artifact is
actually generated and available for download-artifact to retrieve during the
current workflow run.
- Line 31: The cache-dependency-path parameter on line 31 of
.github/workflows/angular-deploy-github-pages.yml contains invalid YAML syntax
with comma-separated quoted strings. Remove the comma and the 'frontend/engine/'
path reference, keeping only 'frontend/package-lock.json' as the value, since
the frontend/engine/ directory does not contain package dependencies that need
to be cached.

In `@engine/src/main/scala/com/drumbeatrepo/sequencer/Command.scala`:
- Around line 13-28: The fromJS method unsafely accesses nested JavaScript
dynamic fields without validating their existence, which can crash with
uncontrolled errors if payload or genre/beat fields are missing. Add validation
before accessing cmd.selectDynamic("payload") and the subsequent genre/beat
fields in both the SELECT_GENRE and SELECT_BEAT case patterns. Use Option types
or explicit checks to safely extract these values, and handle missing fields by
either returning an error variant (if the Command type supports it) or throwing
a controlled exception that clearly describes the malformed input rather than
letting dynamic field access fail silently.

In `@engine/src/main/scala/com/drumbeatrepo/sequencer/SequencerState.scala`:
- Around line 22-23: The arguments to the constructor are being passed in the
wrong order. The constructor expects parameters in the order (genre, beat, ...),
but the code is passing SequencerState.initial.beat where genre is expected and
SequencerState.initial.genre where beat is expected. Swap the order of these two
arguments so that SequencerState.initial.genre is passed first and
SequencerState.initial.beat is passed second, matching the constructor parameter
order. This same swap needs to be applied at all locations where this reversed
order pattern occurs.
- Around line 11-26: The SelectGenre, SelectBeat, and ClearAll commands are
preserving the future (redo history) when creating new SequencerState instances.
When a user executes a new command after an Undo, the redo history should be
invalidated to prevent stale actions from being replayed. In each of these three
case statements (Command.SelectGenre, Command.SelectBeat, and Command.ClearAll),
replace the `future` parameter being passed to the new SequencerState
constructor with an empty collection (appropriate to the type of future, such as
an empty list or sequence) to clear the redo history.

In `@frontend/src/app/ui/components/sequencer/sequencer.component.html`:
- Around line 27-34: The click event handlers for the UNDO and REDO actions are
currently bound to the nested <img> elements instead of their parent <button>
elements. Move the (click)="sequencerService.dispatch({ type: 'UNDO'})" handler
from the undo icon <img> to the <button class="button play-sample-button undo">
element, and move the (click)="this.sequencerService.dispatch({ type: 'REDO'})"
handler from the redo icon <img> to the <button class="button play-sample-button
redo"> element. This will ensure keyboard activation (Enter/Space) works
properly and expands the clickable target area to the entire button rather than
just the icon bounds.

In `@frontend/src/app/ui/components/sequencer/sequencer.component.ts`:
- Around line 123-127: The initialization code unconditionally dispatches
SELECT_GENRE and SELECT_BEAT actions whenever beats are loaded, which overwrites
any existing SequencerService state and pollutes the undo history on remount.
Check the current state of SequencerService (checking for existing genre and
beat selections) before dispatching these actions. Only dispatch the actions if
the SequencerService does not already have valid state; if it does, skip the
dispatches to preserve the user's prior selection and maintain undo history
integrity.

In `@README.md`:
- Around line 19-32: The setup instructions assume the user returns to the
repository root between command blocks, but the path to the frontend directory
becomes invalid after the `cd engine/` command. Update the frontend setup
section to use `cd ../frontend/` instead of `cd frontend/` so that the command
works correctly when executed immediately after the engine setup commands. This
allows the full command sequence to be executed consecutively without requiring
the user to manually navigate back to the repo root.

---

Nitpick comments:
In `@engine/src/test/scala/com/drumbeatrepo/sequencer/SequencerStateTest.scala`:
- Around line 7-25: The test class SequencerStateTest is missing two regression
tests for critical invariants in the SequencerState dispatch method. Add a new
test that verifies when a new command (like SelectBeat with a different value)
is dispatched after Undo, the redo future is cleared and cannot be recovered.
Additionally, add a test that verifies the ClearAll command properly resets both
the genre and beat fields back to their initial empty string values, confirming
that ClearAll clears these state fields as expected. Both tests should follow
the existing test pattern in the class using dispatch chains and shouldBe
assertions.

In `@frontend/src/app/ui/components/sequencer/sequencer.service.ts`:
- Around line 13-18: The state$ BehaviorSubject property in the SequencerService
is publicly writable, allowing callers to bypass the SequencerEngine invariants
and directly modify state, as demonstrated by the tests directly writing to it.
Make the state$ field private and expose a read-only observable interface to
callers by creating a public method or getter property that returns
state$.asObservable(). This ensures all state changes flow through the dispatch
method, maintaining consistency with the SequencerEngine.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 12364031-c8ae-4cc7-a104-628772b49983

📥 Commits

Reviewing files that changed from the base of the PR and between b8eaddc and 47080fc.

📒 Files selected for processing (30)
  • .github/actions/scala-test/action.yml
  • .github/workflows/angular-deploy-github-pages.yml
  • .github/workflows/tests.yml
  • README.md
  • engine/.gitignore
  • engine/.gitkeep
  • engine/build.sbt
  • engine/project/build.properties
  • engine/project/plugins.sbt
  • engine/src/main/scala/com/drumbeatrepo/sequencer/Command.scala
  • engine/src/main/scala/com/drumbeatrepo/sequencer/SequencerEngine.scala
  • engine/src/main/scala/com/drumbeatrepo/sequencer/SequencerState.scala
  • engine/src/test/scala/com/drumbeatrepo/sequencer/SequencerStateTest.scala
  • frontend/.gitignore
  • frontend/angular.json
  • frontend/eslint.config.mjs
  • frontend/src/app/domain/export-options/audio-export-options.ts
  • frontend/src/app/domain/export-options/midi-export-options.ts
  • frontend/src/app/infrastructure/adapters/audio-engine/audio-engine.adapter.ts
  • frontend/src/app/infrastructure/adapters/audio-export/audio-export.adapter.ts
  • frontend/src/app/infrastructure/adapters/utils/blob.utils.ts
  • frontend/src/app/ui/app.module.ts
  • frontend/src/app/ui/components/modals/export-audio-modal/export-audio-modal.component.spec.ts
  • frontend/src/app/ui/components/sequencer/sequencer.component.html
  • frontend/src/app/ui/components/sequencer/sequencer.component.spec.ts
  • frontend/src/app/ui/components/sequencer/sequencer.component.ts
  • frontend/src/app/ui/components/sequencer/sequencer.service.spec.ts
  • frontend/src/app/ui/components/sequencer/sequencer.service.ts
  • frontend/src/app/ui/router.spec.ts
  • frontend/src/types/engine.d.ts

Comment thread .github/actions/scala-test/action.yml
Comment thread .github/workflows/angular-deploy-github-pages.yml Outdated
Comment thread .github/workflows/angular-deploy-github-pages.yml
Comment thread engine/src/main/scala/com/drumbeatrepo/sequencer/Command.scala
Comment thread engine/src/main/scala/com/drumbeatrepo/sequencer/SequencerState.scala Outdated
Comment thread engine/src/main/scala/com/drumbeatrepo/sequencer/SequencerState.scala Outdated
Comment thread frontend/src/app/ui/components/sequencer/sequencer.component.html Outdated
Comment thread frontend/src/app/ui/components/sequencer/sequencer.component.ts
Comment thread README.md

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (2)
.github/workflows/angular-deploy-github-pages.yml (1)

24-24: ⚡ Quick win

Consider hardening checkout security.

Two security improvements recommended:

  1. Persist credentials: The GitHub token remains accessible in .git/config and can be used by subsequent steps. Setting persist-credentials: false limits token exposure.
  2. Pin to commit SHA: Using a mutable tag (@v6) instead of an immutable commit hash introduces supply chain risk—the tag could be moved to malicious code.
🔒 Proposed security hardening
     steps:
-      - uses: actions/checkout@v6
+      - uses: actions/checkout@1e31de5234b9f8995739874a8ce0492dc87873e2  # v6.0.0
+        with:
+          persist-credentials: false
 
       - uses: ./.github/actions/scala-test/
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/angular-deploy-github-pages.yml at line 24, The checkout
action at `actions/checkout@v6` needs two security hardening improvements:
First, add `persist-credentials: false` as a parameter to the action to prevent
the GitHub token from persisting in the `.git/config` file, which reduces token
exposure to subsequent steps. Second, replace the mutable tag `@v6` with the
immutable commit SHA of that specific version to eliminate supply chain risk and
ensure you are always using the exact version you intend rather than allowing
the tag to potentially point to malicious code in the future.

Source: Linters/SAST tools

frontend/src/app/ui/components/sequencer/sequencer.component.html (1)

27-27: ⚡ Quick win

Use consistent this. prefix in template expressions.

Line 27 omits this. while line 32 includes it. For consistency and clarity, either use this.sequencerService.dispatch in both places or omit this. in both (Angular supports either style).

✨ Suggested fix for consistency
-        <button class="button play-sample-button undo" (click)="sequencerService.dispatch({ type: 'UNDO'})">
+        <button class="button play-sample-button undo" (click)="this.sequencerService.dispatch({ type: 'UNDO'})">

Also applies to: 32-32

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/app/ui/components/sequencer/sequencer.component.html` at line
27, The template uses inconsistent prefix style for sequencerService.dispatch
calls. Line 27 omits the this. prefix while line 32 includes it. Update line 27
to add this. prefix before sequencerService.dispatch to match the style used on
line 32, ensuring all template expressions use the same consistent approach
throughout the sequencer component template.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In @.github/workflows/angular-deploy-github-pages.yml:
- Line 24: The checkout action at `actions/checkout@v6` needs two security
hardening improvements: First, add `persist-credentials: false` as a parameter
to the action to prevent the GitHub token from persisting in the `.git/config`
file, which reduces token exposure to subsequent steps. Second, replace the
mutable tag `@v6` with the immutable commit SHA of that specific version to
eliminate supply chain risk and ensure you are always using the exact version
you intend rather than allowing the tag to potentially point to malicious code
in the future.

In `@frontend/src/app/ui/components/sequencer/sequencer.component.html`:
- Line 27: The template uses inconsistent prefix style for
sequencerService.dispatch calls. Line 27 omits the this. prefix while line 32
includes it. Update line 27 to add this. prefix before sequencerService.dispatch
to match the style used on line 32, ensuring all template expressions use the
same consistent approach throughout the sequencer component template.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 7f1bd235-af3d-47d5-a6bb-7901e8fe863d

📥 Commits

Reviewing files that changed from the base of the PR and between 47080fc and baf18eb.

📒 Files selected for processing (4)
  • .github/workflows/angular-deploy-github-pages.yml
  • README.md
  • frontend/src/app/ui/components/sequencer/sequencer.component.html
  • frontend/src/app/ui/components/sequencer/sequencer.component.ts
✅ Files skipped from review due to trivial changes (1)
  • README.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • frontend/src/app/ui/components/sequencer/sequencer.component.ts

@Babali42 Babali42 merged commit cf76467 into main Jun 20, 2026
1 check passed
@Babali42 Babali42 deleted the add-engine branch June 20, 2026 10:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant