Conversation
- 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
📝 WalkthroughWalkthroughThis 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. ChangesRelease, tooling, and configuration
Docker and frontend behavior
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
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
⛔ Files ignored due to path filters (2)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yamlsrc-tauri/Cargo.lockis 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.jsonCHANGELOG.mdcomponents.jsoneslint.config.jsindex.htmlpackage.jsonsrc-tauri/Cargo.tomlsrc-tauri/src/commands/swarm.rssrc-tauri/src/commands/volumes.rssrc-tauri/tauri.conf.jsonsrc/components/layout/AppLayout.tsxsrc/components/layout/Sidebar.tsxsrc/components/ui/badge.tsxsrc/components/ui/button.tsxsrc/components/ui/form.tsxsrc/components/ui/navigation-menu.tsxsrc/components/ui/sidebar.tsxsrc/components/ui/toggle.tsxsrc/context/DockerContext.tsxsrc/hooks/use-docker-events.tssrc/main.tsxsrc/pages/Containers.tsxsrc/pages/Images.tsxsrc/pages/Index.tsxsrc/pages/Networks.tsxsrc/pages/NotFound.tsxsrc/pages/Stacks.tsxsrc/pages/Swarm.tsxsrc/pages/Volumes.tsxtsconfig.app.jsontsconfig.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
|
|
||
| - name: Setup Node.js | ||
| uses: actions/setup-node@v6 | ||
| uses: actions/setup-node@v7 |
There was a problem hiding this comment.
🔒 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 thereleasejob's Setup Node.js step to the same SHA..github/workflows/semantic-release.yml#L71-L71: pin thebuildjob'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
| "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 }] | ||
| }, |
There was a problem hiding this comment.
📐 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; }
doneRepository: 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
doneRepository: 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:
- 1: https://oxc.rs/docs/guide/usage/linter/rules/typescript/no-explicit-any
- 2: https://github.com/oxc-project/oxc/blob/6147d225716269ae56daf77c60c6cd75a4ffaa1c/crates/oxc_linter/src/rules/typescript/no_explicit_any.rs
- 3: https://oxc.rs/docs/guide/usage/linter/rules/react/only-export-components.html
- 4: fix: Add react-refresh/only-export-components support and fix eslint-plugin-n rule aliases oxc-project/oxlint-migrate#342
- 5: linter: react-refresh rule can only be disabled using react namespace oxc-project/oxc#18070
- 6: https://github.com/oxc-project/oxc/blob/cacbc4a9/tasks/lint_rules/src/oxlint-rules.mjs
🌐 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:
- 1: feat(linter)!: report error on unknown builtin rule oxc-project/oxc#20464
- 2: Is there a way to get a CLI error for unrecognized rules? oxc-project/oxc#20352
- 3: https://oxc.rs/docs/guide/usage/linter/config.html
- 4: new plugin: `oxlint-config` oxc-project/oxc#7086
- 5: https://oxc.rs/docs/guide/usage/linter/js-plugins.html
- 6: linter: rule incorrectly reported as unmatched oxc-project/oxc#7025
- 7: https://oxc.rs/docs/guide/usage/linter/plugins.html
🏁 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"
fiRepository: 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.
| .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%); | ||
| } | ||
| } |
There was a problem hiding this comment.
📐 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.
| .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.
| <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> |
There was a problem hiding this comment.
🎯 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.
| "lint": "oxlint .", | ||
| "lint:fix": "oxlint --fix .", |
There was a problem hiding this comment.
📐 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.jsonRepository: 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
doneRepository: 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:
- 1: https://oxc.rs/docs/guide/usage/linter/cli.html
- 2: https://oxc.rs/docs/guide/usage/linter/config.html
- 3: https://oxc.rs/docs/guide/usage/linter/config-file-reference.html
- 4: https://oxc.rs/docs/guide/usage/linter/quickstart.html
- 5: Problem in oxlint with exit code oxc-project/oxc#5073
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.
| "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 */ |
There was a problem hiding this comment.
📐 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.
| 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) ? ( |
There was a problem hiding this comment.
🎯 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 */ | |||
There was a problem hiding this comment.
📐 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-L1src/components/ui/form.tsx#L1-L1src/components/ui/navigation-menu.tsx#L1-L1src/components/ui/sidebar.tsx#L1-L1src/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.
| environment: | ||
| POSTGRES_USER: user | ||
| POSTGRES_PASSWORD: password | ||
| POSTGRES_PASSWORD: changeme |
There was a problem hiding this comment.
🔒 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: replacechangemewith a requiredPOSTGRES_PASSWORDenvironment substitution.src/pages/Stacks.tsx#L130-L130: replacechangemewith a requiredMONGO_INITDB_ROOT_PASSWORDenvironment 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.
| <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"} |
There was a problem hiding this comment.
🎯 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.
| <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.
Merge de fixes, bumps e melhorias aplicadas em dev para main (preparando para release v1.15.0
Summary by CodeRabbit