diff --git a/.brewiz/bin/packages-updater b/.brewiz/bin/packages-updater index 70f2134..8467c65 100755 --- a/.brewiz/bin/packages-updater +++ b/.brewiz/bin/packages-updater @@ -48,7 +48,7 @@ def read_action_block content = content.sub(/^{{ACTION}}\s*/, '') begin - parsed = YAML.safe_load(content, [Date, Time]) + parsed = YAML.safe_load(content, permitted_classes: [Date, Time]) rescue Psych::SyntaxError => e abort "Failed to parse ACTION payload as YAML: #{e.message}" end diff --git a/.github/prompts/commit.prompt.md b/.github/prompts/commit.prompt.md new file mode 100644 index 0000000..f78e7a9 --- /dev/null +++ b/.github/prompts/commit.prompt.md @@ -0,0 +1,45 @@ +# Conventional Commit Message Generator + +## Purpose +Generate conventional commit messages for staged changes in the brewiz repository. + +## Instructions + +You are a commit message generator. Analyze the staged changes and generate a **conventional commit message** following this format: + +``` +(): + + + +[optional footer] +``` + +### Guidelines + +1. **Type**: Choose from: `feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `chore` +2. **Scope**: The affected area (e.g., `packages`, `package-manager`, `ui`, `docs`) +3. **Subject**: + - Imperative mood ("add" not "added") + - Lowercase + - No period at end + - Max 50 characters +4. **Body**: + - Describe WHAT changed and HOW (not why) + - Wrap at 72 characters + - Use bullet points for multiple changes + - Be specific and technical +5. **Footer**: Reference issues if applicable (e.g., `Fixes #123`) + +### What to Include +- Technical changes made +- Files modified +- Methods or functions affected +- Configuration updates +- Data structure changes + +### What to Exclude +- Business reasons +- Problem justification +- User impact explanations +- Contextual backstory diff --git a/.github/prompts/update.prompt.md b/.github/prompts/update.prompt.md index 4c5f180..0aefa73 100644 --- a/.github/prompts/update.prompt.md +++ b/.github/prompts/update.prompt.md @@ -87,7 +87,7 @@ YAML nodes MUST follow this ordering and shape: ```yaml - name: string # required; display name - desc: string # required; one-line (<=120 chars) + desc: string # required; one-line summary from `brew info` command homepage: https://example.com # required; canonical project URL id: homebrew/[core|cask]/formula-name # required; normalized Homebrew id tags: [tag-a, tag-b, tag-c] # required; 3–6 existing tags @@ -105,7 +105,10 @@ Notes: Preconditions / Inputs ---------------------- -1. The command input is plaintext containing one or more `brew info` blocks. +1. The command input can be: + - **Preferred**: Plaintext from `brew info ` (compact, human-readable) + - **Supported**: JSON from `brew info --json=v2 ` (structured, parsing-safe) + The agent should auto-detect the format and parse accordingly. 2. Optional $ARGUMENTS may include explicit category, tags, idempotency mode (`insert-only` vs `upsert`), or `visit_homepage: true`. Execution flow (strict, step-by-step) @@ -123,43 +126,79 @@ Execution flow (strict, step-by-step) - If parsing fails for a specific optional field, set it to null or omit it in output (do NOT leave bracket tokens). 3) Category selection (heuristic) - - Load `data/packages.yaml` and collect existing category ids, names, and tags. + - **Context optimization**: Extract only the list of unique category names and tag names from `data/packages.yaml` first. Do NOT load the entire file content into working memory unless needed for precedent search. + - Precedent Check (highest priority): + * For each package being categorized, search for 1-3 existing packages with: + - Overlapping tags (e.g., if new package has tag "3d-printing", search for existing packages with "3d" or "design") + - Similar name patterns (substring matches) + - Related functionality keywords + * If semantically similar packages found, prefer their category. Example: "Orca Slicer" shares "3d-printing" with "OpenSCAD" → assign to OpenSCAD's category (Media & Design) + * Mark confidence level: **HIGH** - Use this priority to choose category: - a) If user provided explicit category via $ARGUMENTS, use it (validate it exists; if not, warn). - b) Apply deterministic keyword heuristics—match on formula name, description, and homepage contents. Examples: - | Signal | Preferred category | Suggested tags | - | ---------------------------------------------------- | --------------------------- | ---------------------------------- | - | Contains "cli", "command", "shell", "terminal" | `command-line` | `command-line`, `terminal`, `shell`| - | Mentions "library", "sdk", specific language names | `development` or language-specific | `development`, `` | - | Provides packaging or brew automation tooling | `package-management` | `packaging`, `automation` | - | Desktop/macOS apps (GUI, productivity, browsers) | `applications` or `browsers`| `productivity`, `macos` | - | Networking/servers/cloud keywords | `networking` or `infrastructure` | `network`, `cloud` | - | Documentation generators/static site tooling | `documentation` or `web` | `documentation`, `static-sites` | - c) If no confident match (≤80%), assign `uncategorized` and set `REVIEW_REQUIRED`. Do NOT create new categories automatically; creation requires explicit human approval or a runtime `--allow-create` flag. + a) Existing package precedent → confidence: **HIGH** (semantically similar packages in same category) + b) User-provided explicit category via $ARGUMENTS → confidence: **HIGH** + c) Apply deterministic keyword heuristics—match on formula name, description, and homepage contents with expanded domain patterns → confidence: **MEDIUM** + d) If no strong match, assign `uncategorized` and set `review_required: true` with alternatives → confidence: **LOW** + - **EXPANDED HEURISTIC TABLE (new domain-specific patterns):** + | Signal | Preferred category | Suggested tags | + | ------------------------------------------------------ | --------------------------- | ---------------------------------- | + | Contains "cli", "command", "shell", "terminal" | `command-line` | `command-line`, `terminal`, `shell`| + | Mentions "library", "sdk", specific language names | `development` or language-specific | `development`, `` | + | Provides packaging or brew automation tooling | `package-management` | `packaging`, `automation` | + | Desktop/macOS apps (GUI, productivity, browsers) | `applications` or `browsers`| `productivity`, `macos` | + | Networking/servers/cloud keywords | `networking` or `infrastructure` | `network`, `cloud` | + | Documentation generators/static site tooling | `documentation` or `web` | `documentation`, `static-sites` | + | **3D modeling, CAD, slicing, design-focused tools** | **`media` or `graphics`** | **`design`, `3d`, `graphics`** | + | **WordPress, Laravel, framework local dev environments** | **`devutil`** | **`development`, `web`, `framework`** | + | **Remote desktop, screen sharing, connectivity** | **`network` or `office`** | **`remote-access`, `productivity`** | + | **PDF viewing, document management, office tools** | **`office`** | **`productivity`, `pdf`, `office`** | + - Do NOT create new categories automatically; creation requires explicit human approval or a runtime `--allow-create` flag. Resolution & application loop (explicit) --------------------------------------- -- After generating the `{{ACTION}}` block, do a pass for `REVIEW_REQUIRED` flags: - - If any entries are `REVIEW_REQUIRED`, summarise each open question (why it's ambiguous and the suggested alternatives) and pause execution. The agent MUST wait for explicit human confirmation specifying either: - * `approve []` to resolve that entry, or - * `reject ` to skip it, or - * `edit ` with a modified payload. - - Only once all `REVIEW_REQUIRED` entries are resolved by explicit responses should the agent proceed to apply changes. - -- If there are no `REVIEW_REQUIRED` entries (confidence high for all), the agent SHOULD apply the inserts/updates directly to `data/packages.yaml`. When applying changes the agent MUST: - - Write the updated `data/packages.yaml` file contents (do not perform git commits or pushes). - - Include the resulting unified diff (or the exact changed YAML nodes) inside the `{{ACTION}}` block so humans and automation can review the applied edits. - - Still emit the `{{REPORT}}` and `{{COMMIT}}` sections: the latter is a suggested commit message that a human or CI may use to commit the changes. +- **Always generate the complete `{{ACTION}}` block**, regardless of confidence level. For ambiguous entries, use `review_required: true` in the operation metadata. + +- Operation status handling: + - **HIGH confidence entries**: Set `review_required: false` (or omit). These are ready to apply. + - **MEDIUM/LOW confidence entries**: Set `review_required: true` and include: + * `confidence: MEDIUM` or `confidence: LOW` + * `alternatives: [...]` with 2-3 ranked options + * `rationale: "..."` explaining the ambiguity + * Format: `Primary → Development Utilities (HIGH), Alternative → macOS Enhancements (MEDIUM), Alternative → Office (LOW)` + +- Application behavior: + - If ALL entries have `review_required: false` (or omitted), the agent SHOULD apply changes directly to `data/packages.yaml`: + * Write the updated file contents (do not perform git commits or pushes) + * Include the resulting unified diff in the `{{ACTION}}` block + - If ANY entry has `review_required: true`, the agent SHOULD: + * Still generate the full `{{ACTION}}` block with proposed YAML + * Apply ONLY the HIGH confidence entries to `data/packages.yaml` + * List the entries needing review in a summary after the `{{REPORT}}` section + * Wait for user response: `approve `, `reject `, or `edit ` - Do not perform git operations (commit/push); only write files locally and surface diffs. This preserves auditability and adheres to repository safety rules. 4) Tag assignment - Prefer tags already used in the repository. Map common keywords to tags (e.g. "documentation" -> `documentation`, "shell" -> `command-line`/`terminal`, "fish" -> `shell`, "bash" -> `shell`, "cli" -> `command-line`, "dev" -> `development`). - - Limit tags to a sensible number (3–6). Avoid inventing new tags unless necessary; if no existing tags fit, add a single `uncategorized` tag and flag `REVIEW_REQUIRED` so a maintainer can refine tags later. + - Confidence levels for Tags: + * **HIGH confidence** (auto-assign): + - Tag already exists in repository + - Tag is semantic variant of existing tag (e.g., "cli" → "command-line") with remap note + * **MEDIUM confidence** (auto-assign with note): + - Tag is new but semantically clear from domain context + * **LOW confidence** (flag for review): + - Tag is ambiguous or unclear → set `review_required: true` with alternatives + * Limit tags to a sensible number (3–6). + * If any tag has LOW confidence, include `review_required: true` with alternatives and rationale. + - Avoid inventing entirely new tags; if no existing tags fit and all candidates are LOW confidence, add a single `uncategorized` tag and flag `review_required: true` so a maintainer can refine tags later. 5) Duplicate detection and idempotency - Search `data/packages.yaml` for an existing entry by `id` if available, otherwise by `name` (case-insensitive). + - Category Schema Validation + * Before assignment, verify the category exists in `data/packages.yaml` + * If assigned category doesn't exist → flag `REVIEW_REQUIRED` with top 3 alternatives by semantic relevance + * If assigned category's description doesn't semantically align with package purpose (e.g., "WordPress dev tool" in "Office" category) → flag with explanation and alternatives - If found: * If `mode=insert-only` → report "exists, skipped". * Otherwise `upsert` mode: compute a minimal patch that updates only changed fields (homepage, info/desc, tags, id, license). Preserve existing `id` when present. @@ -175,6 +214,20 @@ Resolution & application loop (explicit) - `cask`: true when it's a cask (omit when false) - `license`: SPDX identifier when available - Keep ordering of keys consistent with repository examples (look at neighboring entries in the chosen category). + - Include metadata in ACTION block for context: + * When inserting, include `similar_existing` field with 1-3 similar packages already in that category (for reviewer context) + * Example metadata: + ```yaml + - op: insert + category: media + similar_existing: + - name: OpenSCAD + tags: [design, programming] + reason: "Both are 3D CAD/modeling tools" + payload: | + - name: Orca Slicer + ... + ``` 7) Validation - Ensure generated YAML is syntactically valid (no tab characters for indentation, consistent 2-space indent, proper quoting when needed). @@ -194,7 +247,15 @@ Resolution & application loop (explicit) 9) Final output sections (exact order) - A compact machine-readable YAML action block labelled: `{{ACTION}}` containing operations to apply (insert/update/skip) with file path `data/packages.yaml` and the exact YAML fragment(s). This block MUST be valid YAML and parsable programmatically. - A human-friendly Sync Impact Report (as above). - - A suggested commit message and recommended PR description bullet points. + - A suggested commit message **displayed directly in chat** (ready for copy-paste) with these rules: + * **Format**: `add: , , ... packages` (list only package names, not versions) + * **Content**: List only `- Add to for ` + * **EXCLUDE**: Version numbers (not stored in packages.yaml) + * **EXCLUDE**: Skip/rejection reasons (not relevant to commit) + * **EXCLUDE**: Process notes (conventions followed, implementation details) + * **Delivery**: Present as a code block in the response for easy copy-paste. Do NOT create temporary files. + * Example GOOD: `add: git, Local packages\n- Add git to Git Tools for version control\n- Add Local to Development Utilities for WordPress development` + * Example BAD: `add: git (v2.52.0), Local (v9.2.9) packages\nSkip: container already exists\nAll packages follow conventions` 10) Post-steps and safety - Homepage-first rule (REQUIRED for NEW packages): For any package not already present in `data/packages.yaml`, the agent MUST attempt to visit the `homepage` URL and extract a short, authoritative description to populate `info`. If the `homepage` field is missing in the input block, the agent MUST perform a web search to find an authoritative homepage (prefer the `formulae.brew.sh` API, the Homebrew formula page, the project's official site, or the GitHub repository). @@ -238,11 +299,12 @@ Example INSERT for `fisher` (Fish plugin manager): Agent response rules (must follow exactly) ---------------------------------------- -1. Always produce the three output sections in order: `{{ACTION}}` (machine), `{{REPORT}}` (human), `{{COMMIT}}` (suggested commit message). -2. The `{{ACTION}}` block must contain a list of operations with explicit `op: insert|update|skip`, `path: data/packages.yaml`, `category: `, and `payload: `. -3. If any ambiguous choices were made, include `REVIEW_REQUIRED` next to the operation and provide alternatives. +1. Always produce the three output sections in order: `{{ACTION}}` (machine), `{{REPORT}}` (human), `{{COMMIT}}` (suggested commit message in chat). +2. The `{{ACTION}}` block must contain a list of operations with explicit `op: insert|update|skip`, `path: data/packages.yaml`, `category: `, `confidence: HIGH|MEDIUM|LOW`, `review_required: true|false`, and `payload: `. +3. If any ambiguous choices were made, set `review_required: true` in the operation and provide `alternatives: [...]` with confidence levels (HIGH/MEDIUM/LOW) and rationale. 4. If the input is empty or unparsable, respond with a clear, actionable error and a short example of expected input. 5. Limit the total size of the YAML fragments to what would be reasonably included in a single PR (no more than ~100 new entries at once). If more, split into multiple batches and request confirmation. +6. **Do NOT create temporary files** for documentation, summaries, or commit messages. All output should be presented directly in the chat response. Security & Privacy ------------------ @@ -255,7 +317,8 @@ Notes for implementers / integrators ---------------------------------- - This prompt is designed to be idempotent and programmatic-friendly; CI or a bot can run an agent with this prompt and apply the `{{ACTION}}` block automatically after human review. -- The agent should be tolerant of slightly different `brew info` formats (old/new). Use regexes to extract values robustly. -- Keep match heuristics conservative to avoid miscategorization; prefer `REVIEW_REQUIRED` when confidence < 80%. +- The agent should be tolerant of slightly different `brew info` formats (old/new, text/JSON). Use robust parsing for both formats. +- Keep match heuristics conservative to avoid miscategorization; prefer `review_required: true` when confidence is MEDIUM or LOW. +- Input format detection: The agent should auto-detect JSON (starts with `[` or `{`) vs plaintext (contains `==>`) and parse accordingly. End of prompt. diff --git a/app/src/utils/BrewCommandsUtils.js b/app/src/utils/BrewCommandsUtils.js index ca0314d..9ed8325 100644 --- a/app/src/utils/BrewCommandsUtils.js +++ b/app/src/utils/BrewCommandsUtils.js @@ -12,7 +12,7 @@ export function generateBrewCommands(categories, selectedPackages, outdatedPacka addUninstallCommands(commands, selectedPkgs); } addOutdatedPackagesCommand(commands, outdatedPackages); - commands.push("brew cleanup # Consider to remove old versions and free disk space"); + commands.push("brew autoremove && brew cleanup # Consider running to remove unused dependencies and free disk space"); return commands; } diff --git a/bin/beautify-packages-yaml b/bin/beautify-packages-yaml index 158e7cf..2f8a8aa 100755 --- a/bin/beautify-packages-yaml +++ b/bin/beautify-packages-yaml @@ -15,7 +15,14 @@ class PackageBeautifier def beautify # Load YAML data with error handling begin - data = YAML.load_file(@input_file) + # Load all documents from the YAML stream + docs = YAML.load_stream(File.read(@input_file)) + # Find the document that contains the categories array + data = docs.find { |d| d.is_a?(Array) } + unless data + puts "Error: Could not find categories array in '#{@input_file}'" + exit 1 + end rescue Errno::ENOENT puts "Error: Input file '#{@input_file}' not found." exit 1 diff --git a/bin/brewiz b/bin/brewiz index 51aef63..0b1be02 100755 --- a/bin/brewiz +++ b/bin/brewiz @@ -213,7 +213,11 @@ class PackageManager @packages.each do |category| category['packages'].map! do |pkg| - pkg.merge(brew_info.delete(pkg['id']) || {}).select { |_, v| v } + # Preserve tags if they exist in the original package + tags = pkg['tags'] + merged = pkg.merge(brew_info.delete(pkg['id']) || {}).select { |_, v| v } + merged['tags'] = tags if tags + merged end category['packages'].sort_by! { |pkg| pkg['name'].downcase } end diff --git a/data/packages.yaml b/data/packages.yaml index 97ecfa8..0e4f52e 100644 --- a/data/packages.yaml +++ b/data/packages.yaml @@ -84,6 +84,17 @@ UpdatePrompt: | without complex setup. id: homebrew/core/tgpt tags: [ai, command-line] + - name: gemini-cli + desc: Interact with Google Gemini AI models from the command-line + homepage: https://github.com/google-gemini/gemini-cli + id: homebrew/core/gemini-cli + tags: [ai, command-line] + license: Apache-2.0 + info: >- + Gemini CLI is an open-source command-line interface for Google's Gemini family of AI models. + It provides terminal-first access to chat and multimodal capabilities, built-in tools for + grounding (web search, file operations), and integrations for automation and MCP servers. + Authentication options include Google OAuth, API key, and Vertex AI for enterprise workflows. - id: archive name: Archiving & Compression desc: Tools for compressing, archiving, and extracting files. @@ -125,6 +136,16 @@ UpdatePrompt: | unique features for tab and workspace management. id: homebrew/cask/arc tags: [web, productivity] + - name: kotlin + desc: Statically typed programming language for the JVM + homepage: https://kotlinlang.org/ + id: homebrew/core/kotlin + tags: [programming-language, java, development] + license: Apache-2.0 + info: >- + Kotlin is a modern, statically typed programming language that targets the JVM and also supports + compilation to JavaScript and native binaries. It is interoperable with Java and widely used for + Android and server-side development. - name: Brave desc: Privacy-focused web browser homepage: https://brave.com/ @@ -210,6 +231,15 @@ UpdatePrompt: | interface. It's written in Rust for speed and safety. id: homebrew/core/xh tags: [http, command-line, api, testing] + - name: zen + desc: Gecko based web browser + homepage: https://zen-browser.app/ + cask: true + id: homebrew/cask/zen + tags: [web, macos] + info: >- + Zen Browser is a Gecko-based web browser with a focus on privacy and usability. It offers a streamlined + browsing experience and is distributed as a macOS desktop app. - id: cloud name: Cloud & DevOps desc: Tools for cloud infrastructure, deployment automation, and DevOps workflows. @@ -535,6 +565,16 @@ UpdatePrompt: | Android development. id: homebrew/core/gradle tags: [build, java, development] + - name: gradle@8 + desc: gradle 8 (alternate formula) — Open-source build automation tool based on the Groovy and Kotlin DSL + homepage: https://www.gradle.org/ + id: homebrew/core/gradle@8 + tags: [build, java, development] + license: Apache-2.0 + info: >- + Gradle 8 is a stable release series of the Gradle build automation system. It provides flexible + build scripting using the Groovy or Kotlin DSL and is commonly used for JVM and Android projects. + This keg-only formula is an alternate version kept separate from the main `gradle` formula. - name: leiningen desc: Build tool for Clojure homepage: https://github.com/technomancy/leiningen @@ -594,6 +634,14 @@ UpdatePrompt: | models to process and understand. id: homebrew/core/repomix tags: [development, ai, command-line] + - name: ruby-lsp + desc: Opinionated language server for Ruby + homepage: https://shopify.github.io/ruby-lsp + info: >- + Ruby LSP is an opinionated language server for Ruby that provides IDE features like autocomplete, + go-to-definition, and linting. It's designed to work with any editor that supports the Language + Server Protocol. + id: homebrew/core/ruby-lsp - name: cargo-generate desc: Use pre-existing git repositories as templates homepage: https://github.com/cargo-generate/cargo-generate @@ -608,7 +656,7 @@ UpdatePrompt: | homepage: https://github.com/github/spec-kit id: homebrew/core/specify license: MIT - tags: [development, testing, python] + tags: [development, testing, python, ai] info: >- Specify is a toolkit designed to help you get started with Spec-Driven Development. It provides opinionated tooling and templates to scaffold and run specifications, with integrations for @@ -622,6 +670,16 @@ UpdatePrompt: | project types, helping developers reclaim storage space without affecting source code. id: homebrew/core/kondo tags: [development, file-management, rust] + - name: Local + desc: WordPress local development tool by Flywheel + homepage: https://localwp.com/ + id: homebrew/cask/local + tags: [wordpress, development, productivity] + cask: true + info: >- + Local is a local WordPress development environment for Mac and Windows. It simplifies WordPress + development by providing an easy-to-use interface to create, test, and deploy WordPress sites + locally. It includes built-in tools for database management, file editing, and site publishing. - id: file-nav name: File Navigation & Search desc: Tools for searching, navigating, and exploring file systems and directories. @@ -782,6 +840,17 @@ UpdatePrompt: | Note: Requires a kernel extension to work. See vendor documentation for details. id: homebrew/cask/openzfs tags: [file-system, storage, utility] + - name: coreutils + desc: GNU File, Shell, and Text utilities + homepage: https://www.gnu.org/software/coreutils/ + id: homebrew/core/coreutils + tags: [command-line, file-management, system] + license: GPL-3.0-or-later + info: >- + GNU Coreutils is a collection of basic file, shell, and text utilities for Unix-like systems, + providing commands such as ls, cp, mv, rm, sort, cut, and more. On macOS these tools are installed + with a 'g' prefix (e.g., gls); you can add the package's gnubin directory to your PATH to use the + standard (unprefixed) command names. - id: fonts name: Fonts desc: Typography and font packages for coding and document preparation. @@ -850,6 +919,16 @@ UpdatePrompt: | name: Git Tools desc: Git-specific utilities, extensions, and interfaces for enhanced Git workflows. packages: + - name: git + desc: Distributed version control system + homepage: https://git-scm.com + id: homebrew/core/git + tags: [version-control, command-line, scm] + license: GPL-2.0-only + info: >- + git is a free and open source distributed version control system designed to handle everything + from small to very large projects with speed and efficiency. It enables collaboration, code + review, and maintains complete project history locally. - name: ugit desc: Undo git commands. Your damage control git buddy homepage: https://bhupesh.me/undo-your-last-git-mistake-with-ugit/ @@ -1153,6 +1232,16 @@ UpdatePrompt: | IntelliJ IDEA, PyCharm, WebStorm, and others, keeping them updated and organized. id: homebrew/cask/jetbrains-toolbox tags: [ide, development] + - name: Cursor + desc: Write, edit, and chat about your code with AI + homepage: https://www.cursor.com/ + cask: true + id: homebrew/cask/cursor + tags: [editor, ide, ai] + info: >- + Cursor is a desktop application that integrates code editing with AI-assisted features for + writing and browsing code. It provides an editor-centric experience with tools to speed up + development workflows. - name: jupyterlab desc: Interactive environments for writing and running code homepage: https://jupyter.org/ @@ -1653,6 +1742,39 @@ UpdatePrompt: | macOS. id: homebrew/cask/xquartz tags: [graphics] + - name: Hazel + desc: Automated organisation + homepage: https://www.noodlesoft.com/ + cask: true + info: >- + Hazel watches folders you choose and automatically moves, renames, tags, archives, or deletes files + based on rules you define, keeping downloads, documents, and other directories tidy without + manual work. It can run workflows, upload files, and clean up application support files via App Sweep + while also integrating with Shortcuts, Automator, and AppleScript for richer automations. + id: homebrew/cask/hazel + tags: [macos, automation, productivity, file-management] + - name: Hidden Bar + desc: Utility to hide menu bar items + homepage: https://github.com/dwarvesf/hidden/ + cask: true + info: >- + Hidden Bar adds a chevron icon to the macOS menu bar so you can hide or reveal menu extras on demand, + keeping the top of your screen uncluttered while still letting you access background apps. Drag menu + icons into the hidden zone, click the arrow to stash them, and click again to show them exactly when + you need them. + id: homebrew/cask/hiddenbar + tags: [macos, productivity, utility, window-management] + - name: OnyX + desc: Verify system files structure, run miscellaneous maintenance and more + homepage: https://www.titanium-software.fr/en/onyx.html + cask: true + info: >- + OnyX is a multifunction maintenance utility that verifies system files, cleans caches, rebuilds + indexes, and adjusts Finder, Dock, Safari, and other Apple app settings through a graphical interface. + It exposes scripts for maintenance, cleaning, and rebuilding databases so you can safely repair, + optimize, and customize macOS without diving into Terminal commands. + id: homebrew/cask/onyx + tags: [macos, system, diagnostics, utility] - id: media name: Media & Design desc: Tools for graphic design, illustration, diagramming, and 3D modeling. @@ -1694,14 +1816,25 @@ UpdatePrompt: | tags: [visualization, documentation] - name: OpenSCAD desc: Programmable solid 3D CAD modeller - homepage: https://www.openscad.org/ + homepage: https://www.openscad.org/downloads.html#snapshots cask: true info: >- - OpenSCAD is a software for creating solid 3D CAD models. Unlike most free software for creating 3D - models, it focuses on CAD aspects rather than artistic ones, using a descriptive programming - language. - id: homebrew/cask/openscad + OpenSCAD is a software for creating solid 3D CAD models. This is the snapshot/development version + with the latest features and improvements. Unlike most free software for creating 3D models, + it focuses on CAD aspects rather than artistic ones, using a descriptive programming language. + id: homebrew/cask/openscad@snapshot + token: openscad@snapshot tags: [design, programming] + - name: Orca Slicer + desc: G-code generator for 3D printers + homepage: https://github.com/SoftFever/OrcaSlicer + id: homebrew/cask/orcaslicer + tags: [graphics, 3d-printing, design] + cask: true + info: >- + Orca Slicer is a G-code generator for 3D printers. It's a fork of Bambu Studio that provides + slicing functionality to convert 3D models into printable G-code. It supports various 3D printer + models and provides advanced slicing options for optimizing print quality. - name: Visual Paradigm desc: UML, SysML, BPMN modelling platform homepage: https://www.visual-paradigm.com/ @@ -1740,10 +1873,31 @@ UpdatePrompt: | Formula: https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/c/colorpicker-materialdesign.rb id: homebrew/cask/colorpicker-materialdesign tags: [design, macos, utility] + - name: Autodesk Fusion 360 + desc: Integrated CAD, CAM, CAE, and PCB software + homepage: https://www.autodesk.com/products/fusion-360/overview + cask: true + id: homebrew/cask/autodesk-fusion + tags: [graphics, design] + info: >- + Autodesk Fusion 360 is an integrated CAD, CAM, CAE, and PCB tool for product design and manufacturing. + It offers parametric modeling, CAM toolpath generation, simulation, and collaboration features for + mechanical and electronics design workflows. - id: graphics name: Graphics & Image Tools desc: Image editors, screenshot and annotation tools, diagram editors, OCR and image utilities. packages: + - name: FontForge + desc: Font editor and converter for outline and bitmap fonts + homepage: https://fontforge.github.io/en-US/ + id: homebrew/cask/fontforge-app + tags: [graphics, design, font-tools] + cask: true + license: BSD-3-Clause + info: >- + FontForge is a free, open-source font editor for outline and bitmap fonts. It lets you edit glyph + outlines and metrics, generate multiple font formats, and convert between font formats. Note: This + version is built for Intel macOS and requires Rosetta 2 on Apple Silicon. - name: draw.io Desktop desc: Online diagram software homepage: https://www.diagrams.net/ @@ -1786,6 +1940,15 @@ UpdatePrompt: | Tesseract is an open-source OCR engine that recognizes text in images and converts it to machine-readable text. (source: https://tesseract-ocr.github.io/) id: homebrew/core/tesseract tags: [graphics, conversion] + - name: poppler + desc: PDF rendering library and utilities + homepage: https://poppler.freedesktop.org/ + id: homebrew/core/poppler + tags: [graphics, conversion] + license: GPL-2.0-only + info: >- + Poppler is a PDF rendering library derived from the xpdf codebase. It provides utilities to render + and convert PDF documents and is used by many applications for PDF processing. - name: flameshot desc: Screenshot software with built-in annotation tools homepage: https://flameshot.org/ @@ -1794,6 +1957,16 @@ UpdatePrompt: | info: >- Flameshot is a screenshot tool with built-in annotation features. Note: this cask is marked deprecated in Homebrew and scheduled to be disabled on 2026-09-01. (source: https://flameshot.org/) tags: [graphics, screenshot, productivity] + - name: ImageMagick + desc: Tools and libraries to manipulate images in many formats + homepage: https://imagemagick.org/index.php + id: homebrew/core/imagemagick + tags: [graphics, conversion, command-line] + license: ImageMagick + info: >- + ImageMagick is a suite of command-line tools and libraries to read, write, and manipulate images + in a wide range of formats. It supports common operations like resizing, compositing, format conversion, + and image transformations useful for scripting and batch image processing. - id: network name: Network Tools desc: Utilities for network diagnostics, communication, and connection management. @@ -1898,6 +2071,18 @@ UpdatePrompt: | configuration. id: homebrew/core/sshuttle tags: [network, ssh, proxy] + - name: Tailscale + desc: Mesh VPN based on WireGuard + homepage: https://tailscale.com + cask: true + id: homebrew/cask/tailscale-app + tags: [network, security, macos] + info: >- + Tailscale provides a secure mesh VPN built on WireGuard that connects your devices with minimal + configuration. The macOS app includes a native GUI for device and access management and leverages + platform networking features; it may require enabling a kernel extension or system permission + during setup. Typical uses include secure remote access, private networking between devices, and + exposing services safely across an individual's machines. - name: wget desc: Internet file retriever homepage: https://www.gnu.org/software/wget/ @@ -1943,6 +2128,26 @@ UpdatePrompt: | name: Office desc: Office suites applications for document creation and editing. packages: + - name: Adobe Acrobat Reader + desc: View, print, and comment on PDF documents + homepage: https://www.adobe.com/acrobat/pdf-reader.html + id: homebrew/cask/adobe-acrobat-reader + tags: [productivity, pdf, office] + cask: true + info: >- + Adobe Acrobat Reader is a free PDF viewer and editor. It allows you to view, print, comment on, + and share PDF documents. It's the most widely used PDF reader and provides essential tools for + working with PDF files across different platforms. + - name: TeamViewer + desc: Remote access and connectivity software focused on security + homepage: https://www.teamviewer.com/ + id: homebrew/cask/teamviewer + tags: [remote-access, productivity, security] + cask: true + info: >- + TeamViewer is remote access and connectivity software that enables secure remote desktop access, + file transfer, and collaboration capabilities. It's widely used by IT professionals and support + teams for remote assistance and device management. - name: LibreOffice desc: Free cross-platform office suite, fresh version homepage: https://www.libreoffice.org/ diff --git a/lib/package_manager.rb b/lib/package_manager.rb index 20a237c..2c212b0 100644 --- a/lib/package_manager.rb +++ b/lib/package_manager.rb @@ -49,7 +49,11 @@ def update_packages_with_brew_info @packages.each do |category| category['packages'].map! do |pkg| - pkg.merge(brew_info.delete(pkg['id']) || {}).select { |_, v| v } + # Preserve tags if they exist in the original package + tags = pkg['tags'] + merged = pkg.merge(brew_info.delete(pkg['id']) || {}).select { |_, v| v } + merged['tags'] = tags if tags + merged end category['packages'].sort_by! { |pkg| pkg['name'].downcase } end