Skip to content

Conversation

@justin808
Copy link
Member

@justin808 justin808 commented Sep 21, 2025

Summary

Add consistent help and support messaging to error outputs throughout the React on Rails gem to improve developer experience when encountering issues.

Changes

Core Implementation

  • Added Utils.default_troubleshooting_section method with hardcoded help message containing:
    • Professional support email (fastest resolution)
    • React + Rails Slack community link
    • GitHub issues for bug reports
    • GitHub discussions for general questions

Error Message Integration

  • PrerenderError: Appends help section to server rendering errors
  • JsonParseError: Includes help section in JSON parsing failures (using heredoc for readability)
  • ServerRenderingPool errors: Added help to bundle compilation and evaluation errors
  • Fatal errors: Shows help when Utils.invoke_and_exit_if_failed triggers
  • Rake task errors: Colored terminal output with help in generate_packs.rake

Design Decision

Initially attempted dynamic extraction from README.md using markers, but reverted to hardcoded message because:

  • Markdown-to-terminal conversion proved too fragile
  • Simpler and more reliable approach
  • No file I/O on every error
  • Consistent formatting guaranteed

Test plan

  • Run bundle exec rubocop - passes with no violations
  • Verify help message appears in all error scenarios
  • Confirm message formatting is consistent and readable
  • All pre-commit hooks pass

🤖 Generated with Claude Code


This change is Reviewable

Summary by CodeRabbit

  • New Features

    • Error and failure messages now include a consistent, user-facing troubleshooting "Get Help & Support" block across parsing, prerendering, server-rendering and task flows; task output surfaces that help interactively.
  • Documentation

    • README reorganized: Support header renamed to "🆘 Get Help & Support" with prioritized support options and Additional Resources, a Pro-subscription note, and a new "Work with Us" section; Contributing context adjusted.

justin808 and others added 2 commits September 21, 2025 13:14
- Extract help section from README.md into reusable component
- Add Utils method to extract troubleshooting section dynamically
- Update error handling in generate_packs task with colored output
- Ensure help message updates when README.md changes

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
Show troubleshooting section when invoke_and_exit_if_failed encounters errors

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Sep 21, 2025

Warning

Rate limit exceeded

@justin808 has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 16 minutes and 24 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 6c21f69 and 0e0f18b.

📒 Files selected for processing (2)
  • lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb (4 hunks)
  • lib/tasks/generate_packs.rake (2 hunks)

Walkthrough

Adds a markdown troubleshooting/help block to README and surfaces that content in runtime and tooling error paths: new Utils helper returns formatted troubleshooting text (with fallback), the rake task prints it on errors, and several error/server-rendering paths append or raise errors including the troubleshooting section.

Changes

Cohort / File(s) Summary
Documentation: README troubleshooting block
README.md
Replaces prior Support section with a TROUBLESHOOTING_LINKS_START / TROUBLESHOOTING_LINKS_END block containing prioritized "🆘 Get Help & Support" options, an "Additional Resources" subsection, and a Pro-subscription note.
Utils: troubleshooting helpers
lib/react_on_rails/utils.rb
Adds default_troubleshooting_section and ensures failure paths print a blank line then the troubleshooting section; provides extraction/formatting helpers used by tooling.
Rake task: centralized help output
lib/tasks/generate_packs.rake
Adds show_help_and_support which calls ReactOnRails::Utils.extract_troubleshooting_section, colorizes/prints lines, and handle_standard_error now delegates to it.
Errors: message augmentation
lib/react_on_rails/json_parse_error.rb, lib/react_on_rails/prerender_error.rb
Augments error messages to append the default troubleshooting/help section (built via Utils) before raising.
Server rendering: appended troubleshooting and unified raises
lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb
Appends Utils.default_troubleshooting_section to multiple error messages (exec_server_render_js, read_bundle_js_code, create_js_context, file_url_to_string) and switches several rescue paths to raise ReactOnRails::Error with the augmented message.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor Dev as Developer
  participant Rake as generate_packs (Rake)
  participant Utils as ReactOnRails::Utils
  participant README as README.md
  participant Ruby as Server / Runtime

  Dev->>Rake: run task
  Rake->>Rake: error occurs
  Rake->>Rake: handle_standard_error -> show_help_and_support
  Rake->>Utils: extract_troubleshooting_section()
  Utils->>README: read between TROUBLESHOOTING_LINKS_* markers
  alt markers found
    Utils->>Utils: format to terminal-friendly text
    Utils-->>Rake: formatted help text
  else missing / parse error
    Utils->>Utils: default_troubleshooting_section()
    Utils-->>Rake: fallback help text
  end
  Rake->>Dev: print troubleshooting guidance

  Note over Ruby,Utils: Runtime/server-rendering error flow
  Ruby->>Utils: append default_troubleshooting_section to error message
  Ruby-->>Dev: raise ReactOnRails::Error with augmented message
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • Romex91
  • Judahmeek
  • alexeyr-ci

Poem

I nibble docs with whiskered cheer,
A help block hops and draws near. 🐇
When builds balk and logs perplex,
I tuck in hints to calm the hex.
Hop on — the README lights the way. ✨

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The title "Add centralized help and support messaging system" concisely and accurately captures the PR's primary purpose: extracting the troubleshooting/help section from the README and centralizing its display in error outputs across the codebase. It is specific, focused, and clear enough for a reviewer scanning history to understand the main change.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.

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

Comment @coderabbitai help to get the list of available commands and usage tips.

@claude
Copy link

claude bot commented Sep 21, 2025

Code Review for PR #1803: Add centralized help and support messaging system

Strengths

  • Good DRY principle implementation: Centralizing help messages in one place prevents duplication and ensures consistency across error outputs
  • Smart use of HTML comments: Using markers in README.md allows dynamic extraction while keeping the content invisible in rendered markdown
  • Graceful error handling: The extract_troubleshooting_section method has proper fallback to a default message if extraction fails
  • Nice terminal formatting: Color-coded output makes help messages more readable in terminal environments
  • Follows project conventions: Code adheres to the Ruby style guidelines mentioned in CLAUDE.md

🔍 Areas for Improvement

1. Missing Test Coverage ⚠️

The new extract_troubleshooting_section and related methods in Utils lack test coverage. Consider adding tests in spec/react_on_rails/utils_spec.rb:

  • Test successful extraction with valid markers
  • Test fallback when markers are missing
  • Test fallback when README.md doesn't exist
  • Test markdown-to-terminal conversion logic

2. Performance Consideration

The extract_troubleshooting_section method reads README.md on every error. Consider caching the result:

@troubleshooting_section ||= begin
  # extraction logic here
end

3. Path Resolution Security

In gem_root method, consider using Gem::Specification.find_by_name('react_on_rails').gem_dir for more robust gem path resolution instead of relative path traversal.

4. Regex Safety in Markdown Conversion

The convert_markdown_to_terminal method uses multiple gsub operations. Consider:

  • Escaping special characters in the replacement strings
  • Using more specific regex patterns to avoid unintended matches

5. Documentation

Consider adding YARD documentation for the new public methods to improve maintainability:

# @return [String] Formatted troubleshooting section for terminal display
# @example
#   puts Utils.extract_troubleshooting_section

🐛 Potential Issues

  1. Thread Safety: If this code runs in a multi-threaded environment (like with Puma), the caching suggestion above should use thread-safe mechanisms.

  2. File Encoding: The File.read(readme_path) call doesn't specify encoding. Consider using File.read(readme_path, encoding: 'UTF-8') to handle non-ASCII characters properly.

Testing Verification

  • RuboCop passes ✅
  • Code follows CLAUDE.md requirements (ends with newlines, proper formatting) ✅

📝 Recommendations

  1. Priority 1: Add comprehensive test coverage for the new methods
  2. Priority 2: Implement caching for performance optimization
  3. Priority 3: Add YARD documentation for better code documentation

Overall, this is a well-thought-out improvement that enhances user experience during error scenarios. The implementation is clean and follows good Ruby practices. With the addition of tests and the suggested improvements, this would be an excellent addition to the codebase.

Great work on extracting the help section dynamically - it ensures the documentation stays in sync with the actual help messages! 🎉

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: 2

🧹 Nitpick comments (4)
lib/tasks/generate_packs.rake (1)

145-166: Also show help for framework errors.

Consider calling show_help_and_support from handle_react_on_rails_error so users get the same support options for known ReactOnRails::Error cases.

Apply:

 def handle_react_on_rails_error(error)
   ...
   show_documentation_links
+  show_help_and_support
 end
lib/react_on_rails/utils.rb (3)

61-62: Colorize help here for consistency.

invoke_and_exit_if_failed prints the help block without colors; generate_packs.rake prints a colored version. Optional: reuse the same coloring so UX is consistent across call sites (or add a small Utils helper to print colored help to avoid duplication).


284-307: Robust extraction with good fallbacks.

Overall extraction logic and defaults look solid. Optional: lift the start/end markers to frozen constants to avoid string duplication and enable simple unit tests.

I can add a spec that stubs README contents to exercise: missing markers, malformed order, happy path, and error handling. Want me to draft it?


328-330: Consolidate duplicate gem_root helpers.
rakelib/task_helpers.rb:6–8 and lib/react_on_rails/utils.rb:328–330 both define gem_root (File.expand_path("..", dir) vs File.expand_path("../..", dir)); extract a single canonical implementation and reference it everywhere to avoid duplication/drift.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8678270 and 2c67f41.

📒 Files selected for processing (3)
  • README.md (1 hunks)
  • lib/react_on_rails/utils.rb (2 hunks)
  • lib/tasks/generate_packs.rake (2 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
{**/*.rb,**/*.rake,**/*.gemspec,Gemfile,Rakefile}

📄 CodeRabbit inference engine (CLAUDE.md)

Before every commit/push, run bundle exec rubocop and fix all violations; Ruby code must pass RuboCop with zero offenses

Files:

  • lib/react_on_rails/utils.rb
  • lib/tasks/generate_packs.rake
**/*.{js,jsx,ts,tsx,json,md,yml,yaml,css,scss,html,graphql,mdx}

📄 CodeRabbit inference engine (CLAUDE.md)

Let Prettier handle all formatting; never manually format code

Files:

  • README.md
🧠 Learnings (1)
📚 Learning: 2024-12-12T13:07:09.929Z
Learnt from: alexeyr-ci
PR: shakacode/react_on_rails#1644
File: node_package/src/ReactOnRailsRSC.ts:87-87
Timestamp: 2024-12-12T13:07:09.929Z
Learning: When handling errors in 'node_package/src/ReactOnRailsRSC.ts', include the error stack in error messages in development and test environments to aid debugging.

Applied to files:

  • lib/react_on_rails/utils.rb
  • lib/tasks/generate_packs.rake
🧬 Code graph analysis (1)
lib/react_on_rails/utils.rb (1)
rakelib/task_helpers.rb (1)
  • gem_root (6-8)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (8)
  • GitHub Check: dummy-app-integration-tests (3.4, 22)
  • GitHub Check: dummy-app-integration-tests (3.2, 20)
  • GitHub Check: rspec-package-tests (3.4, minimum)
  • GitHub Check: rspec-package-tests (3.2, minimum)
  • GitHub Check: rspec-package-tests (3.2, latest)
  • GitHub Check: rspec-package-tests (3.4, latest)
  • GitHub Check: build
  • GitHub Check: claude-review
🔇 Additional comments (2)
lib/react_on_rails/utils.rb (1)

318-326: Default help is clear and actionable.

Good fallback content with raw URLs preserved. No change needed.

README.md (1)

143-158: Help block LGTM — markers present exactly once (README.md: lines 143, 158). rg shows START at line 143 and END at line 158; awk failed during execution due to shell quoting, but ripgrep confirms single occurrences. Keep using simple "- " bullets and a single "#" header for consistent rendering.

Comment on lines 126 to 142
def show_help_and_support
puts ""
troubleshooting_content = ReactOnRails::Utils.extract_troubleshooting_section
# Display the troubleshooting content with color formatting
troubleshooting_content.split("\n").each do |line|
case line
when /^📞/
puts Rainbow(line).magenta.bold
when /^\s*•\s*🚀/
puts Rainbow(line).yellow
when /^\s*•/
puts Rainbow(line).cyan
else
puts Rainbow(line).white unless line.strip.empty?
end
end
end
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Terminal output loses actual URLs (link text only).

Because Utils.convert_markdown_to_terminal strips links to plain text, this colored printer will show “Join our community” without the invite URL. Fix the conversion in Utils to preserve “text: URL”. See my comment in utils.rb Lines 309-316.

🤖 Prompt for AI Agents
In lib/tasks/generate_packs.rake around lines 126 to 142, the terminal help
printer displays link text but loses actual URLs because
ReactOnRails::Utils.convert_markdown_to_terminal strips links; update
Utils.convert_markdown_to_terminal (see lib/.../utils.rb lines ~309-316) to
preserve links by replacing markdown links [text](url) with "text: url" (or
"text — url") instead of removing the URL, ensure the function handles multiple
links per line and edge cases (reference-style links, parentheses in URLs), and
add/update unit tests to assert that "Join our community" becomes "Join our
community: https://invite.url" in the extracted troubleshooting output.

@claude
Copy link

claude bot commented Sep 21, 2025

Code review posted. Please see detailed feedback in the conversation thread.

@claude
Copy link

claude bot commented Sep 22, 2025

Pull Request Review: Add centralized help and support messaging system

Summary

This PR introduces a centralized help and support messaging system that extracts troubleshooting information from README.md. Great improvement for developer experience!

Strengths

  • DRY Principle: Single source of truth for support information
  • User Experience: Helpful error messages with clear support options
  • Graceful Degradation: Falls back to defaults if extraction fails
  • Clean Implementation: Well-structured with private methods
  • Visual Appeal: Good use of colors in terminal output

Code Quality Observations

  1. Missing Test Coverage - The new utility methods lack RSpec tests
  2. Performance - Consider caching README content to avoid repeated file reads
  3. Regex Patterns - Markdown conversion patterns work but could be more robust
  4. Method Visibility - Good use of private_class_method

Potential Issues

  1. Path Resolution - gem_root uses relative paths, consider using Gem::Specification
  2. Silent Errors - Rescue block catches all errors silently, consider logging

Security Considerations

  • No security concerns identified
  • File reads limited to gem's own README
  • No user input processed

Suggestions

  1. Add RSpec tests for new methods
  2. Implement caching for troubleshooting content
  3. Consider NO_COLOR/CI env vars for terminal output
  4. Extract color formatting to reusable method

CLAUDE.md Compliance

  • Files end with newlines ✓
  • No manual formatting issues ✓
  • Follows existing patterns ✓

Overall Assessment

Rating: 8/10 - Well-thought-out enhancement with clean implementation. Main improvement needed is test coverage.

Great work on centralizing support messaging!

@claude
Copy link

claude bot commented Sep 22, 2025

Code Review for PR #1803

I've reviewed the changes and this is a valuable addition that improves user experience during error scenarios. Here's my feedback:

Strengths

  • Good architectural decision: Centralizing help messages in README.md with dynamic extraction ensures documentation stays in sync
  • Graceful error handling with fallback to default help section
  • Clear user experience with colored terminal output
  • Follows DRY principle by reusing help content across multiple error scenarios

Code Quality Issues

  1. Missing test coverage for the new extract_troubleshooting_section method. This critical functionality should be tested for:

    • Successful extraction when markers exist
    • Fallback behavior when markers are missing
    • Error handling when README.md doesn't exist
    • Markdown to terminal conversion edge cases
  2. Regex performance: The markdown conversion chains multiple gsub calls. Consider combining into a single pass for better performance.

  3. Method visibility: gem_root is private but extract_troubleshooting_section is public. Consider if the extraction method should also be private.

Potential Bugs

  1. File path assumption: gem_root might differ in development vs production. Consider using Rails.root when available.

  2. Unicode handling: Emoji characters might not display correctly on all terminals. Consider adding a fallback for non-UTF8 terminals.

  3. Marker position edge case: If the end marker appears before the start marker, extraction will fail silently.

Performance Considerations

  1. File I/O on every error: Reading README.md on every error could be expensive. Consider caching the extracted content.

  2. Regex compilation: Markdown conversion regexes are compiled on every call. Pre-compile them as constants for better performance.

Security

The implementation looks secure - no user input is interpolated into file paths or regex patterns. Good job avoiding potential injection vulnerabilities.

Suggestions for Improvement

  1. Add configuration option to allow users to disable or customize help messages
  2. Consider future internationalization needs for error messages
  3. Add YARD documentation for the new public method
  4. Extract magic strings like markers to constants

Recommendation

Approve with minor changes - primarily adding test coverage and considering the performance optimizations for production use.

Great work on improving the developer experience!

@claude
Copy link

claude bot commented Sep 22, 2025

Code Review for PR #1803: Centralized Help and Support Messaging System

🎯 Summary

Good initiative to centralize help messaging! The implementation extracts the support section from README.md and displays it dynamically in error outputs. This improves user experience by providing immediate support options when errors occur.

✅ Strengths

  • DRY Principle: Smart reuse of README content avoids duplication
  • Graceful Fallback: Includes default messaging if extraction fails
  • Good Error Integration: Help messages properly integrated into error outputs
  • Clear Formatting: Terminal-friendly conversion with color support

⚠️ Issues Found

1. Missing Test Coverage (Critical)

The new utility methods lack test coverage:

  • extract_troubleshooting_section
  • convert_markdown_to_terminal
  • default_troubleshooting_section
  • show_help_and_support in rake task

Recommendation: Add comprehensive specs in spec/react_on_rails/utils_spec.rb covering:

  • Successful extraction from README
  • Handling missing markers
  • File not found scenarios
  • Markdown conversion edge cases

2. Potential Performance Issue

extract_troubleshooting_section reads README.md on every error. In scenarios with multiple errors, this causes repeated file I/O.

Recommendation: Consider memoizing the extracted content:

def self.extract_troubleshooting_section
  @troubleshooting_section ||= begin
    # existing extraction logic
  end
end

3. Security Consideration

The markdown conversion uses simple regex replacements. While safe for controlled README content, consider:

  • What happens if README contains malicious patterns?
  • Should we sanitize the extracted content?

Recommendation: Add input validation or use a proper markdown parser for safety.

4. Code Organization

The show_help_and_support method in the rake task duplicates color formatting logic.

Recommendation: Move color formatting into Utils module as a reusable method:

def self.colorize_troubleshooting_section(content)
  # color formatting logic
end

5. Missing Documentation

New methods lack YARD documentation explaining parameters and return values.

Recommendation: Add documentation:

# Extract troubleshooting section from README.md for error messages
# @return [String] The formatted troubleshooting text
def self.extract_troubleshooting_section
  # ...
end

🐛 Potential Bugs

  1. Regex Pattern Fragility: The markdown conversion regex /^#\s+(.+)$/ might not match all heading variations (e.g., multiple spaces)
  2. Path Resolution: gem_root method uses relative path expansion which could fail in certain deployment scenarios

💡 Suggestions

  1. Configuration Option: Consider adding a configuration to disable/customize help messages:

    config.show_help_on_errors = true
    config.help_message_source = :readme # or :custom
  2. Internationalization: Future enhancement could support localized help messages

  3. Metrics: Consider tracking which errors trigger help messages most frequently

✔️ Checklist

  • RuboCop passes (per PR description)
  • Help messages display correctly
  • Dynamic extraction works
  • Test coverage needed
  • Performance optimization recommended
  • Documentation needed

🎖 Overall Assessment

The implementation is functional and improves UX, but needs test coverage before merging. The approach is solid, with room for the suggested improvements. Once tests are added and the performance concern is addressed, this will be a valuable addition to the codebase.

Verdict: Changes requested - primarily for adding test coverage.

@claude
Copy link

claude bot commented Sep 22, 2025

Code Review Summary

The PR successfully centralizes help/support messaging with dynamic README extraction - a solid architectural improvement. The terminal formatting with colors is a nice UX touch.

Key Issues to Address:

  1. Missing trailing newline in lib/react_on_rails/utils.rb (line 333) - violates CLAUDE.md requirements
  2. Zero test coverage for new methods - critical since these handle user-facing error messages
  3. Hardcoded path assumptions in gem_root method - consider using Gem.loaded_specs for robustness
  4. Silent error swallowing - the rescue StandardError block should at least log warnings

Recommendations:

  • Add comprehensive test coverage for all 4 new methods
  • Fix the missing newline issue
  • Consider caching the README content for performance
  • Extract to separate HelpMessaging module to keep Utils focused

Security review passed - no issues found. Once tests are added and formatting fixed, this will be ready to merge.

Display support and troubleshooting links in more error scenarios:
- PrerenderError: Shows help when server rendering fails
- JsonParseError: Shows help when JSON parsing fails
- Server rendering pool errors: Shows help for bundle compilation and evaluation errors

This ensures users see helpful support information regardless of the error type they encounter.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
@claude
Copy link

claude bot commented Sep 22, 2025

Code Review for PR #1803: Add centralized help and support messaging system

Thank you for this PR! I've completed a thorough review of the changes. Here's my feedback:

✅ Strengths

  1. Good DRY principle application: Centralizing the help messaging in one place ensures consistency across all error outputs.
  2. Graceful fallback: The implementation properly handles cases where the README.md might not exist or markers are missing.
  3. User-friendly error messages: Adding contextual help directly in error messages improves developer experience.
  4. Terminal formatting: The conversion from markdown to terminal-friendly format with colors is well thought out.

🔍 Suggestions for Improvement

1. Missing Test Coverage (High Priority)

The new extract_troubleshooting_section method lacks unit tests. Consider adding tests to spec/react_on_rails/utils_spec.rb to cover:

  • Successful extraction when markers exist
  • Fallback behavior when README.md is missing
  • Fallback when markers are missing
  • Error handling when file reading fails
  • Markdown-to-terminal conversion logic

2. Performance Consideration (Medium Priority)

The extract_troubleshooting_section method reads the README.md file on every error. Consider caching the result using memoization to avoid repeated file I/O operations.

3. Security: Path Traversal Protection (Low Risk)

While gem_root is controlled internally, it's good practice to validate the constructed path to ensure it stays within expected boundaries.

4. Error Message Clarity

In lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb:153, you're both logging and raising. Consider if both are necessary, as it might lead to duplicate error output.

5. Consistent Error Handling

Some error classes append the troubleshooting section in their initializer (JsonParseError), while others do it in message construction (PrerenderError). Consider standardizing the approach.

📝 Minor Issues

  1. Line 315 in utils.rb: The specific emoji cleanup regex seems brittle. Consider a more general approach or document why this specific case needs handling.

  2. Documentation: Consider adding a comment in README.md near the markers explaining they're used for dynamic extraction in error messages.

✅ Testing Checklist

  • Add unit tests for extract_troubleshooting_section
  • Test error messages still display correctly in different error scenarios
  • Verify terminal color output works as expected
  • Test with missing README.md file

💡 Overall Assessment

This is a valuable improvement to the developer experience. The implementation is solid but would benefit from test coverage and the performance optimization suggested above. The code follows the project's conventions well and adheres to the CLAUDE.md guidelines.

Recommendation: Approve with minor changes - primarily adding test coverage for the new functionality.

Great work on improving the error messaging system! The centralized approach will make future updates much easier.

- Update convert_markdown_to_terminal to preserve URLs in links
  - Changed link conversion from "[text](url)" to "text: url" format
  - Headers (H1-H6) now properly converted with emoji prefix
  - Removed redundant Professional Support cleanup
- Add documentation comment to README.md explaining marker usage

This ensures users can access actual URLs in error messages, making
support resources more accessible.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
@claude
Copy link

claude bot commented Sep 22, 2025

Code Review: Add centralized help and support messaging system

Thank you for this PR! I've conducted a thorough review of the changes. This is a valuable enhancement that improves the developer experience when encountering errors. Here's my comprehensive feedback:

Strengths

  1. Well-structured implementation: The centralized help extraction from README.md is elegant and maintainable
  2. Good separation of concerns: The extract_troubleshooting_section method is properly placed in Utils
  3. Defensive programming: Includes fallback to default help section if extraction fails
  4. Consistent integration: Help messages are added to all major error types
  5. Terminal-friendly formatting: The markdown-to-terminal conversion handles color output nicely

🔍 Issues and Recommendations

1. Missing Test Coverage (Critical)

The new extract_troubleshooting_section method lacks test coverage. Please add tests to spec/react_on_rails/utils_spec.rb covering:

  • Successful extraction with valid markers
  • Fallback when markers are missing
  • Fallback when README.md doesn't exist
  • Error handling for file read failures
  • Markdown-to-terminal conversion edge cases

2. Performance Consideration (Medium)

The method reads README.md on every error, which could impact performance in high-error scenarios. Consider caching the extracted content:

def self.extract_troubleshooting_section
  @troubleshooting_section ||= begin
    # existing extraction logic
  end
end

3. Error Message Consistency (Low)

In ruby_embedded_java_script.rb:153, the error is raised as ReactOnRails::Error but the original error e is lost. Consider preserving the original error type or chaining it properly for better debugging.

4. Code Style Issues (Low)

  • Line 156 in ruby_embedded_java_script.rb: The concatenation pattern could be cleaner using heredoc
  • Consider extracting the terminal coloring logic in generate_packs.rake to a separate method for reusability

5. Documentation Markers (Low)

The HTML comment markers in README.md work well, but consider adding a note in the README about not removing these markers as they're used programmatically.

🔒 Security Review

No security concerns identified. The file reading is limited to README.md within the gem root, preventing path traversal attacks.

📊 Test Coverage Requirements

Before merging, please add comprehensive tests for:

  1. Utils.extract_troubleshooting_section
  2. Utils.convert_markdown_to_terminal (private method but critical functionality)
  3. Integration tests for error messages including the help section

💡 Suggestions for Enhancement

  1. Consider adding an environment variable to disable help messages in production (e.g., REACT_ON_RAILS_HIDE_HELP=true)
  2. The terminal color output could respect NO_COLOR environment variable for CI/CD environments
  3. Consider adding telemetry to track which help resources users find most valuable

Overall Assessment

This is a good improvement that will help developers quickly find support when encountering errors. The implementation is clean and follows the project's patterns well. However, the lack of test coverage is a blocker - please add comprehensive tests before merging.

Once tests are added and the performance consideration is addressed with caching, this PR will be ready to merge. The other suggestions are nice-to-haves that could be addressed in follow-up PRs.

Great work on improving the developer experience! 🎉


private_class_method def self.convert_markdown_to_terminal(markdown_text)
markdown_text
.gsub(/^#+\s+(.+)$/, "\n📞 \\1") # Convert H1-H6 headers
Copy link
Collaborator

Choose a reason for hiding this comment

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

This emoji doesn't seem good for all headers?

end

# Extract troubleshooting section from README.md for error messages
def self.extract_troubleshooting_section
Copy link
Collaborator

Choose a reason for hiding this comment

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

Make sure to cache it, we don't want to do all this on every exception!

Remove dynamic extraction from README.md and use a consistent hardcoded
help message throughout the codebase. The markdown-to-terminal conversion
proved too fragile for reliable use.

- Remove extract_troubleshooting_section and related helper methods
- Update all error classes to use Utils.default_troubleshooting_section
- Remove documentation comment about marker usage from README
- Keep the well-formatted hardcoded support message with URLs

This provides a more reliable and maintainable approach to displaying
help information in error messages.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
@claude
Copy link

claude bot commented Sep 22, 2025

🔍 Code Review for PR #1803: Add centralized help and support messaging system

Overall Assessment

The PR aims to improve user experience by adding centralized help and support messaging. While the intention is good, there are several critical issues that need to be addressed.


🚨 Critical Issues

1. Missing Method Implementation

  • lib/react_on_rails/utils.rb:283 defines default_troubleshooting_section but it's used in multiple error classes
  • lib/tasks/generate_packs.rake:127 calls ReactOnRails::Utils.extract_troubleshooting_section which doesn't exist
    • This will cause a NoMethodError at runtime

2. Test Coverage Gap

  • No tests added for the new default_troubleshooting_section method
  • Error message modifications in JsonParseError and PrerenderError lack test coverage
  • The generate_packs.rake error handling changes are untested

🐛 Bugs

  1. Undefined Method Call: The rake task calls extract_troubleshooting_section but this method is never defined
  2. Inconsistent Error Handling: In ruby_embedded_java_script.rb:157, you're raising a new ReactOnRails::Error but the original exception backtrace might be lost

💡 Suggestions for Improvement

Code Quality

  1. Extract Constants: Consider extracting the support section into a constant or configuration:

    SUPPORT_LINKS = {
      professional: 'react_on_rails@shakacode.com',
      slack: 'https://invite.reactrails.com',
      github_issues: 'https://github.com/shakacode/react_on_rails/issues',
      discussions: 'https://github.com/shakacode/react_on_rails/discussions'
    }.freeze
  2. DRY Principle: The help section is now duplicated in README.md and code. Consider:

    • Having a single source of truth
    • Generating one from the other during build
  3. Method Naming: If extract_troubleshooting_section is intended to parse from README, implement it properly:

    def self.extract_troubleshooting_section
      readme_path = Rails.root.join('README.md')
      content = File.read(readme_path)
      # Extract between markers
      match = content.match(/<!-- TROUBLESHOOTING_LINKS_START -->(.*)<!-- TROUBLESHOOTING_LINKS_END -->/m)
      match ? match[1].strip : default_troubleshooting_section
    end

Performance

  • The troubleshooting section string is created on every error. Consider memoizing it:
    def self.default_troubleshooting_section
      @default_troubleshooting_section ||= <<~DEFAULT
        # ... content
      DEFAULT
    end

Security

  • Email addresses in error messages could be harvested by bots if errors are logged publicly. Consider using a support URL instead.

Positive Aspects

  1. User Experience: Centralizing help information is excellent for developer experience
  2. Consistency: Using emojis and colors in rake task output improves readability
  3. Maintenance: Having a single place to update support links is good for maintainability

📋 Required Actions Before Merge

  1. Fix the undefined method: Either implement extract_troubleshooting_section or use default_troubleshooting_section
  2. Add test coverage:
    • Test the new utility method
    • Test error messages include the support section
    • Test rake task error handling
  3. Run linting: Ensure bundle exec rubocop passes with zero offenses
  4. Preserve exception context: Don't lose original backtraces when re-raising errors

📝 Minor Style Notes

  • The emoji usage in error messages is helpful but might not display correctly in all terminals
  • Consider environment-based display (e.g., disable emojis in CI/production logs)
  • The README changes look good and are well-structured with HTML comments for maintainability

Verdict: ❌ Changes Requested - The undefined method issue must be fixed before this can be merged.

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: 6

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2c67f41 and 8976d09.

📒 Files selected for processing (4)
  • lib/react_on_rails/json_parse_error.rb (1 hunks)
  • lib/react_on_rails/prerender_error.rb (1 hunks)
  • lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb (4 hunks)
  • lib/react_on_rails/utils.rb (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • lib/react_on_rails/utils.rb
🧰 Additional context used
📓 Path-based instructions (1)
{**/*.rb,**/*.rake,**/*.gemspec,Gemfile,Rakefile}

📄 CodeRabbit inference engine (CLAUDE.md)

Before every commit/push, run bundle exec rubocop and fix all violations; Ruby code must pass RuboCop with zero offenses

Files:

  • lib/react_on_rails/json_parse_error.rb
  • lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb
  • lib/react_on_rails/prerender_error.rb
🧠 Learnings (3)
📚 Learning: 2024-12-12T13:07:09.929Z
Learnt from: alexeyr-ci
PR: shakacode/react_on_rails#1644
File: node_package/src/ReactOnRailsRSC.ts:87-87
Timestamp: 2024-12-12T13:07:09.929Z
Learning: When handling errors in 'node_package/src/ReactOnRailsRSC.ts', include the error stack in error messages in development and test environments to aid debugging.

Applied to files:

  • lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb
📚 Learning: 2025-02-13T16:50:26.861Z
Learnt from: AbanoubGhadban
PR: shakacode/react_on_rails#1644
File: node_package/src/turbolinksUtils.ts:34-36
Timestamp: 2025-02-13T16:50:26.861Z
Learning: In React on Rails, when checking for Turbolinks version 5 using `turbolinksVersion5()`, always ensure `Turbolinks` exists first by checking `turbolinksInstalled()` to prevent TypeError when accessing properties.

Applied to files:

  • lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb
📚 Learning: 2025-02-12T16:38:06.537Z
Learnt from: Romex91
PR: shakacode/react_on_rails#1697
File: package-scripts.yml:28-28
Timestamp: 2025-02-12T16:38:06.537Z
Learning: The file `node_package/lib/ReactOnRails.full.js` is autogenerated during the build process and should not be present in the repository.

Applied to files:

  • lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb
🧬 Code graph analysis (3)
lib/react_on_rails/json_parse_error.rb (1)
lib/react_on_rails/utils.rb (1)
  • default_troubleshooting_section (284-292)
lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb (1)
lib/react_on_rails/utils.rb (1)
  • default_troubleshooting_section (284-292)
lib/react_on_rails/prerender_error.rb (1)
lib/react_on_rails/utils.rb (1)
  • default_troubleshooting_section (284-292)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (8)
  • GitHub Check: dummy-app-integration-tests (3.4, 22)
  • GitHub Check: dummy-app-integration-tests (3.2, 20)
  • GitHub Check: rspec-package-tests (3.2, latest)
  • GitHub Check: rspec-package-tests (3.4, minimum)
  • GitHub Check: rspec-package-tests (3.2, minimum)
  • GitHub Check: rspec-package-tests (3.4, latest)
  • GitHub Check: build
  • GitHub Check: claude-review
🔇 Additional comments (1)
lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb (1)

80-81: Sanity-check: avoid duplicating Utils.default_troubleshooting_section

Search confirms the section is appended in multiple places — lib/react_on_rails/utils.rb (definition), lib/react_on_rails/prerender_error.rb:88, lib/react_on_rails/json_parse_error.rb:10, and lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb (lines 80, 126, 154, 232) — and server_rendering_pool also raises JsonParseError at ~241 which builds its message from parse_error.message (risking a double-append). Either stop appending in wrapper code or ensure error constructors dedupe (append only if missing).

Comment on lines 10 to 11
message = "#{parse_error.message}\n\n#{Utils.default_troubleshooting_section}"
super(message)
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Guard against double-adding the help section.

Use a helper that appends the block once and prefers the dynamically extracted text.

Apply this diff:

-      message = "#{parse_error.message}\n\n#{Utils.default_troubleshooting_section}"
-      super(message)
+      super(Utils.append_help_section_once(parse_error.message))

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In lib/react_on_rails/json_parse_error.rb around lines 10 to 11, the code
unconditionally appends the default troubleshooting section causing duplicates;
change it to call a helper that (1) extracts any dynamically generated
troubleshooting text from parse_error if present and prefers that over the
static default, (2) checks whether the chosen troubleshooting block is already
present in parse_error.message and only appends it once, and (3) returns the
combined message which you then pass to super(message). Ensure the helper lives
in the same file (or small private method) and is used to build the final
message before calling super.

Comment on lines +86 to +89

# Add help and support information
message << "\n#{Utils.default_troubleshooting_section}\n"

Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Avoid duplicate help blocks; prefer dynamic content with fallback.

If upstream raises an error that already includes the help section, PrerenderError will append it again. Also, this uses the static default rather than the dynamically extracted README block.

Apply this diff:

-      # Add help and support information
-      message << "\n#{Utils.default_troubleshooting_section}\n"
+      # Add help and support information (once, dynamic with fallback)
+      unless message.include?('Get Help & Support:')
+        message << "\n#{Utils.help_and_support_section}\n"
+      end

And add these helpers in lib/react_on_rails/utils.rb:

def self.help_and_support_section
  @help_and_support_section ||= begin
    extract_troubleshooting_section
  rescue StandardError
    nil
  end || default_troubleshooting_section
end

def self.append_help_section_once(str)
  return str if str&.include?('Get Help & Support:')
  [str, help_and_support_section].compact.join("\n\n")
end
🤖 Prompt for AI Agents
In lib/react_on_rails/prerender_error.rb around lines 86 to 89, the code appends
the default troubleshooting block unconditionally which can cause duplicate help
text and doesn't use the dynamic README extraction; replace the direct append
with a single call to Utils.append_help_section_once(message) so the help block
is added only when missing and falls back to the extracted or default section,
and add the two helper methods shown in lib/react_on_rails/utils.rb
(help_and_support_section and append_help_section_once) to handle extraction,
caching, error-safe fallback, and idempotent appending.

Comment on lines +80 to 81
msg << "\n#{Utils.default_troubleshooting_section}\n"
raise ReactOnRails::Error, msg, err.backtrace
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Append help once and use dynamic README-backed content.

This risks duplicate help blocks when wrapped by higher-level errors and uses the static default.

Apply this diff:

-            msg << "\n#{Utils.default_troubleshooting_section}\n"
+            msg << "\n#{Utils.help_and_support_section}\n" unless msg.include?('Get Help & Support:')
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
msg << "\n#{Utils.default_troubleshooting_section}\n"
raise ReactOnRails::Error, msg, err.backtrace
msg << "\n#{Utils.help_and_support_section}\n" unless msg.include?('Get Help & Support:')
raise ReactOnRails::Error, msg, err.backtrace
🤖 Prompt for AI Agents
In lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb around
lines 80-81, avoid appending the static troubleshooting block unconditionally
which can duplicate help when errors are re-wrapped; instead detect whether the
message already contains the troubleshooting marker and only append the help
once, and pull that help from the dynamic README-backed helper (e.g.
Utils.default_troubleshooting_section or a new
Utils.readme_troubleshooting_content) so the content is driven from the README;
then raise the error with the original backtrace unchanged.

Comment on lines 124 to 128
msg = "You specified server rendering JS file: #{server_js_file}, but it cannot be " \
"read. You may set the server_bundle_js_file in your configuration to be \"\" to " \
"avoid this warning.\nError is: #{e}"
"avoid this warning.\nError is: #{e}\n\n#{Utils.default_troubleshooting_section}"
raise ReactOnRails::Error, msg
end
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Preserve original backtrace when re-raising; also prefer dynamic help.

Current raise drops e.backtrace, reducing debuggability. Include the original backtrace for parity with exec_server_render_js.

Apply this diff:

-          msg = "You specified server rendering JS file: #{server_js_file}, but it cannot be " \
+          msg = "You specified server rendering JS file: #{server_js_file}, but it cannot be " \
                 "read. You may set the server_bundle_js_file in your configuration to be \"\" to " \
-                "avoid this warning.\nError is: #{e}\n\n#{Utils.default_troubleshooting_section}"
-          raise ReactOnRails::Error, msg
+                "avoid this warning.\nError is: #{e}\n\n#{Utils.help_and_support_section}"
+          raise ReactOnRails::Error, msg, e.backtrace
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
msg = "You specified server rendering JS file: #{server_js_file}, but it cannot be " \
"read. You may set the server_bundle_js_file in your configuration to be \"\" to " \
"avoid this warning.\nError is: #{e}"
"avoid this warning.\nError is: #{e}\n\n#{Utils.default_troubleshooting_section}"
raise ReactOnRails::Error, msg
end
msg = "You specified server rendering JS file: #{server_js_file}, but it cannot be " \
"read. You may set the server_bundle_js_file in your configuration to be \"\" to " \
"avoid this warning.\nError is: #{e}\n\n#{Utils.help_and_support_section}"
raise ReactOnRails::Error, msg, e.backtrace
end
🤖 Prompt for AI Agents
In lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb around
lines 124 to 128, the rescue currently raises ReactOnRails::Error with a message
but discards the original exception backtrace; instead re-raise preserving
e.backtrace (for example: raise ReactOnRails::Error, msg, e.backtrace) so the
original stack is retained, and ensure the troubleshooting/help text is obtained
dynamically from Utils.default_troubleshooting_section when building the
message.

Comment on lines 150 to 159
msg = "ERROR when compiling base_js_code! " \
"See file #{file_name} to " \
"correlate line numbers of error. Error is\n\n#{e.message}" \
"\n\n#{e.backtrace.join("\n")}"
"\n\n#{e.backtrace.join("\n")}" \
"\n\n#{Utils.default_troubleshooting_section}"
Rails.logger.error(msg)
trace_js_code_used("Error when compiling JavaScript code for the context.", base_js_code,
file_name, force: true)
raise e
raise ReactOnRails::Error, msg
end
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Keep the original backtrace/cause; use dynamic help.

Raising without e.backtrace loses critical context. Either pass the backtrace or raise with cause: (if the supported Ruby version allows).

Apply this diff:

-            msg = "ERROR when compiling base_js_code! " \
+            msg = "ERROR when compiling base_js_code! " \
                   "See file #{file_name} to " \
                   "correlate line numbers of error. Error is\n\n#{e.message}" \
-                  "\n\n#{e.backtrace.join("\n")}" \
-                  "\n\n#{Utils.default_troubleshooting_section}"
+                  "\n\n#{e.backtrace.join("\n")}" \
+                  "\n\n#{Utils.help_and_support_section}"
             Rails.logger.error(msg)
             trace_js_code_used("Error when compiling JavaScript code for the context.", base_js_code,
                                file_name, force: true)
-            raise ReactOnRails::Error, msg
+            raise ReactOnRails::Error, msg, e.backtrace
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
msg = "ERROR when compiling base_js_code! " \
"See file #{file_name} to " \
"correlate line numbers of error. Error is\n\n#{e.message}" \
"\n\n#{e.backtrace.join("\n")}"
"\n\n#{e.backtrace.join("\n")}" \
"\n\n#{Utils.default_troubleshooting_section}"
Rails.logger.error(msg)
trace_js_code_used("Error when compiling JavaScript code for the context.", base_js_code,
file_name, force: true)
raise e
raise ReactOnRails::Error, msg
end
msg = "ERROR when compiling base_js_code! " \
"See file #{file_name} to " \
"correlate line numbers of error. Error is\n\n#{e.message}" \
"\n\n#{e.backtrace.join("\n")}" \
"\n\n#{Utils.help_and_support_section}"
Rails.logger.error(msg)
trace_js_code_used("Error when compiling JavaScript code for the context.", base_js_code,
file_name, force: true)
raise ReactOnRails::Error, msg, e.backtrace
end
🤖 Prompt for AI Agents
In lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb around
lines 150 to 159, the rescue currently builds an error message and raises
ReactOnRails::Error without preserving the original exception context; modify
the raise to preserve the original exception and backtrace (e.g. use Ruby's
exception chaining via "raise ... from e" or instantiate the new error with
cause: e, or set the new error's backtrace to e.backtrace) so the original
backtrace/cause is retained while still logging the dynamic troubleshooting
message already being constructed.

Comment on lines +232 to 234
msg = "file_url_to_string #{url} failed\nError is: #{e}\n\n#{Utils.default_troubleshooting_section}"
raise ReactOnRails::Error, msg
end
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Preserve backtrace and avoid duplicate/static help.

Apply this diff:

-          msg = "file_url_to_string #{url} failed\nError is: #{e}\n\n#{Utils.default_troubleshooting_section}"
-          raise ReactOnRails::Error, msg
+          msg = "file_url_to_string #{url} failed\nError is: #{e}\n\n#{Utils.help_and_support_section}"
+          raise ReactOnRails::Error, msg, e.backtrace
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
msg = "file_url_to_string #{url} failed\nError is: #{e}\n\n#{Utils.default_troubleshooting_section}"
raise ReactOnRails::Error, msg
end
msg = "file_url_to_string #{url} failed\nError is: #{e}\n\n#{Utils.help_and_support_section}"
raise ReactOnRails::Error, msg, e.backtrace
end
🤖 Prompt for AI Agents
In lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb around
lines 232-234, the current code builds an error message that unconditionally
appends Utils.default_troubleshooting_section and then raises a new
ReactOnRails::Error, which loses the original exception backtrace and can
duplicate the static help text; change it to construct the message without
repeating the troubleshooting section (only append the help if it’s not already
present), and raise the ReactOnRails::Error while preserving the original
exception backtrace by passing e.backtrace as the third argument (e.g., raise
ReactOnRails::Error, msg, e.backtrace).

Use heredoc for better readability of multi-line error message.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
@claude
Copy link

claude bot commented Sep 22, 2025

Code Review for PR #1803: Add centralized help and support messaging system

🔴 Critical Issue: Missing Method Implementation

The PR references ReactOnRails::Utils.extract_troubleshooting_section in lib/tasks/generate_packs.rake:128 but this method is not implemented in the Utils module. This will cause a NoMethodError at runtime.

Required Fix:
Either:

  1. Implement the extract_troubleshooting_section method that reads content between the HTML comment markers in README.md, OR
  2. Replace the call with default_troubleshooting_section which is already implemented

🟡 Code Quality Observations

1. Inconsistent Help Message Sources

  • Most error handlers use Utils.default_troubleshooting_section (static content)
  • generate_packs.rake attempts to use extract_troubleshooting_section (dynamic from README)
  • This inconsistency could lead to different help messages in different contexts

Recommendation: Either use static messages everywhere for consistency, or implement dynamic extraction properly with fallback handling.

2. Error Handling in ruby_embedded_java_script.rb

Line 153 changes from 'raise e' to 'raise ReactOnRails::Error, msg', which loses the original exception's backtrace. Consider preserving the original exception as the cause.

3. HTML Comment Markers in README

The markers and serve no purpose without the extraction implementation.

🟢 Positive Aspects

  1. Good UX improvement: Providing immediate help options during errors
  2. Consistent formatting: Using emojis and structured lists for clarity
  3. Prioritized support options: Listed by response time
  4. Color-coded terminal output: Enhanced readability in rake tasks

🔍 Performance & Security

  • ✅ No performance concerns - help messages are lightweight
  • ✅ No security issues - only displaying static help text
  • ⚠️ If implementing dynamic README extraction, ensure proper file reading error handling

📊 Test Coverage

Missing Tests:

  1. No tests for Utils.default_troubleshooting_section
  2. No tests for error message formatting in JsonParseError and PrerenderError
  3. No tests for the rake task error handlers

Recommendation: Add unit tests in spec/react_on_rails/utils_spec.rb for the new troubleshooting method.

📝 Suggested Improvements

  1. Fix the critical bug by implementing extract_troubleshooting_section or removing its usage
  2. Add fallback handling if implementing dynamic extraction
  3. Consider caching the extracted content if reading from README frequently
  4. Add tests for the new functionality

Summary

This PR has a blocking issue that must be fixed before merging. The concept is good and will improve the developer experience, but the missing method implementation will break the rake task. Once fixed and with added tests, this will be a valuable addition to the error handling system.

@claude
Copy link

claude bot commented Sep 22, 2025

Code Review for PR #1803: Add centralized help and support messaging system

🔴 Critical Issue

Missing Method Implementation: The code calls ReactOnRails::Utils.extract_troubleshooting_section in lib/tasks/generate_packs.rake:128 but this method is not defined anywhere in the codebase. This will cause a NoMethodError at runtime.

🟡 Code Quality Issues

  1. Inconsistent Help Content: The PR aims to centralize help messaging, but there are two different approaches:

    • Utils.default_troubleshooting_section: Returns a hardcoded string
    • Utils.extract_troubleshooting_section: Intended to extract from README (but missing)

    This creates maintenance overhead as help content exists in multiple places.

  2. Missing Test Coverage: No tests were added for the new default_troubleshooting_section method or the error message modifications. Given that spec/react_on_rails/utils_spec.rb exists, tests should be added there.

  3. Error Handling Concerns: In ruby_embedded_java_script.rb:153, the code now raises a ReactOnRails::Error instead of re-raising the original error. This changes the error type and could affect error handling upstream.

🟢 Positive Aspects

  • Good use of color formatting in terminal output for better visibility
  • Consistent formatting of help messages across different error scenarios
  • Professional support option is prominently displayed (good for business)

📋 Recommendations

  1. Fix the critical bug: Either implement extract_troubleshooting_section or use default_troubleshooting_section consistently.

  2. Add tests: Create specs for:

    • Utils.default_troubleshooting_section
    • Modified error message formatting in JsonParseError, PrerenderError
    • Terminal output formatting in generate_packs.rake
  3. Consider a configuration approach: Instead of hardcoding help content, consider making it configurable through ReactOnRails.configuration.

  4. Documentation: Update CHANGELOG.md to document this user-facing change.

  5. Performance: The help section is being appended to every error. Consider if this could be done lazily only when errors are displayed to users.

🔒 Security

No security issues identified. Email addresses and URLs are appropriately public-facing support channels.

⚡ Performance

Minor concern: String concatenation in error paths could be optimized using string buffers, but the impact is negligible since these are error paths.

✅ Style & Conventions

The code follows the project's RuboCop configuration requirements (based on CLAUDE.md guidelines). However, ensure bundle exec rubocop passes before merging.

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: 0

🧹 Nitpick comments (2)
README.md (2)

152-157: Clarify extraction scope: include or exclude “Additional Resources”

Decide if these belong inside the extracted help block shown in error messages. If not, place them outside the markers; if yes, keep them inside so they surface with errors.


170-171: Keep License section purely licensing; move Pro note earlier

This marketing note fits better under “React on Rails Pro” above. Consider relocating to avoid mixing licensing with product notes.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f769676 and 882b43c.

📒 Files selected for processing (1)
  • README.md (2 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{js,jsx,ts,tsx,json,md,yml,yaml,css,scss,html,graphql,mdx}

📄 CodeRabbit inference engine (CLAUDE.md)

Let Prettier handle all formatting; never manually format code

Files:

  • README.md
🧠 Learnings (2)
📚 Learning: 2025-09-15T21:24:48.207Z
Learnt from: AbanoubGhadban
PR: shakacode/react_on_rails#1781
File: node_package/src/ClientSideRenderer.ts:82-95
Timestamp: 2025-09-15T21:24:48.207Z
Learning: In React on Rails, the force_load feature includes both explicit `data-force-load="true"` usage and the ability to hydrate components during the page loading state (`document.readyState === 'loading'`). Both capabilities require a Pro license, so the condition `!railsContext.rorPro && (isComponentForceLoaded || document.readyState === 'loading')` correctly gates both scenarios.

Applied to files:

  • README.md
📚 Learning: 2025-02-18T13:08:01.477Z
Learnt from: AbanoubGhadban
PR: shakacode/react_on_rails#1644
File: lib/react_on_rails/helper.rb:190-197
Timestamp: 2025-02-18T13:08:01.477Z
Learning: RSC support validation in React on Rails Pro is handled through a chain of validations:
1. Pro version check in `run_stream_inside_fiber`
2. RSC support check during pack generation via `ReactOnRailsPro.configuration.enable_rsc_support`
3. RSC support validation during component registration
This makes additional validation in the helper methods unnecessary.

Applied to files:

  • README.md
🪛 GitHub Actions: Lint JS and Ruby
README.md

[error] 1-1: Prettier formatting check failed on README.md. Run 'prettier --write' to fix code style issues.

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: dummy-app-integration-tests (3.4, 22)
  • GitHub Check: dummy-app-integration-tests (3.2, 20)
  • GitHub Check: rspec-package-tests (3.2, latest)
  • GitHub Check: rspec-package-tests (3.2, minimum)
  • GitHub Check: rspec-package-tests (3.4, latest)
  • GitHub Check: rspec-package-tests (3.4, minimum)
  • GitHub Check: claude-review
🔇 Additional comments (2)
README.md (2)

143-157: Fix Prettier failure on README

CI reports Prettier formatting issues. Please run Prettier locally and commit the result.

Suggested commands:

  • npx prettier --write README.md
  • or: yarn prettier --write README.md
  • then: git add README.md && git commit -m "chore: prettier README"

143-151: Add the HTML comment markers expected by ReactOnRails::Utils.extract_troubleshooting_section

  • README.md "Get Help & Support" (lines ~143–151) has no HTML start/end comment markers; the extractor needs them to reliably pull this block.
  • lib/tasks/generate_packs.rake calls ReactOnRails::Utils.extract_troubleshooting_section, but lib/react_on_rails/utils.rb only defines default_troubleshooting_section and no extract_troubleshooting_section — the exact marker strings are not discoverable in the repo.
  • Action: either wrap this README section with the extractor's exact HTML comment start/end markers, or add/restore extract_troubleshooting_section and document the marker strings here. After you share the exact marker identifiers I will generate the precise diff.

@claude
Copy link

claude bot commented Sep 22, 2025

Code Review for PR #1803: Add centralized help and support messaging system

Summary

This PR aims to centralize help and support messaging throughout the React on Rails gem, providing consistent error messaging with helpful troubleshooting information. While the intent is excellent for improving user experience, there are critical issues that need to be addressed.

Critical Issues

1. Missing Method Implementation

The code calls ReactOnRails::Utils.extract_troubleshooting_section in lib/tasks/generate_packs.rake:128, but this method is not defined in the diff. This will cause a NoMethodError at runtime when the rake task encounters an error.

File: lib/tasks/generate_packs.rake:128

Recommendation: Either add the missing extract_troubleshooting_section method implementation to lib/react_on_rails/utils.rb or use the existing default_troubleshooting_section method instead.

2. Inconsistent Error Messaging Approach

The PR uses two different approaches:

  • Static method Utils.default_troubleshooting_section (defined and working)
  • Dynamic method Utils.extract_troubleshooting_section (undefined)

This inconsistency could lead to confusion and maintenance issues.

Potential Issues

1. Documentation Drift Risk

The PR description mentions HTML comment markers for the help section in README.md, but these markers are not visible in the diff. If the dynamic extraction relies on these markers, removing or modifying them accidentally could break the help system silently.

2. Exception Handling Chain

In lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb:153-158, the error is being re-raised as a new ReactOnRails::Error instead of preserving the original exception type. This could affect error tracking and debugging.

Good Practices

  1. Consistent Help Messaging: Great initiative to standardize error messages across the gem
  2. User-Friendly Error Output: The colored terminal output in rake tasks enhances readability
  3. Prioritized Support Options: Clear hierarchy of support channels based on response time

Recommendations

  1. Fix the missing method before merging - this is a blocker
  2. Add tests for the error messaging behavior to ensure help content appears correctly
  3. Consider using only the static approach (default_troubleshooting_section) for simplicity and reliability
  4. Document the help message system in developer documentation for future contributors
  5. Add validation to ensure help content is always available, even if dynamic extraction fails

Test Coverage Suggestions

Add tests for:

  • Error classes with help messages (JsonParseError, PrerenderError)
  • Rake task error handling with help output
  • Utils methods for troubleshooting content

Code Quality Notes

The code follows the repository conventions well:

  • RuboCop compliance mentioned in PR description
  • Proper use of heredocs for multi-line strings
  • Consistent formatting
  • Files end with newline character per CLAUDE.md requirements

Overall Assessment

The concept is excellent and will improve developer experience, but the missing method implementation is a critical blocker. Once that is fixed and the other issues are addressed, this will be a valuable addition to the gem.

Status: Changes Requested

Please address the missing extract_troubleshooting_section method before this can be merged.

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: 0

🧹 Nitpick comments (2)
README.md (2)

143-157: Optional: include the doctor command for quick self-serve troubleshooting

Consider adding a one‑liner pointing to rake react_on_rails:doctor for faster self‑serve fixes.

 - 📖 **Discussions**: [Ask questions](https://github.com/shakacode/react_on_rails/discussions) - General help
+
+Tip: Run `rake react_on_rails:doctor` (or `VERBOSE=true rake react_on_rails:doctor`) to diagnose common setup issues.

171-172: Microcopy: replace “Note,” with “Note:” and tighten wording

Improves clarity and tone; avoids an uncommon “Note,” comma usage.

-Note, some features are available only with a React on Rails Pro subscription. See [React on Rails Pro](https://www.shakacode.com/react-on-rails-pro/) for more information.
+Note: some features are available only with a React on Rails Pro subscription. See [React on Rails Pro](https://www.shakacode.com/react-on-rails-pro/) for details.
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 882b43c and 6c21f69.

📒 Files selected for processing (1)
  • README.md (2 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
{Gemfile,Rakefile,**/*.{rb,rake,gemspec,ru,js,jsx,ts,tsx,json,yml,yaml,md,css,scss}}

📄 CodeRabbit inference engine (CLAUDE.md)

Ensure all committed files end with a trailing newline character

Files:

  • README.md
**/*.{js,jsx,ts,tsx,json,yml,yaml,md,css,scss}

📄 CodeRabbit inference engine (CLAUDE.md)

Let Prettier handle all non-Ruby file formatting; never manually format these files

Files:

  • README.md
🧠 Learnings (2)
📚 Learning: 2025-09-15T21:24:48.207Z
Learnt from: AbanoubGhadban
PR: shakacode/react_on_rails#1781
File: node_package/src/ClientSideRenderer.ts:82-95
Timestamp: 2025-09-15T21:24:48.207Z
Learning: In React on Rails, the force_load feature includes both explicit `data-force-load="true"` usage and the ability to hydrate components during the page loading state (`document.readyState === 'loading'`). Both capabilities require a Pro license, so the condition `!railsContext.rorPro && (isComponentForceLoaded || document.readyState === 'loading')` correctly gates both scenarios.

Applied to files:

  • README.md
📚 Learning: 2025-02-18T13:08:01.477Z
Learnt from: AbanoubGhadban
PR: shakacode/react_on_rails#1644
File: lib/react_on_rails/helper.rb:190-197
Timestamp: 2025-02-18T13:08:01.477Z
Learning: RSC support validation in React on Rails Pro is handled through a chain of validations:
1. Pro version check in `run_stream_inside_fiber`
2. RSC support check during pack generation via `ReactOnRailsPro.configuration.enable_rsc_support`
3. RSC support validation during component registration
This makes additional validation in the helper methods unnecessary.

Applied to files:

  • README.md
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (8)
  • GitHub Check: dummy-app-integration-tests (3.2, 20)
  • GitHub Check: dummy-app-integration-tests (3.4, 22)
  • GitHub Check: build
  • GitHub Check: claude-review
  • GitHub Check: rspec-package-tests (3.2, latest)
  • GitHub Check: rspec-package-tests (3.4, latest)
  • GitHub Check: rspec-package-tests (3.4, minimum)
  • GitHub Check: rspec-package-tests (3.2, minimum)
🔇 Additional comments (1)
README.md (1)

143-157: Add HTML comment markers required by Utils.extract_troubleshooting_section

README.md (lines 143–157) contains the "Get Help & Support" block but lacks the HTML comment markers the extractor expects. Repo search did not locate Utils.extract_troubleshooting_section, so confirm the exact marker names and add them around this block (example below — adjust names to match the extractor).

+# <!-- react-on-rails-help:start -->
 # 🆘 Get Help & Support

 **Need immediate help?** Here are your options, ordered by response time:

 - 🚀 **Professional Support**: [react_on_rails@shakacode.com](mailto:react_on_rails@shakacode.com) - Fastest resolution for bugs, upgrades, and consulting
 - 💬 **React + Rails Slack**: [Join our community](https://invite.reactrails.com) - Chat with other developers
 - 🆓 **GitHub Issues**: [Report bugs](https://github.com/shakacode/react_on_rails/issues) - Community support
 - 📖 **Discussions**: [Ask questions](https://github.com/shakacode/react_on_rails/discussions) - General help

 **Additional Resources:**

 - [**Subscribe**](https://app.mailerlite.com/webforms/landing/l1d9x5) for announcements of new releases and tutorials
 - **[forum.shakacode.com](https://forum.shakacode.com)** - Development discussions
 - **[@railsonmaui on Twitter](https://twitter.com/railsonmaui)** - Updates and tips
 - [Projects using React on Rails](https://github.com/shakacode/react_on_rails/tree/master/PROJECTS.md) - Submit yours!
+# <!-- react-on-rails-help:end -->

@claude
Copy link

claude bot commented Sep 22, 2025

Comprehensive Pull Request Review: PR #1803

Overview

This PR introduces a centralized help and support messaging system to improve developer experience when encountering errors. While the concept is excellent, there are critical implementation issues that need to be addressed.

✅ Strengths

  • Addresses real developer pain points with consistent error messaging
  • Clean implementation approach using a centralized method
  • Follows Ruby conventions with proper heredoc usage
  • Improves developer experience significantly

🔴 Critical Issues That Must Be Addressed

1. Method Name Mismatch

The rake task calls ReactOnRails::Utils.extract_troubleshooting_section but the implementation adds default_troubleshooting_section. This will cause a NoMethodError at runtime.

2. Missing Test Coverage

No tests are included for:

  • The new default_troubleshooting_section method
  • Integration tests verifying help messages appear in errors
  • Error path testing

3. Potential Missing Code

The default_troubleshooting_section method should be in lib/react_on_rails/utils.rb according to the diff, but needs verification that all changes are present.

📝 Suggested Improvements

Code Quality

  • Fix the method name inconsistency between rake task and implementation
  • Ensure consistent formatting approach across all error integrations
  • Verify all modified files end with newlines (per CLAUDE.md requirements)

Testing

Add comprehensive test coverage for the new utility method and its integration points. Tests should verify that help messages appear correctly in all error scenarios.

Performance

✅ Minimal impact - changes only affect error paths, using efficient string concatenation

Security

✅ No security concerns - only hardcoded help text, no user input processing

🔧 Action Items

  1. Fix the method name mismatch in generate_packs.rake
  2. Add comprehensive test coverage for the new functionality
  3. Run bundle exec rubocop and fix any violations
  4. Verify all URLs in the help text are functional
  5. Ensure all code changes are properly committed

Recommendation: REQUIRES CHANGES

Once these issues are addressed, this will be a valuable addition that significantly improves the developer experience. The approach is sound, but the implementation needs these critical fixes before merging.

Great initiative on improving the error messaging experience! 🎉

1. Fix undefined method error: Changed Utils.extract_troubleshooting_section
   to Utils.default_troubleshooting_section in rake task
2. Preserve original exception: Changed to re-raise original exception
   instead of wrapping in ReactOnRails::Error to maintain stack trace

These fixes address the blocker issues identified in the code review.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
@claude
Copy link

claude bot commented Sep 22, 2025

Code Review for PR #1803: Add centralized help and support messaging system

Summary

This PR successfully centralizes help and support messaging across the React on Rails gem's error handling. The implementation is clean and follows good software engineering practices. The decision to use hardcoded messages instead of dynamic extraction from README.md is pragmatic and appropriate.

Strengths

  1. Good separation of concerns: The centralized Utils.default_troubleshooting_section method provides a single source of truth for help messaging
  2. Consistent error handling: All major error paths now include helpful guidance for users
  3. Developer-friendly output: The rake task implementation with colored terminal output is particularly nice
  4. Clear commit message and PR description: Excellent documentation of the changes and design decisions

Issues Found

1. Undefined Method Reference (BUG)

In lib/tasks/generate_packs.rake line 127, the method calls ReactOnRails::Utils.extract_troubleshooting_section which does not exist. This should be ReactOnRails::Utils.default_troubleshooting_section

This is a critical bug that will cause the rake task to fail when encountering errors.

2. Missing Test Coverage

No tests have been added for the new default_troubleshooting_section method. Consider adding:

  • Unit test in spec/react_on_rails/utils_spec.rb to verify the method returns expected content
  • Integration tests to ensure error messages properly include the help section

3. Potential Performance Consideration

While minor, the heredoc in JsonParseError#initialize creates a new string on every error. Consider memoizing or using string concatenation if this error is raised frequently.

Suggestions for Improvement

  1. Consider environment-specific messaging: In production, you might want to show different support options (e.g., hide Slack link, emphasize professional support)

  2. Add configuration option: Consider adding a configuration flag to disable help messages for users who don't want them

  3. Extract URLs to constants: For easier maintenance, consider extracting URLs to module constants

Security Considerations

No security issues identified. The hardcoded approach actually improves security by avoiding file I/O operations during error handling.

Performance Impact

Minimal performance impact - adding a few string concatenations to error paths that are already slow by nature.

Compliance with CLAUDE.md

  • Code follows the project's style guidelines
  • Changes are focused and don't introduce unnecessary modifications
  • Error messages are helpful and actionable

Verdict

Needs revision - The undefined method bug in generate_packs.rake must be fixed before merging. Once that's addressed and ideally some basic tests are added, this will be a valuable improvement to the developer experience.

Great work on improving the error messaging system! The centralized approach will make future maintenance much easier.

@claude
Copy link

claude bot commented Sep 22, 2025

Code Review for PR #1803: Add centralized help and support messaging system

✅ Strengths

  • Excellent DRY principle: Centralizing the help message in Utils.default_troubleshooting_section eliminates duplication and ensures consistency
  • Smart design decision: Hardcoding the message instead of runtime file I/O is the right choice for performance and reliability
  • Good UX improvement: Developers encountering errors will immediately see how to get help
  • Clean implementation: The heredoc usage in JsonParseError improves readability

🔍 Issues & Recommendations

1. Missing Test Coverage 🔴

The new default_troubleshooting_section method lacks test coverage. Consider adding tests to spec/react_on_rails/utils_spec.rb:

  • Verify the method returns the expected message structure
  • Ensure all support links are present
  • Test that error classes include the help section

2. Potential Performance Concern 🟡

The help section is appended to every error message, even in production. Consider:

  • Making it configurable via ReactOnRails.configuration
  • Only showing in development/test environments by default
  • Allow users to suppress it in production logs

3. Hard-coded URLs 🟡

The Slack invite URL (https://invite.reactrails.com) is hardcoded. If this URL changes, it requires a gem update. Consider:

  • Moving URLs to configuration constants
  • Document URL maintenance in contributing guide

4. Inconsistent Error Formatting 🟡

Some errors use string concatenation while others use heredocs. For consistency, consider using heredocs for all multi-line error messages.

5. Security Consideration 🟢

Good that professional support email is provided directly rather than through a redirect that could be hijacked.

📝 Specific Code Feedback

lib/react_on_rails/json_parse_error.rb:10-14
The heredoc improves readability. Good change! ✅

lib/react_on_rails/prerender_error.rb:87
Consider whether the help section should appear before or after the backtrace for better visibility.

lib/tasks/generate_packs.rake:126-141
The colored output implementation is nice, but consider extracting to a reusable method if this pattern spreads to other rake tasks.

🧪 Test Recommendations

Add these test cases:

  1. Test that JsonParseError includes the help section
  2. Test that PrerenderError includes the help section
  3. Test the Utils.default_troubleshooting_section method directly
  4. Test that the rake task error handler displays colored help

✅ CI/Lint Compliance

  • RuboCop passes ✅
  • Files end with newlines ✅
  • Follows project conventions ✅

📊 Overall Assessment

Good PR that improves developer experience! The centralized help system is a valuable addition. With added tests and the minor improvements suggested above, this will be production-ready.

Recommendation: Approve with minor changes - primarily adding test coverage for the new functionality.


Review generated with assistance from Claude Code

@justin808 justin808 merged commit 316d356 into master Sep 22, 2025
15 checks passed
@justin808 justin808 deleted the update-help-message branch September 22, 2025 08:37
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