🔧 Bug Fixes & Refactoring (Code Review Iteration):
- tests/: Extracted duplicated test helper functions (
pass,fail,assert_eq,assert_contains,assert_file_exists,extract_func,make_workspace,make_test_cheat) into a sharedtest_helpers.shfile, eliminating maintenance burden across 7 test files. - .github/workflows/ci.yml: Added
generate-tldr.shto the CI version-sync check so itsVERSIONvariable is validated againstversion.txt. - devtoolbox-cheats.30s.sh: Fixed viewer-selection loop to always
return 0after invokingcode --reuse-window, preventing silent fallthrough to other viewers when VS Code is installed but the command fails. - kde-widget-plasma6 main.qml: Increased
startupRetryTimerandretryBoundTimerintervals from 10s to 30s, preventing premature disconnection of the indexer for large cheats directories. - cheats-updater.sh: Fixed broken rollback mechanism in backup recovery —
mktemp -dwas pre-creating the rollback destination, allowingmvto nestCHEATS_DIRinside it rather than performing a true rename, which broke the intended rollback path. Now uses a staging parent directory so bothmvoperations perform true renames, with proper cleanup on both success and failure paths. - kde-widget-plasma5 cheats.js: Fixed shell injection vulnerability in
getIndexCommand()—cheatsDiranddebugLogwere interpolated directly into double-quoted bash strings without escaping. AddedescapeBashDoubleQuoted()helper to properly escape",$,`, and\characters before interpolation. - kde-widget-plasma5 cheats.js: Added
mkdir -pfor the debug log parent directory in the indexer shell command, preventing silent failure when the cache directory doesn't exist yet. - kde-widget-plasma5 cheats.js: Added exit-status check and
/tmpfallback for themkdir -pingetIndexCommand()— if the debug log directory cannot be created, falls back to/tmp/devtoolbox-debug.log; if that also fails, emits an error and exits non-zero. - devtoolbox-cheats.30s.sh:
applyTocFormat()now waits formanage-tocs.pyto finish and propagates its exit status to callers ofsetTocFormatand the CLIapplyTocFormatcommand, instead of backgrounding and detaching the process. - devtoolbox-cheats.30s.sh: Added guard to EXIT trap for
_ARGOS_TMP_CACHE— skips cleanup when the variable is empty and always returns success, preventingrm -f ""from overriding the script's exit status. - devtoolbox-cheats.30s.sh:
_ARGOS_TMP_CACHEis now only cleared aftermv -f "$tmp_cache" "$cat_cache"succeeds, so failed moves still allow the temporary cache to be removed by the EXIT trap. - kde-widget-plasma5 cheats.js: Added write-verification for the initial
echo > "$debugLog"ingetIndexCommand()— if the log file is not writable, falls back to/tmp/devtoolbox-debug.logand retries; emits an error and exits non-zero if that also fails. - devtoolbox-cheats.30s.sh:
applyTocFormat()now returns exit code 1 whenmanage-tocs.pyis not found, matching the existing python3 availability check behavior. - devtoolbox-cheats.30s.sh: Fixed EXIT trap in
argos_show_categoryto use a scope-safe global path (_ARGOS_TMP_CACHE) so cleanup works after the function returns, and preserves any existing EXIT trap. - devtoolbox-cheats.30s.sh: Split 8
local var="$(cmd)"declarations into separate declaration and assignment to avoid masking subshell return values (SC2155). - devtoolbox-cheats.30s.sh: Replaced 3 redundant single-item
forloops with directcommand -vchecks (SC2043). - devtoolbox-cheats.30s.sh: Fixed
copy()to let clipboard errors propagate instead of silently masking them (SC2015). - kde-widget-plasma6/debug-widget.sh: Quoted unquoted variables in test expressions to prevent syntax errors on empty values (SC2086).
- bump-version.sh, devtoolbox-cheats.30s.sh: Replaced useless
catpipes with input redirection (SC2002). - cheats-updater.sh: Added exit-status checks to backup recovery block to prevent silent corruption on
rm/cpfailure. - cheats-updater.sh: Strengthened backup recovery to use transactional staging — moves current dir to rollback location before copy, with automatic rollback on failure. Uses
--for safe path handling. - kde-widget-plasma6 indexer.sh: Added diagnostic when debug log directory creation fails instead of silently swallowing the error.
- tools/manage-tocs.py: Preserved original file permissions during atomic write — temp file now inherits the original file's mode bits before replacement.
- tools/manage-tocs.py: Fixed tmp_fd double-close risk by transferring ownership to file object before write can fail.
- manage-tocs.py: Hardened file operations by explicitly catching
OSErrorand safely skipping files that fail to write. RemovedExceptionswallowing for better visibility. - manage-tocs.py: Added
in_fenceparsing state to skip markdown code blocks, preventing inline##comments from being accidentally parsed as TOC headers. - manage-tocs.py: Improved
sys.exitcode tracking when explicit--filesargs contain missing paths; valid files are still successfully processed, but the script accurately returns1at the end to fail CI/CD automation pipelines. - manage-tocs.py: Refactored
clean_header()to reliably slice using a regex stripping##whitespace tolerances, and restricted the removal of trailing translations strictly to Cyrillic payloads. - fix-toc-github.py: Strengthened Strategy 6 (fuzzy matching) heuristics, updated dry-run simulation to utilize in-memory mutated states correctly, resolved bug where duplicate headings incorrectly overwrite keys by dynamically appending GitHub-style suffixes (
-1,-2), and properly corrected TOC links using literal line numbers. - fix_tocs-obsidian.py: Scrapped the duplicated fallback payload script. It is now a highly-efficient Python shim wrapping native
--style obsidianoperations out tomanage-tocs.py. - docs/cheats-readme.sh: Added
set -euo pipefailfor strict bash error handling. Ripped out developer-hardcoded local path references (/home/sviatoslav/...), converting logic to dynamically evaluate the current repository path usingBASH_SOURCE[0], gracefully supportingCHEATS_DIRandREADME_FILEvariable overrides. - devtoolbox-cheats.30s.sh: Simplified the
argos_set_categoryinternal API directory initialization by applyingmkdir -p -m 0700directly. - KDE Plasma (5 & 6) Widgets: Restructured formatting implementation for UI
configGeneral.qmlfiles;applyTocFormatNow()logic now explicitly shell-escapescfg_cheatsDirto prevent shell injection via malicious directory names while safely allowing$HOMEexpansion, normalizescfg_tocFormatinjections defensively, and reliably queries.localor repo directories using chained evaluation if finding scripts.
🧪 Test Improvements:
- tests/test_uninstall.sh: Added user cheat sheet preservation assertion to
test_uninstall_removes_known_paths(). - tests/test_uninstall.sh: Updated
test_remove_file_readonlyto check output for failure indicators and verify file existence instead of exit status. - tests/test_uninstall.sh: Replaced inline
mktemp -dassignments with the sharedmake_workspace()helper, adding proper error handling. - tests/test_plasma5_cheats_js.mjs: Strengthened assertion in "uses default debug log when not provided" test to verify the exact default path
/tmp/devtoolbox-debug.loginstead of generic text. - tests/test_install.sh: Fixed
test_configure_toc_format_default_obsidianto stop mutating the real repository by removing themkdir -p "$REPO_ROOT/tools"command. - tests/test_install.sh: Fixed
test_install_cheats_copies_filesto assert the grep result instead of discarding it, ensuring the test validates the install pipeline output. - tests/test_install.sh: Fixed broken "Results" summary line by adding a
passedcounter and using it in the output. - tests/test_install_extended.sh: Replaced inline awk-based function extraction with the existing
extract_func()helper, eliminating code duplication. - tests/test_indexer.sh: Fixed
test_indexer_disables_debug_on_bad_dirto actually assert the indexer succeeds and produces output instead of masking the exit status with|| true. - tests/test_devtoolbox_cheats_ui.sh: Fixed
test_ensure_cache_rebuilds_on_rebuild_flagto use the realindex_cheatsfunction instead of a mocked version that was being overridden, ensuring the test actually validates rebuild behavior. - tests/test_devtoolbox_cheats_screen.sh: Fixed four test functions that always passed regardless of assertion results by conditionally calling
passonly when[[ -n "$out" ]]succeeds. - tests/test_helpers.sh: Created shared test helper file with common utilities (
pass,fail,assert_eq,assert_contains,assert_file_exists,extract_func,make_workspace,make_test_cheat) to eliminate duplication across test files. - tests/test_argos_renderers.sh: Updated to source shared test helpers instead of defining them locally.
- tests/test_cheats_updater_extended2.sh: Updated to source shared test helpers instead of defining them locally.
- tests/test_devtoolbox_cheats_screen.sh: Updated to source shared test helpers instead of defining them locally.
- tests/test_devtoolbox_cheats_ui.sh: Updated to source shared test helpers instead of defining them locally.
- tests/test_indexer.sh: Updated to source shared test helpers instead of defining them locally.
- tests/test_bump_version.sh: Updated to source shared test helpers instead of defining them locally.
- tests/test_cheats_readme.sh: Updated to source shared test helpers instead of defining them locally.
- tests/test_bump_version.sh: Fixed
test_no_version_txt_no_changesto copy the script into the workspace (which lacksversion.txt) instead of running from the repo root whereversion.txtalways exists. - tests/test_bump_version.sh: Replaced duplicated sed logic in
test_updates_version_in_bash_scripts,test_updates_version_in_metadata_json,test_preserves_readonly_prefix, andtest_version_with_special_charswith actualbump-version.shexecution, ensuring tests catch regressions in the real script. - tests/test_devtoolbox_cheats_core.sh: Replaced standalone function redefinitions in
test_compose_label_without_iconwithextract_functo use the real implementations, matching the pattern of adjacent tests.
✨ New Feature: TOC Formatting Style — Multi-Platform Configuration
A new tools/manage-tocs.py script allows users to reformat the Table of Contents links in all cheatsheets for either Obsidian (exact-match, %20-encoded) or GitHub (lowercase slug) compatibility.
The selected style is persisted to ~/.config/devtoolbox-cheats/toc_format.conf and respected by all parts of the application.
New Tools:
- ✨
tools/manage-tocs.py— Unified TOC rebuild script. Strips Russian translations from##headers, wipes the old TOC, and regenerates it from scratch in the chosen style. Supports--style obsidian|githuband--dirflags. Default target:~/cheats.d. - ✨
tools/README.md— Documentation for the new tools directory.
GNOME Argos (devtoolbox-cheats.30s.sh):
- ✨ New "TOC Formatting" submenu under ⚙️ Configuration with Obsidian/GitHub radio-style options and a "🪄 Apply Formatting Now" action.
- ✨ New "📝 TOC Format" and "🪄 Apply TOC Formatting" items in both the compact menu and standalone menu (XFCE Genmon, MATE, Cinnamon, LXQt, tiling WMs, all non-GNOME non-KDE platforms).
- ✨
showSettingsinfo dialog now displays the current TOC format alongside layout and version info. - ✨ New
get_toc_format(),setTocFormat(),applyTocFormat(),settingsTocFormat()functions. - 🔧
applyTocFormat()searches multiple install locations formanage-tocs.py(~/.local/share/devtoolbox-cheats/tools/, script dir,~/devtoolbox-cheats/tools/) — prevents "not found" errors when the script is installed to Argos directory.
KDE Plasma 6 & 5 Widgets:
- ✨ New "TOC Link Style" ComboBox (Obsidian / GitHub) in ⚙️ Configure… settings page.
- ✨ New "🪄 Apply TOC Formatting" button with live status feedback in settings.
- ✨ Selecting a style saves it to the shared
toc_format.confimmediately. - 🔧
tocFormatconfig entry added tomain.xmlschemas for both Plasma 5 and Plasma 6.
CLI Updater (cheats-updater.sh):
- ✨ After a successful
cheats-updater update, the updater now automatically readstoc_format.confand re-runsmanage-tocs.pyso newly downloaded files are instantly reformatted to the user's preferred style.
Installer (install.sh):
- ✨ New interactive TOC format prompt with 30-second timeout (defaults to Obsidian). Saves the choice and applies formatting immediately.
- ✨ New
install_tools()function deploystools/directory to~/.local/share/devtoolbox-cheats/tools/somanage-tocs.pyis globally accessible to all components.
Cheatsheet Quality:
- ✅ Standardized TOC links across all 147 cheatsheets to use Obsidian-compatible
%20-encoded anchors. - ✅ Cleaned
##section headers by removing inline Russian translations (emojis preserved). - 🔧 Updated
docs/ai-gen-cheatsheet.mdanddocs/ai-gen-cheatsheet-new.md— Rule 6 now mandates%20-encoded TOC links for all AI-generated cheatsheets.
Bug fixes:
- 🐛 Fix: Dynamically display the configured
cheatsDirinstead of hardcoding~/cheats.din the Plasma 6 widget's empty-state recovery messages.
Bug fixes:
- 🐛 Fix: Hardened the QML Timer cleanup logic by moving the
timerDestroyed = trueassignment to happen before cleanup method invocations (xhr.abort()andupdateTimer.destroy()), completely preventing synchronous re-entrancy edge cases via signals.
Bug fixes & improvements:
- 🐛 Fix: Resolved an issue where Zenity list dialogs (e.g. standalone argos menu) incorrectly displayed
&instead of&for categories like "Dev & Tools". Removed redundant HTML escaping specifically forzenity --listwhich requires literal ampersands. - 🐛 Fix: Prevented a double-destruction race condition crash in the QML widgets caused by simultaneous timer timeouts and XHR state changes.
- 🔧 Improved: Display the installer version explicitly in the headers of
install.shanddevtools.1m.shoutputs. - 🔧 Improved: Added an interactive prompt to restart Plasma 5 after widget installation (mirroring the Plasma 6 installer).
Bug fixes:
- 🐛 Fix: Resolved an issue where
fzfwould return 0 results because the internalgreppattern was accidentally removed during a previous code cleanup. The.pattern has been safely restored across all widgets and scripts to accurately feed files intofzf.
Bug fixes:
- 🐛 Fix: Replaced standard
XMLHttpRequest.timeout(which is often silently ignored by QML) with a dynamicTimer-based timeout to reliably enforce the 10-second limit during the version check (Plasma 5 & Plasma 6). - 🐛 Fix: Ensured
globalCheatsModelis cleared in Plasma 5 when the indexer encounters an error so that stale cache data isn't displayed alongside error messages. - 🐛 Fix: Removed redundant single-quotes around
notify-sendvariables inFullRepresentation.qmlto prevent shell argument breaking when editor paths contain spaces.
Bug fixes:
- 🐛 Fix: Resolved an issue where rapidly triggering
refreshCheats()could cause stdout buffering interleaving by switching to per-command buffer mapping inmain.qml(Plasma 5 & Plasma 6). - 🐛 Fix: Removed an unintended leading dot (
.) in thefzfSearch()internalgrepcommand to prevent recursive searching of the current working directory.
New Features:
- ✨ Feature: Added automatic GitHub version check for both Plasma 5 and Plasma 6 widgets. On startup, the widget performs a single asynchronous HTTP request to fetch
version.txtfrom the main branch. If a newer version is available, an "⬆️ v..." update button appears in the widget header — clicking it opens the GitHub Releases page. The check can be disabled via a new "Automatically check for updates on startup" toggle in Settings.
Bug fixes:
- ✅ Fix: Added proper error and exit code logging to the editor auto-detection background task in Plasma 6 to improve debuggability when fallback editors fail to detect.
Security:
- 🔒 Fix: Escaped user-controlled configuration values (
cheatsDir,cacheFile) in the Plasma 6 widget's indexer command to prevent shell injection. Previously these values were interpolated with only double-quote wrapping, which does not prevent$()or backtick expansion. Now uses single-quote escaping via sharedescapeShell()/bashSafePath()utilities added tocheats.js.
Bug fixes:
- ✅ Fix: Fixed a silent UI crash in the Plasma 6 widget that caused the "No cheatsheets found" empty state to persistently show even when cheats were successfully indexed in the background. The crash was caused by using
cheatsModel.slice()to copy the model array. In Qt 6 QML, JavaScript arrays passed across component boundaries (frommain.qmltoFullRepresentation.qml) are implicitly converted toQVariantList, which does not support the.slice()method. Replaced it with a safe manual copy loop.
Bug fixes:
- ✅ Fix: Removed the incorrectly applied
plasmaShield()escaping from the Plasma 6 widget. TheplasmaShield()function backslash-escapes every special character (including/,.,-), which was completely destroying file paths (e.g.,/home/user/cheats.d→\/home\/user\/cheats\.d) and silently preventing the indexer from ever finding any cheatsheets. ThePlasma5Support.DataSourceexecutable engine does not strip characters and does not need this escaping. - ✅ Fix: Removed orphaned dead code block in Plasma 5
cheats.js. - ✅ Fix: Deleted accidentally committed
test_home.qmlscratch file. - ✅ Fix: Moved
$EDITORresolution inside the terminalbash -csession in Plasma 5fzfSearch()so that the variable is correctly exported into thekonsole/xtermchild process.
Bug fixes & Adjustments:
- ✅ Fix: Fixed a critical bug in the Plasma 6 widget (
main.qml) where the asynchronous data source would prematurely disconnect if the indexer script printed anystderrprogress messages before exiting. The widget now properly waits for the bash script to finish (exitCode !== undefined) before evaluating the output, fixing the "No cheatsheets found" error.
Features & Refactoring:
- ✨ Feature: Overhauled editor launch logic for both Plasma 5 and Plasma 6 widgets. If your configured editor isn't installed, the widget will display a warning notification and securely fall back through a massive, dynamically exported list of 23 popular GUI and CLI editors (
vscodium,zed,kate,nvim,hx, etc.) to ensure cheatsheets always open successfully. - ♻️ Refactor: Simplified FZF search
getFzfSearchCommandto inherit the resolved$EDITORdirectly from the QML logic rather than duplicating fallback behaviors, natively supporting smart+linejumping for CLI tools and-gfor GUI tools.
Bug fixes & Adjustments:
- ✅ Fix: Improved shell escaping via a new
bashSafePathhelper to properly allow bash to expand$HOME/and~/paths while strictly escaping the rest of the string. This fixes an issue where thefzfSearchand Export features were failing when configured to point inside the user's home directory. - ✅ Fix: Updated Plasma 5's
copyCheatfunction to use the standard centralizedescapeShellhelper instead of a manual string replace. - 🛠️ Internal: Updated
tofix-helper.py fetchto automatically detect CodeRabbit AI rate limits. If a limit is hit, the script displays a live countdown timer and automatically triggers the next review via the GitHub CLI once the cooldown expires.
Bug fixes & Adjustments:
- ✅ Fix: Improved category search filtering in Plasma 5 to automatically expand categories that contain matches, making search results immediately visible.
- ✅ Security: Ensured the
copyCheatandexportCheatfunctions in both widgets use strict shell escaping for all cheat paths, removing the final possible vector for shell injection.
Bug fixes & Adjustments:
- ✅ Security: Fixed shell injection vulnerabilities in Plasma 5/6 widgets by aggressively escaping user-supplied strings (
configuredEditor,detectedEditor,cheatPath) before composing shell execution strings. - ✅ Fix: Improved indexer error handling so it correctly treats commands with
exit 0as success even if they emit warnings tostderr.
Bug fixes & Adjustments:
- ✅ Refactor: Consolidated the editor fallback logic into a single shared helper used by both
openCheat()andfzfSearch(), ensuring consistent behavior. - ✅ Fix: Ensured FZF Search aborts correctly if the fallback notification fails to send, preventing it from executing a terminal with an empty editor variable.
Bug fixes & Adjustments:
- ✅ Fix: Improved FZF Search editor validation. It now verifies the editor exists via
command -vbefore launching, properly handles missing editors, and removes the hardcoded"code"fallback if no editor is found.
Bug fixes & Adjustments:
- ✅ Fix: Added proper
try-catchblocks aroundCheats.parseIndexOutput()inmain.qmlto prevent UI lockups if cheat parsing fails. - ✅ Fix: Corrected editor fallback logic in
fzfSearch()to properly respect the user's explicit preferred editor over the auto-detected editor.
Performance:
- ✅ Categories now expand and collapse instantly (negligible delay). We implemented a QML signal-based update that prevents the
ListViewfrom unnecessarily destroying and rebuilding all 150+ cheat delegates whenever a single category is clicked.
Bug fixes & Adjustments:
- ✅ Fix: Preserved QML property bindings by updating global state (
plasmoid.rootItem) instead of writing to bound local properties in Plasma 5/6 widgets. - ✅ Fix: Repaired a syntax issue with the filter function in Plasma 5
FullRepresentation.qml. - ✅ Fix: Updated import paths to correctly resolve relative locations (
../code/) inmain.qml. - ✅ Fix: Ensure the persistent cache is explicitly cleared if the indexer returns empty data, preventing stale entries from displaying.
Performance — KDE Widget Caching & Instant Loading:
- ✅ Massive performance improvement for both Plasma 5 and Plasma 6 widgets. The widget now features virtually instantaneous popup loading.
- ✅ Moved data loading and index caching out of the ephemeral popup (
FullRepresentation.qml) and into the persistent background root (main.qml). - ✅ The widget now fully loads and parses your cheatsheets into RAM when the Plasma shell starts. The "Loading cheats..." spinner no longer appears on initial popup open because data is preloaded, eliminating the need to spawn
/bin/bashsubprocesses and D-Bus transfers every single time you click the widget icon. - ✅ The "Refresh" button remains available if you add new
.mdfiles and want to manually trigger a re-index. TheglobalIsLoadingflag is set duringrefreshCheats(), so the spinner will correctly appear when a manual refresh is requested.
Bug fixes & Adjustments:
- ✅ Fix: KDE Plasma 5 and 6 widget config menus (
configGeneral.qml) now dynamically pull the version string directly frommetadata.json(plasmoid.metadata.version), avoiding the need for sed-based script updates and ensuring a single source of truth. - ✅ Fix: Removed duplicate
vprefix from thegenerate-tldr.shoutput when displaying the--versionor help menu.
Bug fixes & Adjustments:
- ✅ Fix: FZF search in KDE 5 and older fzf versions. The
--preview-window 'right:60%'option was passed with an invalid trailing space due to a KDE 5 Javascript escaping bug, and olderfzfversions rejected the syntax entirely. Replaced across the entire codebase with the universal--preview-window=right:60%syntax.
Bug fixes & Layout adjustments:
- ✅ Fix: Zenity and Yad dialogs now correctly display categories and cheatsheets containing ampersands (
&). Previously, GTK's Pango markup parser would fail on unescaped ampersands, causing items like "Backups & S3" to disappear or create duplicated ghost rows. - ✅ Fix: Added
VERSIONvariable tracking to all scripts and KDE widgets, which is now displayed in the Settings menu.
Bug fixes & Layout adjustments:
- ✅ Fix: On small screens (≤1368×768), the drilldown layout now correctly hides inline categories and only shows the "Browse all cheats" dialog entry point, making it consistent with the standard and zenity layouts.
- ✅ Fix: Changed Argos menu item syntax to use
param1for passing script paths tocodeanddoublecmd, preventing breakage when paths contain spaces. - ✅ Fix: Escaped glob metacharacters (
[,],*,?) when searching for cheatsheets by filename, ensuring files containing brackets or wildcards are matched correctly. - ✅ Fix: Notification "copied to clipboard" now conditionally triggers only if
CLIPBOARD_COPYis set, with a fallback neutral message when missing. - ✅ Fix:
ensure_cachenow correctly rebuilds (clears) the cache instead of leaving it stale when all markdown files have been deleted. - ✅ Fix:
showSettingsnow properly expands\ncharacters usingprintf '%b'so that the dialog doesn't display literal backslash-n sequences. - ✅ Fix: Category cache files are now written atomically using a temporary file and
mv, preventing partial or corrupted cache files if generation is interrupted. - ✅ Fix: Category cache filenames are now generated using a collision-free
sha256sumhash of the category name rather than a lossy alphanumeric normalization, preventing cache collisions between categories likeA+BandA/B. - ✅ Security:
ARGOS_CAT_STATEnow uses a private per-user directory instead of falling back to/tmp, and state files are written atomically using a temporary file to prevent symlink attacks and clobbered files.
Development & Alignment:
- ✅ Synchronized the Argos menu structure in
devtoolbox-cheats.30s-separate-menu-DEV.shwith the production script: added the🛠 DevToolbox Functionssubmenu, fixed panel button text to "🗒️ Cheatsheets", and removed collapsed/expanded logic so categories are always flat while preserving the drill-downsetCategoryaction.
Development & Installation:
- ✅ Created
install-dev.sh: an interactive Argos script installer allowing users to select between the standard, zenity-list, and drill-down DEV variants, including an option to install all three simultaneously under distinct filenames. - ✅ Synchronized the Argos menu structure in
devtoolbox-cheats.30s-zenity-cheatslist-DEV.shwith the production script: added the🛠 DevToolbox Functionssubmenu, fixed panel button text, and removed collapsed/expanded logic so categories are always flat and open the zenity dialog directly.
Development & Testing:
- ✅ Isolate cache files for the DEV script (
devtoolbox-cheats.30s-separate-menu-DEV.sh). The DEV script now writes to~/.cache/devtoolbox-cheats-dev.idxand~/.cache/devtoolbox-cheats-argos-dev/to ensure it never interferes with or pollutes the production script's cache.
Performance — Cache Fixes (DEV script + production script):
- ✅ Fix critical bug:
CHEATS_REBUILD=0was treated as truthy by[[ -n ... ]], causing a full re-index of all 158 cheatsheets on every script invocation. Changed toCHEATS_REBUILD=""so the cache is correctly used. Fixed in bothdevtoolbox-cheats.30s-separate-menu-DEV.shanddevtoolbox-cheats.30s.sh. - ✅ Add
_CACHE_CHECKEDper-process guard inensure_cache()(DEV script): eliminates redundantfindmtime scans when multiple action functions callensure_cache()in the same shell invocation (e.g.standaloneMenu→browseAllCheatsFS). - ✅ Cache
get_screen_dims()result in_SCREEN_DIMS_CACHED(DEV script):xdpyinfo/xrandris now queried at most once per run instead of on everylist_dialog()andtext_dialog()call. - ✅ Cache
base64flag detection at startup in_B64ENC_FLAG(DEV script): eliminatesbase64 --help | grepsubprocess pair spawned on everyb64enc()call (was called once per cheatsheet in Argos render loop, 158×/run). - ✅ Remove redundant identity
awkpassthrough inargos_category_lines()and Argos expanded-mode render loop (DEV script): the secondawkwas reading and re-printing the same TSV unchanged.
Codebase & Documentation Alignment:
- ✅
README.md: Updated 'Usage' instructions to accurately reflect the new GNOME Argos🛠 DevToolbox Functionssubmenu introduced in v1.4.4. - ✅
README.md: Updated the 'Other DEs (Dialog Menu)' section to document the inline categories and new buttons added in v1.4.5. - ✅ Fix: The
CHEAT_VIEWERSenvironment variable couldn't be overridden by the user because its value was hardcoded inside the script. This bug is now fixed, and it properly respects custom overrides while defaulting to a much larger list of popular editors:"code codium antigravity windsurf subl kate kwrite geany gedit mousepad pluma xed notepadqq zenity".
Installation:
- ✅
install.sh: The GNOME Argos installer now also deploysdevtools.1m.shto provide an additional tools menu panel - ✅ Documentation: Added a note about the new DevTools menu to the Argos section in
README.md
Bug fixes:
- ✅ Fix: Argos
⚙️ Settingsentry in🛠 DevToolbox Functionssubmenu now shows the Settings info dialog correctly — previously it opened the fullstandaloneMenu()instead - ✅ Add dedicated
showSettings()function +showSettingsdispatch action so the info dialog can be triggered directly from Argos without launching the full navigation menu - ✅ Fix:
CHEATS_REBUILD=1→0— the debug flag was left hardcoded, causing a full cheatsheet re-index on every script invocation; menus are now fast (cache is rebuilt only when.mdfiles change) - ✅ Fix: Argos small-screen layout accidentally nested 'Edit this script' and 'Go to Argos folder' as a submenu under 'Open compact menu'. Removed
--prefix to render them as top-level items.
Dialog menus — Inline Category Listing:
- ✅
standaloneMenu(): categories are now listed inline directly after functional buttons — no extra click needed to browse cheatsheets - ✅
compactMenu(): same inline category listing added - ✅ Both menus: added
"── Categories ──"label divider between functional buttons and category list - ✅
compactMenu(): added⚙️ Settingsbutton (previously only instandaloneMenu()) - ✅ Argos
🛠 DevToolbox Functionssubmenu: added⚙️ Settingsentry (launchesstandaloneMenu) - ✅ Clicking a category calls
browseDeep_Cheats()directly — reduces navigation from 3 clicks to 2 - ✅
"── Categories ──"divider is a no-op (re-shows the menu if clicked) - ✅
browseAllCheatsFS()function and📚 Browse all cheatsmenu item are preserved unchanged - ✅ No impact on GNOME Argos menu layout, KDE widget, or DE detection logic
GNOME Argos — Functions Submenu:
- ✅ Normal-screen layout: moved all 6 functional buttons (Compact Menu, Search, FZF Search, Export, Online Version, GitHub) into a collapsible
🛠 Functionssubmenu - ✅ Functions submenu appears before cheatsheet category groups — reclaims top-level Argos dropdown space for categories
- ✅ Small-screen layout is unchanged (existing behavior preserved)
- ✅ No impact on KDE, XFCE, dialog-based, or terminal DE paths
GNOME Argos — Auto-Adaptive Menu Layout:
- ✅ Fix: categories with submenus were invisible on 1080p screens — GNOME Shell clipped submenus when the dropdown exceeded screen height
- ✅ Add
calc_max_argos_groups()function — dynamically calculates the safe maximum number of top-level category groups based on screen resolution - ✅ Collapsed mode: when group count exceeds the screen-safe threshold (e.g. 19 groups on 1080p), all categories are nested under 📂 Browse by Category with
----third-level submenu items — ensuring submenus always have room to render - ✅ Expanded mode: original behavior preserved when screen is large enough (e.g. ≥1440p with current group count)
- ✅ Formula:
(screen_height − 30px) / 28px × 60%— the 60% factor reserves vertical space for submenu rendering - ✅ No new external dependencies — reuses existing
get_screen_dims() - ✅ No impact on KDE, XFCE, dialog-based, or terminal DE paths
Security / Stability:
- ✅ Fix predictable
/tmppath incheats-updater.sh— replaced withmktemp -d(prevents race conditions) - ✅ Add
cmpto dependency check incheats-updater.shto fail fast when missing
Windows Installer (install-devtoolbox.ps1):
- ✅ Default to deploying
cheats.ahk(script mode) instead of compiled EXE — avoids Windows Defender false positives - ✅ Add optional
-CompileExeflag for users who prefer a compiled executable - ✅ Add AutoHotkey v1 version check — aborts with a clear message if only v2 is installed
- ✅ Auto-download latest AutoHotkey v1 installer from GitHub releases; bundled EXE used as offline fallback
- ✅ Abort installer if run as Administrator (prevents wrong-profile installation)
- ✅ Fix duplicate tray icon bug — only one startup entry registered
Documentation:
- ✅ Fix Windows install guide to not instruct users to run as Administrator
- ✅ Update
README-windows.mdto reflect AHK-first default and-CompileExeoption - ✅ Fix broken mojibake characters in README.md cheatsheet list
- ✅ Update systemd/updater docs to match actual deployed unit and binary path
- ✅ Add missing
# Changelogheading toCHANGELOG.md - ✅ Fix manual Windows install guide to include the compile step
- ✅ Fix
.gitignoreentry forWindows-beta/cheats.exe
Code Quality:
- ✅ Fix all ShellCheck warnings in
cheats-updater.sh(SC2155, SC2295) - ✅ Fix AHK menu collision bug —
MENU_MAPnow keyed by position index, not label
Features:
- ✅ Add online and GitHub repository links to shell script and Plasma widgets
- ✅ Configure CodeRabbit AI review settings
Documentation:
- ✅ Fix Windows Setup Guide links in README.md
- ✅ Update installer command in README to include execution policy bypass
Windows Support (BETA):
- ✅ Introduced native Windows Tray Application using AutoHotkey with PowerShell installer.
- ✅ Native Search GUI for Windows with real-time filtering by Title and Group.
- ✅ Global hotkey
Ctrl+Shift+Sto trigger search on Windows. - ✅ Custom tray icon support and enhanced tray menu items with emojis.
- ✅ Dual-file startup strategy for improved reliability against antivirus false positives.
New Cheatsheets & Categories:
- ✅ New Categories: Added Identity Management and Infrastructure Management.
- ✅ Databases/HA: Added ProxySQL, MySQL Galera, Percona XtraDB Cluster, Pacemaker HA.
- ✅ Security/Identity: Added Keycloak, adcli, SSH Honeypot & CrowdSec.
- ✅ Enterprise: Added comprehensive Commvault v11 (Simpana) backup strategies.
- ✅ Infrastructure/Web: Added WildFly, Meld, plus 11 additional cheatsheets across monitoring, security, and cloud.
- ✅ Updates: Refined APT, HAProxy, and Nginx cheatsheets.
Documentation:
- ✅ Added Windows native tray app screenshots and setup instructions.
- ✅ Updated repository README to reflect Windows support.
New Cheatsheets:
- ✅ Added WildFly application server cheatsheet.
- ✅ Added MySQL Galera Cluster cheatsheet.
- ✅ Added Percona XtraDB Cluster cheatsheet.
- ✅ Added Meld (merge & diff) cheatsheet.
- ✅ Added Pacemaker HA cheatsheet.
- ✅ Added ProxySQL cheatsheet.
Documentation:
- ✅ Updated HAProxy cheatsheet with corrections and new content.
- ✅ Updated APT cheatsheet content.
New Cheatsheets:
- ✅ Added Keycloak identity management cheatsheet.
- ✅ Added Commvault v11 (Simpana) enterprise backup strategies cheatsheet.
Windows (BETA) — Tray App Improvements:
- ✅ Implemented native Search GUI with global hotkey
Ctrl+Shift+Sand real-time filtering. - ✅ Automated user profile path detection — no manual path editing required.
- ✅ Custom tray icon support: place
icon.icoincheats.dto override. - ✅ Enhanced tray menu items with emoji group icons.
- ✅ Professional Gear icon in tray (replaces default "H").
- ✅ Dual-file startup strategy (
cheats.exe+cheats.ahk) for antivirus resilience. - ✅ UTF-8 BOM encoding enforced on script save to prevent garbled characters.
- ✅ Removed obsolete installation script and icon browser utility.
Windows Support (BETA — Initial Release):
- ✅ Introduced native Windows tray application via AutoHotkey (
cheats.ahk). - ✅ Automated PowerShell installer (
install-devtoolbox.ps1). - ✅ Auto-discovery of cheatsheets from
%USERPROFILE%\cheats.d. - ✅ Auto-start on login via Windows Startup folder.
- ✅ Documented ExecutionPolicy bypass and Administrator warning.
New Cheatsheets & Categories:
- ✅ Added Identity Management category with adcli cheatsheet.
- ✅ Added Infrastructure Management category with 11 new cheatsheets across monitoring, security, and cloud.
- ✅ Added SSH Honeypot & CrowdSec security cheatsheet.
Documentation:
- ✅ Updated Nginx cheatsheet.
- ✅ Updated README with new categories and cheatsheet links.
Documentation Updates:
- ✅ Simplified manual
.desktopcreation instructions for all Desktop Environments (Cosmic, Budgie, Deepin, etc.) - ✅ Updated panel commands for XFCE, MATE, Cinnamon, LXQt to point to the universal executable
devtoolbox-cheats-menu - ✅ Updated Tiling WM configurations (i3, sway, bspwm, hyprland) to use the new
devtoolbox-cheats-menubinary
Universal Installer:
- ✅ Unified
install.sh— single installer for all 12+ desktop environments - ✅ Auto-detection for GNOME, KDE, XFCE, MATE, Cinnamon, LXQt, LXDE, Budgie, Pantheon, Deepin, Cosmic, Tiling WMs
- ✅ Per-DE panel integration instructions printed after install
- ✅ Universal
cheats.ddeployment to~/cheats.dfor all DEs
Auto-Updater:
- ✅ New
cheats-updater.sh— check, list, and update cheatsheets from upstream - ✅ Smart diff — only overwrites changed files; custom cheatsheets never touched
- ✅ Automatic backups before every update
- ✅ systemd daily timer for automatic updates
- ✅ Installed to
~/.local/bin/(PATH-accessible)
Cheatsheet Library:
- ✅ 130+ cheatsheets organized in 17 categories
- ✅ Refactored and standardized formatting across all cheatsheets
- ✅ Proper fenced code blocks, consistent headers, improved readability
Universal Support:
- ✅ GNOME Argos integration
- ✅ KDE Plasma 5 & 6 native widgets
- ✅ XFCE/MATE/Cinnamon dialog menus
- ✅ LXQt/LXDE lightweight support
- ✅ Budgie/Pantheon/Deepin modern DEs
- ✅ Cosmic (Pop!_OS 2025) support
- ✅ Tiling WM support (i3, sway, bspwm, hyprland, awesome, dwm)
- ✅ Auto-detection with smart fallbacks
Performance:
- ✅ Smart caching: <100ms load time
- ✅ Category toggle optimization: <10ms (KDE widget)
- ✅ Auto cache invalidation on file changes
KDE Widget Features:
- ✅ Editor auto-detection (16+ editors)
- ✅ Editor dropdown with ✓ marks
- ✅ Auto-fallback when editor missing
- ✅ Safe install/uninstall (no crashes in VMs)
Universal Script Features:
- ✅ Cross-DE dialog abstraction layer
- ✅ Terminal detection (15+ terminals)
- ✅ FZF search with syntax highlighting
- ✅ Copy/Open/Export functions
- ✅ PDF export with pandoc
- ✅ Wayland clipboard support (wl-clipboard)