Skip to content

Conversation

@Tearran
Copy link
Owner

@Tearran Tearran commented Aug 20, 2025

@coderabbitai

Summary by CodeRabbit

  • New Features

    • Added Contributors page with a responsive grid fed by JSON.
    • Introduced initialize_env module to detect and show environment details.
    • Added web_kit CLI to generate icons, JSON, contributor data, pages, and run a local test server.
    • Added setup_scafolding tool to quickly scaffold new modules.
  • Improvements

    • Icon-generation workflow supports environment overrides and expanded default sizes.
  • Chores

    • Removed legacy web UI/assets and module browser tools.
    • Deleted outdated documentation and metadata files.

deleted:    SDK/00_start_here.sh
deleted:    SDK/10_validate_module.sh
deleted:    SDK/20_promote_module.sh
deleted:    SDK/30_docstring.sh
deleted:    SDK/40_consolidate_module.sh
deleted:    SDK/50_array_to_json.sh
deleted:    SDK/60_icon_set_from_svg.sh
deleted:    SDK/README.md
deleted:    SDK/configng_v2.sh
modified:   staging/web_kit.sh
assets/
contributors.html
public_html/
staging/initialise.conf
staging/initialise.sh
staging/web_icon.sh
staging/web_kit.conf
svg_meta.json
web/
workflow/
new file:   assets/images/logos/armbian_font.v2.1.svg
new file:   assets/images/logos/armbian_mascot_v2.3.svg
new file:   assets/images/logos/armbian_social.svg
new file:   assets/images/logos/configng_cog_v1.0.svg
new file:   assets/images/logos/configng_mascot_v2.0.svg
new file:   assets/images/logos/configng_v1.0.svg
new file:   assets/images/logos/favicon.ico
new file:   assets/images/logos/legacy/armbian_font_v1.5.svg
new file:   assets/images/logos/legacy/armbian_os_v1.1.svg
new file:   assets/images/logos/legacy/armbian_sdk_v1.1.svg
new file:   contributors.html
new file:   public_html/contributors.html
new file:   public_html/favicon.ico
new file:   public_html/images.html
new file:   public_html/images/logos/1024x1024/armbian_cpu_v1.0.png
new file:   public_html/images/logos/1024x1024/armbian_font.v2.1.png
new file:   public_html/images/logos/1024x1024/armbian_font_v1.5.png
new file:   public_html/images/logos/1024x1024/armbian_mascot_v2.3.png
new file:   public_html/images/logos/1024x1024/armbian_os_v1.1.png
new file:   public_html/images/logos/1024x1024/armbian_sdk_v1.1.png
new file:   public_html/images/logos/1024x1024/armbian_social.png
new file:   public_html/images/logos/1024x1024/configng_cog_v1.0.png
new file:   public_html/images/logos/1024x1024/configng_mascot_v2.0.png
new file:   public_html/images/logos/1024x1024/configng_v1.0.png
new file:   public_html/images/logos/128x128/armbian_cpu_v1.0.png
new file:   public_html/images/logos/128x128/armbian_font.v2.1.png
new file:   public_html/images/logos/128x128/armbian_font_v1.5.png
new file:   public_html/images/logos/128x128/armbian_mascot_v2.3.png
new file:   public_html/images/logos/128x128/armbian_os_v1.1.png
new file:   public_html/images/logos/128x128/armbian_sdk_v1.1.png
new file:   public_html/images/logos/128x128/armbian_social.png
new file:   public_html/images/logos/128x128/configng_cog_v1.0.png
new file:   public_html/images/logos/128x128/configng_mascot_v2.0.png
new file:   public_html/images/logos/128x128/configng_v1.0.png
new file:   public_html/images/logos/16x16/armbian_cpu_v1.0.png
new file:   public_html/images/logos/16x16/armbian_font.v2.1.png
new file:   public_html/images/logos/16x16/armbian_font_v1.5.png
new file:   public_html/images/logos/16x16/armbian_mascot_v2.3.png
new file:   public_html/images/logos/16x16/armbian_os_v1.1.png
new file:   public_html/images/logos/16x16/armbian_sdk_v1.1.png
new file:   public_html/images/logos/16x16/armbian_social.png
new file:   public_html/images/logos/16x16/configng_cog_v1.0.png
new file:   public_html/images/logos/16x16/configng_mascot_v2.0.png
new file:   public_html/images/logos/16x16/configng_v1.0.png
new file:   public_html/images/logos/180x180/armbian_cpu_v1.0.png
new file:   public_html/images/logos/180x180/armbian_font.v2.1.png
new file:   public_html/images/logos/180x180/armbian_font_v1.5.png
new file:   public_html/images/logos/180x180/armbian_mascot_v2.3.png
new file:   public_html/images/logos/180x180/armbian_os_v1.1.png
new file:   public_html/images/logos/180x180/armbian_sdk_v1.1.png
new file:   public_html/images/logos/180x180/armbian_social.png
new file:   public_html/images/logos/180x180/configng_cog_v1.0.png
new file:   public_html/images/logos/180x180/configng_mascot_v2.0.png
new file:   public_html/images/logos/180x180/configng_v1.0.png
new file:   public_html/images/logos/192x192/armbian_cpu_v1.0.png
new file:   public_html/images/logos/192x192/armbian_font.v2.1.png
new file:   public_html/images/logos/192x192/armbian_font_v1.5.png
new file:   public_html/images/logos/192x192/armbian_mascot_v2.3.png
new file:   public_html/images/logos/192x192/armbian_os_v1.1.png
new file:   public_html/images/logos/192x192/armbian_sdk_v1.1.png
new file:   public_html/images/logos/192x192/armbian_social.png
new file:   public_html/images/logos/192x192/configng_cog_v1.0.png
new file:   public_html/images/logos/192x192/configng_mascot_v2.0.png
new file:   public_html/images/logos/192x192/configng_v1.0.png
new file:   public_html/images/logos/256x256/armbian_cpu_v1.0.png
new file:   public_html/images/logos/256x256/armbian_font.v2.1.png
new file:   public_html/images/logos/256x256/armbian_font_v1.5.png
new file:   public_html/images/logos/256x256/armbian_mascot_v2.3.png
new file:   public_html/images/logos/256x256/armbian_os_v1.1.png
new file:   public_html/images/logos/256x256/armbian_sdk_v1.1.png
new file:   public_html/images/logos/256x256/armbian_social.png
new file:   public_html/images/logos/256x256/configng_cog_v1.0.png
new file:   public_html/images/logos/256x256/configng_mascot_v2.0.png
new file:   public_html/images/logos/256x256/configng_v1.0.png
new file:   public_html/images/logos/32x32/armbian_cpu_v1.0.png
new file:   public_html/images/logos/32x32/armbian_font.v2.1.png
new file:   public_html/images/logos/32x32/armbian_font_v1.5.png
new file:   public_html/images/logos/32x32/armbian_mascot_v2.3.png
new file:   public_html/images/logos/32x32/armbian_os_v1.1.png
new file:   public_html/images/logos/32x32/armbian_sdk_v1.1.png
new file:   public_html/images/logos/32x32/armbian_social.png
new file:   public_html/images/logos/32x32/configng_cog_v1.0.png
new file:   public_html/images/logos/32x32/configng_mascot_v2.0.png
new file:   public_html/images/logos/32x32/configng_v1.0.png
new file:   public_html/images/logos/384x384/armbian_cpu_v1.0.png
new file:   public_html/images/logos/384x384/armbian_font.v2.1.png
new file:   public_html/images/logos/384x384/armbian_font_v1.5.png
new file:   public_html/images/logos/384x384/armbian_mascot_v2.3.png
new file:   public_html/images/logos/384x384/armbian_os_v1.1.png
new file:   public_html/images/logos/384x384/armbian_sdk_v1.1.png
new file:   public_html/images/logos/384x384/armbian_social.png
new file:   public_html/images/logos/384x384/configng_cog_v1.0.png
new file:   public_html/images/logos/384x384/configng_mascot_v2.0.png
new file:   public_html/images/logos/384x384/configng_v1.0.png
new file:   public_html/images/logos/48x48/armbian_cpu_v1.0.png
new file:   public_html/images/logos/48x48/armbian_font.v2.1.png
new file:   public_html/images/logos/48x48/armbian_font_v1.5.png
new file:   public_html/images/logos/48x48/armbian_mascot_v2.3.png
new file:   public_html/images/logos/48x48/armbian_os_v1.1.png
new file:   public_html/images/logos/48x48/armbian_sdk_v1.1.png
new file:   public_html/images/logos/48x48/armbian_social.png
new file:   public_html/images/logos/48x48/configng_cog_v1.0.png
new file:   public_html/images/logos/48x48/configng_mascot_v2.0.png
new file:   public_html/images/logos/48x48/configng_v1.0.png
new file:   public_html/images/logos/512x512/armbian_cpu_v1.0.png
new file:   public_html/images/logos/512x512/armbian_font.v2.1.png
new file:   public_html/images/logos/512x512/armbian_font_v1.5.png
new file:   public_html/images/logos/512x512/armbian_mascot_v2.3.png
new file:   public_html/images/logos/512x512/armbian_os_v1.1.png
new file:   public_html/images/logos/512x512/armbian_sdk_v1.1.png
new file:   public_html/images/logos/512x512/armbian_social.png
new file:   public_html/images/logos/512x512/configng_cog_v1.0.png
new file:   public_html/images/logos/512x512/configng_mascot_v2.0.png
new file:   public_html/images/logos/512x512/configng_v1.0.png
new file:   public_html/images/logos/64x64/armbian_cpu_v1.0.png
new file:   public_html/images/logos/64x64/armbian_font.v2.1.png
new file:   public_html/images/logos/64x64/armbian_font_v1.5.png
new file:   public_html/images/logos/64x64/armbian_mascot_v2.3.png
new file:   public_html/images/logos/64x64/armbian_os_v1.1.png
new file:   public_html/images/logos/64x64/armbian_sdk_v1.1.png
new file:   public_html/images/logos/64x64/armbian_social.png
new file:   public_html/images/logos/64x64/configng_cog_v1.0.png
new file:   public_html/images/logos/64x64/configng_mascot_v2.0.png
new file:   public_html/images/logos/64x64/configng_v1.0.png
new file:   public_html/images/logos/96x96/armbian_cpu_v1.0.png
new file:   public_html/images/logos/96x96/armbian_font.v2.1.png
new file:   public_html/images/logos/96x96/armbian_font_v1.5.png
new file:   public_html/images/logos/96x96/armbian_mascot_v2.3.png
new file:   public_html/images/logos/96x96/armbian_os_v1.1.png
new file:   public_html/images/logos/96x96/armbian_sdk_v1.1.png
new file:   public_html/images/logos/96x96/armbian_social.png
new file:   public_html/images/logos/96x96/configng_cog_v1.0.png
new file:   public_html/images/logos/96x96/configng_mascot_v2.0.png
new file:   public_html/images/logos/96x96/configng_v1.0.png
new file:   public_html/images/logos/scalable/armbian_cpu_v1.0.svg
new file:   public_html/images/logos/scalable/armbian_font.v2.1.svg
new file:   public_html/images/logos/scalable/armbian_mascot_v2.3.svg
new file:   public_html/images/logos/scalable/armbian_social.svg
new file:   public_html/images/logos/scalable/configng_cog_v1.0.svg
new file:   public_html/images/logos/scalable/configng_mascot_v2.0.svg
new file:   public_html/images/logos/scalable/configng_v1.0.svg
new file:   public_html/images/logos/scalable/legacy/armbian_font_v1.5.svg
new file:   public_html/images/logos/scalable/legacy/armbian_os_v1.1.svg
new file:   public_html/images/logos/scalable/legacy/armbian_sdk_v1.1.svg
new file:   public_html/json/contributors/build.json
new file:   public_html/json/contributors/configng-v2.json
new file:   public_html/json/contributors/configng.json
new file:   public_html/json/contributors/documentation.json
new file:   public_html/json/images/logos.json
new file:   staging/initialise.conf
new file:   staging/initialise.sh
new file:   staging/web_icon.sh
new file:   staging/web_kit.conf
modified:   staging/web_kit.sh
new file:   svg_meta.json
new file:   web/css/blue.css
new file:   web/css/green.css
new file:   web/css/grey.css
new file:   web/css/red.css
new file:   web/css/style.css
new file:   web/css/white.css
new file:   web/favicon.ico
new file:   web/index.html
new file:   web/js/configng.js
new file:   web/js/contact.js
new file:   web/js/home.js
new file:   web/js/nav.js
new file:   web/js/script.js
new file:   web/js/templates.js
new file:   web/js/theme.js
new file:   web/json/author.json
new file:   web/json/configng_v2.json
new file:   web/json/contact-info.json
new file:   web/json/contributors.json
new file:   web/json/home.json
new file:   web/json/logos.json
renamed:    SDK/00_start_here.sh -> workflow/00_start_here.sh
renamed:    SDK/10_validate_module.sh -> workflow/10_validate_module.sh
renamed:    SDK/20_promote_module.sh -> workflow/20_promote_module.sh
renamed:    SDK/30_docstring.sh -> workflow/30_docstring.sh
renamed:    SDK/40_consolidate_module.sh -> workflow/40_consolidate_module.sh
renamed:    SDK/50_array_to_json.sh -> workflow/50_array_to_json.sh
renamed:    SDK/60_icon_set_from_svg.sh -> workflow/60_icon_set_from_svg.sh
renamed:    SDK/README.md -> workflow/README.md
renamed:    SDK/configng_v2.sh -> workflow/configng_v2.sh
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 20, 2025

Walkthrough

Adds new modules and tooling: environment initializer, web asset builder, and scaffolding generator; introduces related configuration files and a static contributors HTML. Removes legacy web UI/site assets, media-kit tooling, and the modules_browser toolchain (HTML/JS/CSS/JSON and Go/Python helpers). Adjusts two workflow scripts and adds an incomplete svg_meta.json.

Changes

Cohort / File(s) Summary
Environment initialization module
src/core/initialize/initialize_env.conf, src/core/initialize/initialize_env.sh
New module config and Bash script that detect and export common environment variables, provide show/export/help subcommands, and expose helper functions.
Web asset toolkit (staging)
staging/web_kit.conf, staging/web_kit.sh
New staging config and Bash CLI to generate icons, build logos/contributors JSON, render HTML pages, and run a local test server (server/icons/json/pages/build commands).
Module scaffolding generator
staging/setup_scafolding.conf, staging/setup_scafolding.sh
New scaffolding module and script to validate a module name and produce starter .conf and .sh templates into a staging directory.
Contributors page and SVG meta
contributors.html, svg_meta.json
Adds a static contributors HTML page that reads contributors.json; introduces svg_meta.json containing an opening JSON array bracket (incomplete in this diff).
Workflow updates
workflow/50_array_to_json.sh, workflow/60_icon_set_from_svg.sh
Commented-out two copy operations in 50_array_to_json.sh; made SRC_DIR and SIZES environment-overrideable and added 48px default size in 60_icon_set_from_svg.sh.
Remove modules browser toolchain
modules_browsers/...
modules_browsers/README.md, modules_browsers/go.mod, modules_browsers/modules_browser.go, modules_browsers/modules_browser.html, modules_browsers/modules_browser.py, modules_browsers/modules_metadata.json, modules_browsers/web-server.go
Deleted the modules_browser HTML/UI, metadata JSON, Go/Python webview/server helpers, README, and go.mod.
Remove legacy web_kit site and data
web_kit/...
web_kit/README.md, web_kit/media_kit.sh, web_kit/src/index.html, web_kit/src/css/*, web_kit/src/js/*, web_kit/src/json/*
Deleted the legacy media-kit scripts, the site HTML, all CSS theme files, client JS modules, and site JSON datasets (logos, home, contact, modules metadata, authors, etc.).

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant Caller
  participant initialize_env as initialize_env.sh
  participant OS as /etc/*release
  participant Net as ip/route

  Caller->>initialize_env: initialize_env [help|show|default]
  alt help
    initialize_env-->>Caller: print usage/help
  else show/default
    initialize_env->>OS: source /etc/os-release /etc/armbian-release (if present)
    initialize_env->>Net: detect default adapter, local IP, subnet
    initialize_env-->>Caller: export variables (or print on show)
  end
Loading
sequenceDiagram
  autonumber
  participant User
  participant webkit as web_kit.sh
  participant IM as ImageMagick
  participant FS as Filesystem
  participant Py as PythonServer

  User->>webkit: web_kit [icons|json|contrib|pages|server|build]
  alt icons
    webkit->>IM: convert SVG -> PNG sizes, create favicon
    IM-->>FS: write image assets
  else json
    webkit->>FS: scan SVG/PNG, extract meta -> write images/logo.json
  else contrib
    webkit->>FS: fetch GitHub -> write contributors JSON
  else pages
    webkit-->>FS: render contributors.html & images.html referencing JSON
  else server
    webkit->>Py: start Python HTTP server serving WEB_ROOT
  else build
    webkit->>webkit: icons -> json -> contrib -> pages
    webkit->>Py: start server
  end
Loading
sequenceDiagram
  autonumber
  participant Dev
  participant scaffold as setup_scafolding.sh
  participant FS as Filesystem

  Dev->>scaffold: setup_scafolding <ModuleName>
  scaffold->>scaffold: validate name, ensure staging dir
  scaffold-->>FS: create <ModuleName>.conf and <ModuleName>.sh (if absent)
  scaffold-->>Dev: summary (Created / Skipped counts)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • modified: tools/start_here.sh #63 — Overlaps with scaffold/template metadata and helpers; likely touches the same generated .conf structure.
  • modified: docs/index.html #70 — Related to modules_browser and webview tooling changes (adds/removes similar browser UI components).
  • Media kit #104 — Touches media-kit/web assets and tooling overlapping with the new staging web_kit additions and removed legacy media-kit.

Poem

A rabbit hops and taps away,
Old pages sleep, new scripts at play.
Env maps paths and icons gleam,
Scaffolds sprout from a tidy dream.
Contributors gather — hop, hooray! 🐇✨

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.


📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 0c75ff0 and f2074e7.

📒 Files selected for processing (3)
  • staging/setup_scafolding.sh (1 hunks)
  • staging/web_kit.conf (1 hunks)
  • workflow/60_icon_set_from_svg.sh (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • workflow/60_icon_set_from_svg.sh
  • staging/setup_scafolding.sh
  • staging/web_kit.conf
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch web_kit

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Tearran added 10 commits August 20, 2025 23:59
new file:   public_html/json/images/armbian_font.v2.1.json
new file:   public_html/json/images/armbian_font_v1.5.json
new file:   public_html/json/images/armbian_mascot_v2.3.json
new file:   public_html/json/images/armbian_os_v1.1.json
new file:   public_html/json/images/armbian_sdk_v1.1.json
new file:   public_html/json/images/armbian_social.json
new file:   public_html/json/images/configng_cog_v1.0.json
new file:   public_html/json/images/configng_mascot_v2.0.json
new file:   public_html/json/images/configng_v1.0.json
deleted:    public_html/json/images/logos.json
modified:   staging/web_kit.sh
 with '' will be ignored, and an empty message aborts the commit.

 On branch web_kit
 Your branch is up to date with 'origin/web_kit'.

 Changes to be committed:
modified:   src/core/initialize/initialize_env.sh
	modified:   staging/web_kit.sh
	deleted:    web_kit/README.md
	deleted:    web_kit/brand/armbian_cpu_v1.0.svg
	deleted:    web_kit/brand/armbian_font.v2.1.svg
	deleted:    web_kit/brand/armbian_mascot_v2.3.svg
	deleted:    web_kit/brand/armbian_social.svg
	deleted:    web_kit/brand/configng_cog_v1.0.svg
	deleted:    web_kit/brand/configng_mascot_v2.0.svg
	deleted:    web_kit/brand/configng_v1.0.svg
	deleted:    web_kit/brand/legacy/armbian_font_v1.5.svg
	deleted:    web_kit/brand/legacy/armbian_os_v1.1.svg
	deleted:    web_kit/brand/legacy/armbian_sdk_v1.1.svg
	deleted:    web_kit/media_kit.sh
	deleted:    web_kit/src/css/blue.css
	deleted:    web_kit/src/css/green.css
	deleted:    web_kit/src/css/grey.css
	deleted:    web_kit/src/css/red.css
	deleted:    web_kit/src/css/style.css
	deleted:    web_kit/src/css/white.css
	deleted:    web_kit/src/favicon.ico
	deleted:    web_kit/src/images/16x16/armbian_cpu_v1.0.png
	deleted:    web_kit/src/images/16x16/armbian_font.v2.1.png
	deleted:    web_kit/src/images/16x16/armbian_font_v1.5.png
	deleted:    web_kit/src/images/16x16/armbian_mascot_v2.3.png
	deleted:    web_kit/src/images/16x16/armbian_os_v1.1.png
	deleted:    web_kit/src/images/16x16/armbian_sdk_v1.1.png
	deleted:    web_kit/src/images/16x16/armbian_social.png
	deleted:    web_kit/src/images/16x16/configng_cog_v1.0.png
	deleted:    web_kit/src/images/16x16/configng_mascot_v2.0.png
	deleted:    web_kit/src/images/16x16/configng_v1.0.png
	deleted:    web_kit/src/images/32x32/armbian_cpu_v1.0.png
	deleted:    web_kit/src/images/32x32/armbian_font.v2.1.png
	deleted:    web_kit/src/images/32x32/armbian_font_v1.5.png
	deleted:    web_kit/src/images/32x32/armbian_mascot_v2.3.png
	deleted:    web_kit/src/images/32x32/armbian_os_v1.1.png
	deleted:    web_kit/src/images/32x32/armbian_sdk_v1.1.png
	deleted:    web_kit/src/images/32x32/armbian_social.png
	deleted:    web_kit/src/images/32x32/configng_cog_v1.0.png
	deleted:    web_kit/src/images/32x32/configng_mascot_v2.0.png
	deleted:    web_kit/src/images/32x32/configng_v1.0.png
	deleted:    web_kit/src/images/48x48/armbian_cpu_v1.0.png
	deleted:    web_kit/src/images/48x48/armbian_font.v2.1.png
	deleted:    web_kit/src/images/48x48/armbian_font_v1.5.png
	deleted:    web_kit/src/images/48x48/armbian_mascot_v2.3.png
	deleted:    web_kit/src/images/48x48/armbian_os_v1.1.png
	deleted:    web_kit/src/images/48x48/armbian_sdk_v1.1.png
	deleted:    web_kit/src/images/48x48/armbian_social.png
	deleted:    web_kit/src/images/48x48/configng_cog_v1.0.png
	deleted:    web_kit/src/images/48x48/configng_mascot_v2.0.png
	deleted:    web_kit/src/images/48x48/configng_v1.0.png
	deleted:    web_kit/src/images/512x512/armbian_cpu_v1.0.png
	deleted:    web_kit/src/images/512x512/armbian_font.v2.1.png
	deleted:    web_kit/src/images/512x512/armbian_font_v1.5.png
	deleted:    web_kit/src/images/512x512/armbian_mascot_v2.3.png
	deleted:    web_kit/src/images/512x512/armbian_os_v1.1.png
	deleted:    web_kit/src/images/512x512/armbian_sdk_v1.1.png
	deleted:    web_kit/src/images/512x512/armbian_social.png
	deleted:    web_kit/src/images/512x512/configng_cog_v1.0.png
	deleted:    web_kit/src/images/512x512/configng_mascot_v2.0.png
	deleted:    web_kit/src/images/512x512/configng_v1.0.png
	deleted:    web_kit/src/images/scalable/armbian_cpu_v1.0.svg
	deleted:    web_kit/src/images/scalable/armbian_font.v2.1.svg
	deleted:    web_kit/src/images/scalable/armbian_mascot_v2.3.svg
	deleted:    web_kit/src/images/scalable/armbian_social.svg
	deleted:    web_kit/src/images/scalable/configng_cog_v1.0.svg
	deleted:    web_kit/src/images/scalable/configng_mascot_v2.0.svg
	deleted:    web_kit/src/images/scalable/configng_v1.0.svg
	deleted:    web_kit/src/images/scalable/legacy/armbian_font_v1.5.svg
	deleted:    web_kit/src/images/scalable/legacy/armbian_os_v1.1.svg
	deleted:    web_kit/src/images/scalable/legacy/armbian_sdk_v1.1.svg
	deleted:    web_kit/src/index.html
	deleted:    web_kit/src/js/configng.js
	deleted:    web_kit/src/js/contact.js
	deleted:    web_kit/src/js/home.js
	deleted:    web_kit/src/js/nav.js
	deleted:    web_kit/src/js/script.js
	deleted:    web_kit/src/js/templates.js
	deleted:    web_kit/src/js/theme.js
	deleted:    web_kit/src/json/author.json
	deleted:    web_kit/src/json/configng_v2.json
	deleted:    web_kit/src/json/contact-info.json
	deleted:    web_kit/src/json/contributors.json
	deleted:    web_kit/src/json/home.json
	deleted:    web_kit/src/json/logos.json
new file:   share/icons/hicolor/128x128/armbian_font.v2.1.png
new file:   share/icons/hicolor/128x128/armbian_mascot_v2.3.png
new file:   share/icons/hicolor/128x128/armbian_social.png
new file:   share/icons/hicolor/128x128/configng_cog_v1.0.png
new file:   share/icons/hicolor/128x128/configng_mascot_v2.0.png
new file:   share/icons/hicolor/128x128/configng_v1.0.png
new file:   share/icons/hicolor/16x16/armbian_cpu_v1.0.png
new file:   share/icons/hicolor/16x16/armbian_font.v2.1.png
new file:   share/icons/hicolor/16x16/armbian_mascot_v2.3.png
new file:   share/icons/hicolor/16x16/armbian_social.png
new file:   share/icons/hicolor/16x16/configng_cog_v1.0.png
new file:   share/icons/hicolor/16x16/configng_mascot_v2.0.png
new file:   share/icons/hicolor/16x16/configng_v1.0.png
new file:   share/icons/hicolor/256x256/armbian_cpu_v1.0.png
new file:   share/icons/hicolor/256x256/armbian_font.v2.1.png
new file:   share/icons/hicolor/256x256/armbian_mascot_v2.3.png
new file:   share/icons/hicolor/256x256/armbian_social.png
new file:   share/icons/hicolor/256x256/configng_cog_v1.0.png
new file:   share/icons/hicolor/256x256/configng_mascot_v2.0.png
new file:   share/icons/hicolor/256x256/configng_v1.0.png
new file:   share/icons/hicolor/32x32/armbian_cpu_v1.0.png
new file:   share/icons/hicolor/32x32/armbian_font.v2.1.png
new file:   share/icons/hicolor/32x32/armbian_mascot_v2.3.png
new file:   share/icons/hicolor/32x32/armbian_social.png
new file:   share/icons/hicolor/32x32/configng_cog_v1.0.png
new file:   share/icons/hicolor/32x32/configng_mascot_v2.0.png
new file:   share/icons/hicolor/32x32/configng_v1.0.png
new file:   share/icons/hicolor/48x48/armbian_cpu_v1.0.png
new file:   share/icons/hicolor/48x48/armbian_font.v2.1.png
new file:   share/icons/hicolor/48x48/armbian_mascot_v2.3.png
new file:   share/icons/hicolor/48x48/armbian_social.png
new file:   share/icons/hicolor/48x48/configng_cog_v1.0.png
new file:   share/icons/hicolor/48x48/configng_mascot_v2.0.png
new file:   share/icons/hicolor/48x48/configng_v1.0.png
new file:   share/icons/hicolor/512x512/armbian_cpu_v1.0.png
new file:   share/icons/hicolor/512x512/armbian_font.v2.1.png
new file:   share/icons/hicolor/512x512/armbian_mascot_v2.3.png
new file:   share/icons/hicolor/512x512/armbian_social.png
new file:   share/icons/hicolor/512x512/configng_cog_v1.0.png
new file:   share/icons/hicolor/512x512/configng_mascot_v2.0.png
new file:   share/icons/hicolor/512x512/configng_v1.0.png
new file:   share/icons/hicolor/64x64/armbian_cpu_v1.0.png
new file:   share/icons/hicolor/64x64/armbian_font.v2.1.png
new file:   share/icons/hicolor/64x64/armbian_mascot_v2.3.png
new file:   share/icons/hicolor/64x64/armbian_social.png
new file:   share/icons/hicolor/64x64/configng_cog_v1.0.png
new file:   share/icons/hicolor/64x64/configng_mascot_v2.0.png
new file:   share/icons/hicolor/64x64/configng_v1.0.png
modified:   workflow/60_icon_set_from_svg.sh
@Tearran Tearran marked this pull request as ready for review August 21, 2025 16:13
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 18

Caution

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

⚠️ Outside diff range comments (6)
svg_meta.json (1)

1-2: Fix invalid JSON: file ends before closing the array.

The file currently contains only the opening bracket, which breaks JSON parsers and the build step flagged by Biome. If this is meant to be a placeholder, use an empty array to remain valid.

Apply this diff:

-[
+[]

Follow-up:

  • If consumers expect objects with specific fields (e.g., title, desc), consider adding a minimal schema or a placeholder object and add a JSON validation step in CI.
workflow/50_array_to_json.sh (4)

1-3: Harden the script: fail fast on errors and failed pipelines.

Add strict mode so JSON generation or cp failures stop the script instead of silently producing partial artifacts.

Apply this diff:

 #!/usr/bin/env bash
+set -euo pipefail
+# If you rely on word-splitting anywhere intentionally, opt out locally with:
+#   # shellcheck disable=SC2086

84-93: Escape JSON values safely; current interpolation can break on quotes/newlines.

Directly embedding strings like "${arr[$mod,description]}" into JSON will break if values contain quotes, backslashes, or newlines. The same applies to command elements. Use jq to JSON-escape each string and build arrays robustly.

Apply these diffs in two places (the direct-group block around Lines 84–93 and the grouped block around Lines 154–163):

-						# Command array
-						cmds="${arr[$mod,command]}"
-						IFS=',' read -ra cmd_array <<< "$cmds"
-						cmd_json=""
-						for idx in "${!cmd_array[@]}"; do
-							c="$(echo "${cmd_array[$idx]}" | xargs)"
-							[ $idx -gt 0 ] && cmd_json+=", "
-							cmd_json+="\"$c\""
-						done
+						# Command array (robust JSON array using jq)
+						cmds="${arr[$mod,command]}"
+						IFS=',' read -ra cmd_array <<< "$cmds"
+						# Build a NUL-delimited stream to preserve spaces/commas, then JSONify
+						cmd_json="$(printf '%s\0' "${cmd_array[@]}" | jq -R -s 'split("\u0000")[:-1]')"

And adjust the heredoc object fields to JSON-escape values (see next comment for the heredoc changes).



Also applies to: 154-163

---

`94-111`: **Use JSON-escaped substitutions inside the heredoc (direct-group item).**

Leverage jq to escape each field. This prevents malformed JSON if any source contains quotes or special characters.

Apply this diff:

```diff
-				{
-					"id": "$feature_id",
-					"feature": "${arr[$mod,feature]}",
-					"description": "${arr[$mod,description]}",
-					"options": "${arr[$mod,options]}",
-					"author": "${arr[$mod,contributor]}",
-					"arch": "${arr[$mod,arch]}",
-					"require_os": "${arr[$mod,require_os]}",
-					"require_kernel": "${arr[$mod,require_kernel]}",
-					"status": "Stable",
-					"helpers": "${arr[$mod,helpers]}",
-					"about": "${arr[$mod,extend_desc]}",
-					"condition": "${arr[$mod,condition]}",
-					"command": [
-						$cmd_json
-					]
-				}
+				{
+					"id": "$feature_id",
+					"feature": $(jq -Rn --arg v "${arr[$mod,feature]}" '$v'),
+					"description": $(jq -Rn --arg v "${arr[$mod,description]}" '$v'),
+					"options": $(jq -Rn --arg v "${arr[$mod,options]}" '$v'),
+					"author": $(jq -Rn --arg v "${arr[$mod,contributor]}" '$v'),
+					"arch": $(jq -Rn --arg v "${arr[$mod,arch]}" '$v'),
+					"require_os": $(jq -Rn --arg v "${arr[$mod,require_os]}" '$v'),
+					"require_kernel": $(jq -Rn --arg v "${arr[$mod,require_kernel]}" '$v'),
+					"status": "Stable",
+					"helpers": $(jq -Rn --arg v "${arr[$mod,helpers]}" '$v'),
+					"about": $(jq -Rn --arg v "${arr[$mod,extend_desc]}" '$v'),
+					"condition": $(jq -Rn --arg v "${arr[$mod,condition]}" '$v'),
+					"command": $cmd_json
+				}

Note: Using jq -Rn --arg v '...' '$v' avoids forking Python and keeps dependencies consistent since jq is already required.


---

`165-181`: **Mirror the JSON-escaping fix in the grouped-item heredoc.**

Apply the same safe substitutions here to keep both code paths consistent.

Apply this diff:

```diff
-						{
-							"id": "$feature_id",
-							"feature": "${arr[$mod,feature]}",
-							"description": "${arr[$mod,description]}",
-							"options": "${arr[$mod,options]}",
-							"author": "${arr[$mod,contributor]}",
-							"arch": "${arr[$mod,arch]}",
-							"require_os": "${arr[$mod,require_os]}",
-							"require_kernel": "${arr[$mod,require_kernel]}",
-							"status": "Stable",
-							"helpers": "${arr[$mod,helpers]}",
-							"about": "${arr[$mod,extend_desc]}",
-							"condition": "${arr[$mod,condition]}",
-							"command": [
-								$cmd_json
-							]
-						}
+						{
+							"id": "$feature_id",
+							"feature": $(jq -Rn --arg v "${arr[$mod,feature]}" '$v'),
+							"description": $(jq -Rn --arg v "${arr[$mod,description]}" '$v'),
+							"options": $(jq -Rn --arg v "${arr[$mod,options]}" '$v'),
+							"author": $(jq -Rn --arg v "${arr[$mod,contributor]}" '$v'),
+							"arch": $(jq -Rn --arg v "${arr[$mod,arch]}" '$v'),
+							"require_os": $(jq -Rn --arg v "${arr[$mod,require_os]}" '$v'),
+							"require_kernel": $(jq -Rn --arg v "${arr[$mod,require_kernel]}" '$v'),
+							"status": "Stable",
+							"helpers": $(jq -Rn --arg v "${arr[$mod,helpers]}" '$v'),
+							"about": $(jq -Rn --arg v "${arr[$mod,extend_desc]}" '$v'),
+							"condition": $(jq -Rn --arg v "${arr[$mod,condition]}" '$v'),
+							"command": $cmd_json
+						}
workflow/60_icon_set_from_svg.sh (1)

35-41: Not recursive: nested SVGs (e.g., scalable/legacy) are skipped.

Current glob only matches "$SRC_DIR/*.svg". Assets under nested folders won’t be processed.

Apply this diff to include nested SVGs:

-shopt -s nullglob
-svg_files=("$SRC_DIR"/*.svg)
-if [ ${#svg_files[@]} -eq 0 ]; then
+mapfile -t svg_files < <(find "$SRC_DIR" -type f -name '*.svg' | sort -u)
+if [ "${#svg_files[@]}" -eq 0 ]; then
   echo "Error: No SVG files found in '$SRC_DIR'."
   exit 1
 fi
-shopt -u nullglob
🧹 Nitpick comments (23)
src/core/initialize/initialize_env.sh (4)

85-88: Avoid double initialization in _initialize_env_show

initialize_env show already calls _initialize_env_vars; calling it again inside _initialize_env_show duplicates work.

Apply:

 _initialize_env_show() {
-  # Make sure variables are initialized first
-  _initialize_env_vars
+  # Assumes _initialize_env_vars was called by the caller

36-41: Make BIN_ROOT resolution symlink-aware (optional)

If this script is symlinked, pwd may not resolve the real location. Prefer readlink -f or realpath when available; fall back to pwd.

-BIN_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+BIN_ROOT="$(
+  cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 || exit 1
+  if command -v readlink >/dev/null 2>&1 && readlink -f "${BASH_SOURCE[0]}" >/dev/null 2>&1; then
+    dirname "$(readlink -f "${BASH_SOURCE[0]}")"
+  elif command -v realpath >/dev/null 2>&1; then
+    dirname "$(realpath "${BASH_SOURCE[0]}")"
+  else
+    pwd
+  fi
+)"

161-171: Extend the self-test to cover show/export outputs (optional)

The test only asserts help usage. Adding minimal checks for show/export improves confidence without heavy dependencies.

Example snippet to append:

# Basic sanity checks (non-fatal if ip/armbian files are absent)
initialize_env show >/dev/null

# Verify export emits at least one export line
if ! initialize_env export | grep -q '^export BIN_ROOT='; then
  echo "fail: export did not emit BIN_ROOT"
  echo "test complete"
  exit 1
fi

I can integrate this and align with your CI expectations.


118-139: Consider gating full file dumps behind a verbose flag

Dumping entire /etc/os-release and /etc/armbian-release is noisy in non-debug runs. Consider printing paths by default and the contents only when a VERBOSE or DEBUG flag is set.

If desired, I can wire a --verbose flag so initialize_env show only cats files when VERBOSE=1.

src/core/initialize/initialize_env.conf (2)

14-15: Document the export command in the [options] section

options includes export, but [options] lacks a description. Add an entry to keep module metadata consistent.

 [options]
 help=Show help for this module
 show=Print discovered variables as key=value for inspection
+export=Emit export statements (export KEY=VALUE) suitable for eval

Also applies to: 46-47


30-31: Confirm require_os scope (Armbian only?)

The implementation works broadly for any distro exposing /etc/os-release; require_os=Armbian narrows availability. If intended to run on Debian/Ubuntu as well, widen this list. If not, ignore.

I can update require_os to Armbian,Debian,Ubuntu if that matches the intended surface. Want me to open a small follow-up?

public_html/json/contributors/configng.json (1)

1-104: Dataset looks consistent and UI-ready; consider freezing order to reduce churn in diffs.

The structure (login, contributions, avatar_url, html_url) matches the new UI’s expectations. To minimize noisy diffs in future updates, pre-sort entries (e.g., by contributions desc, then login asc) before committing. If bots are intentionally included, you may want to add a “type”: "bot" | "user" in the future to allow UI filtering without dropping data.

workflow/50_array_to_json.sh (1)

80-83: Sanitize feature_id prefix to alphanumerics to avoid accidental invalid IDs.

If grp begins with non-letters (e.g., symbols), IDs like "___001" could be undesirable. Suggest normalizing to A–Z and digits.

Example:

-						group_prefix="$(echo "${grp:0:3}" | tr '[:lower:]' '[:upper:]')"
+						group_prefix="$(echo "${grp:0:3}" | tr '[:lower:]' '[:upper:]' | tr -cd 'A-Z0-9')"
+						[[ -z "$group_prefix" ]] && group_prefix="GRP"

Also applies to: 150-153

public_html/json/contributors/documentation.json (1)

1-338: Large dataset looks well-formed; add periodic re-gen note or timestamp if this feeds “top contributors.”

Structure is correct and consistent with other blocks. Consider adding a top-level sibling asset (e.g., public_html/json/contributors/last_updated.json) or embedding a timestamp in the page that fetches these to communicate data freshness to users.

contributors.html (1)

1-7: Optional: De-duplicate with public_html/contributors.html to avoid two UIs.

If the richer UI in public_html/ is the new canonical page, consider either redirecting this file or removing it to reduce maintenance overhead and possible confusion over data locations.

public_html/json/images/logo.json (2)

97-99: Trim trailing whitespace in title.

Minor cleanliness nit.

-      "title": "Armbian SDK Icon ",
+      "title": "Armbian SDK Icon",

13-16: Normalize naming: dots vs underscores in asset names.

armbian_font.v2.1 uses a dot in the basename, while others use underscores. Mixed conventions can complicate globbing, sorting, and cross-tool assumptions.

Consider standardizing to underscores (armbian_font_v2.1) across file names and JSON to reduce edge cases in scripts and UIs.

workflow/60_icon_set_from_svg.sh (1)

8-26: Apt-only installer prompt will break on macOS and in non-interactive CI.

Interactive apt install hangs in CI and doesn’t work on macOS. Add OS detection and a non-interactive fallback.

-if ! command -v convert &> /dev/null; then
+if ! command -v convert &> /dev/null; then
   echo "Error: ImageMagick 'convert' command not found."
-  read -p "Would you like to install ImageMagick using 'sudo apt install imagemagick'? [Y/n] " yn
-  case "$yn" in
-    [Yy]* | "" )
-    echo "Installing ImageMagick..."
-    sudo apt update && sudo apt install imagemagick
-    if ! command -v convert &> /dev/null; then
-      echo "Installation failed or 'convert' still not found. Exiting."
-      exit 1
-    fi
-    ;;
-    * )
-    echo "Cannot proceed without ImageMagick. Exiting."
-    exit 1
-  ;;
-  esac
+  case "$(uname -s)" in
+    Linux)
+      if command -v apt >/dev/null 2>&1; then
+        echo "Attempting non-interactive install via apt..."
+        sudo DEBIAN_FRONTEND=noninteractive apt-get update -y && sudo DEBIAN_FRONTEND=noninteractive apt-get install -y imagemagick
+      else
+        echo "Please install ImageMagick via your distro package manager."
+        exit 1
+      fi
+      ;;
+    Darwin)
+      if command -v brew >/dev/null 2>&1; then
+        echo "Attempting install via Homebrew..."
+        brew install imagemagick
+      else
+        echo "Install Homebrew first (https://brew.sh) or install ImageMagick manually."
+        exit 1
+      fi
+      ;;
+    *)
+      echo "Unsupported OS for auto-install. Please install ImageMagick manually."
+      exit 1
+      ;;
+  esac
   if ! command -v convert &> /dev/null; then
     echo "Installation failed or 'convert' still not found. Exiting."
     exit 1
   fi
 fi
public_html/contributors.html (2)

281-286: Avoid stale caches on refresh; disable cache for JSON fetches.

Browsers may cache the JSON aggressively, making Refresh ineffective.

-            const resp = await fetch(block.file);
+            const resp = await fetch(block.file, { cache: 'no-store' });

140-155: Improve accessibility feedback for loading and errors.

Consider adding aria-live="polite" to the container so screen readers announce load/error state changes when data refreshes.

-    <div id="contributors-container"></div>
+    <div id="contributors-container" aria-live="polite"></div>
public_html/images.html (6)

242-249: Add lazy-loading and decode hints to thumbnails to improve page responsiveness

Images are created without lazy-loading, which can slow initial render on large datasets. Add loading="lazy" and decode="async" for better perceived performance.

-          const img = document.createElement('img');
+          const img = document.createElement('img');
+          img.loading = 'lazy';
+          img.decode = 'async';

243-247: Provide a graceful thumbnail fallback for missing/broken assets

When neither PNG nor SVG exists, img.src remains empty, resulting in a broken image icon. Add a tiny transparent data URI (or hide the image) and an onerror fallback.

-          img.src = src || '';
+          img.src = src || 'data:image/gif;base64,R0lGODlhAQABAAAAACw=';
+          img.onerror = () => { img.style.display = 'none'; };

237-238: Pluralize item count for better UX

Minor UX nit: show “1 item” vs “N items”.

-        countEl.textContent = items.length + ' items';
+        countEl.textContent = items.length + ' item' + (items.length === 1 ? '' : 's');

163-176: Associate labels to form controls explicitly for accessibility

Wrapping inputs with labels works, but adding for/id pairs improves assistive tech navigation and click targets when markup changes.

-        <label>
-          Category
-          <select id="categoryFilter" class="input" aria-label="Filter by category">
+        <label for="categoryFilter">Category</label>
+        <select id="categoryFilter" class="input" aria-label="Filter by category">
             <option value="">All</option>
           </select>
-        </label>
...
-        <label>
-          Search
-          <input id="search" class="input" type="search" placeholder="name, title or description"
-            aria-label="Search images">
-        </label>
+        <label for="search">Search</label>
+        <input id="search" class="input" type="search" placeholder="name, title or description"
+          aria-label="Search images">

177-181: Name the downloaded file consistently with the data source

Download currently saves as logo.json even if the source path changes. Derive the filename from JSON_URL to avoid confusion.

-          a.download = 'logo.json';
+          a.download = JSON_URL.split('/').pop() || 'logos.json';

205-218: Normalize error type and avoid mixed return types from fetchJson()

Returning an object with {error} vs an array forces downstream type checks. Prefer throwing and catching at the caller, or consistently returning [] with a surfaced status.

Option A (throw; simplest here):

       async function fetchJson() {
         try {
           const res = await fetch(JSON_URL + '?_=' + Date.now(), { cache: 'no-cache' });
           if (!res.ok) throw new Error('HTTP ' + res.status);
           const data = await res.json();
           if (!Array.isArray(data)) throw new Error('JSON root is not an array');
           return data;
         } catch (err) {
           console.error('Failed to load', JSON_URL, err);
-          return { error: err };
+          throw err;
         }
       }

And at call site:

-        const result = await fetchJson();
-        if (result && result.error) {
+        try {
+          const result = await fetchJson();
+          window._IMAGES_CACHE = result;
+          populateCategories(result);
+          render(result);
+        } catch (e) {
           empty.textContent = 'Failed to load JSON: ' + result.error.message;
           empty.style.display = 'block';
           countEl.textContent = '0';
           window._IMAGES_CACHE = [];
           return;
-        }
-        window._IMAGES_CACHE = result;
-        populateCategories(result);
-        render(result);
+        }
staging/web_kit.sh (2)

970-1004: Icon rendering: set SVG density adaptively and skip redundant resizes for small targets

For tiny sizes (16–32), a constant -density 384 is fine, but for very large outputs 1024 it can be insufficient for some SVG engines and wasteful for small ones. Consider scaling density proportional to size; also avoid recomputing if target file exists and is newer than source.

-			$IM -background none -density 384 "$svg" \
+			local density=$(( size < 64 ? 192 : (size < 256 ? 384 : 512) ))
+			# Skip if up-to-date
+			if [[ -f "${OUT_DIR}/${base}.png" && "${OUT_DIR}/${base}.png" -nt "$svg" ]]; then
+				continue
+			fi
+			$IM -background none -density "${density}" "$svg" \
 				-resize "${size}x${size}" \
 				-gravity center -extent "${size}x${size}" \
 				"${OUT_DIR}/${base}.png"

Also applies to: 1008-1034


1089-1112: Self-test invokes web_kit help via the function; ensure PATH-free execution works when sourced

This is fine when executing the script, but if included from another script, calling web_kit help here may be unexpected. Consider gating the help assertion behind an env flag (e.g., WEB_KIT_SELFTEST!=0).

-	# --- Capture and assert help output ---
-	help_output="$(web_kit help)"
+	# --- Capture and assert help output (opt-out with WEB_KIT_SELFTEST=0) ---
+	if [[ "${WEB_KIT_SELFTEST:-1}" != "0" ]]; then
+		help_output="$(web_kit help)"
 		echo "$help_output" | grep -q "Usage: web_kit" || {
 			echo "fail: Help output does not contain the expected usage string"
 			echo "test complete"
 			exit 1
 		}
-	# --- end assertion ---
+	fi
+	# --- end assertion ---
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 1bc12ba and a37c8c6.

⛔ Files ignored due to path filters (176)
  • assets/images/logos/armbian_cpu_v1.0.svg is excluded by !**/*.svg
  • assets/images/logos/armbian_font.v2.1.svg is excluded by !**/*.svg
  • assets/images/logos/armbian_mascot_v2.3.svg is excluded by !**/*.svg
  • assets/images/logos/armbian_social.svg is excluded by !**/*.svg
  • assets/images/logos/configng_cog_v1.0.svg is excluded by !**/*.svg
  • assets/images/logos/configng_mascot_v2.0.svg is excluded by !**/*.svg
  • assets/images/logos/configng_v1.0.svg is excluded by !**/*.svg
  • assets/images/logos/legacy/armbian_font_v1.5.svg is excluded by !**/*.svg
  • assets/images/logos/legacy/armbian_os_v1.1.svg is excluded by !**/*.svg
  • assets/images/logos/legacy/armbian_sdk_v1.1.svg is excluded by !**/*.svg
  • modules_browsers/go.sum is excluded by !**/*.sum
  • public_html/favicon.ico is excluded by !**/*.ico
  • public_html/images/logos/1024x1024/armbian_cpu_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/1024x1024/armbian_font.v2.1.png is excluded by !**/*.png
  • public_html/images/logos/1024x1024/armbian_font_v1.5.png is excluded by !**/*.png
  • public_html/images/logos/1024x1024/armbian_mascot_v2.3.png is excluded by !**/*.png
  • public_html/images/logos/1024x1024/armbian_os_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/1024x1024/armbian_sdk_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/1024x1024/armbian_social.png is excluded by !**/*.png
  • public_html/images/logos/1024x1024/configng_cog_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/1024x1024/configng_mascot_v2.0.png is excluded by !**/*.png
  • public_html/images/logos/1024x1024/configng_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/128x128/armbian_cpu_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/128x128/armbian_font.v2.1.png is excluded by !**/*.png
  • public_html/images/logos/128x128/armbian_font_v1.5.png is excluded by !**/*.png
  • public_html/images/logos/128x128/armbian_mascot_v2.3.png is excluded by !**/*.png
  • public_html/images/logos/128x128/armbian_os_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/128x128/armbian_sdk_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/128x128/armbian_social.png is excluded by !**/*.png
  • public_html/images/logos/128x128/configng_cog_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/128x128/configng_mascot_v2.0.png is excluded by !**/*.png
  • public_html/images/logos/128x128/configng_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/16x16/armbian_cpu_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/16x16/armbian_font.v2.1.png is excluded by !**/*.png
  • public_html/images/logos/16x16/armbian_font_v1.5.png is excluded by !**/*.png
  • public_html/images/logos/16x16/armbian_mascot_v2.3.png is excluded by !**/*.png
  • public_html/images/logos/16x16/armbian_os_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/16x16/armbian_sdk_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/16x16/armbian_social.png is excluded by !**/*.png
  • public_html/images/logos/16x16/configng_cog_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/16x16/configng_mascot_v2.0.png is excluded by !**/*.png
  • public_html/images/logos/16x16/configng_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/180x180/armbian_cpu_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/180x180/armbian_font.v2.1.png is excluded by !**/*.png
  • public_html/images/logos/180x180/armbian_font_v1.5.png is excluded by !**/*.png
  • public_html/images/logos/180x180/armbian_mascot_v2.3.png is excluded by !**/*.png
  • public_html/images/logos/180x180/armbian_os_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/180x180/armbian_sdk_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/180x180/armbian_social.png is excluded by !**/*.png
  • public_html/images/logos/180x180/configng_cog_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/180x180/configng_mascot_v2.0.png is excluded by !**/*.png
  • public_html/images/logos/180x180/configng_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/192x192/armbian_cpu_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/192x192/armbian_font.v2.1.png is excluded by !**/*.png
  • public_html/images/logos/192x192/armbian_font_v1.5.png is excluded by !**/*.png
  • public_html/images/logos/192x192/armbian_mascot_v2.3.png is excluded by !**/*.png
  • public_html/images/logos/192x192/armbian_os_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/192x192/armbian_sdk_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/192x192/armbian_social.png is excluded by !**/*.png
  • public_html/images/logos/192x192/configng_cog_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/192x192/configng_mascot_v2.0.png is excluded by !**/*.png
  • public_html/images/logos/192x192/configng_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/256x256/armbian_cpu_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/256x256/armbian_font.v2.1.png is excluded by !**/*.png
  • public_html/images/logos/256x256/armbian_font_v1.5.png is excluded by !**/*.png
  • public_html/images/logos/256x256/armbian_mascot_v2.3.png is excluded by !**/*.png
  • public_html/images/logos/256x256/armbian_os_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/256x256/armbian_sdk_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/256x256/armbian_social.png is excluded by !**/*.png
  • public_html/images/logos/256x256/configng_cog_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/256x256/configng_mascot_v2.0.png is excluded by !**/*.png
  • public_html/images/logos/256x256/configng_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/32x32/armbian_cpu_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/32x32/armbian_font.v2.1.png is excluded by !**/*.png
  • public_html/images/logos/32x32/armbian_font_v1.5.png is excluded by !**/*.png
  • public_html/images/logos/32x32/armbian_mascot_v2.3.png is excluded by !**/*.png
  • public_html/images/logos/32x32/armbian_os_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/32x32/armbian_sdk_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/32x32/armbian_social.png is excluded by !**/*.png
  • public_html/images/logos/32x32/configng_cog_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/32x32/configng_mascot_v2.0.png is excluded by !**/*.png
  • public_html/images/logos/32x32/configng_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/384x384/armbian_cpu_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/384x384/armbian_font.v2.1.png is excluded by !**/*.png
  • public_html/images/logos/384x384/armbian_font_v1.5.png is excluded by !**/*.png
  • public_html/images/logos/384x384/armbian_mascot_v2.3.png is excluded by !**/*.png
  • public_html/images/logos/384x384/armbian_os_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/384x384/armbian_sdk_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/384x384/armbian_social.png is excluded by !**/*.png
  • public_html/images/logos/384x384/configng_cog_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/384x384/configng_mascot_v2.0.png is excluded by !**/*.png
  • public_html/images/logos/384x384/configng_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/48x48/armbian_cpu_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/48x48/armbian_font.v2.1.png is excluded by !**/*.png
  • public_html/images/logos/48x48/armbian_font_v1.5.png is excluded by !**/*.png
  • public_html/images/logos/48x48/armbian_mascot_v2.3.png is excluded by !**/*.png
  • public_html/images/logos/48x48/armbian_os_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/48x48/armbian_sdk_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/48x48/armbian_social.png is excluded by !**/*.png
  • public_html/images/logos/48x48/configng_cog_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/48x48/configng_mascot_v2.0.png is excluded by !**/*.png
  • public_html/images/logos/48x48/configng_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/512x512/armbian_cpu_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/512x512/armbian_font.v2.1.png is excluded by !**/*.png
  • public_html/images/logos/512x512/armbian_font_v1.5.png is excluded by !**/*.png
  • public_html/images/logos/512x512/armbian_mascot_v2.3.png is excluded by !**/*.png
  • public_html/images/logos/512x512/armbian_os_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/512x512/armbian_sdk_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/512x512/armbian_social.png is excluded by !**/*.png
  • public_html/images/logos/512x512/configng_cog_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/512x512/configng_mascot_v2.0.png is excluded by !**/*.png
  • public_html/images/logos/512x512/configng_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/64x64/armbian_cpu_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/64x64/armbian_font.v2.1.png is excluded by !**/*.png
  • public_html/images/logos/64x64/armbian_font_v1.5.png is excluded by !**/*.png
  • public_html/images/logos/64x64/armbian_mascot_v2.3.png is excluded by !**/*.png
  • public_html/images/logos/64x64/armbian_os_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/64x64/armbian_sdk_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/64x64/armbian_social.png is excluded by !**/*.png
  • public_html/images/logos/64x64/configng_cog_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/64x64/configng_mascot_v2.0.png is excluded by !**/*.png
  • public_html/images/logos/64x64/configng_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/96x96/armbian_cpu_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/96x96/armbian_font.v2.1.png is excluded by !**/*.png
  • public_html/images/logos/96x96/armbian_font_v1.5.png is excluded by !**/*.png
  • public_html/images/logos/96x96/armbian_mascot_v2.3.png is excluded by !**/*.png
  • public_html/images/logos/96x96/armbian_os_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/96x96/armbian_sdk_v1.1.png is excluded by !**/*.png
  • public_html/images/logos/96x96/armbian_social.png is excluded by !**/*.png
  • public_html/images/logos/96x96/configng_cog_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/96x96/configng_mascot_v2.0.png is excluded by !**/*.png
  • public_html/images/logos/96x96/configng_v1.0.png is excluded by !**/*.png
  • public_html/images/logos/scalable/armbian_cpu_v1.0.svg is excluded by !**/*.svg
  • public_html/images/logos/scalable/armbian_font.v2.1.svg is excluded by !**/*.svg
  • public_html/images/logos/scalable/armbian_mascot_v2.3.svg is excluded by !**/*.svg
  • public_html/images/logos/scalable/armbian_social.svg is excluded by !**/*.svg
  • public_html/images/logos/scalable/configng_cog_v1.0.svg is excluded by !**/*.svg
  • public_html/images/logos/scalable/configng_mascot_v2.0.svg is excluded by !**/*.svg
  • public_html/images/logos/scalable/configng_v1.0.svg is excluded by !**/*.svg
  • public_html/images/logos/scalable/legacy/armbian_font_v1.5.svg is excluded by !**/*.svg
  • public_html/images/logos/scalable/legacy/armbian_os_v1.1.svg is excluded by !**/*.svg
  • public_html/images/logos/scalable/legacy/armbian_sdk_v1.1.svg is excluded by !**/*.svg
  • web_kit/src/images/16x16/armbian_font.v2.1.png is excluded by !**/*.png
  • web_kit/src/images/16x16/armbian_font_v1.5.png is excluded by !**/*.png
  • web_kit/src/images/16x16/armbian_mascot_v2.3.png is excluded by !**/*.png
  • web_kit/src/images/16x16/armbian_os_v1.1.png is excluded by !**/*.png
  • web_kit/src/images/16x16/armbian_sdk_v1.1.png is excluded by !**/*.png
  • web_kit/src/images/16x16/armbian_social.png is excluded by !**/*.png
  • web_kit/src/images/16x16/configng_cog_v1.0.png is excluded by !**/*.png
  • web_kit/src/images/16x16/configng_mascot_v2.0.png is excluded by !**/*.png
  • web_kit/src/images/16x16/configng_v1.0.png is excluded by !**/*.png
  • web_kit/src/images/32x32/armbian_cpu_v1.0.png is excluded by !**/*.png
  • web_kit/src/images/32x32/armbian_font.v2.1.png is excluded by !**/*.png
  • web_kit/src/images/32x32/armbian_font_v1.5.png is excluded by !**/*.png
  • web_kit/src/images/32x32/armbian_mascot_v2.3.png is excluded by !**/*.png
  • web_kit/src/images/32x32/armbian_os_v1.1.png is excluded by !**/*.png
  • web_kit/src/images/32x32/armbian_sdk_v1.1.png is excluded by !**/*.png
  • web_kit/src/images/32x32/armbian_social.png is excluded by !**/*.png
  • web_kit/src/images/32x32/configng_cog_v1.0.png is excluded by !**/*.png
  • web_kit/src/images/32x32/configng_mascot_v2.0.png is excluded by !**/*.png
  • web_kit/src/images/32x32/configng_v1.0.png is excluded by !**/*.png
  • web_kit/src/images/48x48/armbian_cpu_v1.0.png is excluded by !**/*.png
  • web_kit/src/images/48x48/armbian_font.v2.1.png is excluded by !**/*.png
  • web_kit/src/images/48x48/armbian_font_v1.5.png is excluded by !**/*.png
  • web_kit/src/images/48x48/armbian_mascot_v2.3.png is excluded by !**/*.png
  • web_kit/src/images/48x48/armbian_os_v1.1.png is excluded by !**/*.png
  • web_kit/src/images/48x48/armbian_sdk_v1.1.png is excluded by !**/*.png
  • web_kit/src/images/48x48/armbian_social.png is excluded by !**/*.png
  • web_kit/src/images/48x48/configng_cog_v1.0.png is excluded by !**/*.png
  • web_kit/src/images/48x48/configng_mascot_v2.0.png is excluded by !**/*.png
  • web_kit/src/images/48x48/configng_v1.0.png is excluded by !**/*.png
  • web_kit/src/images/512x512/armbian_cpu_v1.0.png is excluded by !**/*.png
  • web_kit/src/images/512x512/armbian_font.v2.1.png is excluded by !**/*.png
  • web_kit/src/images/512x512/armbian_font_v1.5.png is excluded by !**/*.png
  • web_kit/src/images/512x512/armbian_social.png is excluded by !**/*.png
  • web_kit/src/images/512x512/configng_v1.0.png is excluded by !**/*.png
📒 Files selected for processing (42)
  • contributors.html (1 hunks)
  • modules_browsers/README.md (0 hunks)
  • modules_browsers/go.mod (0 hunks)
  • modules_browsers/modules_browser.go (0 hunks)
  • modules_browsers/modules_browser.html (0 hunks)
  • modules_browsers/modules_browser.py (0 hunks)
  • modules_browsers/modules_metadata.json (0 hunks)
  • modules_browsers/web-server.go (0 hunks)
  • public_html/contributors.html (1 hunks)
  • public_html/images.html (1 hunks)
  • public_html/json/contributors/configng-v2.json (1 hunks)
  • public_html/json/contributors/configng.json (1 hunks)
  • public_html/json/contributors/documentation.json (1 hunks)
  • public_html/json/images/logo.json (1 hunks)
  • src/core/initialize/initialize_env.conf (1 hunks)
  • src/core/initialize/initialize_env.sh (1 hunks)
  • staging/web_kit.conf (1 hunks)
  • staging/web_kit.sh (1 hunks)
  • svg_meta.json (1 hunks)
  • web_kit/README.md (0 hunks)
  • web_kit/media_kit.sh (0 hunks)
  • web_kit/src/css/blue.css (0 hunks)
  • web_kit/src/css/green.css (0 hunks)
  • web_kit/src/css/grey.css (0 hunks)
  • web_kit/src/css/red.css (0 hunks)
  • web_kit/src/css/style.css (0 hunks)
  • web_kit/src/css/white.css (0 hunks)
  • web_kit/src/index.html (0 hunks)
  • web_kit/src/js/configng.js (0 hunks)
  • web_kit/src/js/contact.js (0 hunks)
  • web_kit/src/js/home.js (0 hunks)
  • web_kit/src/js/nav.js (0 hunks)
  • web_kit/src/js/script.js (0 hunks)
  • web_kit/src/js/templates.js (0 hunks)
  • web_kit/src/js/theme.js (0 hunks)
  • web_kit/src/json/author.json (0 hunks)
  • web_kit/src/json/configng_v2.json (0 hunks)
  • web_kit/src/json/contact-info.json (0 hunks)
  • web_kit/src/json/home.json (0 hunks)
  • web_kit/src/json/logos.json (0 hunks)
  • workflow/50_array_to_json.sh (1 hunks)
  • workflow/60_icon_set_from_svg.sh (1 hunks)
💤 Files with no reviewable changes (28)
  • web_kit/src/js/home.js
  • web_kit/src/js/configng.js
  • web_kit/src/js/script.js
  • web_kit/src/json/home.json
  • web_kit/src/json/configng_v2.json
  • web_kit/src/js/nav.js
  • modules_browsers/modules_metadata.json
  • web_kit/README.md
  • web_kit/src/index.html
  • web_kit/src/css/green.css
  • web_kit/src/js/theme.js
  • web_kit/src/css/grey.css
  • web_kit/src/css/red.css
  • modules_browsers/web-server.go
  • web_kit/src/js/templates.js
  • modules_browsers/modules_browser.py
  • web_kit/src/json/contact-info.json
  • modules_browsers/go.mod
  • web_kit/src/js/contact.js
  • modules_browsers/modules_browser.go
  • web_kit/src/css/blue.css
  • modules_browsers/modules_browser.html
  • web_kit/src/json/author.json
  • web_kit/src/css/white.css
  • web_kit/src/json/logos.json
  • web_kit/src/css/style.css
  • web_kit/media_kit.sh
  • modules_browsers/README.md
🧰 Additional context used
🧠 Learnings (4)
📓 Common learnings
Learnt from: Tearran
PR: Tearran/configng-v2#36
File: src/network/interface/network_manager.sh:46-53
Timestamp: 2025-06-23T18:54:21.952Z
Learning: Tearran prefers heredoc over echo/printf for multi-line templating work, especially for generating dynamic content from metadata. Heredoc provides better readability, easier maintenance, and is more forgiving for complex formatting than chained echo statements.
📚 Learning: 2025-07-24T05:52:42.317Z
Learnt from: Tearran
PR: Tearran/configng-v2#92
File: workflow/50_array_to_json.sh:236-236
Timestamp: 2025-07-24T05:52:42.317Z
Learning: In workflow/50_array_to_json.sh, core_options are intentionally excluded from the arrays list because they are internal/administrative commands not meant for TUI/GUI/UX interfacing. The JSON output is specifically for user-facing interfaces, so core options should remain separate from the user-facing system/network/software options.

Applied to files:

  • workflow/50_array_to_json.sh
📚 Learning: 2025-07-23T18:29:39.709Z
Learnt from: Tearran
PR: Tearran/configng-v2#89
File: modules_browsers/modules_browser.html:470-476
Timestamp: 2025-07-23T18:29:39.709Z
Learning: Tearran's configng-v2 project has excellent implementation across most goals: 15/15 modules with matching .conf/.sh files, robust documentation automation (4 workflow scripts), existing scaffolding (20_promote_module.sh), strong frontend/backend separation (20 interface modules), and active JSON generation. The main verification needed is CLI compatibility between the new ID system (USE001, MAN001) and existing armbian/configng integration points.

Applied to files:

  • workflow/50_array_to_json.sh
📚 Learning: 2025-06-16T21:50:00.575Z
Learnt from: Tearran
PR: Tearran/configng-v2#23
File: staging/interface/test_info_box.sh:6-10
Timestamp: 2025-06-16T21:50:00.575Z
Learning: Tearran's project currently uses only a 'contributor' field in configuration files, not a 'maintained' field. The contributor field appears to indicate both authorship and maintenance responsibility.

Applied to files:

  • public_html/json/contributors/configng-v2.json
🧬 Code graph analysis (6)
workflow/60_icon_set_from_svg.sh (1)
media_kit/media_kit.sh (2)
  • _icon_set_from_svg (280-370)
  • _index_json (168-248)
staging/web_kit.conf (1)
SDK/00_start_here.sh (1)
  • _template_conf (25-76)
public_html/images.html (1)
media_kit/media_kit.sh (1)
  • _index_json (168-248)
src/core/initialize/initialize_env.conf (1)
SDK/00_start_here.sh (1)
  • _template_conf (25-76)
public_html/json/images/logo.json (1)
media_kit/media_kit.sh (1)
  • _index_json (168-248)
staging/web_kit.sh (2)
media_kit/media_kit.sh (4)
  • media_kit (6-30)
  • _about_media_kit (372-406)
  • _index_json (168-248)
  • _html_index (32-166)
SDK/00_start_here.sh (1)
  • _template_sh (78-149)
🪛 Biome (2.1.2)
svg_meta.json

[error] 1-1: expected ] but instead the file ends

the file ends here

(parse)

🔇 Additional comments (6)
src/core/initialize/initialize_env.sh (1)

144-156: Help text omits supported commands and short flags

Help should reflect help|show|export and their short forms for discoverability and to satisfy the self-test intent.

-_about_initialize_env() {
-  cat <<"EOF"
-Usage: initialize_env [help|-h|--help]
-
-About:
-  The 'initialize_env' module provides environment detection utilities.
-
-Commands:
-  help    - Show this help message.
-
-Notes:
-  - To set variables in the current shell: source this file and call _initialize_env_vars
-  - When executed, this file's test entrypoint verifies the environment and prints variables.
-EOF
-}
+_about_initialize_env() {
+  cat <<"EOF"
+Usage: initialize_env [help|-h|--help|show|-s|export|-e]
+
+About:
+  The 'initialize_env' module provides environment detection utilities.
+
+Commands:
+  help      - Show this help message.
+  show|-s   - Print discovered variables and OS info for inspection.
+  export|-e - Emit export statements (export KEY=VALUE) suitable for: eval "$(initialize_env export)"
+
+Notes:
+  - To set variables in the current shell: source this file and call _initialize_env_vars
+  - When executed, this file's test entrypoint verifies the environment and prints variables.
+EOF
+}
⛔ Skipped due to learnings
Learnt from: Tearran
PR: Tearran/configng-v2#36
File: src/network/interface/network_manager.sh:46-53
Timestamp: 2025-06-23T18:16:55.123Z
Learning: In Tearran's CLI tools, help text intentionally shows simplified "command" terminology with only preferred options for UI parsing and integration purposes, while the actual implementation includes additional standard flags (like -h, --help) for bash/shell conventions. This creates an intentional discrepancy between displayed help and full functionality.
workflow/50_array_to_json.sh (1)

94-111: Nice use of heredocs for templating JSON.

This aligns with the project preference for readability and maintenance over chained echoes.

Also applies to: 165-181

public_html/json/contributors/configng-v2.json (1)

4-4: Contributions count verified

The “contributions” value for Tearran (243) in public_html/json/contributors/configng-v2.json matches the GitHub API response. No updates are needed.

workflow/60_icon_set_from_svg.sh (1)

49-52: Icon output path is correct and not used by the web gallery
The workflow/60_icon_set_from_svg.sh script installs PNGs into share/icons/hicolor/... for packaging as a freedesktop‐compliant icon theme. The web gallery and JSON generator live under public_html/json/images and reference SVGs (and any web‐served logos) in images/logos, not the hicolor directory. A search across the repo shows no references to images/${size}x${size} or to share/icons/hicolor in the gallery or JSON code, so there are no broken links in public_html. You can safely ignore the suggested path change.

Likely an incorrect or invalid review comment.

staging/web_kit.conf (1)

40-41: All listed helpers are present in staging/web_kit.sh

I’ve confirmed that every helper referenced in the helpers= line of staging/web_kit.conf is implemented in staging/web_kit.sh, including:

  • _about_web_kit (line 1037)
  • _web_kit_logo_json (line 57)
  • _web_kit_images_page (line 204)
  • _web_kit_server_py (line 551)
  • _web_kit_contributors_json (line 594)
  • _web_kit_contrib_page (line 625)
  • _web_kit_icon_set (line 954)
  • json_escape (line 95)
  • extract_tag_content (line 104)

No missing helpers—module validation should pass.

staging/web_kit.sh (1)

204-548: Good use of heredocs for page generation; matches maintainer preference

Both _web_kit_images_page and _web_kit_contrib_page use heredocs with minimal shell interpolation, improving readability and maintainability. This aligns with the stated preference for heredocs over echoed strings.

deleted:    public_html/favicon.ico
deleted:    public_html/images.html
deleted:    public_html/images/logos/1024x1024/armbian_cpu_v1.0.png
deleted:    public_html/images/logos/1024x1024/armbian_font.v2.1.png
deleted:    public_html/images/logos/1024x1024/armbian_font_v1.5.png
deleted:    public_html/images/logos/1024x1024/armbian_mascot_v2.3.png
deleted:    public_html/images/logos/1024x1024/armbian_os_v1.1.png
deleted:    public_html/images/logos/1024x1024/armbian_sdk_v1.1.png
deleted:    public_html/images/logos/1024x1024/armbian_social.png
deleted:    public_html/images/logos/1024x1024/configng_cog_v1.0.png
deleted:    public_html/images/logos/1024x1024/configng_mascot_v2.0.png
deleted:    public_html/images/logos/1024x1024/configng_v1.0.png
deleted:    public_html/images/logos/128x128/armbian_cpu_v1.0.png
deleted:    public_html/images/logos/128x128/armbian_font.v2.1.png
deleted:    public_html/images/logos/128x128/armbian_font_v1.5.png
deleted:    public_html/images/logos/128x128/armbian_mascot_v2.3.png
deleted:    public_html/images/logos/128x128/armbian_os_v1.1.png
deleted:    public_html/images/logos/128x128/armbian_sdk_v1.1.png
deleted:    public_html/images/logos/128x128/armbian_social.png
deleted:    public_html/images/logos/128x128/configng_cog_v1.0.png
deleted:    public_html/images/logos/128x128/configng_mascot_v2.0.png
deleted:    public_html/images/logos/128x128/configng_v1.0.png
deleted:    public_html/images/logos/16x16/armbian_cpu_v1.0.png
deleted:    public_html/images/logos/16x16/armbian_font.v2.1.png
deleted:    public_html/images/logos/16x16/armbian_font_v1.5.png
deleted:    public_html/images/logos/16x16/armbian_mascot_v2.3.png
deleted:    public_html/images/logos/16x16/armbian_os_v1.1.png
deleted:    public_html/images/logos/16x16/armbian_sdk_v1.1.png
deleted:    public_html/images/logos/16x16/armbian_social.png
deleted:    public_html/images/logos/16x16/configng_cog_v1.0.png
deleted:    public_html/images/logos/16x16/configng_mascot_v2.0.png
deleted:    public_html/images/logos/16x16/configng_v1.0.png
deleted:    public_html/images/logos/180x180/armbian_cpu_v1.0.png
deleted:    public_html/images/logos/180x180/armbian_font.v2.1.png
deleted:    public_html/images/logos/180x180/armbian_font_v1.5.png
deleted:    public_html/images/logos/180x180/armbian_mascot_v2.3.png
deleted:    public_html/images/logos/180x180/armbian_os_v1.1.png
deleted:    public_html/images/logos/180x180/armbian_sdk_v1.1.png
deleted:    public_html/images/logos/180x180/armbian_social.png
deleted:    public_html/images/logos/180x180/configng_cog_v1.0.png
deleted:    public_html/images/logos/180x180/configng_mascot_v2.0.png
deleted:    public_html/images/logos/180x180/configng_v1.0.png
deleted:    public_html/images/logos/192x192/armbian_cpu_v1.0.png
deleted:    public_html/images/logos/192x192/armbian_font.v2.1.png
deleted:    public_html/images/logos/192x192/armbian_font_v1.5.png
deleted:    public_html/images/logos/192x192/armbian_mascot_v2.3.png
deleted:    public_html/images/logos/192x192/armbian_os_v1.1.png
deleted:    public_html/images/logos/192x192/armbian_sdk_v1.1.png
deleted:    public_html/images/logos/192x192/armbian_social.png
deleted:    public_html/images/logos/192x192/configng_cog_v1.0.png
deleted:    public_html/images/logos/192x192/configng_mascot_v2.0.png
deleted:    public_html/images/logos/192x192/configng_v1.0.png
deleted:    public_html/images/logos/256x256/armbian_cpu_v1.0.png
deleted:    public_html/images/logos/256x256/armbian_font.v2.1.png
deleted:    public_html/images/logos/256x256/armbian_font_v1.5.png
deleted:    public_html/images/logos/256x256/armbian_mascot_v2.3.png
deleted:    public_html/images/logos/256x256/armbian_os_v1.1.png
deleted:    public_html/images/logos/256x256/armbian_sdk_v1.1.png
deleted:    public_html/images/logos/256x256/armbian_social.png
deleted:    public_html/images/logos/256x256/configng_cog_v1.0.png
deleted:    public_html/images/logos/256x256/configng_mascot_v2.0.png
deleted:    public_html/images/logos/256x256/configng_v1.0.png
deleted:    public_html/images/logos/32x32/armbian_cpu_v1.0.png
deleted:    public_html/images/logos/32x32/armbian_font.v2.1.png
deleted:    public_html/images/logos/32x32/armbian_font_v1.5.png
deleted:    public_html/images/logos/32x32/armbian_mascot_v2.3.png
deleted:    public_html/images/logos/32x32/armbian_os_v1.1.png
deleted:    public_html/images/logos/32x32/armbian_sdk_v1.1.png
deleted:    public_html/images/logos/32x32/armbian_social.png
deleted:    public_html/images/logos/32x32/configng_cog_v1.0.png
deleted:    public_html/images/logos/32x32/configng_mascot_v2.0.png
deleted:    public_html/images/logos/32x32/configng_v1.0.png
deleted:    public_html/images/logos/384x384/armbian_cpu_v1.0.png
deleted:    public_html/images/logos/384x384/armbian_font.v2.1.png
deleted:    public_html/images/logos/384x384/armbian_font_v1.5.png
deleted:    public_html/images/logos/384x384/armbian_mascot_v2.3.png
deleted:    public_html/images/logos/384x384/armbian_os_v1.1.png
deleted:    public_html/images/logos/384x384/armbian_sdk_v1.1.png
deleted:    public_html/images/logos/384x384/armbian_social.png
deleted:    public_html/images/logos/384x384/configng_cog_v1.0.png
deleted:    public_html/images/logos/384x384/configng_mascot_v2.0.png
deleted:    public_html/images/logos/384x384/configng_v1.0.png
deleted:    public_html/images/logos/48x48/armbian_cpu_v1.0.png
deleted:    public_html/images/logos/48x48/armbian_font.v2.1.png
deleted:    public_html/images/logos/48x48/armbian_font_v1.5.png
deleted:    public_html/images/logos/48x48/armbian_mascot_v2.3.png
deleted:    public_html/images/logos/48x48/armbian_os_v1.1.png
deleted:    public_html/images/logos/48x48/armbian_sdk_v1.1.png
deleted:    public_html/images/logos/48x48/armbian_social.png
deleted:    public_html/images/logos/48x48/configng_cog_v1.0.png
deleted:    public_html/images/logos/48x48/configng_mascot_v2.0.png
deleted:    public_html/images/logos/48x48/configng_v1.0.png
deleted:    public_html/images/logos/512x512/armbian_cpu_v1.0.png
deleted:    public_html/images/logos/512x512/armbian_font.v2.1.png
deleted:    public_html/images/logos/512x512/armbian_font_v1.5.png
deleted:    public_html/images/logos/512x512/armbian_mascot_v2.3.png
deleted:    public_html/images/logos/512x512/armbian_os_v1.1.png
deleted:    public_html/images/logos/512x512/armbian_sdk_v1.1.png
deleted:    public_html/images/logos/512x512/armbian_social.png
deleted:    public_html/images/logos/512x512/configng_cog_v1.0.png
deleted:    public_html/images/logos/512x512/configng_mascot_v2.0.png
deleted:    public_html/images/logos/512x512/configng_v1.0.png
deleted:    public_html/images/logos/64x64/armbian_cpu_v1.0.png
deleted:    public_html/images/logos/64x64/armbian_font.v2.1.png
deleted:    public_html/images/logos/64x64/armbian_font_v1.5.png
deleted:    public_html/images/logos/64x64/armbian_mascot_v2.3.png
deleted:    public_html/images/logos/64x64/armbian_os_v1.1.png
deleted:    public_html/images/logos/64x64/armbian_sdk_v1.1.png
deleted:    public_html/images/logos/64x64/armbian_social.png
deleted:    public_html/images/logos/64x64/configng_cog_v1.0.png
deleted:    public_html/images/logos/64x64/configng_mascot_v2.0.png
deleted:    public_html/images/logos/64x64/configng_v1.0.png
deleted:    public_html/images/logos/96x96/armbian_cpu_v1.0.png
deleted:    public_html/images/logos/96x96/armbian_font.v2.1.png
deleted:    public_html/images/logos/96x96/armbian_font_v1.5.png
deleted:    public_html/images/logos/96x96/armbian_mascot_v2.3.png
deleted:    public_html/images/logos/96x96/armbian_os_v1.1.png
deleted:    public_html/images/logos/96x96/armbian_sdk_v1.1.png
deleted:    public_html/images/logos/96x96/armbian_social.png
deleted:    public_html/images/logos/96x96/configng_cog_v1.0.png
deleted:    public_html/images/logos/96x96/configng_mascot_v2.0.png
deleted:    public_html/images/logos/96x96/configng_v1.0.png
deleted:    public_html/images/logos/scalable/armbian_cpu_v1.0.svg
deleted:    public_html/images/logos/scalable/armbian_font.v2.1.svg
deleted:    public_html/images/logos/scalable/armbian_mascot_v2.3.svg
deleted:    public_html/images/logos/scalable/armbian_social.svg
deleted:    public_html/images/logos/scalable/configng_cog_v1.0.svg
deleted:    public_html/images/logos/scalable/configng_mascot_v2.0.svg
deleted:    public_html/images/logos/scalable/configng_v1.0.svg
deleted:    public_html/images/logos/scalable/legacy/armbian_font_v1.5.svg
deleted:    public_html/images/logos/scalable/legacy/armbian_os_v1.1.svg
deleted:    public_html/images/logos/scalable/legacy/armbian_sdk_v1.1.svg
deleted:    public_html/json/contributors/configng-v2.json
deleted:    public_html/json/contributors/configng.json
deleted:    public_html/json/contributors/documentation.json
deleted:    public_html/json/images/logo.json
new file:   staging/setup_scafolding.conf
new file:   staging/setup_scafolding.sh
modified:   staging/web_kit.sh
modified:   workflow/00_start_here.sh
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (6)
staging/setup_scafolding.sh (4)

6-15: Gracefully handle no-argument invocation by defaulting to help.

Treating an empty first arg as help improves UX and avoids descending into _setup_scafolding_main just to handle emptiness again.

 setup_scafolding() {
-  case "${1:-}" in
-    help|-h|--help)
+  case "${1:-}" in
+    ""|help|-h|--help)
       _about_setup_scafolding
       ;;
     *)
       _setup_scafolding_main "$@"
       ;;
   esac
 }

130-139: Pass through CLI args to the generated module main.

Forwarding "$@" makes the template more generally useful without requiring users to rewire the dispatcher later.

   case "\${1:-}" in
     help|-h|--help)
       _about_${MODULE}
       ;;
     *)
-      _${MODULE}_main
+      _${MODULE}_main "$@"
       ;;
   esac

64-66: Prefer printf over echo -e for portability and format safety.

printf avoids implementation-specific escape handling and lets you format variables safely.

-echo -e "Staging: Complete\nScaffold for ${MODULE} can be found at ${STAGING_DIR}/."
-echo "Created: $created, Skipped: $skipped"
+printf "Staging: Complete\nScaffold for %s can be found at %s/.\n" "${MODULE}" "${STAGING_DIR}"
+printf "Created: %d, Skipped: %d\n" "${created}" "${skipped}"

4-15: Unify “scaffolding” spelling across script and metadata

The project currently uses the misspelling “scafolding” in both the shell script and its accompanying .conf file, which may lead to confusion and hinder searchability. These need to be renamed and updated consistently.

Files and locations to update:

  • Rename files

    • staging/setup_scafolding.shstaging/setup_scaffolding.sh
    • staging/setup_scafolding.confstaging/setup_scaffolding.conf
  • In staging/setup_scafolding.sh (all occurrences of “scafolding” should become “scaffolding”):

    • Header comment (line 4)
    • Function declarations and invocations:
      • setup_scafolding()setup_scaffolding() (line 6)
      • _setup_scafolding_main_setup_scaffolding_main
      • _about_setup_scafolding_about_setup_scaffolding
    • Usage text (lines 197–198):
      • Usage: setup_scafolding <module-name> [options]Usage: setup_scaffolding <module-name> [options]
    • Example commands (lines 207, 210, 213):
      • setup_scafolding testmodsetup_scaffolding testmod
      • Test assertion (line 231): update grep to expect Usage: setup_scaffolding
  • In staging/setup_scafolding.conf (update section name, feature key, helpers list):

    • Section header [setup_scafolding][setup_scaffolding] (line 3)
    • feature=setup_scafoldingfeature=setup_scaffolding (line 5)
    • helpers=_setup_scafolding_main,_template_conf,_template_sh,_about_setup_scafoldinghelpers=_setup_scaffolding_main,_template_conf,_template_sh,_about_setup_scaffolding (line 43)

Run a global search for the old spelling to catch any remaining references:

rg -nP 'scafold' -S -C2
staging/setup_scafolding.conf (2)

11-14: Flatten extend_desc to a single line (INI parsers typically don’t support multiline values).

Unless your loader explicitly supports multiline fields, these continuation lines will likely be treated as stray keys/garbage. Safer to collapse to a single line.

-extend_desc=Creates starter `.conf` and `.sh` files for new Configng V2 modules.
-Validates the provided module name, ensures the staging directory exists,
-and writes template files to it. Intended to standardize the structure of
-new modules and speed up development.
+extend_desc=Creates starter .conf and .sh files for new Configng V2 modules. Validates the provided module name, ensures the staging directory exists, and writes template files to it. Intended to standardize the structure of new modules and speed up development.

If multiline is required, consider a separate docs file or an escaped newline convention handled by your parser.


1-1: Standardize spelling of “scaffolding” in setup_scaffolding modules

To align with the project-wide scaffolding conventions and improve discoverability (per learned preference for consistent scaffolding standards), rename all occurrences of “scafolding” → “scaffolding”. Verified instances below.

• staging/setup_scafolding.conf
• staging/setup_scafolding.sh

Diff examples:

# staging/setup_scafolding.conf
-# setup_scafolding - Configng V2 metadata
+# setup_scaffolding - Configng V2 metadata

-[setup_scafolding]
+[setup_scaffolding]

-feature=setup_scafolding
+feature=setup_scaffolding
# staging/setup_scafolding.sh
-setup_scafolding() {
+setup_scaffolding() {-_about_setup_scafolding() {
+_about_setup_scaffolding() {-Usage: setup_scafolding <module-name> [options]
+Usage: setup_scaffolding <module-name> [options]

Also update:

  • File names (setup_scafolding.confsetup_scaffolding.conf, setup_scafolding.shsetup_scaffolding.sh)
  • Any helper functions or invocations in the test entrypoint (lines ~228–239)

You can run:

rg -nP '\bsetup_scafold\w*\b' -S -C2

to locate all remaining references.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between a37c8c6 and 0c75ff0.

📒 Files selected for processing (3)
  • staging/setup_scafolding.conf (1 hunks)
  • staging/setup_scafolding.sh (1 hunks)
  • staging/web_kit.sh (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • staging/web_kit.sh
🧰 Additional context used
🧠 Learnings (7)
📓 Common learnings
Learnt from: Tearran
PR: Tearran/configng-v2#36
File: src/network/interface/network_manager.sh:46-53
Timestamp: 2025-06-23T18:54:21.952Z
Learning: Tearran prefers heredoc over echo/printf for multi-line templating work, especially for generating dynamic content from metadata. Heredoc provides better readability, easier maintenance, and is more forgiving for complex formatting than chained echo statements.
📚 Learning: 2025-07-05T16:08:27.350Z
Learnt from: Tearran
PR: Tearran/configng-v2#58
File: tools/configng_v2.sh:25-27
Timestamp: 2025-07-05T16:08:27.350Z
Learning: In tools/configng_v2.sh, the staging code block (lines 23-31) is specifically for development and refining mini modules. The TRACE=true setting within this block is intentional for development purposes and would be stripped out if/when this becomes the main binary entry point for production. The staging folder and its associated code are temporary development tools, not production code.

Applied to files:

  • staging/setup_scafolding.sh
  • staging/setup_scafolding.conf
📚 Learning: 2025-07-23T18:29:39.709Z
Learnt from: Tearran
PR: Tearran/configng-v2#89
File: modules_browsers/modules_browser.html:470-476
Timestamp: 2025-07-23T18:29:39.709Z
Learning: Tearran's configng-v2 project has excellent implementation across most goals: 15/15 modules with matching .conf/.sh files, robust documentation automation (4 workflow scripts), existing scaffolding (20_promote_module.sh), strong frontend/backend separation (20 interface modules), and active JSON generation. The main verification needed is CLI compatibility between the new ID system (USE001, MAN001) and existing armbian/configng integration points.

Applied to files:

  • staging/setup_scafolding.sh
  • staging/setup_scafolding.conf
📚 Learning: 2025-06-15T15:37:25.466Z
Learnt from: Tearran
PR: Tearran/configng-v2#12
File: src/test_checkpoint.sh:4-8
Timestamp: 2025-06-15T15:37:25.466Z
Learning: In the configng-v2 project, test files like `src/test_checkpoint.sh` are generated by `tools/staging_setup_scaffold.sh`. In the generator script, variables need to be escaped with backslashes (e.g., `\${BASH_SOURCE[0]}`, `\${0}`) so they are evaluated at runtime in the generated script rather than during the scaffold generation process.

Applied to files:

  • staging/setup_scafolding.sh
📚 Learning: 2025-06-14T07:07:36.487Z
Learnt from: Tearran
PR: Tearran/configng-v2#11
File: staging/src_tests.sh:4-7
Timestamp: 2025-06-14T07:07:36.487Z
Learning: The file `staging/src_tests.sh` in the configng-v2 repository is a temporary test file created specifically to test the GitHub workflow `.github/workflows/02_github_workflows_staging.yml`, not a production module meant for implementation.

Applied to files:

  • staging/setup_scafolding.sh
📚 Learning: 2025-07-23T18:29:39.709Z
Learnt from: Tearran
PR: Tearran/configng-v2#89
File: modules_browsers/modules_browser.html:470-476
Timestamp: 2025-07-23T18:29:39.709Z
Learning: Tearran's configng-v2 project shows strong implementation in metadata systems, documentation automation, and frontend/backend separation, but has a critical gap in scaffolding infrastructure (missing tools/ directory) and needs verification of CLI compatibility with the new ID system (USE001, MAN001) for backward compatibility with armbian/configng.

Applied to files:

  • staging/setup_scafolding.sh
  • staging/setup_scafolding.conf
📚 Learning: 2025-07-16T17:31:03.723Z
Learnt from: Tearran
PR: Tearran/configng-v2#71
File: staging/start_here.sh:0-0
Timestamp: 2025-07-16T17:31:03.723Z
Learning: In configng-v2, scaffold templates are intentionally incomplete and should fail validation until developers complete all required fields. This fail-fast design enforces proper completion before module promotion. The staging validation mode only checks for duplicates, allowing incomplete scaffolds to exist in staging/ while preventing naming conflicts.

Applied to files:

  • staging/setup_scafolding.sh
  • staging/setup_scafolding.conf
🧬 Code graph analysis (2)
staging/setup_scafolding.sh (2)
workflow/00_start_here.sh (1)
  • _about_setup_module (6-23)
SDK/00_start_here.sh (5)
  • _template_sh (78-149)
  • _make_module (185-234)
  • _template_conf (25-76)
  • setup_module (249-259)
  • _about_setup_module (6-23)
staging/setup_scafolding.conf (2)
SDK/00_start_here.sh (3)
  • _template_conf (25-76)
  • _make_module (185-234)
  • _template_sh (78-149)
SDK/20_promote_module.sh (1)
  • promote_module (5-55)
🔇 Additional comments (2)
staging/setup_scafolding.sh (1)

176-191: Good heredoc escaping in the template entrypoint.

Escaping BASH_SOURCE, 0, and intermediate variables ensures they evaluate at runtime in the generated script, not during scaffolding. Nicely aligned with prior guidance/preference for heredocs.

staging/setup_scafolding.conf (1)

41-44: Helpers-to-implementation mapping looks correct.

Declared helpers match the functions implemented in staging/setup_scafolding.sh, including the help function. This should satisfy your validation rule.

@Tearran Tearran merged commit 6551f20 into main Aug 21, 2025
4 checks passed
@Tearran Tearran deleted the web_kit branch August 21, 2025 19:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants