-
-
Notifications
You must be signed in to change notification settings - Fork 638
Add centralized help and support messaging system #1803
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
- 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>
|
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 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. 📒 Files selected for processing (2)
WalkthroughAdds 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
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
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested reviewers
Poem
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
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. Comment |
Code Review for PR #1803: Add centralized help and support messaging system✅ Strengths
🔍 Areas for Improvement1. Missing Test Coverage
|
There was a problem hiding this 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 endlib/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
📒 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 rubocopand fix all violations; Ruby code must pass RuboCop with zero offenses
Files:
lib/react_on_rails/utils.rblib/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.rblib/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.
| 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
|
Code review posted. Please see detailed feedback in the conversation thread. |
Pull Request Review: Add centralized help and support messaging systemSummaryThis PR introduces a centralized help and support messaging system that extracts troubleshooting information from README.md. Great improvement for developer experience! Strengths
Code Quality Observations
Potential Issues
Security Considerations
Suggestions
CLAUDE.md Compliance
Overall AssessmentRating: 8/10 - Well-thought-out enhancement with clean implementation. Main improvement needed is test coverage. Great work on centralizing support messaging! |
Code Review for PR #1803I've reviewed the changes and this is a valuable addition that improves user experience during error scenarios. Here's my feedback: Strengths
Code Quality Issues
Potential Bugs
Performance Considerations
SecurityThe implementation looks secure - no user input is interpolated into file paths or regex patterns. Good job avoiding potential injection vulnerabilities. Suggestions for Improvement
RecommendationApprove with minor changes - primarily adding test coverage and considering the performance optimizations for production use. Great work on improving the developer experience! |
Code Review for PR #1803: Centralized Help and Support Messaging System🎯 SummaryGood 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
|
Code Review SummaryThe 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:
Recommendations:
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>
Code Review for PR #1803: Add centralized help and support messaging systemThank you for this PR! I've completed a thorough review of the changes. Here's my feedback: ✅ Strengths
🔍 Suggestions for Improvement1. 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:
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 ClarityIn 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 HandlingSome error classes append the troubleshooting section in their initializer (JsonParseError), while others do it in message construction (PrerenderError). Consider standardizing the approach. 📝 Minor Issues
✅ Testing Checklist
💡 Overall AssessmentThis 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>
Code Review: Add centralized help and support messaging systemThank 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
🔍 Issues and Recommendations1. Missing Test Coverage (Critical)The new
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
end3. Error Message Consistency (Low)In 4. Code Style Issues (Low)
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 ReviewNo security concerns identified. The file reading is limited to README.md within the gem root, preventing path traversal attacks. 📊 Test Coverage RequirementsBefore merging, please add comprehensive tests for:
💡 Suggestions for Enhancement
✨ Overall AssessmentThis 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! 🎉 |
lib/react_on_rails/utils.rb
Outdated
|
|
||
| private_class_method def self.convert_markdown_to_terminal(markdown_text) | ||
| markdown_text | ||
| .gsub(/^#+\s+(.+)$/, "\n📞 \\1") # Convert H1-H6 headers |
There was a problem hiding this comment.
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?
lib/react_on_rails/utils.rb
Outdated
| end | ||
|
|
||
| # Extract troubleshooting section from README.md for error messages | ||
| def self.extract_troubleshooting_section |
There was a problem hiding this comment.
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>
🔍 Code Review for PR #1803: Add centralized help and support messaging systemOverall AssessmentThe 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 Issues1. Missing Method Implementation
2. Test Coverage Gap
🐛 Bugs
💡 Suggestions for ImprovementCode Quality
Performance
Security
✅ Positive Aspects
📋 Required Actions Before Merge
📝 Minor Style Notes
Verdict: ❌ Changes Requested - The undefined method issue must be fixed before this can be merged. |
There was a problem hiding this 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
📒 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 rubocopand fix all violations; Ruby code must pass RuboCop with zero offenses
Files:
lib/react_on_rails/json_parse_error.rblib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rblib/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_sectionSearch 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).
| message = "#{parse_error.message}\n\n#{Utils.default_troubleshooting_section}" | ||
| super(message) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
|
|
||
| # Add help and support information | ||
| message << "\n#{Utils.default_troubleshooting_section}\n" | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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"
+ endAnd 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.
| msg << "\n#{Utils.default_troubleshooting_section}\n" | ||
| raise ReactOnRails::Error, msg, err.backtrace |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| 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.
| 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| 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.
| 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| 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.
| msg = "file_url_to_string #{url} failed\nError is: #{e}\n\n#{Utils.default_troubleshooting_section}" | ||
| raise ReactOnRails::Error, msg | ||
| end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| 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>
Code Review for PR #1803: Add centralized help and support messaging system🔴 Critical Issue: Missing Method ImplementationThe 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:
🟡 Code Quality Observations1. Inconsistent Help Message Sources
Recommendation: Either use static messages everywhere for consistency, or implement dynamic extraction properly with fallback handling. 2. Error Handling in ruby_embedded_java_script.rbLine 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 READMEThe markers and serve no purpose without the extraction implementation. 🟢 Positive Aspects
🔍 Performance & Security
📊 Test CoverageMissing Tests:
Recommendation: Add unit tests in spec/react_on_rails/utils_spec.rb for the new troubleshooting method. 📝 Suggested Improvements
✅ SummaryThis 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. |
Code Review for PR #1803: Add centralized help and support messaging system🔴 Critical IssueMissing Method Implementation: The code calls 🟡 Code Quality Issues
🟢 Positive Aspects
📋 Recommendations
🔒 SecurityNo security issues identified. Email addresses and URLs are appropriately public-facing support channels. ⚡ PerformanceMinor concern: String concatenation in error paths could be optimized using string buffers, but the impact is negligible since these are error paths. ✅ Style & ConventionsThe code follows the project's RuboCop configuration requirements (based on CLAUDE.md guidelines). However, ensure |
There was a problem hiding this 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 earlierThis 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
📒 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 READMECI 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.
Code Review for PR #1803: Add centralized help and support messaging systemSummaryThis 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 Issues1. Missing Method ImplementationThe 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 ApproachThe PR uses two different approaches:
This inconsistency could lead to confusion and maintenance issues. Potential Issues1. Documentation Drift RiskThe 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 ChainIn 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
Recommendations
Test Coverage SuggestionsAdd tests for:
Code Quality NotesThe code follows the repository conventions well:
Overall AssessmentThe 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. |
There was a problem hiding this 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 troubleshootingConsider adding a one‑liner pointing to
rake react_on_rails:doctorfor 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 wordingImproves 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
📒 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_sectionREADME.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 -->
Comprehensive Pull Request Review: PR #1803OverviewThis 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
🔴 Critical Issues That Must Be Addressed1. Method Name MismatchThe 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 CoverageNo tests are included for:
3. Potential Missing CodeThe 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 ImprovementsCode Quality
TestingAdd 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
Recommendation: REQUIRES CHANGESOnce 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>
Code Review for PR #1803: Add centralized help and support messaging systemSummaryThis 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
Issues Found1. 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 CoverageNo tests have been added for the new default_troubleshooting_section method. Consider adding:
3. Potential Performance ConsiderationWhile 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
Security ConsiderationsNo security issues identified. The hardcoded approach actually improves security by avoiding file I/O operations during error handling. Performance ImpactMinimal performance impact - adding a few string concatenations to error paths that are already slow by nature. Compliance with CLAUDE.md
VerdictNeeds 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. |
Code Review for PR #1803: Add centralized help and support messaging system✅ Strengths
🔍 Issues & Recommendations1. Missing Test Coverage 🔴The new default_troubleshooting_section method lacks test coverage. Consider adding tests to spec/react_on_rails/utils_spec.rb:
2. Potential Performance Concern 🟡The help section is appended to every error message, even in production. Consider:
3. Hard-coded URLs 🟡The Slack invite URL (https://invite.reactrails.com) is hardcoded. If this URL changes, it requires a gem update. Consider:
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 Feedbacklib/react_on_rails/json_parse_error.rb:10-14 lib/react_on_rails/prerender_error.rb:87 lib/tasks/generate_packs.rake:126-141 🧪 Test RecommendationsAdd these test cases:
✅ CI/Lint Compliance
📊 Overall AssessmentGood 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 |
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
Utils.default_troubleshooting_sectionmethod with hardcoded help message containing:Error Message Integration
Utils.invoke_and_exit_if_failedtriggersgenerate_packs.rakeDesign Decision
Initially attempted dynamic extraction from README.md using markers, but reverted to hardcoded message because:
Test plan
bundle exec rubocop- passes with no violations🤖 Generated with Claude Code
This change is
Summary by CodeRabbit
New Features
Documentation