Skip to content

chore: migrate lint/format stack to OXC#11

Merged
KooshaPari merged 9 commits into
mainfrom
chore/oxc-migration-20260303-colab
Mar 5, 2026
Merged

chore: migrate lint/format stack to OXC#11
KooshaPari merged 9 commits into
mainfrom
chore/oxc-migration-20260303-colab

Conversation

@KooshaPari

@KooshaPari KooshaPari commented Mar 3, 2026

Copy link
Copy Markdown
Owner

Summary\n- migrate lint/format wiring to OXC stack (oxlint, oxfmt, tsgolint)\n- add OXC config files and remove biome/prettier/eslint surfaces where present\n- keep repo-native gates wired to the new stack\n\n## Validation\n- ran repo-native lint/format/quality commands in each lane\n- pre-existing debt and environment blockers are documented in lane notes

Summary by CodeRabbit

Release Notes

  • New Features

    • Added Git diff viewer and change tracking capabilities
    • Enhanced terminal input handling for better command interaction
    • Improved settings synchronization across the application
  • Chores

    • Configured automated CI/CD pipeline for code quality checks
    • Added linting and formatting tooling for development workflows
    • Updated development dependencies and scripts
  • Documentation

    • Added branch health reconciliation guide for repository management

Copilot AI review requested due to automatic review settings March 3, 2026 18:17
@coderabbitai

coderabbitai Bot commented Mar 3, 2026

Copy link
Copy Markdown

Warning

Rate limit exceeded

@KooshaPari has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 7 minutes and 16 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 0145129e-31b6-4bad-9fd9-f3254a41b9e0

📥 Commits

Reviewing files that changed from the base of the PR and between f02a96c and 5e01703.

📒 Files selected for processing (11)
  • .github/required-checks.txt
  • .github/workflows/build-release.yml
  • .github/workflows/ci.yml
  • .github/workflows/required-check-names-guard.yml
  • .gitignore
  • docs/branch-health-reconcile-2026-03-03.md
  • package.json
  • src/main/utils/terminalManager.ts
  • src/renderers/ivde/services/settingsSyncService.ts
  • src/renderers/ivde/slates/git/diff.ts
  • tsconfig.ci.json
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch chore/oxc-migration-20260303-colab

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.

@gemini-code-assist

Copy link
Copy Markdown

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request modernizes the project's code quality infrastructure by transitioning to the OXC linting and formatting tools, which streamlines the development workflow. It also includes significant internal refactorings to improve type safety and modularity in core functionalities, such as terminal process management and the handling of repository cloning events within the user interface. These changes aim to enhance code consistency, reduce potential errors, and provide a more robust foundation for future development.

Highlights

  • Linting and Formatting Migration: The project's linting and formatting stack has been migrated to the OXC ecosystem, incorporating oxlint, oxfmt, and tsgolint. This replaces previous tools like Biome, Prettier, and ESLint.
  • New Configuration Files: New configuration files (.oxfmtrc.json, .oxlintrc.json) have been added to define the rules and settings for the new linting and formatting tools.
  • Development Dependencies and Scripts Update: The package.json and bun.lock files have been updated to include the new OXC tools as development dependencies and to introduce new lint, format, and typecheck scripts.
  • Terminal Manager Type Safety Improvements: The TerminalManager utility has been refactored to enhance type safety, particularly for spawn process handling and I/O streams, by introducing specific types and type guards.
  • Repository Cloning Workflow Enhancement: A new utility (repoCloneWatcher.ts) was introduced to manage the asynchronous process of watching for cloned repositories and automatically opening relevant Git slates in the UI.
  • New Git and UI Type Definitions: Several new TypeScript type definitions have been added for Git-related data structures and UI components, improving code clarity and maintainability.
Changelog
  • .github/required-checks.txt
    • Added new CI checks for typecheck, lint, unit-tests, coverage, secret-scan, and ci-summary.
  • .gitignore
    • Added new ignore patterns for various AI tool artifacts and internal directories.
  • .oxfmtrc.json
    • Added configuration file for oxfmt with print width, tab settings, and ignore patterns.
  • .oxlintrc.json
    • Added configuration file for oxlint with schema, ignore patterns, plugins (eslint, typescript, unicorn, oxc, import, promise, vitest, jsdoc), environment settings, category severity, and rule overrides.
  • bun.lock
    • Updated bun.lock to include oxfmt, oxlint, and oxlint-tsgolint as dev dependencies and their respective platform-specific bindings.
  • docs/branch-health-reconcile-2026-03-03.md
    • Added a new document outlining a non-destructive branch health reconciliation plan with detailed Git steps for two repositories.
  • package.json
    • Updated development scripts and added new oxfmt, oxlint, and oxlint-tsgolint dev dependencies.
    • Added new typecheck, lint, lint:fix, format, format:check, and test scripts using tsc, oxlint, and oxfmt.
  • src/main/utils/terminalManager.ts
    • Updated TerminalSession interface to use ReturnType<typeof spawn> for process type.
    • Added TerminalMessage and TerminalMessageHandler types.
    • Introduced hasWrite and hasReader type guards.
    • Updated setMessageHandler and setWindowMessageHandler to use TerminalMessageHandler.
    • Updated process.env.SHELL access and spawn options casting.
  • src/renderers/ivde/index.tsx
    • Added /// <reference lib="dom" /> directive.
    • Imported new types and watchClonedRepoAndOpenGitSlate.
    • Updated type annotations for window.onbeforeunload, window.open, document.addEventListener("keydown"), githubAuthWebview, and analyticsStatus to be more specific.
    • Refactored repository cloning logic to use watchClonedRepoAndOpenGitSlate.
  • src/renderers/ivde/repoCloneWatcher.ts
    • Added a new utility to watch for cloned repositories and automatically open Git slates.
  • src/renderers/ivde/services/settingsSyncService.ts
    • Added /// <reference lib="dom" /> directive.
    • Defined new types SyncedTokenRpcRecord, PluginInstalledRpcRecord, TokensRpcResponse, and SettingsSyncRpcRequest for RPC interactions.
    • Updated gatherSyncableSettings and applySyncedSettings to use the new SettingsSyncRpcRequest type for RPC calls, removing any casts.
  • src/renderers/ivde/slates/git/diff.ts
    • Added a new utility for reading Git file contents and generating diffs.
  • src/renderers/ivde/slates/git/helpers.ts
    • Added a helper function to parse Git status lines.
  • src/renderers/ivde/slates/git/spinner.ts
    • Added a utility to ensure CSS keyframes for a spinner animation are present.
  • src/renderers/ivde/slates/git/types.ts
    • Added new TypeScript types for Git-related data structures.
  • src/renderers/ivde/types/ui.ts
    • Added new TypeScript types for UI components and analytics status.
  • tsconfig.json
    • Relaxed TypeScript strictness for unused locals, parameters, and property access from index signatures by setting them to false.
Ignored Files
  • Ignored by pattern: .github/workflows/** (3)
    • .github/workflows/build-release.yml
    • .github/workflows/ci.yml
    • .github/workflows/required-check-names-guard.yml
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Code Review

This pull request successfully migrates the project's linting and formatting stack to OXC, which is a significant undertaking. The changes include new configurations, updated dependencies, and numerous code improvements to align with the new tooling. I'm particularly impressed with the widespread adoption of stricter TypeScript types, which greatly enhances code quality and maintainability. My review includes a couple of suggestions: one for cleaning up a redundant entry in the .gitignore file, and a more important one regarding the disabling of some strict TypeScript compiler options that could affect long-term code quality.

Note: Security Review did not run due to the size of the PR.

Comment thread tsconfig.json Outdated
Comment on lines +27 to +29
"noUnusedLocals": false,
"noUnusedParameters": false,
"noPropertyAccessFromIndexSignature": false

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

high

Disabling noUnusedLocals, noUnusedParameters, and noPropertyAccessFromIndexSignature can reduce code quality and hide potential bugs. While this might be a temporary measure for the migration, it's best to keep these strict checks enabled and fix the reported issues. If that's not feasible right now, consider adding a // TODO: comment to track re-enabling these flags in the future.

Suggested change
"noUnusedLocals": false,
"noUnusedParameters": false,
"noPropertyAccessFromIndexSignature": false
"noUnusedLocals": true,
"noUnusedParameters": true,
"noPropertyAccessFromIndexSignature": true

Comment thread .gitignore
.roo/
.amazonq/
.github/copilot/
.kittify/.dashboard

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The entry .kittify/.dashboard is redundant because the more general .kittify/ entry on line 27 already covers this path. To keep the .gitignore file clean and maintainable, you can remove this line.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Migrates the repo’s lint/format/typecheck plumbing to the OXC toolchain (oxlint/oxfmt/tsgolint), updates CI to run the new gates, and includes some refactors/typing improvements in the renderer and main process to align with the new stricter tooling.

Changes:

  • Add OXC configs and update package.json scripts to use oxlint/oxfmt and tsc --noEmit.
  • Introduce a new CI workflow (plus required-check name guard + manifest) to enforce the new lanes.
  • Refactor/introduce git-slate helper modules and small typing/utilities (repo clone watcher, terminal manager, UI types).

Reviewed changes

Copilot reviewed 17 out of 21 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
tsconfig.json Relaxes several TS “stricter flags” (unused locals/params, index signature access).
src/renderers/ivde/types/ui.ts Adds shared UI-related types used by the renderer.
src/renderers/ivde/slates/git/types.ts Introduces typed shapes for git slate UI state and git change records.
src/renderers/ivde/slates/git/spinner.ts Adds helper to inject spinner keyframes into the document.
src/renderers/ivde/slates/git/helpers.ts Adds parsing helper for git status output lines.
src/renderers/ivde/slates/git/diff.ts Adds a content reader/diff helper for working tree/index/commit comparisons.
src/renderers/ivde/services/settingsSyncService.ts Adds RPC request typing + replaces (electrobun.rpc as any) with a typed request alias.
src/renderers/ivde/repoCloneWatcher.ts Extracts repo clone polling logic into a dedicated helper.
src/renderers/ivde/index.tsx Uses new repo clone watcher + improves typing for DOM/webview/analytics status.
src/main/utils/terminalManager.ts Improves typing around spawn and PTY IO + adds guards for writable/readable streams.
package.json Wires new scripts (lint, format, typecheck, test) and adds OXC devDependencies.
docs/branch-health-reconcile-2026-03-03.md Adds a branch reconciliation plan document.
bun.lock Locks new OXC toolchain dependencies.
.oxlintrc.json Adds oxlint configuration (rules/plugins/overrides).
.oxfmtrc.json Adds oxfmt configuration.
.gitignore Ignores various AI tool artifacts/config directories.
.github/workflows/required-check-names-guard.yml Adds workflow to verify required check names exist.
.github/workflows/ci.yml Adds CI workflow for typecheck/lint/tests/coverage/secret scan + summary job.
.github/workflows/build-release.yml Makes Zig vendor path detection tolerant of legacy vendor/zig path.
.github/required-checks.txt Adds manifest of required check names used by the guard workflow.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +7 to +13
- `/Users/kooshapari/CodeProjects/Phenotype/repos/heliosApp-colab`
- `HEAD` vs `origin/main`: ahead 1, behind 8
- `HEAD` vs `upstream/main`: ahead 1, behind 0
- `/Users/kooshapari/CodeProjects/Phenotype/repos/heliosApp`
- `HEAD` (`heliosapp-upstream-recon`) vs `upstream/main`: ahead 9, behind 0
- `HEAD` vs `origin/main`: ahead 13, behind 510

Copilot AI Mar 3, 2026

Copy link

Choose a reason for hiding this comment

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

This new doc includes absolute local filesystem paths (e.g. /Users/...) and personal branch context. That isn’t portable documentation and can leak developer-specific environment details into the repo. Consider rewriting it to use generic placeholders (e.g. /path/to/repo) and focusing on repo-agnostic steps, or keep it out of version control if it’s purely personal notes.

Copilot uses AI. Check for mistakes.
Comment thread src/renderers/ivde/index.tsx Outdated
Comment on lines +1013 to +1020
const [analyticsStatus, setAnalyticsStatus] = createSignal<AnalyticsStatus>({
enabled: false,
level: "Community",
isAnonymous: true,
hasToken: false,
userOptedIn: false,
userHasBeenPrompted: false,
});

Copilot AI Mar 3, 2026

Copy link

Choose a reason for hiding this comment

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

There’s an extra indentation level before const [analyticsStatus, ...] which makes this block misaligned with surrounding code and may violate formatter expectations. Running oxfmt (or adjusting the indentation) should align it with the other const declarations in GlobalSettings.

Suggested change
const [analyticsStatus, setAnalyticsStatus] = createSignal<AnalyticsStatus>({
enabled: false,
level: "Community",
isAnonymous: true,
hasToken: false,
userOptedIn: false,
userHasBeenPrompted: false,
});
const [analyticsStatus, setAnalyticsStatus] = createSignal<AnalyticsStatus>({
enabled: false,
level: "Community",
isAnonymous: true,
hasToken: false,
userOptedIn: false,
userHasBeenPrompted: false,
});

Copilot uses AI. Check for mistakes.
Comment on lines +4 to +15
if (document.getElementById(SPINNER_STYLE_ID)) {
return;
}
const style = document.createElement("style");
style.id = SPINNER_STYLE_ID;
style.innerHTML = `
@keyframes spinner-rotate {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
`;
document.head.appendChild(style);

Copilot AI Mar 3, 2026

Copy link

Choose a reason for hiding this comment

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

This file uses tab indentation on several lines, but .oxfmtrc.json is configured with useTabs: false. Running bun run format (or converting tabs to spaces) will keep formatting consistent and avoid churn in future formatting runs.

Suggested change
if (document.getElementById(SPINNER_STYLE_ID)) {
return;
}
const style = document.createElement("style");
style.id = SPINNER_STYLE_ID;
style.innerHTML = `
@keyframes spinner-rotate {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
`;
document.head.appendChild(style);
if (document.getElementById(SPINNER_STYLE_ID)) {
return;
}
const style = document.createElement("style");
style.id = SPINNER_STYLE_ID;
style.innerHTML = `
@keyframes spinner-rotate {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
`;
document.head.appendChild(style);

Copilot uses AI. Check for mistakes.
Comment on lines +4 to +66
options: string[];
repoRoot: string;
}) => Promise<string | undefined>;
export type FileExistsRequest = (args: {
path: string;
}) => Promise<boolean | undefined>;
export type ReadFileRequest = (args: {
path: string;
}) => Promise<{ textContent?: string } | undefined>;

type GetFileDiffArgs = {
filepath: string;
commitHash?: string;
changeType?: string;
isStaged?: boolean;
};

type FileContentRequests = {
gitShow?: GitShowRequest;
exists?: FileExistsRequest;
readFile?: ReadFileRequest;
};

export const createGitContentReader = (
repoRootPath: string,
requests: FileContentRequests,
) => {
const getFileContents = async (filepath: string, commitRef = "HEAD") => {
if (commitRef === "WORKING") {
const absolutePath = join(repoRootPath, filepath);
const exists = await requests.exists?.({ path: absolutePath });
if (!exists) {
return "";
}
const result = await requests.readFile?.({ path: absolutePath });
return result?.textContent || "";
}
if (commitRef === "INDEX") {
const content = await requests
.gitShow?.({
options: [`:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
}
if (commitRef !== "HEAD") {
const content = await requests
.gitShow?.({
options: [`${commitRef}:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
}
const content = await requests
.gitShow?.({
options: [`HEAD:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
};

Copilot AI Mar 3, 2026

Copy link

Choose a reason for hiding this comment

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

This new file uses tab indentation (e.g. in the exported type definitions and function bodies) while .oxfmtrc.json is configured with useTabs: false. Running bun run format will normalize this and prevent formatting-only diffs later.

Suggested change
options: string[];
repoRoot: string;
}) => Promise<string | undefined>;
export type FileExistsRequest = (args: {
path: string;
}) => Promise<boolean | undefined>;
export type ReadFileRequest = (args: {
path: string;
}) => Promise<{ textContent?: string } | undefined>;
type GetFileDiffArgs = {
filepath: string;
commitHash?: string;
changeType?: string;
isStaged?: boolean;
};
type FileContentRequests = {
gitShow?: GitShowRequest;
exists?: FileExistsRequest;
readFile?: ReadFileRequest;
};
export const createGitContentReader = (
repoRootPath: string,
requests: FileContentRequests,
) => {
const getFileContents = async (filepath: string, commitRef = "HEAD") => {
if (commitRef === "WORKING") {
const absolutePath = join(repoRootPath, filepath);
const exists = await requests.exists?.({ path: absolutePath });
if (!exists) {
return "";
}
const result = await requests.readFile?.({ path: absolutePath });
return result?.textContent || "";
}
if (commitRef === "INDEX") {
const content = await requests
.gitShow?.({
options: [`:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
}
if (commitRef !== "HEAD") {
const content = await requests
.gitShow?.({
options: [`${commitRef}:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
}
const content = await requests
.gitShow?.({
options: [`HEAD:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
};
options: string[];
repoRoot: string;
}) => Promise<string | undefined>;
export type FileExistsRequest = (args: {
path: string;
}) => Promise<boolean | undefined>;
export type ReadFileRequest = (args: {
path: string;
}) => Promise<{ textContent?: string } | undefined>;
type GetFileDiffArgs = {
filepath: string;
commitHash?: string;
changeType?: string;
isStaged?: boolean;
};
type FileContentRequests = {
gitShow?: GitShowRequest;
exists?: FileExistsRequest;
readFile?: ReadFileRequest;
};
export const createGitContentReader = (
repoRootPath: string,
requests: FileContentRequests,
) => {
const getFileContents = async (filepath: string, commitRef = "HEAD") => {
if (commitRef === "WORKING") {
const absolutePath = join(repoRootPath, filepath);
const exists = await requests.exists?.({ path: absolutePath });
if (!exists) {
return "";
}
const result = await requests.readFile?.({ path: absolutePath });
return result?.textContent || "";
}
if (commitRef === "INDEX") {
const content = await requests
.gitShow?.({
options: [`:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
}
if (commitRef !== "HEAD") {
const content = await requests
.gitShow?.({
options: [`${commitRef}:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
}
const content = await requests
.gitShow?.({
options: [`HEAD:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
};

Copilot uses AI. Check for mistakes.
Comment thread src/renderers/ivde/slates/git/types.ts Outdated
@@ -0,0 +1,69 @@
export type GitChangeCode = "A" | "M" | "D" | "?" | "";

Copilot AI Mar 3, 2026

Copy link

Choose a reason for hiding this comment

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

GitChangeCode is currently limited to "A" | "M" | "D" | "?" | "", but git status / --name-status can emit additional codes (e.g. R rename, C copy, U unmerged, etc.). Since the rest of the git UI appears to pass through file.index.trim()/file.status values, this type is likely to become inaccurate quickly. Consider expanding the union (or explicitly mapping unknown codes to a dedicated "?"/"unknown" value) so the types reflect real inputs.

Suggested change
export type GitChangeCode = "A" | "M" | "D" | "?" | "";
export type GitChangeCode = "A" | "M" | "D" | "R" | "C" | "U" | "T" | "?" | "!" | "";

Copilot uses AI. Check for mistakes.
Comment on lines +42 to +64
const content = await requests
.gitShow?.({
options: [`:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
}
if (commitRef !== "HEAD") {
const content = await requests
.gitShow?.({
options: [`${commitRef}:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
}
const content = await requests
.gitShow?.({
options: [`HEAD:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");

Copilot AI Mar 3, 2026

Copy link

Choose a reason for hiding this comment

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

requests.gitShow?.(...) can evaluate to undefined, but the code then unconditionally calls .catch(...) on the result. If gitShow is not provided this will throw at runtime (TypeError: cannot read properties of undefined). Consider storing the promise in a variable and using optional chaining on the promise (const p = requests.gitShow?.(...); const content = await p?.catch(...)) or branching when the request is missing.

Suggested change
const content = await requests
.gitShow?.({
options: [`:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
}
if (commitRef !== "HEAD") {
const content = await requests
.gitShow?.({
options: [`${commitRef}:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
}
const content = await requests
.gitShow?.({
options: [`HEAD:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
const gitShowPromise = requests.gitShow?.({
options: [`:${filepath}`],
repoRoot: repoRootPath,
});
const content = await gitShowPromise?.catch(() => "");
return content || "";
}
if (commitRef !== "HEAD") {
const gitShowPromise = requests.gitShow?.({
options: [`${commitRef}:${filepath}`],
repoRoot: repoRootPath,
});
const content = await gitShowPromise?.catch(() => "");
return content || "";
}
const gitShowPromise = requests.gitShow?.({
options: [`HEAD:${filepath}`],
repoRoot: repoRootPath,
});
const content = await gitShowPromise?.catch(() => "");

Copilot uses AI. Check for mistakes.
Comment thread src/renderers/ivde/repoCloneWatcher.ts Outdated
Comment on lines +5 to +19
type RepoCloneWatcherArgs = {
previewNode: FileNodeType;
onExpandRepo: (repoPath: string) => void;
onOpenGitSlate: (gitPath: string) => void;
};

const POLL_INTERVAL_MS = 500;
const MAX_REPO_POLL_ATTEMPTS = 20;
const MAX_GIT_POLL_ATTEMPTS = 20;

export const watchClonedRepoAndOpenGitSlate = ({
previewNode,
onExpandRepo,
onOpenGitSlate,
}: RepoCloneWatcherArgs): void => {

Copilot AI Mar 3, 2026

Copy link

Choose a reason for hiding this comment

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

This file uses tab indentation in the new code, but .oxfmtrc.json sets useTabs: false. Consider running bun run format so the new utility matches the repo’s formatting configuration.

Copilot uses AI. Check for mistakes.
Comment on lines 216 to 221
for (const plugin of settings.plugins) {
try {
// Check if plugin is already installed
const installedPlugins = await (electrobun.rpc as any)?.request.pluginGetInstalled?.();
const isInstalled = installedPlugins?.some((p: any) => p.name === plugin.name);
const installedPlugins = await request?.pluginGetInstalled?.();
const isInstalled = installedPlugins?.some((p) => p.name === plugin.name);

Copilot AI Mar 3, 2026

Copy link

Choose a reason for hiding this comment

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

applySyncedSettings calls pluginGetInstalled inside the loop for every plugin being synced. That can create an avoidable N+1 RPC pattern. Consider fetching the installed plugins list once before the loop and reusing it (or updating it locally when you install a missing plugin).

Copilot uses AI. Check for mistakes.
@KooshaPari

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Mar 4, 2026

Copy link
Copy Markdown
✅ Actions performed

Full review triggered.

@KooshaPari

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Mar 4, 2026

Copy link
Copy Markdown
✅ Actions performed

Full review triggered.

@KooshaPari

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Mar 5, 2026

Copy link
Copy Markdown
✅ Actions performed

Full review triggered.

@KooshaPari

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Mar 5, 2026

Copy link
Copy Markdown
✅ Actions performed

Full review triggered.

@KooshaPari

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Mar 5, 2026

Copy link
Copy Markdown
✅ Actions performed

Full review triggered.

@KooshaPari

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Mar 5, 2026

Copy link
Copy Markdown
✅ Actions performed

Full review triggered.

KooshaPari and others added 7 commits March 4, 2026 22:35
Co-authored-by: Codex <noreply@openai.com>
- fix Zig vendor path drift in build-release workflow
- add PR CI jobs for typecheck, lint, unit tests, and ci-summary
- add required-checks manifest and guard workflow
- add branch health reconciliation runbook for heliosApp and heliosApp-colab

Co-authored-by: Codex <noreply@openai.com>
Use 'bun test --pass-with-no-tests' so baseline PR CI stays actionable while test suites are introduced.

Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
…minal services

Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
Slice 3 reduces concrete TypeScript errors in src/renderers/ivde/services/settingsSyncService.ts (9->0) and src/main/utils/terminalManager.ts (33->10) with targeted lib/type references and explicit exit callback typing.

Co-authored-by: Codex <noreply@openai.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 13

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/renderers/ivde/services/settingsSyncService.ts (1)

215-240: ⚠️ Potential issue | 🟡 Minor

Redundant RPC call inside loop degrades performance.

pluginGetInstalled is called inside the loop at Line 219 for every plugin being synced. This results in O(n) RPC calls where a single call before the loop would suffice.

🔧 Proposed fix to hoist RPC call outside loop
   // Install/update plugins
   if (settings.plugins && settings.plugins.length > 0) {
+    const installedPlugins = await request?.pluginGetInstalled?.() ?? [];
     for (const plugin of settings.plugins) {
       try {
         // Check if plugin is already installed
-        const installedPlugins = await request?.pluginGetInstalled?.();
         const isInstalled = installedPlugins?.some((p) => p.name === plugin.name);

         if (!isInstalled) {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/renderers/ivde/services/settingsSyncService.ts` around lines 215 - 240,
The code calls request.pluginGetInstalled repeatedly inside the for loop causing
redundant RPCs; hoist that call outside the loop by invoking
request.pluginGetInstalled once (guarding request and the method) and store the
result in a local installedPlugins variable, then inside the loop use
installedPlugins.some(...) to compute isInstalled; keep the existing calls to
request.pluginInstall, request.pluginSetSettingValue, and
request.pluginSetEnabled and the existing try/catch per plugin but remove
pluginGetInstalled from inside the loop.
src/main/utils/terminalManager.ts (1)

279-292: ⚠️ Potential issue | 🟠 Major

Reader cleanup path is currently broken by registration order.

At Line 288, reader refs are saved via this.terminals.get(terminalId), but createTerminal calls readPtyOutput before inserting the session (Line 226 before Line 246). In that flow, stdoutReader/stderrReader stay unset and cleanupReaders cannot cancel them reliably.

Suggested fix
-    // Handle PTY output
-    this.readPtyOutput(proc, terminalId);
-
     // Handle process exit
     proc.exited.then((exitCode: number) => {
@@
-    this.terminals.set(terminalId, terminal);
+    this.terminals.set(terminalId, terminal);
+
+    // Handle PTY output after session registration so reader refs are persisted
+    this.readPtyOutput(proc, terminalId);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/utils/terminalManager.ts` around lines 279 - 292, readPtyOutput is
saving stdoutReader/stderrReader into this.terminals.get(terminalId) but
createTerminal calls readPtyOutput before inserting the session, so the readers
are never stored and cleanupReaders cannot cancel them; fix by ensuring the
terminal session exists before readPtyOutput tries to store readers—either
insert the session into this.terminals prior to calling readPtyOutput in
createTerminal, or change readPtyOutput to lookup-or-create the terminal entry
(e.g., get or set a TerminalSession object) and then assign
terminal.stdoutReader/terminal.stderrReader so cleanupReaders can always find
and cancel the readers.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/build-release.yml:
- Around line 118-132: The success log prints the legacy path because after
creating the symlink the script sets ZIG_DIR="vendor/zig"; update the branch
that handles the legacy path so ZIG_DIR is set to the canonical vendors/zig (or
otherwise normalize ZIG_DIR to vendors/zig before the echo), and ensure the
final echo uses the normalized ZIG_DIR variable so the message reports the
canonical path; reference the ZIG_DIR variable and the legacy-path branch where
the symlink is created/ln -sfn.

In @.github/workflows/ci.yml:
- Around line 22-25: The CI workflow's Setup Bun step currently uses the
variable value bun-version: latest which causes non-reproducible builds; change
the `Setup Bun` step (the action using oven-sh/setup-bun@v2 and the
`bun-version` input) to pin a specific Bun version or range (for example `1.1.x`
or a concrete patch like `1.1.8`) instead of `latest` so CI runs remain stable
and reproducible.
- Around line 33-36: The lint job currently lists needs: [typecheck] making it
run serially; remove that dependency from the lint job (delete needs:
[typecheck]) so lint and typecheck can run in parallel, and update the
unit-tests job to depend on both checks by setting its needs to include both
typecheck and lint (e.g., needs: [typecheck, lint]) so unit-tests and then
coverage still run after both finish.

In @.github/workflows/required-check-names-guard.yml:
- Around line 48-51: The script exits on failure but never emits a success
message or explicitly confirms completion; after the existing if ... fi block
that checks the variable "missing" add an echo to confirm success (e.g., echo
"Required check name guard passed: all required names present.") and ensure the
workflow file is properly closed so the job/step YAML structure ends cleanly;
locate the if block that references the variable "missing" and append the
success echo and any needed closing YAML statements to terminate the workflow.

In @.oxlintrc.json:
- Around line 138-146: The TS lint config currently disables important async
safety rules; re-enable at least "typescript/no-floating-promises" and
"typescript/no-misused-promises" (and consider "typescript/await-thenable") by
changing them from "off" to "warn" or "error", and if existing legacy code
prevents a full flip, create targeted "overrides" for specific legacy file globs
to keep them off while turning the rules back on globally; also add a short
migration TODO (or issue) tracking re-enablement progress so teams can fix
violations incrementally.

In `@docs/branch-health-reconcile-2026-03-03.md`:
- Around line 24-53: Fenced code blocks using the triple-backtick markers (e.g.,
```bash) in the numbered steps are not surrounded by blank lines; update each
fenced block so there is a blank line before the opening ``` and a blank line
after the closing ``` throughout the document (this includes the examples under
steps 1–6 and the fallback block), ensuring list items and surrounding text
maintain a single blank line separation to satisfy MD031.

In `@package.json`:
- Around line 67-69: The package.json lists non-existent versions for oxlint and
oxlint-tsgolint which will break installs; update the dependency versions for
"oxlint" and "oxlint-tsgolint" to valid npm releases (e.g., set "oxlint" to
1.43.0 and "oxlint-tsgolint" to 0.11.4) while keeping "oxfmt" at 0.36.0, then
run npm install (or yarn) and verify package-lock.json / yarn.lock is updated;
ensure the changes are made to the dependencies block where "oxfmt", "oxlint",
and "oxlint-tsgolint" are declared.

In `@src/main/utils/terminalManager.ts`:
- Around line 20-22: The TerminalMessage type declares terminalExit.signal as a
number but the code always emits 0, which conflates “no signal info” with a real
signal; change the TerminalMessage union so terminalExit.signal is number | null
(or undefined) to represent unknown signals, then update the emitter that
constructs terminalExit (the code that currently hardcodes 0) to set signal to
the actual child/OS signal if present (e.g., from the child process's signal
code/termination info) or to null when unknown; also update any consumers of
TerminalMessage/terminalExit to handle the nullable signal value accordingly.

In `@src/renderers/ivde/repoCloneWatcher.ts`:
- Around line 28-41: The console.log debugging inside openGitSlateWhenReady
(which prints gitPollAttempts, gitNode presence, "Opening git slate for:" with
gitFolderPath, and the timeout message) should be removed or gated behind a
debug flag/logger; update the function to either remove these console.log calls
or replace them with a conditional debug/logger check (e.g., a DEBUG/VERBOSE env
flag or a renderer-level logger.debug) so logs only emit when enabled, keeping
behavior of invoking onOpenGitSlate(gitFolderPath),
setTimeout(openGitSlateWhenReady, POLL_INTERVAL_MS) and the
MAX_GIT_POLL_ATTEMPTS logic unchanged.
- Around line 15-66: The polling logic in watchClonedRepoAndOpenGitSlate
(functions expandWhenReady, pollForGitDirectory, openGitSlateWhenReady) has no
cleanup for setTimeout — add cancellation: store each setTimeout ID (for both
repo and git polls) in scoped variables, set a "cancelled" flag when cleanup
runs, clearTimeout for any pending IDs, and short-circuit handlers
(expandWhenReady/openGitSlateWhenReady) if cancelled to avoid calling
onExpandRepo/onOpenGitSlate after unmount; finally change
watchClonedRepoAndOpenGitSlate to return a cleanup function that performs the
clearing and sets the flag so callers can cancel polling.

In `@src/renderers/ivde/slates/git/diff.ts`:
- Around line 50-66: The code duplicates gitShow calls for the HEAD and non-HEAD
cases; collapse them by building a single refSpec and calling requests.gitShow
once. Concretely, compute const refSpec = `${commitRef}:${filepath}` (or use
commitRef ?? "HEAD" if commitRef can be undefined) and call requests.gitShow?.({
options: [refSpec], repoRoot: repoRootPath }).catch(() => "") and return the
result || "". Update the block that currently branches on commitRef !== "HEAD"
to this single unified implementation referencing commitRef, filepath,
repoRootPath, and requests.gitShow.

In `@src/renderers/ivde/slates/git/types.ts`:
- Line 1: GitChangeCode's union is incomplete and is being bypassed by a type
assertion in the helper (the cast to "as GitChangeCode" in helpers.ts), so
either expand the GitChangeCode type to include the missing git status codes
("R", "C", "U", "T") or remove the assertion and add explicit validation/mapping
in the helper that returns the existing fallback ("" or default behavior) for
unknown codes; update the helper (the function that currently does the "as
GitChangeCode" cast) to perform a safe runtime check (e.g., switch or lookup)
against the allowed GitChangeCode values and only return a typed GitChangeCode
for known codes while handling unknowns explicitly.

In `@tsconfig.json`:
- Around line 27-29: The TypeScript strictness flags noUnusedLocals,
noUnusedParameters, and noPropertyAccessFromIndexSignature were relaxed; add a
concise technical-debt note and tracking entry: insert a TODO comment near the
three flags referencing a short ticket/issue ID (or create one) to re-enable
noUnusedLocals, noUnusedParameters, and noPropertyAccessFromIndexSignature after
lint/format migration stabilizes, and create the corresponding task in your
issue tracker with acceptance criteria for re-enabling and fixing resulting
errors.

---

Outside diff comments:
In `@src/main/utils/terminalManager.ts`:
- Around line 279-292: readPtyOutput is saving stdoutReader/stderrReader into
this.terminals.get(terminalId) but createTerminal calls readPtyOutput before
inserting the session, so the readers are never stored and cleanupReaders cannot
cancel them; fix by ensuring the terminal session exists before readPtyOutput
tries to store readers—either insert the session into this.terminals prior to
calling readPtyOutput in createTerminal, or change readPtyOutput to
lookup-or-create the terminal entry (e.g., get or set a TerminalSession object)
and then assign terminal.stdoutReader/terminal.stderrReader so cleanupReaders
can always find and cancel the readers.

In `@src/renderers/ivde/services/settingsSyncService.ts`:
- Around line 215-240: The code calls request.pluginGetInstalled repeatedly
inside the for loop causing redundant RPCs; hoist that call outside the loop by
invoking request.pluginGetInstalled once (guarding request and the method) and
store the result in a local installedPlugins variable, then inside the loop use
installedPlugins.some(...) to compute isInstalled; keep the existing calls to
request.pluginInstall, request.pluginSetSettingValue, and
request.pluginSetEnabled and the existing try/catch per plugin but remove
pluginGetInstalled from inside the loop.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: cc1346d1-7328-4dd7-a33b-553d55ad2163

📥 Commits

Reviewing files that changed from the base of the PR and between f02a96c and 3aba65a.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
📒 Files selected for processing (20)
  • .github/required-checks.txt
  • .github/workflows/build-release.yml
  • .github/workflows/ci.yml
  • .github/workflows/required-check-names-guard.yml
  • .gitignore
  • .oxfmtrc.json
  • .oxlintrc.json
  • docs/branch-health-reconcile-2026-03-03.md
  • package.json
  • src/main/utils/terminalManager.ts
  • src/renderers/ivde/index.tsx
  • src/renderers/ivde/repoCloneWatcher.ts
  • src/renderers/ivde/services/settingsSyncService.ts
  • src/renderers/ivde/slates/GitSlate.tsx
  • src/renderers/ivde/slates/git/diff.ts
  • src/renderers/ivde/slates/git/helpers.ts
  • src/renderers/ivde/slates/git/spinner.ts
  • src/renderers/ivde/slates/git/types.ts
  • src/renderers/ivde/types/ui.ts
  • tsconfig.json
📜 Review details
🧰 Additional context used
🪛 ast-grep (0.41.0)
src/renderers/ivde/slates/git/spinner.ts

[warning] 8-13: Direct HTML content assignment detected. Modifying innerHTML, outerHTML, or using document.write with unsanitized content can lead to XSS vulnerabilities. Use secure alternatives like textContent or sanitize HTML with libraries like DOMPurify.
Context: style.innerHTML = @Keyframesspinner-rotate { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
Note: [CWE-79] Improper Neutralization of Input During Web Page Generation [REFERENCES]
- https://www.dhairyashah.dev/posts/why-innerhtml-is-a-bad-idea-and-how-to-avoid-it/
- https://cwe.mitre.org/data/definitions/79.html

(unsafe-html-content-assignment)


[warning] 8-13: Direct modification of innerHTML or outerHTML properties detected. Modifying these properties with unsanitized user input can lead to XSS vulnerabilities. Use safe alternatives or sanitize content first.
Context: style.innerHTML = @Keyframesspinner-rotate { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
Note: [CWE-79] Improper Neutralization of Input During Web Page Generation [REFERENCES]
- https://owasp.org/www-community/xss-filter-evasion-cheatsheet
- https://cwe.mitre.org/data/definitions/79.html

(dom-content-modification)

🪛 markdownlint-cli2 (0.21.0)
docs/branch-health-reconcile-2026-03-03.md

[warning] 25-25: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 28-28: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 30-30: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 32-32: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 34-34: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 36-36: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 38-38: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 41-41: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 43-43: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 45-45: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 49-49: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 58-58: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 62-62: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 64-64: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 67-67: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 69-69: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 71-71: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 73-73: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 75-75: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 78-78: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 81-81: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)

🔇 Additional comments (24)
.gitignore (2)

12-18: Good cleanup of local AI-tool artifacts.

These ignore entries are consistent with keeping ephemeral local tooling output out of version control.

Also applies to: 22-28, 31-32


19-20: No action needed. The .github/copilot/, .github/prompts/, and .github/copilot-instructions.md entries are clearly AI tool artifacts, not repository documentation or intentionally versioned content. No tracked files currently exist in these paths, and the ignore rules are appropriate for excluding tool-specific configurations.

.oxfmtrc.json (1)

1-15: LGTM!

The oxfmt configuration is well-structured with sensible defaults (100 char width, 2-space indentation) and comprehensive ignore patterns that align with the project's build artifacts and vendor directories.

src/renderers/ivde/types/ui.ts (1)

1-16: LGTM!

These types provide incremental type safety improvements for webview interactions and analytics state management. The types match their usage in index.tsx and related files.

Consider expanding ReloadableWebviewElement in the future to include other webview methods (goBack, goForward, etc.) as seen in WebSlate.tsx Line 233-241, allowing replacement of the any type annotation there.

.oxlintrc.json (1)

1-171: Configuration is well-structured for the OXC migration.

The ignore patterns, plugin selection, and category severities are sensible. The test file overrides appropriately relax rules for testing contexts. The configuration provides a solid foundation that can be incrementally tightened.

package.json (1)

67-69: No changes needed. The oxlint-tsgolint dependency is an optional peer dependency of oxlint (as specified in oxlint's peerDependencies), not an unused dependency. Optional peer dependencies provide enhancements when installed but do not require explicit configuration in .oxlintrc.json. It is correctly included in the project.

			> Likely an incorrect or invalid review comment.
src/renderers/ivde/services/settingsSyncService.ts (3)

12-38: RPC type definitions diverge from canonical schema.

The local RPC types don't match the actual RPC definitions:

  1. PluginInstalledRpcRecord omits state, installedAt, updatedAt, isLocal, localPath fields present in the actual RPC schema (see src/renderers/ivde/rpc.ts:756-770).

  2. pluginGetSettingsValues response is typed as Record<string, unknown> but the actual RPC returns Record<string, string | number | boolean> - the local type is more permissive.

  3. pluginInstall returns Promise<unknown> but the actual response contains { ok: boolean; plugin?: {...}; error?: string } - errors aren't being checked.

Consider aligning these types with the canonical RPC schema or importing directly from the RPC definitions to avoid drift.

[suggest_recommended_refactor, request_verification]

#!/bin/bash
# Check if there are existing shared RPC types that could be imported
rg -l "pluginGetInstalled|pluginInstall|pluginGetSettingsValues" --type=ts | head -10

104-139: LGTM!

The token gathering logic with optional chaining and try/catch error handling is appropriate for graceful degradation when RPC is unavailable.


141-168: LGTM!

Plugin gathering with graceful error handling is well-structured. The empty catch block for settings fetch errors is acceptable given the explicit comment documenting the intent.

.github/required-checks.txt (1)

1-8: LGTM!

The required checks manifest is well-structured with clear pipe-delimited format. The self-referential entry for verify-required-check-names ensures the guard workflow validates itself.

src/renderers/ivde/slates/git/spinner.ts (1)

1-16: LGTM!

The static analysis warning about innerHTML is a false positive here. The CSS content is a hardcoded string literal with no user input, so there's no XSS risk. This is a standard pattern for dynamically injecting CSS keyframes.

.github/workflows/ci.yml (1)

104-129: LGTM!

The ci-summary job properly aggregates results and fails if any required job didn't succeed. The if: always() ensures it runs even on failures to provide a comprehensive status.

src/renderers/ivde/index.tsx (4)

1-2: LGTM!

The DOM reference directive ensures proper DOM type availability for this renderer module.


3837-3841: LGTM!

Clean extraction of clone-watching logic to watchClonedRepoAndOpenGitSlate. The callback pattern provides good separation of concerns.


1013-1020: LGTM!

The AnalyticsStatus type properly replaces generic any usage, providing type safety for analytics state and component props.

Also applies to: 1181-1181


568-570: LGTM!

The minimal interface type for githubAuthWebview appropriately exposes only the addEventListener method that's actually used, following interface segregation principles.

src/renderers/ivde/slates/git/diff.ts (1)

68-131: LGTM!

The getFileDiff method correctly implements Git diff semantics:

  • Staged changes compare HEAD → INDEX
  • Unstaged changes compare INDEX → WORKING
  • Added files have empty original text
  • Deleted files have empty modified text
  • Commit diffs correctly use commitHash^ for the parent

The parallel fetching via Promise.all is a good optimization.

src/renderers/ivde/slates/git/helpers.ts (1)

5-12: The parseStatusLine function is imported but never actually used in the codebase.

While the review raises a theoretically valid concern about renamed file handling (R old_path -> new_path), the function itself is dead code. The actual file status parsing in GitSlate.tsx uses manual parsing with split("\t") instead of calling parseStatusLine. No refactoring is needed for an unused function, and the suggested diff improvement is not applicable to the actual code flow.

			> Likely an incorrect or invalid review comment.
src/renderers/ivde/slates/git/types.ts (4)

3-13: LGTM!

Clean type definitions with proper extension pattern for FileChangeWithCommitType.


15-37: LGTM!

Type definitions are well-structured. Using number for CommitType.date (timestamp) and string[] for refs is appropriate.


39-57: LGTM!

Well-structured types that map cleanly to git concepts. Separating all and remote branches in BranchInfo is a sensible design.


59-69: LGTM!

Comprehensive UI state type. The literal union for activeSection provides good type safety for section switching logic.

src/main/utils/terminalManager.ts (2)

20-25: Nice move to discriminated terminal messages and typed handlers.

This materially reduces any-driven mistakes in message routing and makes handler contracts explicit.

Also applies to: 83-97


49-61: Good hardening on PTY IO guards before writes.

hasWrite/hasReader checks make the stream handling path safer and prevent invalid stdin writes.

Also applies to: 268-274

Comment on lines +118 to +132
ZIG_DIR=""
if [ -f "vendors/zig/zig" ]; then
ZIG_DIR="vendors/zig"
elif [ -f "vendor/zig/zig" ]; then
# Accept legacy singular path and normalize to canonical vendors/zig.
mkdir -p vendors
ln -sfn ../vendor/zig vendors/zig
ZIG_DIR="vendor/zig"
fi

if [ -z "${ZIG_DIR}" ]; then
echo "❌ Zig not found, running setup"
bun setup
else
echo "✅ Zig found at vendors/zig/zig"
echo "✅ Zig found at ${ZIG_DIR}/zig"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Log message reports legacy path after symlink normalization.

After creating the symlink at Line 124, ZIG_DIR is set to "vendor/zig" (Line 125), so the success message at Line 132 reports the legacy path. The symlink ensures vendors/zig works for downstream scripts, but the log could be clearer by reporting the canonical path:

💡 Suggested improvement
          elif [ -f "vendor/zig/zig" ]; then
            # Accept legacy singular path and normalize to canonical vendors/zig.
            mkdir -p vendors
            ln -sfn ../vendor/zig vendors/zig
-           ZIG_DIR="vendor/zig"
+           ZIG_DIR="vendors/zig (symlinked from vendor/zig)"
          fi
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/build-release.yml around lines 118 - 132, The success log
prints the legacy path because after creating the symlink the script sets
ZIG_DIR="vendor/zig"; update the branch that handles the legacy path so ZIG_DIR
is set to the canonical vendors/zig (or otherwise normalize ZIG_DIR to
vendors/zig before the echo), and ensure the final echo uses the normalized
ZIG_DIR variable so the message reports the canonical path; reference the
ZIG_DIR variable and the legacy-path branch where the symlink is created/ln
-sfn.

Comment thread .github/workflows/ci.yml
Comment on lines +22 to +25
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Consider pinning Bun version for reproducible builds.

Using bun-version: latest may cause unexpected CI failures when Bun releases breaking changes. Pinning to a specific version (e.g., bun-version: 1.1.x) provides more predictable builds.

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

In @.github/workflows/ci.yml around lines 22 - 25, The CI workflow's Setup Bun
step currently uses the variable value bun-version: latest which causes
non-reproducible builds; change the `Setup Bun` step (the action using
oven-sh/setup-bun@v2 and the `bun-version` input) to pin a specific Bun version
or range (for example `1.1.x` or a concrete patch like `1.1.8`) instead of
`latest` so CI runs remain stable and reproducible.

Comment thread .github/workflows/ci.yml
Comment on lines +33 to +36
lint:
name: lint
runs-on: ubuntu-latest
needs: [typecheck]

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Sequential job chain could be optimized.

The lint job depends on typecheck, but these are independent checks. Running them in parallel would reduce CI time on green builds while still catching issues early.

Current: typecheck → lint → unit-tests → coverage (~serial)
Suggested: typecheck ⟍ → unit-tests → coverage (~parallel start)
      lint ⟋

🔧 Example parallel configuration
   lint:
     name: lint
     runs-on: ubuntu-latest
-    needs: [typecheck]
     steps:

Then update unit-tests:

   unit-tests:
     name: unit-tests
     runs-on: ubuntu-latest
-    needs: [lint]
+    needs: [typecheck, lint]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/ci.yml around lines 33 - 36, The lint job currently lists
needs: [typecheck] making it run serially; remove that dependency from the lint
job (delete needs: [typecheck]) so lint and typecheck can run in parallel, and
update the unit-tests job to depend on both checks by setting its needs to
include both typecheck and lint (e.g., needs: [typecheck, lint]) so unit-tests
and then coverage still run after both finish.

Comment on lines +48 to +51
if [ "${missing}" -ne 0 ]; then
echo "Required check name guard failed."
exit 1
fi

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Workflow file appears truncated - missing closing statement.

The workflow ends abruptly at line 51 without proper closure. While the shell script logic is complete, there should be an echo statement for success confirmation to aid debugging.

📝 Proposed fix to add success message
           if [ "${missing}" -ne 0 ]; then
             echo "Required check name guard failed."
             exit 1
           fi
+
+          echo "All required check names verified successfully."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/required-check-names-guard.yml around lines 48 - 51, The
script exits on failure but never emits a success message or explicitly confirms
completion; after the existing if ... fi block that checks the variable
"missing" add an echo to confirm success (e.g., echo "Required check name guard
passed: all required names present.") and ensure the workflow file is properly
closed so the job/step YAML structure ends cleanly; locate the if block that
references the variable "missing" and append the success echo and any needed
closing YAML statements to terminate the workflow.

Comment thread .oxlintrc.json
Comment on lines +138 to +146
"typescript/no-floating-promises": "off",
"typescript/no-confusing-void-expression": "off",
"typescript/promise-function-async": "off",
"typescript/no-unnecessary-type-assertion": "off",
"typescript/no-misused-promises": "off",
"typescript/await-thenable": "off",
"typescript/prefer-nullish-coalescing": "off",
"typescript/prefer-optional-chain": "warn",
"typescript/ban-ts-comment": "off"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Disabled TypeScript promise/async rules represent safety gaps.

Several TypeScript rules that catch common async bugs are disabled:

  • no-floating-promises: Catches unhandled promise rejections
  • no-misused-promises: Catches promises in non-async contexts
  • await-thenable: Catches awaiting non-promise values

These are likely disabled to manage existing debt during migration. Consider tracking re-enablement of at least no-floating-promises and no-misused-promises as they catch runtime errors.

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

In @.oxlintrc.json around lines 138 - 146, The TS lint config currently disables
important async safety rules; re-enable at least
"typescript/no-floating-promises" and "typescript/no-misused-promises" (and
consider "typescript/await-thenable") by changing them from "off" to "warn" or
"error", and if existing legacy code prevents a full flip, create targeted
"overrides" for specific legacy file globs to keep them off while turning the
rules back on globally; also add a short migration TODO (or issue) tracking
re-enablement progress so teams can fix violations incrementally.

Comment thread src/renderers/ivde/repoCloneWatcher.ts Outdated
Comment on lines +15 to +66
export const watchClonedRepoAndOpenGitSlate = ({
previewNode,
onExpandRepo,
onOpenGitSlate,
}: RepoCloneWatcherArgs): void => {
let repoPollAttempts = 0;

const pollForGitDirectory = (gitFolderPath: string) => {
let gitPollAttempts = 0;

const openGitSlateWhenReady = () => {
gitPollAttempts += 1;
const gitNode = getNode(gitFolderPath);
console.log(
`Git folder poll attempt ${gitPollAttempts}, found:`,
gitNode ? "yes" : "no",
);
if (gitNode) {
console.log("Opening git slate for:", gitFolderPath);
onOpenGitSlate(gitFolderPath);
return;
}
if (gitPollAttempts < MAX_GIT_POLL_ATTEMPTS) {
setTimeout(openGitSlateWhenReady, POLL_INTERVAL_MS);
return;
}
console.log("Timeout waiting for .git folder");
};

openGitSlateWhenReady();
};

const expandWhenReady = () => {
repoPollAttempts += 1;
const node = getNode(previewNode.path);
if (node) {
console.log("Found repo node, expanding:", previewNode.path);
onExpandRepo(previewNode.path);
const gitFolderPath = join(previewNode.path, ".git");
console.log("Looking for git folder at:", gitFolderPath);
pollForGitDirectory(gitFolderPath);
return;
}
if (repoPollAttempts < MAX_REPO_POLL_ATTEMPTS) {
setTimeout(expandWhenReady, POLL_INTERVAL_MS);
return;
}
console.log("Timeout waiting for cloned repo to appear in file tree");
};

expandWhenReady();
};

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Missing cleanup mechanism for polling timers.

The polling functions use setTimeout recursively but provide no way to cancel pending timers. If the component unmounts or the user navigates away before polling completes, callbacks will continue executing against potentially stale state.

Consider returning a cleanup function:

♻️ Proposed refactor
-export const watchClonedRepoAndOpenGitSlate = ({
+export const watchClonedRepoAndOpenGitSlate = ({
 	previewNode,
 	onExpandRepo,
 	onOpenGitSlate,
-}: RepoCloneWatcherArgs): void => {
+}: RepoCloneWatcherArgs): (() => void) => {
+	let cancelled = false;
 	let repoPollAttempts = 0;

 	const pollForGitDirectory = (gitFolderPath: string) => {
 		let gitPollAttempts = 0;

 		const openGitSlateWhenReady = () => {
+			if (cancelled) return;
 			gitPollAttempts += 1;
 			const gitNode = getNode(gitFolderPath);
 			// ... rest of function
 		};
 		openGitSlateWhenReady();
 	};

 	const expandWhenReady = () => {
+		if (cancelled) return;
 		repoPollAttempts += 1;
 		// ... rest of function
 	};

 	expandWhenReady();
+	return () => { cancelled = true; };
 };
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export const watchClonedRepoAndOpenGitSlate = ({
previewNode,
onExpandRepo,
onOpenGitSlate,
}: RepoCloneWatcherArgs): void => {
let repoPollAttempts = 0;
const pollForGitDirectory = (gitFolderPath: string) => {
let gitPollAttempts = 0;
const openGitSlateWhenReady = () => {
gitPollAttempts += 1;
const gitNode = getNode(gitFolderPath);
console.log(
`Git folder poll attempt ${gitPollAttempts}, found:`,
gitNode ? "yes" : "no",
);
if (gitNode) {
console.log("Opening git slate for:", gitFolderPath);
onOpenGitSlate(gitFolderPath);
return;
}
if (gitPollAttempts < MAX_GIT_POLL_ATTEMPTS) {
setTimeout(openGitSlateWhenReady, POLL_INTERVAL_MS);
return;
}
console.log("Timeout waiting for .git folder");
};
openGitSlateWhenReady();
};
const expandWhenReady = () => {
repoPollAttempts += 1;
const node = getNode(previewNode.path);
if (node) {
console.log("Found repo node, expanding:", previewNode.path);
onExpandRepo(previewNode.path);
const gitFolderPath = join(previewNode.path, ".git");
console.log("Looking for git folder at:", gitFolderPath);
pollForGitDirectory(gitFolderPath);
return;
}
if (repoPollAttempts < MAX_REPO_POLL_ATTEMPTS) {
setTimeout(expandWhenReady, POLL_INTERVAL_MS);
return;
}
console.log("Timeout waiting for cloned repo to appear in file tree");
};
expandWhenReady();
};
export const watchClonedRepoAndOpenGitSlate = ({
previewNode,
onExpandRepo,
onOpenGitSlate,
}: RepoCloneWatcherArgs): (() => void) => {
let cancelled = false;
let repoPollAttempts = 0;
const pollForGitDirectory = (gitFolderPath: string) => {
let gitPollAttempts = 0;
const openGitSlateWhenReady = () => {
if (cancelled) return;
gitPollAttempts += 1;
const gitNode = getNode(gitFolderPath);
console.log(
`Git folder poll attempt ${gitPollAttempts}, found:`,
gitNode ? "yes" : "no",
);
if (gitNode) {
console.log("Opening git slate for:", gitFolderPath);
onOpenGitSlate(gitFolderPath);
return;
}
if (gitPollAttempts < MAX_GIT_POLL_ATTEMPTS) {
setTimeout(openGitSlateWhenReady, POLL_INTERVAL_MS);
return;
}
console.log("Timeout waiting for .git folder");
};
openGitSlateWhenReady();
};
const expandWhenReady = () => {
if (cancelled) return;
repoPollAttempts += 1;
const node = getNode(previewNode.path);
if (node) {
console.log("Found repo node, expanding:", previewNode.path);
onExpandRepo(previewNode.path);
const gitFolderPath = join(previewNode.path, ".git");
console.log("Looking for git folder at:", gitFolderPath);
pollForGitDirectory(gitFolderPath);
return;
}
if (repoPollAttempts < MAX_REPO_POLL_ATTEMPTS) {
setTimeout(expandWhenReady, POLL_INTERVAL_MS);
return;
}
console.log("Timeout waiting for cloned repo to appear in file tree");
};
expandWhenReady();
return () => { cancelled = true; };
};
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/renderers/ivde/repoCloneWatcher.ts` around lines 15 - 66, The polling
logic in watchClonedRepoAndOpenGitSlate (functions expandWhenReady,
pollForGitDirectory, openGitSlateWhenReady) has no cleanup for setTimeout — add
cancellation: store each setTimeout ID (for both repo and git polls) in scoped
variables, set a "cancelled" flag when cleanup runs, clearTimeout for any
pending IDs, and short-circuit handlers (expandWhenReady/openGitSlateWhenReady)
if cancelled to avoid calling onExpandRepo/onOpenGitSlate after unmount; finally
change watchClonedRepoAndOpenGitSlate to return a cleanup function that performs
the clearing and sets the flag so callers can cancel polling.

Comment thread src/renderers/ivde/repoCloneWatcher.ts Outdated
Comment on lines +28 to +41
console.log(
`Git folder poll attempt ${gitPollAttempts}, found:`,
gitNode ? "yes" : "no",
);
if (gitNode) {
console.log("Opening git slate for:", gitFolderPath);
onOpenGitSlate(gitFolderPath);
return;
}
if (gitPollAttempts < MAX_GIT_POLL_ATTEMPTS) {
setTimeout(openGitSlateWhenReady, POLL_INTERVAL_MS);
return;
}
console.log("Timeout waiting for .git folder");

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Consider removing or gating debug console.log statements.

The polling progress logs are useful during development but may clutter production console output. Consider using a debug flag or removing these before release.

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

In `@src/renderers/ivde/repoCloneWatcher.ts` around lines 28 - 41, The console.log
debugging inside openGitSlateWhenReady (which prints gitPollAttempts, gitNode
presence, "Opening git slate for:" with gitFolderPath, and the timeout message)
should be removed or gated behind a debug flag/logger; update the function to
either remove these console.log calls or replace them with a conditional
debug/logger check (e.g., a DEBUG/VERBOSE env flag or a renderer-level
logger.debug) so logs only emit when enabled, keeping behavior of invoking
onOpenGitSlate(gitFolderPath), setTimeout(openGitSlateWhenReady,
POLL_INTERVAL_MS) and the MAX_GIT_POLL_ATTEMPTS logic unchanged.

Comment on lines +50 to +66
if (commitRef !== "HEAD") {
const content = await requests
.gitShow?.({
options: [`${commitRef}:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
}
const content = await requests
.gitShow?.({
options: [`HEAD:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
};

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Redundant branching can be simplified.

Lines 50-58 and 59-65 have nearly identical logic - both call gitShow with a commit ref and filepath. The HEAD case is just a special case of the general commit ref case.

♻️ Simplified implementation
-		if (commitRef !== "HEAD") {
-			const content = await requests
-				.gitShow?.({
-					options: [`${commitRef}:${filepath}`],
-					repoRoot: repoRootPath,
-				})
-				.catch(() => "");
-			return content || "";
-		}
+		// Handle HEAD and any other commit ref uniformly
 		const content = await requests
 			.gitShow?.({
-				options: [`HEAD:${filepath}`],
+				options: [`${commitRef}:${filepath}`],
 				repoRoot: repoRootPath,
 			})
 			.catch(() => "");
 		return content || "";
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if (commitRef !== "HEAD") {
const content = await requests
.gitShow?.({
options: [`${commitRef}:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
}
const content = await requests
.gitShow?.({
options: [`HEAD:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
};
// Handle HEAD and any other commit ref uniformly
const content = await requests
.gitShow?.({
options: [`${commitRef}:${filepath}`],
repoRoot: repoRootPath,
})
.catch(() => "");
return content || "";
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/renderers/ivde/slates/git/diff.ts` around lines 50 - 66, The code
duplicates gitShow calls for the HEAD and non-HEAD cases; collapse them by
building a single refSpec and calling requests.gitShow once. Concretely, compute
const refSpec = `${commitRef}:${filepath}` (or use commitRef ?? "HEAD" if
commitRef can be undefined) and call requests.gitShow?.({ options: [refSpec],
repoRoot: repoRootPath }).catch(() => "") and return the result || "". Update
the block that currently branches on commitRef !== "HEAD" to this single unified
implementation referencing commitRef, filepath, repoRootPath, and
requests.gitShow.

Comment thread src/renderers/ivde/slates/git/types.ts Outdated
@@ -0,0 +1,69 @@
export type GitChangeCode = "A" | "M" | "D" | "?" | "";

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check how GitChangeCode is consumed and whether unknown codes are handled gracefully
echo "=== Usages of GitChangeCode ==="
rg -n "GitChangeCode" --type=ts -C3

echo ""
echo "=== Check if parsing handles unknown/fallback codes ==="
rg -n "changeType|changeCode" --type=ts -C5 src/renderers/ivde/slates/git/

Repository: KooshaPari/colab

Length of output: 7183


Type assertion bypasses missing git status codes; consider explicit handling or expanded union.

GitChangeCode uses a type assertion (as GitChangeCode in helpers.ts:6) that allows any git status code to pass through, bypassing the incomplete union type. While the code doesn't crash—unknown codes fall back to default diff behavior via the empty string fallback—this masks whether renamed ("R"), copied ("C"), unmerged ("U"), or type-changed ("T") files are intentionally unsupported or accidentally unhandled. Either expand the union to include these codes or remove the type assertion and validate codes explicitly.

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

In `@src/renderers/ivde/slates/git/types.ts` at line 1, GitChangeCode's union is
incomplete and is being bypassed by a type assertion in the helper (the cast to
"as GitChangeCode" in helpers.ts), so either expand the GitChangeCode type to
include the missing git status codes ("R", "C", "U", "T") or remove the
assertion and add explicit validation/mapping in the helper that returns the
existing fallback ("" or default behavior) for unknown codes; update the helper
(the function that currently does the "as GitChangeCode" cast) to perform a safe
runtime check (e.g., switch or lookup) against the allowed GitChangeCode values
and only return a typed GitChangeCode for known codes while handling unknowns
explicitly.

Comment thread tsconfig.json Outdated
Comment on lines +27 to +29
"noUnusedLocals": false,
"noUnusedParameters": false,
"noPropertyAccessFromIndexSignature": false

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Track re-enabling strictness flags as technical debt.

Relaxing noUnusedLocals, noUnusedParameters, and noPropertyAccessFromIndexSignature is a reasonable approach during migration, but these flags help catch dead code and potential bugs. Consider adding a TODO or tracking issue to re-enable them once the lint/format migration stabilizes.

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

In `@tsconfig.json` around lines 27 - 29, The TypeScript strictness flags
noUnusedLocals, noUnusedParameters, and noPropertyAccessFromIndexSignature were
relaxed; add a concise technical-debt note and tracking entry: insert a TODO
comment near the three flags referencing a short ticket/issue ID (or create one)
to re-enable noUnusedLocals, noUnusedParameters, and
noPropertyAccessFromIndexSignature after lint/format migration stabilizes, and
create the corresponding task in your issue tracker with acceptance criteria for
re-enabling and fixing resulting errors.

Co-authored-by: Codex <noreply@openai.com>
@KooshaPari KooshaPari force-pushed the chore/oxc-migration-20260303-colab branch from 3aba65a to b0429f1 Compare March 5, 2026 05:37
Scope CI typecheck to runtime protocol sources and run coverage job via the existing Vitest test script to avoid Bun test-runner mismatches.

Co-authored-by: Codex <noreply@openai.com>
@KooshaPari KooshaPari merged commit 1596af5 into main Mar 5, 2026
7 of 8 checks passed
@KooshaPari KooshaPari deleted the chore/oxc-migration-20260303-colab branch March 5, 2026 06:00
@KooshaPari KooshaPari restored the chore/oxc-migration-20260303-colab branch March 25, 2026 04:10
@KooshaPari KooshaPari added the pr-created PR was created label Jun 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-created PR was created

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants