Skip to content

fix(bazaar): cherry-pick bazaar fixes + migrate curated.yaml to new schema - #808

Draft
castrojo wants to merge 7 commits into
mainfrom
fix/bazaar-cherry-picks
Draft

fix(bazaar): cherry-pick bazaar fixes + migrate curated.yaml to new schema#808
castrojo wants to merge 7 commits into
mainfrom
fix/bazaar-cherry-picks

Conversation

@castrojo

@castrojo castrojo commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Bazaar PR #1655 breaks the curated page. This cherry-picks ready fixes from feature branches and migrates curated.yaml to the new schema.

Commits: djxl flag fix (--color_space=sRGB), bazaar.service Type=simple+Restart, preview recipe set -e hardening, curated.yaml schema migration (css/sections/category -> banner/section rows), bazaar.md rewrite with correct docs.

Tests: pytest tests/test_curated_config.py passes.

Summary by CodeRabbit

  • New Features

    • Added nightly Bazaar content generation for GNOME notes, Bluefin release notes, and curated article updates.
    • Introduced a new Developer Experience page with app tiles and install actions.
    • Expanded Bazaar install prompts to cover more editor and CLI apps.
  • Bug Fixes

    • Improved Bazaar preview flow to run in user space with refreshed content and assets.
    • Updated service behavior for more reliable background operation.
  • Documentation

    • Updated Bazaar guidance and authoring rules for the new content format.
  • Tests

    • Added and updated coverage for curated content, hooks, and DX article layout.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (10)
scripts/check-oci-refs.py (1)

100-108: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

"placeholder"/"number" substring branches aren't actually exercised by the new test.

Because TAG_PATTERN's tag group ([a-zA-Z0-9._-]+) excludes <, >, {, }, template tags like e2e-pr-<N>-<sha> or e2e-pr-{pr_number}-{sha_short} get truncated to e2e-pr- before matching — so the added test passes via the endswith("-")/isupper() branches, not via the "placeholder" in tag / "number" in tag checks. Consider adding a test case with an unbraced placeholder tag (e.g. pr-number or my-placeholder-tag) to actually cover lines 105-106.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/check-oci-refs.py` around lines 100 - 108, The skip logic in the tag
filter is not actually covering the new `"placeholder"` and `"number"` substring
checks because the current test inputs are being truncated before those branches
run. Update the tests around the tag-handling code in the script’s main
filtering path to include a tag that reaches the `if` condition unchanged and
contains one of those substrings, such as a plain `pr-number` or
`my-placeholder-tag`, so the `"placeholder" in tag` / `"number" in tag` branches
are exercised directly.
.github/scripts/assemble_bazaar_curation.py (2)

126-126: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Extract the emoji-stripping regex to a module-level constant.

The same pattern r'[\U00010000-\U0010ffff]|[\u2600-\u27BF]' is repeated four times. A shared precompiled constant avoids drift and slightly reduces per-call recompilation.

♻️ Suggested extraction
EMOJI_RE = re.compile(r'[\U00010000-\U0010ffff]|[\u2600-\u27BF]')

Then replace call sites, e.g.:

-        title = re.sub(r'[\U00010000-\U0010ffff]|[\u2600-\u27BF]', '', title).strip()
+        title = EMOJI_RE.sub('', title).strip()

Also applies to: 137-137, 191-191, 194-194

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/scripts/assemble_bazaar_curation.py at line 126, The emoji-stripping
pattern is duplicated across multiple title/description cleanup sites, so
extract the shared regex into a module-level constant in
assemble_bazaar_curation.py. Add a precompiled constant near the other module
helpers and update the existing re.sub call sites in the relevant title
normalization logic to use it, keeping the behavior in the same functions that
currently strip emojis.

119-119: 🔒 Security & Privacy | 🔵 Trivial | 💤 Low value

Use defusedxml for the GNOME feed parse. ET.fromstring on remote XML should be hardened against entity-expansion attacks; defusedxml.ElementTree.fromstring is a small swap here.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/scripts/assemble_bazaar_curation.py at line 119, Replace the remote
XML parsing in assemble_bazaar_curation.py with a hardened parser: the
ET.fromstring call used to build the GNOME feed tree should be swapped to
defusedxml.ElementTree.fromstring. Update the imports and keep the parsing flow
in the same place so the feed handling logic continues to work with the safer
parser.

Source: Linters/SAST tools

.github/workflows/bazaar-curation.yml (1)

18-19: 🔒 Security & Privacy | 🔵 Trivial | 💤 Low value

Checkout persists credentials that remain live during the network-fetching script step.

The default persist-credentials: true leaves the GITHUB_TOKEN in the local git config while the later step runs a script that makes many outbound HTTP requests, widening the exfiltration surface. Since the job needs to push, one option is to disable credential persistence at checkout and push explicitly with the token only in the final step.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/bazaar-curation.yml around lines 18 - 19, The Checkout
step is leaving `GITHUB_TOKEN` credentials persisted in git config during the
network-fetching script phase. Update the `actions/checkout` usage in the
workflow to stop persisting credentials, then adjust the later push logic in the
job so it uses the token only in the final push step; reference the `Checkout`
step and the push-related step in the same workflow when making the change.

Source: Linters/SAST tools

system_files/bluefin/etc/bazaar/article-devtools.md (1)

38-39: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Large inline base64 SVG data URI bloats the article markdown.

Line 39 embeds a multi-KB base64-encoded SVG directly in the markdown for the "Tavern" icon, unlike every other app card which links to a Flathub-hosted icon URL. This is likely necessary since Tavern isn't on Flathub's icon CDN, but consider extracting it to a static asset file (e.g. under system_files/bluefin/etc/bazaar/) and referencing it by path if Bazaar's markdown renderer supports local relative images, to keep the source file reviewable/diffable.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@system_files/bluefin/etc/bazaar/article-devtools.md` around lines 38 - 39,
The Tavern card is embedding a huge base64 SVG data URI in the markdown, which
makes the article hard to review and bloats the source. Update the Tavern image
in article-devtools.md to use an external/static asset instead of inline data,
following the pattern used by the other app cards if possible. If Bazaar
supports local relative images, move the SVG into a static file under
system_files/bluefin/etc/bazaar/ and reference it from the Tavern image tag so
the markdown stays readable and diff-friendly.
tests/test_curated_config.py (1)

31-64: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Test coverage gap: articles row shape/uri is never validated.

known_row_types includes "articles", but the validation loop only branches on "section" and "banner" — there's no check that an articles row's list[] entries have valid title/subtitle/image/uri fields, nor any check that uri resolves to an existing/expected path. This gap is why the hardcoded developer-local path bug in curated.yaml's articles row (flagged separately) went undetected despite pytest tests/test_curated_config.py passing per the PR description.

♻️ Proposed addition
+        if row_type == "articles":
+            articles = row["articles"]
+            assert isinstance(articles, dict)
+            assert "list" in articles
+            assert isinstance(articles["list"], list)
+            for article in articles["list"]:
+                assert "title" in article
+                assert "uri" in article
+                assert article["uri"].startswith("file:///run/host/etc/bazaar/") or article["uri"].startswith("http"), \
+                    f"Article uri should use the deployed host path, got: {article['uri']}"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_curated_config.py` around lines 31 - 64, The curated config test
currently recognizes articles rows but never validates their contents, so add
coverage in the test loop in test_curated_config.py for the articles branch. Use
the existing known_row_types handling and extend the assertions to inspect
row["articles"], verify the expected list structure and required fields like
title, subtitle, image, and uri, and check that each uri is a valid expected
path/value rather than a developer-local absolute path. Keep the new checks
aligned with the existing banner and section validations so malformed articles
entries fail in pytest.
system_files/bluefin/usr/share/ublue-os/just/system.just (2)

360-365: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Duplicate install -d -m0755 /etc/bazaar.

This directory creation is repeated unconditionally right after the conditional block. Harmless (idempotent) but redundant.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@system_files/bluefin/usr/share/ublue-os/just/system.just` around lines 360 -
365, The /etc/bazaar directory is being created twice, once inside the
conditional block and again immediately after it in the same section of
system.just. Remove the redundant unconditional sudo install -d -m0755
/etc/bazaar so the directory creation happens only once, while keeping the
existing conditional handling around the PNG install logic.

346-363: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Pin the podman image tag; guard against empty JXL glob.

docker.io/library/alpine:latest is a floating tag, unlike the Containerfile's pinned alpine:latest@sha256:... used for the same conversion task. Also, if BRANDING_DIR exists but contains no .jxl files, the glob *.jxl won't expand and djxl will fail on the literal pattern, aborting the whole preview script due to set -euo pipefail.

♻️ Proposed fix
-        podman run --rm -v "${SRC_DIR}":/workspace:z -v "${TMP_PNG_DIR}":/out:z docker.io/library/alpine:latest sh -c "
+        podman run --rm -v "${SRC_DIR}":/workspace:z -v "${TMP_PNG_DIR}":/out:z docker.io/library/alpine:latest@sha256:28bd5fe8b56d1bd048e5babf5b10710ebe0bae67db86916198a6eec434943f8b sh -c "
             set -e
             apk add -q libjxl-tools &&
-            for f in /workspace/bluefin-branding/system_files/etc/bazaar/*.jxl; do
+            shopt -s nullglob
+            for f in /workspace/bluefin-branding/system_files/etc/bazaar/*.jxl; do
                 name=\$(basename \"\$f\" .jxl)
                 djxl \"\$f\" \"/out/\${name}.png\" --color_space=sRGB
             done
         "
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@system_files/bluefin/usr/share/ublue-os/just/system.just` around lines 346 -
363, The banner conversion block in system.just should use a pinned podman image
instead of docker.io/library/alpine:latest, matching the fixed digest used
elsewhere. Also make the JXL conversion loop in the podman sh command resilient
when no .jxl files exist under the branding directory by checking for matches
before calling djxl, so the preview script does not fail from an unexpanded
glob; update the logic around BRANDING_DIR, TMP_PNG_DIR, and the for f in
/workspace/bluefin-branding/system_files/etc/bazaar/*.jxl loop accordingly.
system_files/bluefin/etc/bazaar/article-sustainability.md (1)

11-33: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add blank lines around markdown tables (MD058).

Static analysis flags missing blank lines surrounding the tables at Lines 12, 23, and 30, which will fail markdownlint.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@system_files/bluefin/etc/bazaar/article-sustainability.md` around lines 11 -
33, The markdown tables in the Learning & Education, Code & Engineering
Education, and Earth & Sustainability sections need blank lines before and after
them to satisfy MD058. Update the article content around the affected table
blocks so each table in the markdown file is surrounded by empty lines, keeping
the section headings and table content unchanged.

Source: Linters/SAST tools

tests/test_update_just.bats (1)

126-136: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Odd/likely erroneous comment token "ponytail".

The comment "ponytail: filter out directories containing 'bctl'..." appears to contain a stray, out-of-place word. Please clarify or fix the wording.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_update_just.bats` around lines 126 - 136, The inline comment in
_run() contains a stray token (“ponytail”) that looks accidental. Update the
comment text to clearly describe the PATH filtering behavior without that extra
word, keeping the logic in _run() unchanged and preserving the intent of
filtering directories that contain bctl.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/bazaar-curation.yml:
- Around line 39-40: The icon download steps use curl without fail-fast
behavior, so HTTP errors can still produce corrupt .png/.svg files; update the
download commands in the workflow to include curl’s fail option in the
icon-fetching steps so the job stops on non-2xx responses. Apply this to the
icon download commands for the OpenLens assets and keep the existing destination
paths and URLs unchanged.

In `@Justfile`:
- Around line 47-49: Hardcoded contributor-specific paths in the Justfile make
the Bazaar recipes non-portable. Update the rewrite logic in the curated-dev
generation and the Flatpak launch/desktop override steps to derive the
repository root dynamically instead of embedding /var/home/jorge/src/common,
using the existing Justfile recipe context so bazaar-preview works from any
checkout. Make the changes in the affected recipe blocks that reference the
curated.yaml rewrite and the launch commands, keeping the path construction
centralized and reusable.

In `@system_files/bluefin/etc/bazaar/article-ai.md`:
- Around line 25-31: Replace the placeholder Lorem ipsum content in the Bazaar
article section with real user-facing copy. Update the prose under the
Cloud-Native AI Lore & Architecture heading in article-ai.md so it reads like
intentional documentation or marketing text, and keep the existing
symbol/section title consistent while removing all filler paragraphs.

In `@system_files/bluefin/etc/bazaar/article-bluefin-notes.md`:
- Around line 1-26: Remove the duplicate stale “Variants promoted” sections from
the stable-20260701 article so only the single correct digest table remains.
Keep the block whose bluefin and bluefin-nvidia digests match the later
supply-chain verification commands, and delete the earlier duplicate blocks in
article-bluefin-notes.md to eliminate the repeated heading issue (MD024).

In `@system_files/bluefin/etc/bazaar/article-devtools.md`:
- Around line 198-208: The Product Lore & Design Principles section contains
placeholder Lorem ipsum text that is shown to users, so replace it with real
Bluefin content. Update the markdown in the article-devtools content to match
the style and intent of the corresponding sections in article-ai.md and
article-games.md, keeping the existing Bluefin messaging while removing all
dummy filler.

In `@system_files/bluefin/etc/bazaar/article-games.md`:
- Around line 48-54: The "Performance & Optimization Lore" section in
article-games.md still contains placeholder lorem ipsum text, matching the issue
already found in article-ai.md and article-devtools.md. Replace the placeholder
copy in that section with real content that describes Bluefin’s performance and
optimization features, keeping the existing heading and the final
Bluefin/GameMode sentence if it still fits the narrative.

In `@system_files/bluefin/etc/bazaar/curated.yaml`:
- Line 10: The curated article links are pointing at a developer-local file path
instead of the deployed host-etc path. Update the `articles.list[].uri` entries
in `curated.yaml` to use the same `/run/host/etc/bazaar/...` base as the
corresponding `image:` fields, and make sure the production `curated.yaml` does
not contain the `curated-dev.yaml` output generated by the `bazaar-preview`
Justfile recipe. Use the `articles.list` entries and the `curated-config-paths`
reference in `bazaar.yaml` to locate and correct all affected URIs.

---

Nitpick comments:
In @.github/scripts/assemble_bazaar_curation.py:
- Line 126: The emoji-stripping pattern is duplicated across multiple
title/description cleanup sites, so extract the shared regex into a module-level
constant in assemble_bazaar_curation.py. Add a precompiled constant near the
other module helpers and update the existing re.sub call sites in the relevant
title normalization logic to use it, keeping the behavior in the same functions
that currently strip emojis.
- Line 119: Replace the remote XML parsing in assemble_bazaar_curation.py with a
hardened parser: the ET.fromstring call used to build the GNOME feed tree should
be swapped to defusedxml.ElementTree.fromstring. Update the imports and keep the
parsing flow in the same place so the feed handling logic continues to work with
the safer parser.

In @.github/workflows/bazaar-curation.yml:
- Around line 18-19: The Checkout step is leaving `GITHUB_TOKEN` credentials
persisted in git config during the network-fetching script phase. Update the
`actions/checkout` usage in the workflow to stop persisting credentials, then
adjust the later push logic in the job so it uses the token only in the final
push step; reference the `Checkout` step and the push-related step in the same
workflow when making the change.

In `@scripts/check-oci-refs.py`:
- Around line 100-108: The skip logic in the tag filter is not actually covering
the new `"placeholder"` and `"number"` substring checks because the current test
inputs are being truncated before those branches run. Update the tests around
the tag-handling code in the script’s main filtering path to include a tag that
reaches the `if` condition unchanged and contains one of those substrings, such
as a plain `pr-number` or `my-placeholder-tag`, so the `"placeholder" in tag` /
`"number" in tag` branches are exercised directly.

In `@system_files/bluefin/etc/bazaar/article-devtools.md`:
- Around line 38-39: The Tavern card is embedding a huge base64 SVG data URI in
the markdown, which makes the article hard to review and bloats the source.
Update the Tavern image in article-devtools.md to use an external/static asset
instead of inline data, following the pattern used by the other app cards if
possible. If Bazaar supports local relative images, move the SVG into a static
file under system_files/bluefin/etc/bazaar/ and reference it from the Tavern
image tag so the markdown stays readable and diff-friendly.

In `@system_files/bluefin/etc/bazaar/article-sustainability.md`:
- Around line 11-33: The markdown tables in the Learning & Education, Code &
Engineering Education, and Earth & Sustainability sections need blank lines
before and after them to satisfy MD058. Update the article content around the
affected table blocks so each table in the markdown file is surrounded by empty
lines, keeping the section headings and table content unchanged.

In `@system_files/bluefin/usr/share/ublue-os/just/system.just`:
- Around line 360-365: The /etc/bazaar directory is being created twice, once
inside the conditional block and again immediately after it in the same section
of system.just. Remove the redundant unconditional sudo install -d -m0755
/etc/bazaar so the directory creation happens only once, while keeping the
existing conditional handling around the PNG install logic.
- Around line 346-363: The banner conversion block in system.just should use a
pinned podman image instead of docker.io/library/alpine:latest, matching the
fixed digest used elsewhere. Also make the JXL conversion loop in the podman sh
command resilient when no .jxl files exist under the branding directory by
checking for matches before calling djxl, so the preview script does not fail
from an unexpanded glob; update the logic around BRANDING_DIR, TMP_PNG_DIR, and
the for f in /workspace/bluefin-branding/system_files/etc/bazaar/*.jxl loop
accordingly.

In `@tests/test_curated_config.py`:
- Around line 31-64: The curated config test currently recognizes articles rows
but never validates their contents, so add coverage in the test loop in
test_curated_config.py for the articles branch. Use the existing known_row_types
handling and extend the assertions to inspect row["articles"], verify the
expected list structure and required fields like title, subtitle, image, and
uri, and check that each uri is a valid expected path/value rather than a
developer-local absolute path. Keep the new checks aligned with the existing
banner and section validations so malformed articles entries fail in pytest.

In `@tests/test_update_just.bats`:
- Around line 126-136: The inline comment in _run() contains a stray token
(“ponytail”) that looks accidental. Update the comment text to clearly describe
the PATH filtering behavior without that extra word, keeping the logic in _run()
unchanged and preserving the intent of filtering directories that contain bctl.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b613a724-778c-44b3-ae8b-c81fd3627724

📥 Commits

Reviewing files that changed from the base of the PR and between efdbae7 and e3ad79e.

📒 Files selected for processing (23)
  • .github/scripts/assemble_bazaar_curation.py
  • .github/workflows/bazaar-curation.yml
  • .gitignore
  • Containerfile
  • Justfile
  • docs/skills/bazaar.md
  • docs/superpowers/plans/2026-07-02-developer-experience-portal.md
  • docs/superpowers/specs/2026-07-02-developer-experience-portal-design.md
  • scripts/check-oci-refs.py
  • system_files/bluefin/etc/bazaar/article-ai.md
  • system_files/bluefin/etc/bazaar/article-bluefin-notes.md
  • system_files/bluefin/etc/bazaar/article-devtools.md
  • system_files/bluefin/etc/bazaar/article-games.md
  • system_files/bluefin/etc/bazaar/article-gnome-notes.md
  • system_files/bluefin/etc/bazaar/article-sustainability.md
  • system_files/bluefin/etc/bazaar/curated.yaml
  • system_files/bluefin/etc/xdg/mimeapps.list
  • system_files/bluefin/usr/lib/systemd/user/bazaar.service
  • system_files/bluefin/usr/share/ublue-os/just/system.just
  • tests/test_changelog.bats
  • tests/test_check_oci_refs.py
  • tests/test_curated_config.py
  • tests/test_update_just.bats

Comment thread .github/workflows/bazaar-curation.yml Outdated
Comment on lines +39 to +40
curl -sL -o /home/linuxbrew/.linuxbrew/share/icons/hicolor/128x128/apps/openlens.png \
https://avatars.githubusercontent.com/u/108342416?s=128

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Add -f/--fail to the icon downloads.

Without --fail, curl exits 0 on HTTP errors (e.g. 404) and writes the error response body into the .png/.svg file, silently producing a corrupt icon that then gets committed. Fail fast instead.

🐛 Proposed fix
-          curl -sL -o /home/linuxbrew/.linuxbrew/share/icons/hicolor/128x128/apps/openlens.png \
+          curl -fsSL -o /home/linuxbrew/.linuxbrew/share/icons/hicolor/128x128/apps/openlens.png \
             https://avatars.githubusercontent.com/u/108342416?s=128
-          curl -sL -o /home/linuxbrew/.linuxbrew/share/icons/hicolor/scalable/apps/tavern.svg \
+          curl -fsSL -o /home/linuxbrew/.linuxbrew/share/icons/hicolor/scalable/apps/tavern.svg \
             https://raw.githubusercontent.com/tuna-os/Tavern/main/data/icons/hicolor/scalable/apps/dev.hanthor.Tavern.svg

Also applies to: 53-54

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/bazaar-curation.yml around lines 39 - 40, The icon
download steps use curl without fail-fast behavior, so HTTP errors can still
produce corrupt .png/.svg files; update the download commands in the workflow to
include curl’s fail option in the icon-fetching steps so the job stops on
non-2xx responses. Apply this to the icon download commands for the OpenLens
assets and keep the existing destination paths and URLs unchanged.

Comment thread Justfile Outdated
Comment on lines +47 to +49
echo "Regenerating local curated-dev.yaml based on repository curated.yaml..."
sed 's|file:\/\/\/run/host/etc/bazaar/|file:\/\/\/var/home/jorge/src/common/system_files/bluefin/etc/bazaar/|g' system_files/bluefin/etc/bazaar/curated.yaml > system_files/bluefin/etc/bazaar/curated-dev.yaml

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Hardcoded developer-specific absolute path breaks the recipe for every other contributor.

/var/home/jorge/src/common is hardcoded in the sed substitution (Line 48), the desktop override rewrite (Line 65), and both Flatpak launch invocations (Lines 84, 86). This recipe will only work correctly on the original author's machine/checkout location — any other contributor running just bazaar-preview will point Bazaar at a nonexistent path. This is very likely also the source of the same hardcoded path that leaked into the checked-in curated.yaml (see review comment there).

🐛 Proposed fix using a dynamic repo root
+    REPO_ROOT="$(git rev-parse --show-toplevel)"
     echo "Regenerating local curated-dev.yaml based on repository curated.yaml..."
-    sed 's|file:\/\/\/run/host/etc/bazaar/|file:\/\/\/var/home/jorge/src/common/system_files/bluefin/etc/bazaar/|g' system_files/bluefin/etc/bazaar/curated.yaml > system_files/bluefin/etc/bazaar/curated-dev.yaml
+    sed "s|file:\/\/\/run/host/etc/bazaar/|file:\/\/\/${REPO_ROOT#/}/system_files/bluefin/etc/bazaar/|g" system_files/bluefin/etc/bazaar/curated.yaml > system_files/bluefin/etc/bazaar/curated-dev.yaml

Also applies to: 61-65, 82-88

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Justfile` around lines 47 - 49, Hardcoded contributor-specific paths in the
Justfile make the Bazaar recipes non-portable. Update the rewrite logic in the
curated-dev generation and the Flatpak launch/desktop override steps to derive
the repository root dynamically instead of embedding /var/home/jorge/src/common,
using the existing Justfile recipe context so bazaar-preview works from any
checkout. Make the changes in the affected recipe blocks that reference the
curated.yaml rewrite and the launch commands, keeping the path construction
centralized and reusable.

Comment on lines +25 to +31
## Cloud-Native AI Lore & Architecture

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.

Whether you are running open-source models completely offline or orchestrating complex pipelines using PyTorch inside containerized environments, Project Bluefin's robust OCI foundation is engineered to deliver peak performance for cutting-edge machine learning and AI workloads.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Lorem ipsum placeholder text shipped in user-facing article.

The "Cloud-Native AI Lore & Architecture" section is filled with literal Lorem ipsum filler text. This will render as gibberish to end users in the curated Bazaar page.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@system_files/bluefin/etc/bazaar/article-ai.md` around lines 25 - 31, Replace
the placeholder Lorem ipsum content in the Bazaar article section with real
user-facing copy. Update the prose under the Cloud-Native AI Lore & Architecture
heading in article-ai.md so it reads like intentional documentation or marketing
text, and keep the existing symbol/section title consistent while removing all
filler paragraphs.

Comment on lines +1 to +26
# stable-20260701: Stable (stable-20260701)

## Variants promoted

| Variant | Tag | Digest |
|---|---|---|
| `bluefin` | `:stable` | `sha256:b0276d98a256` |
| `bluefin-nvidia` | `:stable` | `sha256:3a52047ed338` |

---
## Variants promoted

| Variant | Tag | Digest |
|---|---|---|
| `bluefin` | `:stable` | `sha256:a1cd03bc324a` |
| `bluefin-nvidia` | `:stable` | `sha256:e1785056efb5` |

---
## Variants promoted

| Variant | Tag | Digest |
|---|---|---|
| `bluefin` | `:stable` | `sha256:3e31c988e761` |
| `bluefin-nvidia` | `:stable` | `sha256:94f508eddcbf` |

---

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Three conflicting "Variants promoted" blocks under a single release title.

The article title is stable-20260701, but it contains three separate "## Variants promoted" tables (Lines 5-8, 13-16, 21-24) with three different sets of digests for the same bluefin/bluefin-nvidia variants. Only the third digest set (sha256:3e31c988e761...) matches the cosign/oras/slsa-verifier commands used later in the supply-chain section — the first two blocks appear to be stale/duplicate content from prior cherry-picked releases that shouldn't be in this article. Static analysis also flags this as duplicate headings (MD024) at Lines 11 and 19.

🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 11-11: Multiple headings with the same content

(MD024, no-duplicate-heading)


[warning] 19-19: Multiple headings with the same content

(MD024, no-duplicate-heading)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@system_files/bluefin/etc/bazaar/article-bluefin-notes.md` around lines 1 -
26, Remove the duplicate stale “Variants promoted” sections from the
stable-20260701 article so only the single correct digest table remains. Keep
the block whose bluefin and bluefin-nvidia digests match the later supply-chain
verification commands, and delete the earlier duplicate blocks in
article-bluefin-notes.md to eliminate the repeated heading issue (MD024).

Comment thread system_files/bluefin/etc/bazaar/article-devtools.md Outdated
Comment on lines +48 to +54
## Performance & Optimization Lore

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.

Project Bluefin leverages GameMode and containerized GPU drivers out-of-the-box to ensure maximum frame rates and minimal input lag. Play on!

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Lorem ipsum placeholder text in "Performance & Optimization Lore" section.

Same placeholder-content issue as article-ai.md and article-devtools.md.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@system_files/bluefin/etc/bazaar/article-games.md` around lines 48 - 54, The
"Performance & Optimization Lore" section in article-games.md still contains
placeholder lorem ipsum text, matching the issue already found in article-ai.md
and article-devtools.md. Replace the placeholder copy in that section with real
content that describes Bluefin’s performance and optimization features, keeping
the existing heading and the final Bluefin/GameMode sentence if it still fits
the narrative.

- title: "Bluefin Release Notes"
subtitle: "Latest stable updates from Project Bluefin"
image: file:///run/host/etc/bazaar/11-bluefin-day.png
uri: file:///var/home/jorge/src/common/system_files/bluefin/etc/bazaar/article-bluefin-notes.md

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win

Critical: article uri fields point to a developer's local machine, not the deployed path.

All six articles.list[].uri values use file:///var/home/jorge/src/common/system_files/bluefin/etc/bazaar/article-*.md, while the sibling image: fields on the very same rows (Lines 9, 13, 17, 21, 25, 29) correctly use file:///run/host/etc/bazaar/*.png. This is the Flatpak host-etc permission path Bazaar expects for curated content, as confirmed by bazaar.yaml's curated-config-paths: - /run/host/etc/bazaar/curated.yaml. On any machine other than the original author's, /var/home/jorge/... will not exist, so every article link will fail to resolve at runtime — defeating the PR's stated goal of fixing the curated page. This looks like it leaked from the bazaar-preview Justfile recipe, which generates curated-dev.yaml by substituting exactly this same jorge path (see Justfile Line 48) — it appears the generated dev output was accidentally checked in as the production curated.yaml instead of curated-dev.yaml.

🐛 Proposed fix
-          uri: file:///var/home/jorge/src/common/system_files/bluefin/etc/bazaar/article-bluefin-notes.md
+          uri: file:///run/host/etc/bazaar/article-bluefin-notes.md
...
-          uri: file:///var/home/jorge/src/common/system_files/bluefin/etc/bazaar/article-devtools.md
+          uri: file:///run/host/etc/bazaar/article-devtools.md
...
-          uri: file:///var/home/jorge/src/common/system_files/bluefin/etc/bazaar/article-gnome-notes.md
+          uri: file:///run/host/etc/bazaar/article-gnome-notes.md
...
-          uri: file:///var/home/jorge/src/common/system_files/bluefin/etc/bazaar/article-games.md
+          uri: file:///run/host/etc/bazaar/article-games.md
...
-          uri: file:///var/home/jorge/src/common/system_files/bluefin/etc/bazaar/article-sustainability.md
+          uri: file:///run/host/etc/bazaar/article-sustainability.md
...
-          uri: file:///var/home/jorge/src/common/system_files/bluefin/etc/bazaar/article-ai.md
+          uri: file:///run/host/etc/bazaar/article-ai.md

Also applies to: 14-14, 18-18, 22-22, 26-26, 30-30

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@system_files/bluefin/etc/bazaar/curated.yaml` at line 10, The curated article
links are pointing at a developer-local file path instead of the deployed
host-etc path. Update the `articles.list[].uri` entries in `curated.yaml` to use
the same `/run/host/etc/bazaar/...` base as the corresponding `image:` fields,
and make sure the production `curated.yaml` does not contain the
`curated-dev.yaml` output generated by the `bazaar-preview` Justfile recipe. Use
the `articles.list` entries and the `curated-config-paths` reference in
`bazaar.yaml` to locate and correct all affected URIs.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@system_files/bluefin/etc/bazaar/article-devtools.md`:
- Around line 180-186: The “Recommended workflows” list mentions k9s without
introducing it elsewhere, so make the reference self-contained by either adding
a brief k9s introduction in this section or removing the k9s mention from the
Kubernetes workflow bullet; update the “Recommended workflows” content
consistently so the Kubernetes entry stands on its own.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a21d3aff-3a7e-44f3-b766-0c949291398d

📥 Commits

Reviewing files that changed from the base of the PR and between e3ad79e and afaafde.

📒 Files selected for processing (4)
  • docs/skills/bazaar.md
  • system_files/bluefin/etc/bazaar/article-devtools.md
  • system_files/bluefin/etc/bazaar/curated.yaml
  • tests/test_curated_config.py
🚧 Files skipped from review as they are similar to previous changes (2)
  • tests/test_curated_config.py
  • docs/skills/bazaar.md

Comment on lines +180 to +186
## Recommended workflows

- **Local container development** — `ujust devmode` → Docker or Podman Desktop, then `devcontainer up` from your project directory.
- **Remote development containers** — install the `ms-vscode-remote.remote-containers` and `ms-vscode-remote.remote-ssh` VS Code extensions (on by default) and open a folder over SSH or in a devcontainer.
- **Kubernetes cluster work** — `kind` or `minikube` for local clusters, `kubectl` + `helm` for day-to-day operations, `k9s` or Headlamp/OpenLens when you want a visual view.
- **Virtualization and local VM work** — `ujust devmode` → virt-manager + QEMU for full VMs, or Lima for lightweight KVM-backed Linux VMs.
- **General shell productivity** — `mise` for per-project runtime versions, `atuin` for searchable shell history, `eza`/`bat`/`fd`/`ripgrep` as everyday replacements for `ls`/`cat`/`find`/`grep`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the relevant section and search for all mentions of k9s in the article.
file="system_files/bluefin/etc/bazaar/article-devtools.md"

echo "== Relevant lines =="
nl -ba "$file" | sed -n '1,220p' | sed -n '160,200p'

echo
echo "== k9s mentions in the file =="
rg -n -C 2 '\bk9s\b' "$file" || true

echo
echo "== Headings for context =="
rg -n '^#{1,3}\s' "$file" || true

Repository: projectbluefin/common

Length of output: 220


🏁 Script executed:

#!/bin/bash
set -euo pipefail

file="system_files/bluefin/etc/bazaar/article-devtools.md"

echo "== Relevant section =="
sed -n '170,190p' "$file" | cat -n

echo
echo "== All k9s mentions =="
rg -n -C 2 '\bk9s\b' "$file" || true

echo
echo "== Section headings =="
rg -n '^#{1,3}\s' "$file" || true

Repository: projectbluefin/common

Length of output: 2773


Keep k9s self-contained in the workflow list. It appears only here, so add a matching introduction above or remove the reference.

🧰 Tools
🪛 LanguageTool

[grammar] ~182-~182: Ensure spelling is correct
Context: ...flows - Local container developmentujust devmode → Docker or Podman Desktop, th...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@system_files/bluefin/etc/bazaar/article-devtools.md` around lines 180 - 186,
The “Recommended workflows” list mentions k9s without introducing it elsewhere,
so make the reference self-contained by either adding a brief k9s introduction
in this section or removing the k9s mention from the Kubernetes workflow bullet;
update the “Recommended workflows” content consistently so the Kubernetes entry
stands on its own.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/skills/bazaar.md (1)

158-160: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Avoid hardcoding a contributor-specific checkout path here.

/var/home/jorge/src/common/... will only work on one machine, so this example is not copy/paste-safe for other contributors. Prefer a repo-relative placeholder or derive the path from the current checkout.

Suggested edit
-   --extra-content-config=/var/home/jorge/src/common/system_files/bluefin/etc/bazaar/curated-dev.yaml \
+   --extra-content-config="$REPO_ROOT/system_files/bluefin/etc/bazaar/curated-dev.yaml" \
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/skills/bazaar.md` around lines 158 - 160, The Bazaar example hardcodes a
contributor-specific checkout path, which makes the snippet unsafe to copy for
others. Update the command in the Bazaar docs example to use a repo-relative
placeholder or a path derived from the current checkout instead of the fixed
`/var/home/jorge/src/common/...` location, keeping the `setsid flatpak run`
invocation and `--extra-content-config` usage intact.
♻️ Duplicate comments (1)
system_files/bluefin/usr/libexec/bazaar-hook (1)

155-161: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Same bare except: pass issue as hooks.py.

This mirrors the identical handle_gui_cask_hook/handle_cli_editor action-stage exception handling flagged in system_files/bluefin/etc/bazaar/hooks.py; apply the same fix here to keep both scripts behavior-identical.

Also applies to: 237-242

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@system_files/bluefin/usr/libexec/bazaar-hook` around lines 155 - 161, The
action-stage exception handling in the bazaar hook still uses a bare except with
pass, mirroring the same problem as the related hook code. Update the action
branch around the cask lookup and spawn_brew_tap_cask call to catch only the
expected exception type(s) and handle them consistently with the corresponding
hook behavior in the other script, so both bazaar hook implementations stay
behavior-identical. Use the local action-case logic and the spawn_brew_tap_cask
path as the target for the fix.
🧹 Nitpick comments (3)
tests/test_hooks.py (1)

308-314: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Weaker action-stage assertions than the bazaar-hook test suite.

test_action_returns_empty only checks the empty response, while the equivalent test in tests/test_bazaar_hook.py also asserts the spawned subprocess args contain the expected cask/tap/formula. Exposing the mocked Popen calls from _load_hooks (similar to _run_hook_with_mock in test_bazaar_hook.py) would let this suite catch cask/tap/formula mapping errors too.

Also applies to: 370-376

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_hooks.py` around lines 308 - 314, Strengthen the action-stage
tests in test_action_returns_empty and the matching case around test_hooks by
exposing the mocked Popen invocation from _load_hooks, similar to
_run_hook_with_mock in test_bazaar_hook.py. Update the test to assert the
spawned subprocess arguments include the expected cask/tap/formula mapping in
addition to the empty response, so the hook loading path validates both output
and command construction.
docs/superpowers/plans/2026-07-04-dx-appstore-hook-tiles.md (1)

230-246: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Plan doc omits the ## JetBrains section.

The "Produces" list only mentions ## IDEs and ## AI apps, but the actual regression test (tests/test_dx_article_devtools.py) also asserts a ## JetBrains heading. Consider updating the plan for consistency with the final implementation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/superpowers/plans/2026-07-04-dx-appstore-hook-tiles.md` around lines 230
- 246, Update the plan snippet to match the expected final headings: the
“Produces” list and the Step 1 example in the DX plan should also include a `##
JetBrains` tile-only section alongside `## IDEs` and `## AI apps`. Use the
existing `Developer Experience (DX)` plan block and the `Step 1: Replace verbose
content with minimal headings and tile grids` example as the place to add the
missing section so it stays consistent with `tests/test_dx_article_devtools.py`.
system_files/bluefin/etc/bazaar/hooks.py (1)

43-129: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicate source of truth for appids and casks keys.

Each GUI_CASK_HOOKS entry keeps a separate appids tuple and casks dict that must be kept manually in sync. A future edit adding an appid to one but not the other would silently break installs (the action stage's bare except would swallow the resulting KeyError).

Consider deriving appids from casks.keys() to eliminate the duplication.

♻️ Proposed refactor
-    'code': {
-        'appids': ('com.visualstudio.code', 'com.vscodium.codium'),
-        'tap': 'ublue-os/tap',
-        'casks': {
-            'com.visualstudio.code': 'visual-studio-code-linux',
-            'com.vscodium.codium': 'vscodium-linux',
-        },
-    },
+    'code': {
+        'tap': 'ublue-os/tap',
+        'casks': {
+            'com.visualstudio.code': 'visual-studio-code-linux',
+            'com.vscodium.codium': 'vscodium-linux',
+        },
+    },

And update handle_gui_cask_hook to use casks.keys() instead of a separate appids field.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@system_files/bluefin/etc/bazaar/hooks.py` around lines 43 - 129,
`GUI_CASK_HOOKS` duplicates the same app identifiers in both `appids` and
`casks`, which can drift out of sync. Refactor the hook definitions so each
entry derives its app IDs from the `casks` mapping instead of storing a separate
`appids` tuple. Then update `handle_gui_cask_hook` to iterate over
`casks.keys()` (or equivalent) and remove reliance on the `appids` field,
keeping the logic in sync with symbols like `GUI_CASK_HOOKS` and
`handle_gui_cask_hook`.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@system_files/bluefin/etc/bazaar/hooks.py`:
- Around line 155-161: Replace the bare except in hooks.py’s action handling
with explicit exception handling so install failures are not swallowed; in the
action branch around spawn_brew_tap_cask (and the casks[transaction_appid]
lookup), catch the relevant exceptions, log or surface the error, and avoid a
silent pass. Apply the same fix to the similar action path referenced by the
duplicate occurrence so both spawn_brew_tap_cask/spawn_brew_formula flows report
failures instead of returning an empty result with no feedback.

---

Outside diff comments:
In `@docs/skills/bazaar.md`:
- Around line 158-160: The Bazaar example hardcodes a contributor-specific
checkout path, which makes the snippet unsafe to copy for others. Update the
command in the Bazaar docs example to use a repo-relative placeholder or a path
derived from the current checkout instead of the fixed
`/var/home/jorge/src/common/...` location, keeping the `setsid flatpak run`
invocation and `--extra-content-config` usage intact.

---

Duplicate comments:
In `@system_files/bluefin/usr/libexec/bazaar-hook`:
- Around line 155-161: The action-stage exception handling in the bazaar hook
still uses a bare except with pass, mirroring the same problem as the related
hook code. Update the action branch around the cask lookup and
spawn_brew_tap_cask call to catch only the expected exception type(s) and handle
them consistently with the corresponding hook behavior in the other script, so
both bazaar hook implementations stay behavior-identical. Use the local
action-case logic and the spawn_brew_tap_cask path as the target for the fix.

---

Nitpick comments:
In `@docs/superpowers/plans/2026-07-04-dx-appstore-hook-tiles.md`:
- Around line 230-246: Update the plan snippet to match the expected final
headings: the “Produces” list and the Step 1 example in the DX plan should also
include a `## JetBrains` tile-only section alongside `## IDEs` and `## AI apps`.
Use the existing `Developer Experience (DX)` plan block and the `Step 1: Replace
verbose content with minimal headings and tile grids` example as the place to
add the missing section so it stays consistent with
`tests/test_dx_article_devtools.py`.

In `@system_files/bluefin/etc/bazaar/hooks.py`:
- Around line 43-129: `GUI_CASK_HOOKS` duplicates the same app identifiers in
both `appids` and `casks`, which can drift out of sync. Refactor the hook
definitions so each entry derives its app IDs from the `casks` mapping instead
of storing a separate `appids` tuple. Then update `handle_gui_cask_hook` to
iterate over `casks.keys()` (or equivalent) and remove reliance on the `appids`
field, keeping the logic in sync with symbols like `GUI_CASK_HOOKS` and
`handle_gui_cask_hook`.

In `@tests/test_hooks.py`:
- Around line 308-314: Strengthen the action-stage tests in
test_action_returns_empty and the matching case around test_hooks by exposing
the mocked Popen invocation from _load_hooks, similar to _run_hook_with_mock in
test_bazaar_hook.py. Update the test to assert the spawned subprocess arguments
include the expected cask/tap/formula mapping in addition to the empty response,
so the hook loading path validates both output and command construction.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b9b451f4-8422-41f2-8433-5de7fe3b7b63

📥 Commits

Reviewing files that changed from the base of the PR and between afaafde and 93f3def.

📒 Files selected for processing (10)
  • docs/skills/bazaar.md
  • docs/superpowers/plans/2026-07-04-dx-appstore-hook-tiles.md
  • docs/superpowers/specs/2026-07-04-dx-appstore-hook-tiles-design.md
  • system_files/bluefin/etc/bazaar/article-devtools.md
  • system_files/bluefin/etc/bazaar/bazaar.yaml
  • system_files/bluefin/etc/bazaar/hooks.py
  • system_files/bluefin/usr/libexec/bazaar-hook
  • tests/test_bazaar_hook.py
  • tests/test_dx_article_devtools.py
  • tests/test_hooks.py
✅ Files skipped from review due to trivial changes (1)
  • system_files/bluefin/etc/bazaar/article-devtools.md

Comment on lines +155 to +161
case 'action':
try:
cask = casks[transaction_appid]
spawn_brew_tap_cask(tap, cask)
except:
pass
return ''

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Bare except: pass swallows install failures silently.

If spawn_brew_tap_cask/spawn_brew_formula (or the casks[transaction_appid] lookup) raises, the exception is silently discarded and the dialog completes with no feedback to the user, per Ruff's E722/S110 findings.

🐛 Proposed fix
         case 'action':
             try:
                 cask = casks[transaction_appid]
                 spawn_brew_tap_cask(tap, cask)
-            except:
-                pass
+            except Exception:
+                pass  # TODO: surface failure via a follow-up dialog/log
             return ''

Also applies to: 237-242

🧰 Tools
🪛 Ruff (0.15.20)

[error] 159-159: Do not use bare except

(E722)


[error] 159-160: try-except-pass detected, consider logging the exception

(S110)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@system_files/bluefin/etc/bazaar/hooks.py` around lines 155 - 161, Replace the
bare except in hooks.py’s action handling with explicit exception handling so
install failures are not swallowed; in the action branch around
spawn_brew_tap_cask (and the casks[transaction_appid] lookup), catch the
relevant exceptions, log or surface the error, and avoid a silent pass. Apply
the same fix to the similar action path referenced by the duplicate occurrence
so both spawn_brew_tap_cask/spawn_brew_formula flows report failures instead of
returning an empty result with no feedback.

Source: Linters/SAST tools

@hanthor hanthor left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR currently has merge conflicts with the base branch and can't be merged as-is. Could you rebase / resolve the conflicts? Happy to re-review once it's mergeable — the change itself looks reasonable.

@castrojo castrojo added blocked Work is blocked on human input or an external dependency. and removed agent/blocked labels Jul 24, 2026
Jorge Castro and others added 4 commits July 27, 2026 21:43
- Replaced djxl `-C sRGB` with `--color_space=sRGB` to fix missing content in PNG conversions.
- Changed bazaar.service `Type=oneshot` to `Type=simple` and removed `RemainAfterExit=yes` to prevent systemctl from hanging indefinitely on startup.
- Cleaned the PATH in test_changelog.bats setup() to isolate tests from host-installed bctl, unblocking local development test runs.

Assisted-by: Gemini 3.5 Flash via GitHub Copilot
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Integrated automated podman-based JXL-to-PNG conversion in `just bazaar-preview` and `ujust bazaar-preview`.
- This ensures host preview displays populated banners in io.github.kolunmi.Bazaar without requiring local host-installed `djxl`.

Assisted-by: Gemini 3.5 Flash via GitHub Copilot
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Documented sRGB conversion guidelines and the podman-based local conversion loop.
- Specified Type=simple and no-window daemon lifecycle constraints for systemd integration.
- Standardized file triggers, pitfalls, and verification criteria against the canonical /addyosmani/agent-skills spec.

Assisted-by: Gemini 3.5 Flash via GitHub Copilot
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Jorge Castro and others added 3 commits July 27, 2026 21:47
Pin docker.io/library/alpine in the bazaar-preview podman containers to
the same SHA already used by the Containerfile build stage.

Assisted-by: Claude Sonnet via GitHub Copilot
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Bazaar upstream merged PR #1655 'Rework Curated System' on 2026-06-23,
changing the curated page config format before the next Flathub release.

Old schema: root css block + rows[].sections[].category with classes,
            i18n titles, and inline banner fields.
New schema: rows[] with separate banner/section row types, no CSS,
            plain string titles, subtitle as markdown object,
            and appids under appids.list.

Changes:
- Remove root css block (CSS-based section styling dropped upstream)
- Split each combined section+banner into a banner row + section row
- Migrate category.title (en only) -> section.title
- Migrate category.subtitle (en only) -> section.subtitle.string
- Migrate category.appids -> section.appids.list
- Move banner URIs to banner.image.light-uri / dark-uri
- Set banner.light-color and dark-color from old gradient end colors
- Drop i18n strings (not supported in new schema)
- Update test_curated_config.py to validate new schema shape

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… metadata

Rubber-duck review of the schema migration found several gaps:

- bazaar.service: add Restart=on-failure/RestartSec=5 so the daemon
  self-heals on curated config parse errors instead of going silently
  inactive (StartLimitBurst=10 already provides crash-loop protection)

- bazaar-preview Justfile + system.just: add 'set -e' to inner sh -c
  of podman-based JXL conversion so a per-file djxl failure aborts
  rather than letting partial PNG sets be silently installed

- curated.yaml: add can-shrink: true to all 9 banners (prevents
  clipping at narrow window widths); add overflow-count: 12 to
  Utilities (20 apps) and Developers (22 apps) to enable Show More;
  add alt: text to the Bluefin Recommends banner for accessibility

- docs/skills/bazaar.md: rewrite from legacy-schema perspective to
  new schema (post-0.8.3 / PR #1655). Correct the dangerously wrong
  claim that '-C sRGB' is the valid djxl flag (it isn't — use
  '--color_space=sRGB'). Update Red Flags and Verification checklist
  to reflect the new schema shape.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@castrojo
castrojo force-pushed the fix/bazaar-cherry-picks branch from 9c05eae to 80588ac Compare July 28, 2026 02:07
@castrojo castrojo added 4-review A pull request is awaiting review. and removed kind/bug labels Jul 28, 2026
@castrojo
castrojo marked this pull request as draft August 1, 2026 01:52
@projectbluefin projectbluefin deleted a comment from coderabbitai Bot Aug 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

4-review A pull request is awaiting review. blocked Work is blocked on human input or an external dependency.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants