Add checksum type indicator to bundle detail page#1375
Conversation
|
Warning Rate limit exceeded@riderx has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 8 minutes and 57 seconds before requesting another review. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the 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. 📒 Files selected for processing (17)
📝 WalkthroughWalkthroughAdds checksum metadata: four new translation keys, an exported checksum classification API ( Changes
Sequence Diagram(s)(omitted) Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Suggested labels
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom Pre-merge Checks in the settings. 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: 2
🤖 Fix all issues with AI agents
In @src/services/conversion.ts:
- Around line 51-87: The getChecksumInfo function currently classifies checksums
by length only; update it to also validate that the string contains only
hexadecimal characters before returning sha256 (for length 64) or crc32 (for
length 8). Specifically, in getChecksumInfo add a hex-format check (e.g. a regex
check for only 0-9A-F/a-f) applied when length === 64 and length === 8, and fall
back to the existing unknown return if the content is not valid hex; keep all
existing return shapes and labels (type/label/minPluginVersion/features).
- Around line 66-67: The hardcoded minPluginVersion for the SHA-256 entry is
incorrect: update the object with label 'SHA-256' by changing its
minPluginVersion from '4.4.0' to the correct minimum based on the targeted
plugin major line (use '5.10.0' for v5.x, '6.25.0' for v6.x, or leave as the v7+
baseline if targeting v7), and while here verify the CRC32 entry (label 'CRC32'
/ minPluginVersion '4.0.0') against the plugin changelog and adjust that
minPluginVersion if needed to reflect the true historical requirement.
🧹 Nitpick comments (1)
src/pages/app/[package].bundle.[bundle].vue (1)
741-762: Consider extracting the badge and tooltip to a reusable component.The checksum badge and tooltip implementation is well-structured, but the inline complexity could be improved by extracting it into a dedicated component (e.g.,
ChecksumBadge.vue). This would:
- Improve maintainability if similar badges are needed elsewhere
- Reduce template complexity in this page
- Make the tooltip behavior easier to test
Additionally, the
whitespace-nowrapclass on the tooltip (line 754) might truncate longer translations. Consider usingwhitespace-normalormax-w-xsto allow text wrapping for better i18n support.💡 Optional refactor: Extract to component
Create
src/components/ChecksumBadge.vue:<script setup lang="ts"> import type { ChecksumInfo } from '~/services/conversion' defineProps<{ checksumInfo: ChecksumInfo }>() const { t } = useI18n() </script> <template> <div class="relative group"> <span class="inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-full cursor-help" :class="{ 'bg-blue-100 text-blue-800 dark:bg-blue-900/50 dark:text-blue-200': checksumInfo.type === 'sha256', 'bg-green-100 text-green-800 dark:bg-green-900/50 dark:text-green-200': checksumInfo.type === 'crc32', 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-200': checksumInfo.type === 'unknown', }" > {{ checksumInfo.label }} </span> <!-- Tooltip content... --> </div> </template>Then use it in the page:
<ChecksumBadge :checksum-info="checksumInfo" />
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
messages/en.jsonsrc/pages/app/[package].bundle.[bundle].vuesrc/services/conversion.ts
🧰 Additional context used
📓 Path-based instructions (11)
**/*.{ts,tsx,js,jsx,vue}
📄 CodeRabbit inference engine (CLAUDE.md)
Use single quotes and no semicolons per @antfu/eslint-config
Files:
src/services/conversion.tssrc/pages/app/[package].bundle.[bundle].vue
src/services/**/*.{ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
API clients and external service integrations should be organized in
src/services/directory
Files:
src/services/conversion.ts
**/*.{ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
Use TypeScript strict mode with path aliases mapping
~/tosrc/
Files:
src/services/conversion.ts
{capacitor.config.{ts,js},src/**/*.{ts,tsx,vue}}
📄 CodeRabbit inference engine (CLAUDE.md)
Mobile apps should use Capacitor with app ID
ee.forgr.capacitor_gofor native mobile functionality
Files:
src/services/conversion.tssrc/pages/app/[package].bundle.[bundle].vue
src/**/*.{ts,tsx,vue,js}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Use
~/alias for imports fromsrc/directory in frontend TypeScript and Vue components
Files:
src/services/conversion.tssrc/pages/app/[package].bundle.[bundle].vue
src/**/*.{vue,ts,js}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Frontend ESLint must pass before commit; run
bun lint:fixto auto-fix issues in frontend files
Files:
src/services/conversion.tssrc/pages/app/[package].bundle.[bundle].vue
src/**/*.{vue,ts,tsx,js}
📄 CodeRabbit inference engine (AGENTS.md)
Konsta components are reserved for the safe area helpers; avoid importing
konstaanywhere else in the app
Files:
src/services/conversion.tssrc/pages/app/[package].bundle.[bundle].vue
src/**/*.vue
📄 CodeRabbit inference engine (CLAUDE.md)
src/**/*.vue: Use Vue 3 with Composition API and<script setup>syntax for frontend components
Style components using TailwindCSS with DaisyUI components
src/**/*.vue: Use Vue 3<script setup>syntax exclusively for all Vue component scripts
Use Tailwind utility classes for layout and spacing in Vue components
Use DaisyUI components (d-btn,d-input,d-card) for interactive elements in Vue components
Use Konsta components ONLY for safe area helpers (top/bottom insets) in Vue components; avoid other uses
UseuseRoute()fromvue-routerto access route parameters anduseRouter()for programmatic navigation in Vue componentsUse DaisyUI (
d-prefixed classes) for buttons, inputs, and other interactive primitives to keep behavior and spacing consistent
Files:
src/pages/app/[package].bundle.[bundle].vue
src/pages/**/*.vue
📄 CodeRabbit inference engine (CLAUDE.md)
Use file-based routing with unplugin-vue-router for frontend pages
Frontend file-based routing uses
src/pages/directory structure; routes auto-generate withunplugin-vue-routerand types are available insrc/typed-router.d.ts
Files:
src/pages/app/[package].bundle.[bundle].vue
src/**/*.{vue,css,scss}
📄 CodeRabbit inference engine (AGENTS.md)
The web client is built with Vue.js and Tailwind CSS; lean on utility classes and composition-friendly patterns rather than bespoke CSS
Files:
src/pages/app/[package].bundle.[bundle].vue
src/**/*.{css,scss,vue}
📄 CodeRabbit inference engine (AGENTS.md)
Mirror the Capgo design palette from
src/styles/style.css(e.g.,--color-primary-500: #515271,--color-azure-500: #119eff) when introducing new UI, using deep slate bases with the Extract azure highlight and soft radii
Files:
src/pages/app/[package].bundle.[bundle].vue
🧠 Learnings (2)
📚 Learning: 2025-10-30T14:58:37.007Z
Learnt from: Dalanir
Repo: Cap-go/capgo PR: 1238
File: src/layouts/settings.vue:7-13
Timestamp: 2025-10-30T14:58:37.007Z
Learning: In the Cap-go/capgo repository, heroicons are imported using the pattern `~icons/heroicons/icon-name` (e.g., `~icons/heroicons/user`, `~icons/heroicons/bell`) without requiring `/outline/` or `/solid/` path segments. Solid variants use a `-solid` suffix in the icon name itself (e.g., `~icons/heroicons/arrow-path-solid`).
Applied to files:
src/pages/app/[package].bundle.[bundle].vue
📚 Learning: 2025-12-23T01:19:04.593Z
Learnt from: riderx
Repo: Cap-go/capgo PR: 1297
File: src/components/dashboard/DeploymentBanner.vue:77-79
Timestamp: 2025-12-23T01:19:04.593Z
Learning: In the Cap-go codebase, ensure that app permission checks never include the role 'owner'. App-level permissions should be based on the user_min_right enum with values: read, upload, write, admin, super_admin (and NOT owner). This pattern applies across Vue components that perform permission checks; if you find a check referencing 'owner' for app-level access, replace it with the appropriate user_min_right value and keep organization-level owner handling in organization.ts.
Applied to files:
src/pages/app/[package].bundle.[bundle].vue
🔇 Additional comments (4)
src/pages/app/[package].bundle.[bundle].vue (2)
17-17: LGTM: Import statement is correct.The import follows the project's path alias convention and imports the necessary function for checksum detection.
159-161: LGTM: Computed property implementation is clean.The computed property correctly uses optional chaining to handle undefined version values and follows Vue 3 Composition API best practices.
messages/en.json (1)
454-456: LGTM: Translation keys are clear and concise.The new translation keys (
checksum-crc32-desc,checksum-sha256-desc,checksum-type-info,min-plugin-version) are well-named and provide useful information to users.Minor observation: The
min-plugin-versionkey at line 866 is separated from the other checksum-related keys (lines 454-456). Consider grouping them together in future updates for easier maintenance.Also applies to: 866-866
src/services/conversion.ts (1)
37-44: LGTM: Type definitions are well-structured.The
ChecksumTypeunion type andChecksumInfointerface are clearly defined and provide good type safety for the checksum detection feature.
| export function getChecksumInfo(checksum: string | null | undefined): ChecksumInfo { | ||
| if (!checksum) { | ||
| return { | ||
| type: 'unknown', | ||
| label: 'Unknown', | ||
| minPluginVersion: '-', | ||
| features: [], | ||
| } | ||
| } | ||
|
|
||
| const length = checksum.length | ||
|
|
||
| if (length === 64) { | ||
| return { | ||
| type: 'sha256', | ||
| label: 'SHA-256', | ||
| minPluginVersion: '4.4.0', | ||
| features: ['integrity-verification', 'corruption-detection', 'security'], | ||
| } | ||
| } | ||
|
|
||
| if (length === 8) { | ||
| return { | ||
| type: 'crc32', | ||
| label: 'CRC32', | ||
| minPluginVersion: '4.0.0', | ||
| features: ['fast-verification', 'corruption-detection'], | ||
| } | ||
| } | ||
|
|
||
| return { | ||
| type: 'unknown', | ||
| label: 'Unknown', | ||
| minPluginVersion: '-', | ||
| features: [], | ||
| } | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# Find all usages of getChecksumInfo function
rg -n "getChecksumInfo" --type=ts --type=tsx --type=vue -B 2 -A 2Repository: Cap-go/capgo
Length of output: 83
🏁 Script executed:
# Find where checksums are sourced/defined in the codebase
rg -n "checksum" --type=ts --type=tsx --type=vue -B 2 -A 2 | head -100Repository: Cap-go/capgo
Length of output: 83
🏁 Script executed:
# Check if there's any validation logic already in place for checksums
rg -n "hex|checksum.*validat|validat.*checksum" --type=ts --type=tsx -iRepository: Cap-go/capgo
Length of output: 83
🏁 Script executed:
# Look for database schema or types related to checksums
fd -e ts -e tsx -e vue | xargs rg -l "checksum" | head -20Repository: Cap-go/capgo
Length of output: 822
🏁 Script executed:
# Retry with corrected file types (ts and vue only)
rg -n "getChecksumInfo" --type=ts --type=vue -B 2 -A 2Repository: Cap-go/capgo
Length of output: 83
🏁 Script executed:
# Find checksum references without problematic types
rg -n "checksum" --type=ts --type=vue -i | head -50Repository: Cap-go/capgo
Length of output: 83
🏁 Script executed:
# Look at the conversion.ts file
cat -n src/services/conversion.tsRepository: Cap-go/capgo
Length of output: 2959
🏁 Script executed:
# Check test files related to checksums
cat -n tests/cli-old-checksum.test.tsRepository: Cap-go/capgo
Length of output: 1390
🏁 Script executed:
# Search for getChecksumInfo usage
rg -n "getChecksumInfo" --type=tsRepository: Cap-go/capgo
Length of output: 170
🏁 Script executed:
# Search for where checksums are generated or stored
rg -n "checksum.*=" --type=ts -A 1 | head -60Repository: Cap-go/capgo
Length of output: 2600
🏁 Script executed:
# Look for checksum handling in bundle/upload functions
rg -n "checksum" supabase/functions/_backend/public/bundle/create.ts -B 3 -A 3Repository: Cap-go/capgo
Length of output: 945
🏁 Script executed:
# Check if checksums are validated when stored in database
rg -n "checksum" supabase/functions/_backend/utils/postgres_schema.ts -B 2 -A 2Repository: Cap-go/capgo
Length of output: 274
🏁 Script executed:
# Search for imports of getChecksumInfo or from conversion.ts
rg -n "getChecksumInfo|from.*conversion" --type=tsRepository: Cap-go/capgo
Length of output: 349
🏁 Script executed:
# Search in all files for getChecksumInfo usage
rg -n "getChecksumInfo" -t ts -t jsRepository: Cap-go/capgo
Length of output: 386
🏁 Script executed:
# Check frontend directory structure
find src -type f -name "*.ts" -o -name "*.js" | head -20Repository: Cap-go/capgo
Length of output: 581
🏁 Script executed:
# Look for checksum handling in frontend
rg -n "checksum" src --type=ts --type=js -B 1 -A 1Repository: Cap-go/capgo
Length of output: 8040
🏁 Script executed:
# Check how checksums are generated/validated in backend upload handler
rg -n "parseChecksum" supabase/functions/_backend/files/uploadHandler.ts -B 5 -A 10Repository: Cap-go/capgo
Length of output: 1161
🏁 Script executed:
# Check the parse.ts file for checksum parsing details
cat -n supabase/functions/_backend/files/parse.ts | head -80Repository: Cap-go/capgo
Length of output: 2570
🏁 Script executed:
# Check what format checksums are stored in the database
rg -n "toBase64|fromBase64" supabase/functions/_backend/files/ --type=ts -B 2 -A 2Repository: Cap-go/capgo
Length of output: 4545
🏁 Script executed:
# Check the util.ts to understand checksum format
cat -n supabase/functions/_backend/files/util.ts | head -100Repository: Cap-go/capgo
Length of output: 3653
🏁 Script executed:
# See how checksum is stored when inserting into database
rg -n "custom_metadata\|X_CHECKSUM" supabase/functions/_backend/ --type=ts -B 2 -A 2 | head -40Repository: Cap-go/capgo
Length of output: 38
🏁 Script executed:
# Check if checksums are converted to hex format anywhere
rg -n "toHex|toString.*16|Buffer.*hex" supabase/functions/_backend/ --type=tsRepository: Cap-go/capgo
Length of output: 391
🏁 Script executed:
# Check how checksums are returned to the frontend
rg -n "checksum.*return|return.*checksum" supabase/functions/_backend/public/ --type=ts -B 3 -A 3Repository: Cap-go/capgo
Length of output: 38
🏁 Script executed:
# Look at the bundle create endpoint to see what's stored in the database
rg -n "app_versions.*insert|checksum.*insert" supabase/functions/_backend/public/bundle/create.ts -B 5 -A 5Repository: Cap-go/capgo
Length of output: 38
🏁 Script executed:
# Check if there's a conversion from base64 to hex anywhere in the frontend
rg -n "toHex|toString.*16|hex" src/ --type=tsRepository: Cap-go/capgo
Length of output: 308
🏁 Script executed:
# Check what format the checksum field actually contains in the database
# Look at how bundle creates are tested
cat -n tests/bundle-create.test.ts | head -100Repository: Cap-go/capgo
Length of output: 4307
🏁 Script executed:
# Check the CLI/SDK to see what format it sends checksums in
rg -n "checksum" supabase/functions/_backend/public/bundle/create.ts -B 5 -A 5Repository: Cap-go/capgo
Length of output: 1600
🏁 Script executed:
# See what happens with the checksum in the update flow
rg -n "body\.checksum\|checksum.*string" supabase/functions/_backend/public/bundle/create.ts -B 3 -A 3Repository: Cap-go/capgo
Length of output: 38
Add hexadecimal validation to match documented behavior.
The getChecksumInfo function's JSDoc explicitly states it expects "64 hex characters" for SHA-256 and "8 hex characters" for CRC32, but the implementation only checks string length. A non-hexadecimal string of 64 characters would be incorrectly classified as SHA-256. While checksums currently come from controlled sources (SDK/backend), adding format validation makes the function more robust and aligns with its documented contract.
Suggested enhancement with hex validation
export function getChecksumInfo(checksum: string | null | undefined): ChecksumInfo {
if (!checksum) {
return {
type: 'unknown',
label: 'Unknown',
minPluginVersion: '-',
features: [],
}
}
const length = checksum.length
+ const isHex = /^[0-9a-fA-F]+$/.test(checksum)
+
+ if (!isHex) {
+ return {
+ type: 'unknown',
+ label: 'Unknown',
+ minPluginVersion: '-',
+ features: [],
+ }
+ }
if (length === 64) {
return {
type: 'sha256',
label: 'SHA-256',
minPluginVersion: '4.4.0',
features: ['integrity-verification', 'corruption-detection', 'security'],
}
}
if (length === 8) {
return {
type: 'crc32',
label: 'CRC32',
minPluginVersion: '4.0.0',
features: ['fast-verification', 'corruption-detection'],
}
}
return {
type: 'unknown',
label: 'Unknown',
minPluginVersion: '-',
features: [],
}
}📝 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.
| export function getChecksumInfo(checksum: string | null | undefined): ChecksumInfo { | |
| if (!checksum) { | |
| return { | |
| type: 'unknown', | |
| label: 'Unknown', | |
| minPluginVersion: '-', | |
| features: [], | |
| } | |
| } | |
| const length = checksum.length | |
| if (length === 64) { | |
| return { | |
| type: 'sha256', | |
| label: 'SHA-256', | |
| minPluginVersion: '4.4.0', | |
| features: ['integrity-verification', 'corruption-detection', 'security'], | |
| } | |
| } | |
| if (length === 8) { | |
| return { | |
| type: 'crc32', | |
| label: 'CRC32', | |
| minPluginVersion: '4.0.0', | |
| features: ['fast-verification', 'corruption-detection'], | |
| } | |
| } | |
| return { | |
| type: 'unknown', | |
| label: 'Unknown', | |
| minPluginVersion: '-', | |
| features: [], | |
| } | |
| } | |
| export function getChecksumInfo(checksum: string | null | undefined): ChecksumInfo { | |
| if (!checksum) { | |
| return { | |
| type: 'unknown', | |
| label: 'Unknown', | |
| minPluginVersion: '-', | |
| features: [], | |
| } | |
| } | |
| const length = checksum.length | |
| const isHex = /^[0-9a-fA-F]+$/.test(checksum) | |
| if (!isHex) { | |
| return { | |
| type: 'unknown', | |
| label: 'Unknown', | |
| minPluginVersion: '-', | |
| features: [], | |
| } | |
| } | |
| if (length === 64) { | |
| return { | |
| type: 'sha256', | |
| label: 'SHA-256', | |
| minPluginVersion: '4.4.0', | |
| features: ['integrity-verification', 'corruption-detection', 'security'], | |
| } | |
| } | |
| if (length === 8) { | |
| return { | |
| type: 'crc32', | |
| label: 'CRC32', | |
| minPluginVersion: '4.0.0', | |
| features: ['fast-verification', 'corruption-detection'], | |
| } | |
| } | |
| return { | |
| type: 'unknown', | |
| label: 'Unknown', | |
| minPluginVersion: '-', | |
| features: [], | |
| } | |
| } |
🤖 Prompt for AI Agents
In @src/services/conversion.ts around lines 51 - 87, The getChecksumInfo
function currently classifies checksums by length only; update it to also
validate that the string contains only hexadecimal characters before returning
sha256 (for length 64) or crc32 (for length 8). Specifically, in getChecksumInfo
add a hex-format check (e.g. a regex check for only 0-9A-F/a-f) applied when
length === 64 and length === 8, and fall back to the existing unknown return if
the content is not valid hex; keep all existing return shapes and labels
(type/label/minPluginVersion/features).
There was a problem hiding this comment.
useless this is read only the backend do the checksomewhere else check here makes zero sense
There was a problem hiding this comment.
@riderx, you're absolutely right. Since getChecksumInfo is purely a display utility that classifies already-validated checksums from the database, adding hex validation here would be redundant. The backend handles validation at the point of storage, so this function can safely assume valid input. Thanks for the clarification!
Shows visual indicator (SHA-256 or CRC32) with tooltip explaining minimum plugin version and algorithm features. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- SHA-256 is the default algorithm used by CLI - CRC32 is a legacy option (rarely used) - Both require plugin version >4.4.0 (not >=) - Updated translations to clarify default/legacy status 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Based on CLI code at /Users/martindonadieu/Projects/capgo_all/cli: SHA-256 (64 chars) is used when: - V2 encryption is enabled (.capgo_key_v2 exists) - OR modern plugin versions: 5.10.0+, 6.25.0+, 7.0.30+ CRC32 (8 chars) is used when: - Older plugin versions without V2 encryption 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
f29d4f7 to
4a0aa54
Compare
- Position tooltip to the right to avoid being cut off by parent - Use v-show with ref for visibility control - Add click handler for mobile tap support - Keep mouseenter/mouseleave for desktop hover 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
SHA-256 (64 chars): Used with v5 + encryption, or v6, v7, v8 CRC32 (8 chars): Used with v5 without encryption 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Add translations for checksum badge tooltip in 14 languages: - checksum-crc32-desc - checksum-sha256-desc - checksum-type-info - min-plugin-version 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
* Add checksum type indicator badge to bundle detail page Shows visual indicator (SHA-256 or CRC32) with tooltip explaining minimum plugin version and algorithm features. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * Update checksum info based on CLI source code analysis - SHA-256 is the default algorithm used by CLI - CRC32 is a legacy option (rarely used) - Both require plugin version >4.4.0 (not >=) - Updated translations to clarify default/legacy status 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * Fix checksum version info based on actual CLI source code Based on CLI code at /Users/martindonadieu/Projects/capgo_all/cli: SHA-256 (64 chars) is used when: - V2 encryption is enabled (.capgo_key_v2 exists) - OR modern plugin versions: 5.10.0+, 6.25.0+, 7.0.30+ CRC32 (8 chars) is used when: - Older plugin versions without V2 encryption 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * Fix tooltip overflow and add mobile click support - Position tooltip to the right to avoid being cut off by parent - Use v-show with ref for visibility control - Add click handler for mobile tap support - Keep mouseenter/mouseleave for desktop hover 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * Clarify checksum version requirements SHA-256 (64 chars): Used with v5 + encryption, or v6, v7, v8 CRC32 (8 chars): Used with v5 without encryption 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * Add checksum type indicator translations for all languages Add translations for checksum badge tooltip in 14 languages: - checksum-crc32-desc - checksum-sha256-desc - checksum-type-info - min-plugin-version 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
* Add checksum type indicator badge to bundle detail page Shows visual indicator (SHA-256 or CRC32) with tooltip explaining minimum plugin version and algorithm features. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * Update checksum info based on CLI source code analysis - SHA-256 is the default algorithm used by CLI - CRC32 is a legacy option (rarely used) - Both require plugin version >4.4.0 (not >=) - Updated translations to clarify default/legacy status 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * Fix checksum version info based on actual CLI source code Based on CLI code at /Users/martindonadieu/Projects/capgo_all/cli: SHA-256 (64 chars) is used when: - V2 encryption is enabled (.capgo_key_v2 exists) - OR modern plugin versions: 5.10.0+, 6.25.0+, 7.0.30+ CRC32 (8 chars) is used when: - Older plugin versions without V2 encryption 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * Fix tooltip overflow and add mobile click support - Position tooltip to the right to avoid being cut off by parent - Use v-show with ref for visibility control - Add click handler for mobile tap support - Keep mouseenter/mouseleave for desktop hover 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * Clarify checksum version requirements SHA-256 (64 chars): Used with v5 + encryption, or v6, v7, v8 CRC32 (8 chars): Used with v5 without encryption 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * Add checksum type indicator translations for all languages Add translations for checksum badge tooltip in 14 languages: - checksum-crc32-desc - checksum-sha256-desc - checksum-type-info - min-plugin-version 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
* Add checksum type indicator badge to bundle detail page Shows visual indicator (SHA-256 or CRC32) with tooltip explaining minimum plugin version and algorithm features. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * Update checksum info based on CLI source code analysis - SHA-256 is the default algorithm used by CLI - CRC32 is a legacy option (rarely used) - Both require plugin version >4.4.0 (not >=) - Updated translations to clarify default/legacy status 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * Fix checksum version info based on actual CLI source code Based on CLI code at /Users/martindonadieu/Projects/capgo_all/cli: SHA-256 (64 chars) is used when: - V2 encryption is enabled (.capgo_key_v2 exists) - OR modern plugin versions: 5.10.0+, 6.25.0+, 7.0.30+ CRC32 (8 chars) is used when: - Older plugin versions without V2 encryption 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * Fix tooltip overflow and add mobile click support - Position tooltip to the right to avoid being cut off by parent - Use v-show with ref for visibility control - Add click handler for mobile tap support - Keep mouseenter/mouseleave for desktop hover 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * Clarify checksum version requirements SHA-256 (64 chars): Used with v5 + encryption, or v6, v7, v8 CRC32 (8 chars): Used with v5 without encryption 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> * Add checksum type indicator translations for all languages Add translations for checksum badge tooltip in 14 languages: - checksum-crc32-desc - checksum-sha256-desc - checksum-type-info - min-plugin-version 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>



Summary
Added a visual checksum type indicator badge (SHA-256 or CRC32) to the bundle detail page. When hovering over the badge, users see a tooltip explaining the checksum algorithm, minimum required plugin version, and the algorithm's purpose.
Test plan
Screenshots
The badge appears inline with the checksum display, using DaisyUI styling for consistency with the rest of the application.
Checklist
bun run lint:backend && bun run lint.Summary by CodeRabbit
✏️ Tip: You can customize this high-level summary in your review settings.