Skip to content

merge dev into main#66

Open
JGMelon22 wants to merge 24 commits into
mainfrom
dev
Open

merge dev into main#66
JGMelon22 wants to merge 24 commits into
mainfrom
dev

Conversation

@JGMelon22

@JGMelon22 JGMelon22 commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator

Merge de fixes, bumps e melhorias aplicadas em dev para main (preparando para release v1.15.0

Summary by CodeRabbit

  • New Features
    • Dashboard statistic cards are now interactive shortcuts to Containers, Images, Volumes, and Networks.
    • Added richer loading placeholders with improved light and dark theme styling.
    • Docker Swarm node information and inspection are now supported more reliably.
  • Bug Fixes
    • Improved volume usage, creation-date formatting, and unavailable-value handling.
    • Reduced false disconnected-Docker alerts during initial loading.
    • Improved update downloads, navigation, and error reporting.
  • Chores
    • Updated the application to version 1.15.0-beta.7 and modernized code-quality tooling.

JGMelon22 and others added 24 commits July 18, 2026 01:46
- Remove diretivas 'use client' (Next.js) de 9 arquivos
- Remove console.log de produção em Sidebar.tsx
- Remove código comentado morto (swarm.rs, Volumes.tsx)
- Remove estado não utilizado (ContainerRow stats listener)
- Remove bloqueio de clique direito/seleção/Ctrl+C (main.tsx)
- Substitui senhas hardcoded nos templates compose
- Configura CSP no tauri.conf.json (antes null)
- Corrige bug confirmDelete (isActionLoading duplicado)
- Troca <a> por <Link> no NotFound.tsx
- Unifica formatBytes para lib/utils (tratamento de negativos)
- Adiciona error handling em .catch(() => {}) vazios
deps: atualiza recharts para ultima versão v2 suportada
## [1.14.1-beta.1](v1.14.0...v1.14.1-beta.1) (2026-07-18)

### Bug Fixes

* corrigir todos os warnings do lint (28 warnings) ([aeb54df](aeb54df))
# [1.15.0-beta.1](v1.14.1-beta.1...v1.15.0-beta.1) (2026-07-18)

### Features

* migrate to TypeScript 7 and replace ESLint with oxlint ([418468f](418468f))
# [1.15.0-beta.2](v1.15.0-beta.1...v1.15.0-beta.2) (2026-07-18)

### Bug Fixes

* corrigir exibição de created e size na aba de volumes ([cc83d4b](cc83d4b))
# [1.15.0-beta.3](v1.15.0-beta.2...v1.15.0-beta.3) (2026-07-18)

### Bug Fixes

* remover ícone ExternalLink duplicado no Sidebar ([c22a695](c22a695))
# [1.15.0-beta.4](v1.15.0-beta.3...v1.15.0-beta.4) (2026-07-18)

### Features

* tornar tiles do dashboard clicáveis e direcionar para a aba correta ([633227a](633227a))
# [1.15.0-beta.5](v1.15.0-beta.4...v1.15.0-beta.5) (2026-07-18)

### Bug Fixes

* aprimorar loading e alerta de daemon ([44bda3b](44bda3b))
# [1.15.0-beta.6](v1.15.0-beta.5...v1.15.0-beta.6) (2026-07-18)

### Bug Fixes

* corrigir build da tela de carregamento removendo color-mix/backdrop-filter ([232b75c](232b75c))
# [1.15.0-beta.7](v1.15.0-beta.6...v1.15.0-beta.7) (2026-07-18)

### Bug Fixes

* ajustar layout e cores do skeleton e header dos botoes ([3691974](3691974))
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6 to 7.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](actions/setup-node@v6...v7)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps the cargo-minor-patch group in /src-tauri with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [serde](https://github.com/serde-rs/serde) | `1.0.228` | `1.0.229` |
| [serde_json](https://github.com/serde-rs/json) | `1.0.150` | `1.0.151` |
| [tokio](https://github.com/tokio-rs/tokio) | `1.52.3` | `1.53.0` |
| [futures-util](https://github.com/rust-lang/futures-rs) | `0.3.32` | `0.3.33` |
| [tauri-plugin-dialog](https://github.com/tauri-apps/plugins-workspace) | `2.7.1` | `2.7.2` |
| [uuid](https://github.com/uuid-rs/uuid) | `1.23.5` | `1.24.0` |


Updates `serde` from 1.0.228 to 1.0.229
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](serde-rs/serde@v1.0.228...v1.0.229)

Updates `serde_json` from 1.0.150 to 1.0.151
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](serde-rs/json@v1.0.150...v1.0.151)

Updates `tokio` from 1.52.3 to 1.53.0
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](tokio-rs/tokio@tokio-1.52.3...tokio-1.53.0)

Updates `futures-util` from 0.3.32 to 0.3.33
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/main/CHANGELOG.md)
- [Commits](rust-lang/futures-rs@0.3.32...0.3.33)

Updates `tauri-plugin-dialog` from 2.7.1 to 2.7.2
- [Release notes](https://github.com/tauri-apps/plugins-workspace/releases)
- [Commits](tauri-apps/plugins-workspace@log-v2.7.1...dialog-v2.7.2)

Updates `uuid` from 1.23.5 to 1.24.0
- [Release notes](https://github.com/uuid-rs/uuid/releases)
- [Commits](uuid-rs/uuid@v1.23.5...v1.24.0)

---
updated-dependencies:
- dependency-name: serde
  dependency-version: 1.0.229
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: serde_json
  dependency-version: 1.0.151
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: tokio
  dependency-version: 1.53.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo-minor-patch
- dependency-name: futures-util
  dependency-version: 0.3.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: tauri-plugin-dialog
  dependency-version: 2.7.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: uuid
  dependency-version: 1.24.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
…v/actions/setup-node-7

ci: bump actions/setup-node from 6 to 7
…ev/cargo-minor-patch-1dacf23b41

deps(rust): bump the cargo-minor-patch group in /src-tauri with 6 updates
@JGMelon22
JGMelon22 requested a review from pedrofariasx July 25, 2026 21:16
@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

This pull request updates the project to version 1.15.0-beta.7, replaces ESLint with oxlint, redesigns the initial loading screen, changes Docker data retrieval, improves context loading state and typing, and adds dashboard navigation and frontend type-safety updates.

Changes

Release, tooling, and configuration

Layer / File(s) Summary
Tooling and release configuration
.github/workflows/*, package.json, .oxlintrc.json, CHANGELOG.md, src-tauri/*, tsconfig*.json
CI uses Node.js setup action v7, linting switches to oxlint, package and application versions advance to 1.15.0-beta.7, and Tauri CSP and TypeScript configuration are updated.
Loading screen redesign
index.html
Theme variables, shimmer animations, skeleton layouts, and loading placeholders are substantially redesigned.

Docker and frontend behavior

Layer / File(s) Summary
Docker data commands
src-tauri/src/commands/swarm.rs, src-tauri/src/commands/volumes.rs
Swarm commands use Docker CLI output, and volume usage is combined with volume metadata concurrently.
Docker context and event state
src/context/DockerContext.tsx, src/hooks/use-docker-events.ts
Refreshes run concurrently with error logging, initial loading is tracked, and Docker event payloads are typed.
Frontend page behavior
src/pages/*, src/main.tsx, src/components/layout/AppLayout.tsx
Dashboard cards become navigable, connection alerts wait for the first load, page data is more strongly typed, and several client directives and event handlers are removed or adjusted.
Shared component and update cleanup
src/components/layout/Sidebar.tsx, src/components/ui/*
Release assets and download state receive stronger typing, external navigation is guarded, and selected lint warnings are suppressed.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

Suggested reviewers: pedrofariasx

Poem

I’m a rabbit in the release moonlight,
Hopping through shimmer, soft and bright.
Oxlint hums and Docker flows,
Typed little events in tidy rows.
Cards now leap where routes invite—
Beta carrots ship tonight!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.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 accurately describes that this PR merges dev into main, matching the overall change set.
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.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

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.

@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: 11

🤖 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/workflows/ci.yml:
- Line 23: Pin every actions/setup-node@v7 reference to the v7.0.0 commit SHA
and append the trailing “# v7.0.0” comment: update the frontend Setup Node.js
step in .github/workflows/ci.yml:23-23, the build step in
.github/workflows/release.yml:26-26, and the release and build steps in
.github/workflows/semantic-release.yml:31-31 and :71-71. Preserve the existing
explicit cache: pnpm configuration.

In @.oxlintrc.json:
- Around line 3-11: Update the rules in the oxlint configuration to use fully
qualified plugin-prefixed names: replace no-explicit-any with
typescript/no-explicit-any and only-export-components with
react/only-export-components, preserving their existing severity and options.

In `@index.html`:
- Around line 153-167: Update the shimmer animation rules for
.skeleton-box::after and .sk::after to honor the prefers-reduced-motion: reduce
media preference by disabling or otherwise stopping the infinite shimmer
animation for users who request reduced motion, while preserving the current
animation by default.
- Line 421: Update the sidebar subtitle skeleton element using the existing
height utility range, replacing the undefined h-3 class with a defined height
class such as h-4 so .skeleton-box renders with visible height.

In `@package.json`:
- Around line 10-11: Update the package scripts so lint fails on oxlint warnings
by applying the appropriate warning threshold, and add a dedicated typecheck
script that runs TypeScript with no emit. Update the CI workflow’s
lint/type-check job to invoke pnpm typecheck alongside pnpm lint, using the
existing script names and preserving the current lint command behavior.

In `@src-tauri/tauri.conf.json`:
- Line 23: Update the csp entry in tauri.conf.json to include Tauri’s required
IPC origins ipc: and http://ipc.localhost in connect-src, while preserving the
existing restrictions and using an origin-shielded CSP. Verify invoke, listen,
and getVersion work in packaged builds on each target platform before release.

In `@src/components/layout/Sidebar.tsx`:
- Around line 922-929: Update the download button in the Sidebar asset action to
disable whenever downloadingAsset is non-null, including the active asset, and
remove the redundant downloadingAsset check from its onClick handler while
preserving handleDownload(asset) for enabled buttons.
- Line 14: Replace the file-wide react-hooks/exhaustive-deps suppression in
Sidebar with targeted fixes: stabilize the callbacks used by the effects around
lines 179–183, 200–205, and 219–227, or apply narrowly scoped suppressions only
where dependencies are intentionally omitted. Keep dependency validation enabled
for all unrelated hooks.

In `@src/components/ui/button.tsx`:
- Line 1: Replace the file-wide react-refresh/only-export-components
suppressions with a centralized lint configuration exception or targeted
suppressions covering only the intentional mixed exports. Apply this
consistently in src/components/ui/button.tsx:1, src/components/ui/badge.tsx:1,
src/components/ui/form.tsx:1, src/components/ui/navigation-menu.tsx:1,
src/components/ui/sidebar.tsx:1, and src/components/ui/toggle.tsx:1, while
keeping accidental exports detectable.

In `@src/pages/Stacks.tsx`:
- Line 114: Replace the hardcoded changeme values in the deployable templates
within Stacks.tsx: at lines 114 and 130, use required environment substitutions
for POSTGRES_PASSWORD and MONGO_INITDB_ROOT_PASSWORD respectively, so deployment
requires user-provided secrets via .env or generates them at deployment time.

In `@src/pages/Volumes.tsx`:
- Around line 458-459: Update the size display in the Volumes table to format
zero-byte volumes with formatBytes(v.size) as “0 Bytes”; only use “N/A” for the
existing negative sentinel value, while preserving formatting for positive
sizes.
🪄 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: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 4a18173d-1bb6-4534-af05-b415afc7452b

📥 Commits

Reviewing files that changed from the base of the PR and between a5d4c3e and 7247c96.

⛔ Files ignored due to path filters (2)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • src-tauri/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (36)
  • .github/workflows/ci.yml
  • .github/workflows/release.yml
  • .github/workflows/semantic-release.yml
  • .lintstagedrc.json
  • .oxlintrc.json
  • .vscode/extensions.json
  • CHANGELOG.md
  • components.json
  • eslint.config.js
  • index.html
  • package.json
  • src-tauri/Cargo.toml
  • src-tauri/src/commands/swarm.rs
  • src-tauri/src/commands/volumes.rs
  • src-tauri/tauri.conf.json
  • src/components/layout/AppLayout.tsx
  • src/components/layout/Sidebar.tsx
  • src/components/ui/badge.tsx
  • src/components/ui/button.tsx
  • src/components/ui/form.tsx
  • src/components/ui/navigation-menu.tsx
  • src/components/ui/sidebar.tsx
  • src/components/ui/toggle.tsx
  • src/context/DockerContext.tsx
  • src/hooks/use-docker-events.ts
  • src/main.tsx
  • src/pages/Containers.tsx
  • src/pages/Images.tsx
  • src/pages/Index.tsx
  • src/pages/Networks.tsx
  • src/pages/NotFound.tsx
  • src/pages/Stacks.tsx
  • src/pages/Swarm.tsx
  • src/pages/Volumes.tsx
  • tsconfig.app.json
  • tsconfig.json
💤 Files with no reviewable changes (8)
  • eslint.config.js
  • components.json
  • tsconfig.json
  • src/components/layout/AppLayout.tsx
  • src/main.tsx
  • src/pages/Images.tsx
  • tsconfig.app.json
  • src-tauri/src/commands/swarm.rs

Comment thread .github/workflows/ci.yml

- name: Setup Node.js
uses: actions/setup-node@v6
uses: actions/setup-node@v7

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.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

actions/setup-node bumped to @v7 without SHA pinning in all four workflow sites. The repo enforces zizmor's blanket unpinned-uses policy; the tag-only reference fails that check everywhere the bump was applied. Pin each to the v7.0.0 commit SHA with a trailing # v7.0.0 comment.

  • .github/workflows/ci.yml#L23-L23: pin the frontend job's Setup Node.js step to the v7.0.0 SHA.
  • .github/workflows/release.yml#L26-L26: pin the build job's Setup Node.js step to the same SHA.
  • .github/workflows/semantic-release.yml#L31-L31: pin the release job's Setup Node.js step to the same SHA.
  • .github/workflows/semantic-release.yml#L71-L71: pin the build job's Setup Node.js step to the same SHA.

Note for the upgrade itself: v7 runs on node24 and requires runner ≥ v2.327.1, and it changes default package-manager caching — the explicit cache: pnpm inputs here keep that behavior intact.

🧰 Tools
🪛 zizmor (1.26.1)

[error] 23-23: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

📍 Affects 3 files
  • .github/workflows/ci.yml#L23-L23 (this comment)
  • .github/workflows/release.yml#L26-L26
  • .github/workflows/semantic-release.yml#L31-L31
  • .github/workflows/semantic-release.yml#L71-L71
🤖 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/ci.yml at line 23, Pin every actions/setup-node@v7
reference to the v7.0.0 commit SHA and append the trailing “# v7.0.0” comment:
update the frontend Setup Node.js step in .github/workflows/ci.yml:23-23, the
build step in .github/workflows/release.yml:26-26, and the release and build
steps in .github/workflows/semantic-release.yml:31-31 and :71-71. Preserve the
existing explicit cache: pnpm configuration.

Source: Linters/SAST tools

Comment thread .oxlintrc.json
Comment on lines +3 to +11
"plugins": ["typescript", "unicorn", "oxc", "react", "import", "vitest"],
"categories": {
"correctness": "error"
},
"rules": {
"no-explicit-any": "warn",
"no-unused-vars": "off",
"only-export-components": ["warn", { "allowConstantExport": true }]
},

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.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Inspect the oxlint schema shipped with the pinned version for the exact rule keys.
fd -H -t f 'configuration_schema.json' node_modules/oxlint 2>/dev/null | head -1

# Confirm tsconfig unused-symbol settings
fd -H -t f 'tsconfig*.json' --max-depth 2 --exec rg -n 'noUnused|strict|"types"' {}

Repository: pedrofariasx/dockernativemanager

Length of output: 170


🏁 Script executed:

#!/bin/bash
set -u

echo "== repo files relevant to oxlint/tsconfig =="
git ls-files | rg '(^|/)(\.oxlintrc\.json|package\.json|tsconfig[^/]*\.json)$|node_modules/oxlint/' || true

echo
echo "== .oxlintrc.json =="
if [ -f .oxlintrc.json ]; then cat -n .oxlintrc.json; fi

echo
echo "== tsconfig noUnused/strict/types snippets =="
for f in $(git ls-files | rg '(^|/)tsconfig[^/]*\.json$'); do
  echo "--- $f"
  rg -n 'noUnused|strict|types|compilerOptions' "$f" || true
done

echo
echo "== package/lock oxlint references =="
for f in package.json package-lock.json pnpm-lock.yaml yarn.lock bun.lockb 2>/dev/null; do
  [ -f "$f" ] && { echo "--- $f"; rg -n 'oxlint|oxc' "$f" || true; }
done

Repository: pedrofariasx/dockernativemanager

Length of output: 1415


🏁 Script executed:

#!/bin/bash
set -u

echo "== package.json =="
cat -n package.json

echo
echo "== lockfiles with oxlint/oxc and resolved deps =="
for f in package-lock.json pnpm-lock.yaml yarn.lock bun.lockb bun.lock; do
  [ -f "$f" ] && { echo "--- $f"; rg -n 'oxlint|`@oxlint`|oxc-eslint|oxc-' "$f" || true; }
done

echo
echo "== all tsconfig lines =="
for f in tsconfig.json tsconfig.app.json tsconfig.node.json; do
  echo "--- $f"
  sed -n '1,80p' "$f" | cat -n
done

Repository: pedrofariasx/dockernativemanager

Length of output: 9759


🌐 Web query:

oxlint 1.74.0 rule names no-explicit-any only-export-components plugin names

💡 Result:

In oxlint 1.74.0, the rule names and associated plugin namespaces for the requested rules are as follows: - typescript/no-explicit-any [1][2] - react/only-export-components [3][4] The rule no-explicit-any is part of the typescript plugin namespace [1][2], while the rule only-export-components is part of the react plugin namespace [3]. Although only-export-components was originally derived from eslint-plugin-react-refresh, it is implemented and managed within the oxlint react plugin [3][4]. Previous confusion regarding its namespace—often due to its origin in react-refresh—has been resolved in recent versions of oxlint to align with the react namespace [5]. Oxc translates plugin names by replacing underscores with hyphens [6]. Rules are generally registered in the format / [6].

Citations:


🌐 Web query:

oxlint documentation unknown rule names ignored no plugin namespace required

💡 Result:

As of March 2026, Oxlint has moved toward strictly reporting errors for unknown built-in rules [1]. While earlier versions of the linter silently ignored unrecognized rule names or only provided non-breaking warnings, recent updates—specifically following pull request #20464—now cause configuration loading to fail when a referenced built-in rule cannot be resolved [1]. Regarding the namespace requirements for rules: - Format: Oxlint typically expects rule names in a plugin/rule-name format (e.g., typescript/no-explicit-any) [2]. - Namespace Mapping: Oxlint automatically maps many common ESLint-core rules to allow usage without a plugin prefix (e.g., configuring no-console is equivalent to eslint/no-console) [3]. - Unknown Rules: If a rule name is misspelled or does not exist in any loaded plugin, Oxlint will now report it as an error [1]. Previously, these could be ignored or treated as warnings that did not fail CI processes [2][4]. If you are encountering issues with rule resolution or typos, you can debug your configuration by running oxlint --print-config to view the final, resolved set of rules and confirm whether your specific rule is being successfully loaded [2]. Additionally, if you are using custom plugins, ensure they are correctly defined in your plugins or jsPlugins configuration fields, as omitting them will cause rules from those plugins to remain unrecognized [5][6][7].

Citations:


🏁 Script executed:

#!/bin/bash
set -u

if command -v npx >/dev/null 2>&1 && [ -d node_modules/oxlint ]; then
  npx oxlint --print-config .oxlintrc.json 2>&1 | rg -n 'no-explicit-any|only-export-components|no-unused-vars' || true
elif command -v npx >/dev/null 2>&1; then
  echo "node_modules/oxlint not present; oxlint runtime check skipped"
else
  echo "npx not available; oxlint runtime check skipped"
fi

Repository: pedrofariasx/dockernativemanager

Length of output: 232


Qualify oxlint rules to avoid config warnings.

At oxlint 1.74.0, unprefixed rule keys are no longer reliably accepted; use fully-qualified names instead: typescript/no-explicit-any at .oxlintrc.json:8 and react/only-export-components at .oxlintrc.json:10, with both plugins already enabled.

🤖 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 @.oxlintrc.json around lines 3 - 11, Update the rules in the oxlint
configuration to use fully qualified plugin-prefixed names: replace
no-explicit-any with typescript/no-explicit-any and only-export-components with
react/only-export-components, preserving their existing severity and options.

Comment thread index.html
Comment on lines +153 to +167
.skeleton-box::after,
.sk::after {
content: "";
position: absolute;
inset: 0;
transform: translateX(-100%);
background: linear-gradient(90deg, transparent 0%, var(--shimmer-hi) 50%, transparent 100%);
animation: shimmer 1.6s infinite;
}

.skeleton-card {
border: 1px solid var(--border-light);
background-color: rgba(255, 255, 255, 0.5);
border-radius: 0.75rem;
@keyframes shimmer {
100% {
transform: translateX(100%);
}
}

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.

📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Shimmer ignores prefers-reduced-motion.

Every .skeleton-box/.sk runs an infinite translate animation with no opt-out.

♿ Proposed guard
       `@keyframes` shimmer {
         100% {
           transform: translateX(100%);
         }
       }
+
+      `@media` (prefers-reduced-motion: reduce) {
+        .skeleton-box::after,
+        .sk::after {
+          animation: none;
+        }
+      }
📝 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
.skeleton-box::after,
.sk::after {
content: "";
position: absolute;
inset: 0;
transform: translateX(-100%);
background: linear-gradient(90deg, transparent 0%, var(--shimmer-hi) 50%, transparent 100%);
animation: shimmer 1.6s infinite;
}
.skeleton-card {
border: 1px solid var(--border-light);
background-color: rgba(255, 255, 255, 0.5);
border-radius: 0.75rem;
@keyframes shimmer {
100% {
transform: translateX(100%);
}
}
.skeleton-box::after,
.sk::after {
content: "";
position: absolute;
inset: 0;
transform: translateX(-100%);
background: linear-gradient(90deg, transparent 0%, var(--shimmer-hi) 50%, transparent 100%);
animation: shimmer 1.6s infinite;
}
`@keyframes` shimmer {
100% {
transform: translateX(100%);
}
}
`@media` (prefers-reduced-motion: reduce) {
.skeleton-box::after,
.sk::after {
animation: none;
}
}
🤖 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 `@index.html` around lines 153 - 167, Update the shimmer animation rules for
.skeleton-box::after and .sk::after to honor the prefers-reduced-motion: reduce
media preference by disabling or otherwise stopping the infinite shimmer
animation for users who request reduced motion, while preserving the current
animation by default.

Comment thread index.html
<div class="sidebar-logo"></div>
<div style="display: flex; flex-direction: column; gap: 8px">
<div class="skeleton-box h-5 w-24"></div>
<div class="skeleton-box h-3 w-12" style="opacity: 0.5"></div>

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

.h-3 is never defined — this placeholder renders at zero height.

The height utilities in this stylesheet start at .h-4 (line 292). .skeleton-box sets no intrinsic height, so this element collapses and the sidebar subtitle bar is invisible.

🐛 Proposed fix (add near the other height utilities, ~line 292)
+      .h-3 {
+        height: 12px;
+      }
       .h-4 {
         height: 16px;
       }
🤖 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 `@index.html` at line 421, Update the sidebar subtitle skeleton element using
the existing height utility range, replacing the undefined h-3 class with a
defined height class such as h-4 so .skeleton-box renders with visible height.

Comment thread package.json
Comment on lines +10 to +11
"lint": "oxlint .",
"lint:fix": "oxlint --fix .",

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.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Confirm oxlint's warning-exit behavior flag name for the pinned version and check for an existing typecheck gate.
rg -n '"scripts"' -A 20 package.json
rg -n 'tsc|typecheck|noEmit' -g '!node_modules' .github/workflows package.json

Repository: pedrofariasx/dockernativemanager

Length of output: 938


🏁 Script executed:

#!/bin/bash
set -u

echo "== package.json relevant sections =="
sed -n '1,80p' package.json
sed -n '80,180p' package.json || true

echo
echo "== config files =="
for f in .oxlintrc.json tsconfig.json vite.config.ts vite.config.js; do
  if [ -f "$f" ]; then
    echo "--- $f ---"
    sed -n '1,220p' "$f"
  fi
done

echo
echo "== workflow lint/typecheck references =="
if [ -d .github/workflows ]; then
  for f in .github/workflows/*.yml .github/workflows/*.yaml; do
    [ -f "$f" ] && { echo "--- $f ---"; rg -n 'lint|tsc|typecheck|noEmit|pnpm|npm run' "$f" -C 3 || true; }
  done
else
  echo "no .github/workflows directory"
fi

echo
echo "== lockfiles for oxlint/version hints =="
for f in pnpm-lock.yaml package-lock.json yarn.lock; do
  if [ -f "$f" ]; then
    echo "--- $f oxlint/eslint references ---"
    rg -n '`@oxlint`|oxlint|typescript-eslint' "$f" | head -80 || true
  fi
done

Repository: pedrofariasx/dockernativemanager

Length of output: 11108


🌐 Web query:

oxlint 1.74.0 max-warnings option warning exit code

💡 Result:

In oxlint 1.74.0, the --max-warnings option allows you to set a threshold for the number of warning-level rule violations permitted [1][2]. If the number of warnings exceeds the specified integer, oxlint will exit with a non-zero (error) status [1][3]. This option is primarily used to control CI behavior [4]. It functions as a warning threshold rather than an error threshold; standard errors (as opposed to warnings) will typically trigger a non-zero exit code regardless of this setting [5]. You can configure this via the command line using --max-warnings=INT or through your configuration file (e.g.,.oxlintrc.json or oxlint.config.ts) by setting options.maxWarnings [2][3]. When both are present, the CLI flag takes precedence [2].

Citations:


Fail CI on oxlint warnings and add a dedicated typecheck step.

.oxlintrc.json has no-explicit-any and only-export-components as warnings, while pnpm lint runs oxlint . without a threshold, so the Lint job can pass when lint output only contains warnings. Also, typescript-eslint is gone and CI has no explicit tsc --noEmit run, leaving Vite as the only type gate.

♻️ Proposed scripts
-    "lint": "oxlint .",
-    "lint:fix": "oxlint --fix .",
+    "lint": "oxlint --max-warnings=0 .",
+    "lint:fix": "oxlint --fix .",
+    "typecheck": "tsc --noEmit",

Wire pnpm typecheck into .github/workflows/ci.yml alongside the lint step.

📝 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
"lint": "oxlint .",
"lint:fix": "oxlint --fix .",
"lint": "oxlint --max-warnings=0 .",
"lint:fix": "oxlint --fix .",
"typecheck": "tsc --noEmit",
🤖 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 `@package.json` around lines 10 - 11, Update the package scripts so lint fails
on oxlint warnings by applying the appropriate warning threshold, and add a
dedicated typecheck script that runs TypeScript with no emit. Update the CI
workflow’s lint/type-check job to invoke pnpm typecheck alongside pnpm lint,
using the existing script names and preserving the current lint command
behavior.


"use client";

/* eslint-disable react-hooks/exhaustive-deps */

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.

📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Scope the hook lint suppression to specific effects.

The file-wide react-hooks/exhaustive-deps disable also suppresses dependency checks for the effects at Line [179]-[183], Line [200]-[205], and Line [219]-[227]. Stabilize the callbacks or use line-scoped suppressions so future stale-closure bugs remain detectable.

🤖 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 `@src/components/layout/Sidebar.tsx` at line 14, Replace the file-wide
react-hooks/exhaustive-deps suppression in Sidebar with targeted fixes:
stabilize the callbacks used by the effects around lines 179–183, 200–205, and
219–227, or apply narrowly scoped suppressions only where dependencies are
intentionally omitted. Keep dependency validation enabled for all unrelated
hooks.

Comment on lines +922 to +929
downloadingAsset === String(asset.id) &&
"border-blue-500 bg-blue-500/10 shadow-[0_0_10px_rgba(59,130,246,0.1)]",
)}
onClick={() => downloadingAsset !== asset.id && handleDownload(asset)}
disabled={downloadingAsset !== null && downloadingAsset !== asset.id}
onClick={() => downloadingAsset !== String(asset.id) && handleDownload(asset)}
disabled={downloadingAsset !== null && downloadingAsset !== String(asset.id)}
title={asset.name}
>
{downloadingAsset === asset.id ? (
{downloadingAsset === String(asset.id) ? (

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Disable the active download button as well.

The current asset remains enabled while downloading, but its handler short-circuits, so clicks become silent no-ops. Use disabled={downloadingAsset !== null} and remove the redundant guard, or provide explicit retry/cancel behavior.

🤖 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 `@src/components/layout/Sidebar.tsx` around lines 922 - 929, Update the
download button in the Sidebar asset action to disable whenever downloadingAsset
is non-null, including the active asset, and remove the redundant
downloadingAsset check from its onClick handler while preserving
handleDownload(asset) for enabled buttons.

@@ -1,3 +1,4 @@
/* eslint-disable react-refresh/only-export-components */

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.

📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Centralize or narrow the repeated Fast Refresh suppressions.

These file-wide directives disable react-refresh/only-export-components for every export. Verify the intentional mixed exports, then prefer a shared lint configuration exception or targeted suppressions so accidental exports remain detectable.

  • src/components/ui/button.tsx#L1-L1: narrow or centralize the exception for the button/variant exports.
  • src/components/ui/badge.tsx#L1-L1: narrow or centralize the exception for the badge/variant exports.
  • src/components/ui/form.tsx#L1-L1: narrow or centralize the exception for form helper exports.
  • src/components/ui/navigation-menu.tsx#L1-L1: narrow or centralize the exception for navigation-menu style exports.
  • src/components/ui/sidebar.tsx#L1-L1: narrow or centralize the exception for sidebar helper exports.
  • src/components/ui/toggle.tsx#L1-L1: narrow or centralize the exception for toggle variant exports.
📍 Affects 6 files
  • src/components/ui/button.tsx#L1-L1 (this comment)
  • src/components/ui/badge.tsx#L1-L1
  • src/components/ui/form.tsx#L1-L1
  • src/components/ui/navigation-menu.tsx#L1-L1
  • src/components/ui/sidebar.tsx#L1-L1
  • src/components/ui/toggle.tsx#L1-L1
🤖 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 `@src/components/ui/button.tsx` at line 1, Replace the file-wide
react-refresh/only-export-components suppressions with a centralized lint
configuration exception or targeted suppressions covering only the intentional
mixed exports. Apply this consistently in src/components/ui/button.tsx:1,
src/components/ui/badge.tsx:1, src/components/ui/form.tsx:1,
src/components/ui/navigation-menu.tsx:1, src/components/ui/sidebar.tsx:1, and
src/components/ui/toggle.tsx:1, while keeping accidental exports detectable.

Comment thread src/pages/Stacks.tsx
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_PASSWORD: changeme

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.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Remove predictable database passwords from deployable templates.

Both templates publish database ports while provisioning known credentials. Require user-provided secrets via .env or generate them at deployment time.

  • src/pages/Stacks.tsx#L114-L114: replace changeme with a required POSTGRES_PASSWORD environment substitution.
  • src/pages/Stacks.tsx#L130-L130: replace changeme with a required MONGO_INITDB_ROOT_PASSWORD environment substitution.
📍 Affects 1 file
  • src/pages/Stacks.tsx#L114-L114 (this comment)
  • src/pages/Stacks.tsx#L130-L130
🤖 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 `@src/pages/Stacks.tsx` at line 114, Replace the hardcoded changeme values in
the deployable templates within Stacks.tsx: at lines 114 and 130, use required
environment substitutions for POSTGRES_PASSWORD and MONGO_INITDB_ROOT_PASSWORD
respectively, so deployment requires user-provided secrets via .env or generates
them at deployment time.

Comment thread src/pages/Volumes.tsx
Comment on lines 458 to +459
<TableCell className="text-muted-foreground text-xs font-mono">
{v.size >= 0 ? formatBytes(v.size) : "N/A"}
{v.size > 0 ? formatBytes(v.size) : "N/A"}

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Display zero-byte volumes as 0 Bytes.

An empty volume legitimately has size 0; this condition now shows N/A instead. Preserve the negative sentinel only.

Proposed fix
- {v.size > 0 ? formatBytes(v.size) : "N/A"}
+ {v.size >= 0 ? formatBytes(v.size) : "N/A"}
📝 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
<TableCell className="text-muted-foreground text-xs font-mono">
{v.size >= 0 ? formatBytes(v.size) : "N/A"}
{v.size > 0 ? formatBytes(v.size) : "N/A"}
<TableCell className="text-muted-foreground text-xs font-mono">
{v.size >= 0 ? formatBytes(v.size) : "N/A"}
🤖 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 `@src/pages/Volumes.tsx` around lines 458 - 459, Update the size display in the
Volumes table to format zero-byte volumes with formatBytes(v.size) as “0 Bytes”;
only use “N/A” for the existing negative sentinel value, while preserving
formatting for positive sizes.

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.

3 participants