Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
318e370
Restructure monorepo with two top-level product directories
justin808 Nov 23, 2025
ecc0ece
Fix critical path issues for new directory structure
justin808 Nov 24, 2025
efbb07c
Fix git operations in release script to use monorepo_root
justin808 Nov 24, 2025
4ec6490
Fix script/convert for new monorepo structure
justin808 Nov 24, 2025
59c0b75
Fix .rubocop.yml inherit_from paths for new structure
justin808 Nov 24, 2025
4f7db28
Fix missing app/helpers directory in react_on_rails gem
justin808 Nov 24, 2025
fd49e60
Fix path references in dummy app after monorepo restructure
justin808 Nov 24, 2025
bdb8fea
Fix missing Gemfile.development_dependencies and update linter config
justin808 Nov 24, 2025
283b96f
Update .gitignore for new react_on_rails directory structure
justin808 Nov 24, 2025
ed3ee29
Remove obsolete Assets alias path from eslint config
justin808 Nov 24, 2025
ff4f047
Update .rubocop.yml paths for monorepo structure
justin808 Nov 24, 2025
633fc4c
Fix RuboCop Style/NumericPredicate violations
justin808 Nov 24, 2025
d9181c8
Update knip.ts for new monorepo structure
justin808 Nov 24, 2025
446f6db
Fix RSpec be_positive matcher syntax
justin808 Nov 24, 2025
c3008ad
Fix knip configuration for new monorepo structure
justin808 Nov 24, 2025
55fa335
Fix stylelint paths for new monorepo structure
justin808 Nov 24, 2025
aff8a7a
Revert be_positive back to be > 0 for compatibility
justin808 Nov 24, 2025
49dec8e
Move open-source gem files into react_on_rails/ directory
justin808 Nov 24, 2025
9731245
Add CHANGELOG entry for monorepo restructure
justin808 Nov 24, 2025
cf55aa7
Fix script/convert for new monorepo structure
justin808 Nov 24, 2025
3708cdb
Fix examples workflow Gemfile path for monorepo structure
justin808 Nov 24, 2025
46d49a2
Fix bundle commands to use react_on_rails/ directory
justin808 Nov 24, 2025
f2e551c
Fix script/convert to support both old and new file locations
justin808 Nov 24, 2025
668b120
Clean up ESLint config: remove old path patterns
justin808 Nov 24, 2025
28b5ad1
Fix examples workflow Main CI step to run from react_on_rails directory
justin808 Nov 24, 2025
6bdace6
Update yarn.lock after package.json formatting
justin808 Nov 24, 2025
015b75a
Fix package.json: remove empty lines in devDependencies
justin808 Nov 24, 2025
e73a311
Fix yarn.lock frozen-lockfile issue after yalc add
justin808 Nov 24, 2025
1892922
Fix workflow files for new react_on_rails/ directory structure
justin808 Nov 24, 2025
f0bf615
Fix shakapacker version in Gemfile.development_dependencies
justin808 Nov 24, 2025
8ca31d4
Update .gitignore patterns for monorepo structure
justin808 Nov 24, 2025
e835e09
Fix Gemfile.development_dependencies path in dummy app
justin808 Nov 24, 2025
bae67fe
Fix RSpec examples.txt persistence file path configuration
justin808 Nov 24, 2025
31431f9
Disable react/destructuring-assignment ESLint rule for React 19
justin808 Nov 24, 2025
1691270
Fix examples workflow yalc publish command
justin808 Nov 24, 2025
19a6ec5
Add comprehensive guidance on avoiding CI failure cycles
justin808 Nov 24, 2025
785b3ea
Fix RuboCop configuration paths after monorepo restructuring
justin808 Nov 24, 2025
be365d8
Address code review feedback and fix CI failures
justin808 Nov 25, 2025
76293b9
Update Gemfile.lock for shakapacker 9.4.0
justin808 Nov 25, 2025
5439671
Update dummy app yarn.lock for shakapacker 9.4.0
justin808 Nov 25, 2025
1badc3c
Add missing devDependencies for CI lint workflow
justin808 Nov 25, 2025
cd26925
Fix knip: replace concurrently with globals dependency
justin808 Nov 25, 2025
ea5752e
Ignore react_on_rails/vendor in knip to avoid shakapacker deps
justin808 Nov 25, 2025
0511d40
Fix Pro ESLint config and add vendor ignore to knip
justin808 Nov 25, 2025
e4fc262
Fix CI lint failures
justin808 Nov 25, 2025
e906ebf
Revert Pro package-scripts.yml and eslint config to match master
justin808 Nov 25, 2025
894d0ce
docs: Update CI polling guidance to use 30-second intervals
justin808 Nov 25, 2025
bbb5e38
Fix Pro lint workflow: add package.json and use npx for commands
justin808 Nov 25, 2025
68b9410
Fix ESLint errors caught by stricter type checking
justin808 Nov 25, 2025
44d3ae1
Fix Pro package tests: run yarn workspace from repo root
justin808 Nov 25, 2025
c1f0d54
Fix code review concerns: gemspec bug, PropTypes, root Gemfile
justin808 Nov 25, 2025
1304fcc
Fix RSC test infrastructure and add TODO explaining temporary disable
justin808 Nov 25, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
409 changes: 409 additions & 0 deletions .claude/docs/avoiding-ci-failure-cycles.md

Large diffs are not rendered by default.

25 changes: 25 additions & 0 deletions .claude/docs/master-health-monitoring.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,31 @@ Within 30 minutes of your PR merging to master:
- Don't assume "someone else will fix it"
- You are responsible for ensuring your PR doesn't break master

## Polling CI Status While Waiting

**When actively monitoring CI, poll every 30 seconds (not 180 seconds):**

```bash
# Poll every 30 seconds while CI is running
while true; do
gh pr view --json statusCheckRollup --jq '.statusCheckRollup | group_by(.conclusion) | map({conclusion: .[0].conclusion, count: length})'
sleep 30
done
```

Or use the automated tool which polls at 30-second intervals:

```bash
bin/ci-rerun-failures # Automatically waits for in-progress CI, polling every 30s
```

**Why 30 seconds?**

- CI jobs typically complete in 3-15 minutes
- 30-second polling gives responsive feedback without excessive API calls
- 180 seconds (3 minutes) is too slow—you waste time waiting unnecessarily
- GitHub API rate limits are 5000 requests/hour, so 30-second polls are fine

## When You Discover Master is Broken

1. **Determine if it's from your PR:**
Expand Down
9 changes: 5 additions & 4 deletions .github/workflows/examples.yml
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,8 @@ jobs:
- name: Save root ruby gems to cache
uses: actions/cache@v4
with:
path: vendor/bundle
key: package-app-gem-cache-${{ hashFiles('Gemfile.lock') }}-ruby${{ matrix.ruby-version }}-${{ matrix.dependency-level }}
path: react_on_rails/vendor/bundle
key: package-app-gem-cache-${{ hashFiles('react_on_rails/Gemfile.lock') }}-ruby${{ matrix.ruby-version }}-${{ matrix.dependency-level }}
- id: get-sha
run: echo "sha=\"$(git rev-parse HEAD)\"" >> "$GITHUB_OUTPUT"
- name: Install Node modules with Yarn for renderer package
Expand All @@ -147,9 +147,10 @@ jobs:
- name: yalc publish for react-on-rails
# Use yarn workspace script to publish all workspace packages to yalc
# Runs the "yalc:publish" script defined in each workspace's package.json
run: yarn yalc publish
run: yarn run yalc:publish
- name: Install Ruby Gems for package
run: |
cd react_on_rails
bundle lock --add-platform 'x86_64-linux'
if ! bundle check --path=vendor/bundle; then
bundle _2.5.9_ install --path=vendor/bundle --jobs=4 --retry=3
Expand All @@ -172,7 +173,7 @@ jobs:
run: |
echo "CI_DEPENDENCY_LEVEL=${{ matrix.dependency-level }}" >> $GITHUB_ENV
- name: Main CI
run: bundle exec rake run_rspec:shakapacker_examples
run: cd react_on_rails && bundle exec rake run_rspec:shakapacker_examples
- name: Store test results
uses: actions/upload-artifact@v4
with:
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/gem-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -128,10 +128,10 @@ jobs:
- name: Save root ruby gems to cache
uses: actions/cache@v4
with:
path: vendor/bundle
key: package-app-gem-cache-${{ hashFiles('Gemfile.lock') }}-${{ matrix.ruby-version }}-${{ matrix.dependency-level }}
path: react_on_rails/vendor/bundle
key: package-app-gem-cache-${{ hashFiles('react_on_rails/Gemfile.lock') }}-${{ matrix.ruby-version }}-${{ matrix.dependency-level }}
- name: Install Ruby Gems for package
run: bundle check --path=vendor/bundle || bundle _2.5.9_ install --path=vendor/bundle --jobs=4 --retry=3
run: cd react_on_rails && (bundle check --path=vendor/bundle || bundle _2.5.9_ install --path=vendor/bundle --jobs=4 --retry=3)
- name: Git Stuff
if: matrix.dependency-level == 'minimum'
run: |
Expand All @@ -142,7 +142,7 @@ jobs:
run: |
echo "CI_DEPENDENCY_LEVEL=${{ matrix.dependency-level }}" >> $GITHUB_ENV
- name: Run rspec tests
run: bundle exec rspec spec/react_on_rails
run: cd react_on_rails && bundle exec rspec spec/react_on_rails
- name: Store test results
uses: actions/upload-artifact@v4
with:
Expand Down
47 changes: 24 additions & 23 deletions .github/workflows/integration-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -142,31 +142,31 @@ jobs:
- name: yalc publish for react-on-rails
run: cd packages/react-on-rails && yalc publish
- name: yalc add react-on-rails
run: cd spec/dummy && yalc add react-on-rails
run: cd react_on_rails/spec/dummy && yalc add react-on-rails
- name: Install Node modules with Yarn for dummy app
run: cd spec/dummy && yarn install --no-progress --no-emoji ${{ matrix.dependency-level == 'latest' && '--frozen-lockfile' || '' }}
run: cd react_on_rails/spec/dummy && yarn install --no-progress --no-emoji ${{ matrix.dependency-level == 'latest' && '--frozen-lockfile' || '' }}
- name: Save dummy app ruby gems to cache
uses: actions/cache@v4
with:
path: spec/dummy/vendor/bundle
key: dummy-app-gem-cache-${{ hashFiles('spec/dummy/Gemfile.lock') }}-ruby${{ matrix.ruby-version }}-${{ matrix.dependency-level }}
path: react_on_rails/spec/dummy/vendor/bundle
key: dummy-app-gem-cache-${{ hashFiles('react_on_rails/spec/dummy/Gemfile.lock') }}-ruby${{ matrix.ruby-version }}-${{ matrix.dependency-level }}
- name: Install Ruby Gems for dummy app
run: |
cd spec/dummy
cd react_on_rails/spec/dummy
bundle lock --add-platform 'x86_64-linux'
if ! bundle check --path=vendor/bundle; then
bundle _2.5.9_ install --path=vendor/bundle --jobs=4 --retry=3
fi
- name: generate file system-based packs
run: cd spec/dummy && RAILS_ENV="test" bundle exec rake react_on_rails:generate_packs
run: cd react_on_rails/spec/dummy && RAILS_ENV="test" bundle exec rake react_on_rails:generate_packs
- name: Build test bundles for dummy app
run: cd spec/dummy && rm -rf public/webpack/test && yarn run build:rescript && RAILS_ENV="test" NODE_ENV="test" bin/shakapacker
run: cd react_on_rails/spec/dummy && rm -rf public/webpack/test && yarn run build:rescript && RAILS_ENV="test" NODE_ENV="test" bin/shakapacker
- id: get-sha
run: echo "sha=\"$(git rev-parse HEAD)\"" >> "$GITHUB_OUTPUT"
- name: Save test Webpack bundles to cache (for build number checksum used by RSpec job)
uses: actions/cache/save@v4
with:
path: spec/dummy/public/webpack
path: react_on_rails/spec/dummy/public/webpack
key: dummy-app-webpack-bundle-${{ steps.get-sha.outputs.sha }}-ruby${{ matrix.ruby-version }}-${{ matrix.dependency-level }}

dummy-app-integration-tests:
Expand Down Expand Up @@ -217,19 +217,19 @@ jobs:
- name: Save root ruby gems to cache
uses: actions/cache@v4
with:
path: vendor/bundle
key: package-app-gem-cache-${{ hashFiles('Gemfile.lock') }}-ruby${{ matrix.ruby-version }}-${{ matrix.dependency-level }}
path: react_on_rails/vendor/bundle
key: package-app-gem-cache-${{ hashFiles('react_on_rails/Gemfile.lock') }}-ruby${{ matrix.ruby-version }}-${{ matrix.dependency-level }}
- name: Save dummy app ruby gems to cache
uses: actions/cache@v4
with:
path: spec/dummy/vendor/bundle
key: dummy-app-gem-cache-${{ hashFiles('spec/dummy/Gemfile.lock') }}-ruby${{ matrix.ruby-version }}-${{ matrix.dependency-level }}
path: react_on_rails/spec/dummy/vendor/bundle
key: dummy-app-gem-cache-${{ hashFiles('react_on_rails/spec/dummy/Gemfile.lock') }}-ruby${{ matrix.ruby-version }}-${{ matrix.dependency-level }}
- id: get-sha
run: echo "sha=\"$(git rev-parse HEAD)\"" >> "$GITHUB_OUTPUT"
- name: Save test Webpack bundles to cache (for build number checksum used by RSpec job)
uses: actions/cache@v4
with:
path: spec/dummy/public/webpack
path: react_on_rails/spec/dummy/public/webpack
key: dummy-app-webpack-bundle-${{ steps.get-sha.outputs.sha }}-ruby${{ matrix.ruby-version }}-${{ matrix.dependency-level }}
- name: Install Node modules with Yarn
run: |
Expand All @@ -238,22 +238,23 @@ jobs:
- name: yalc publish for react-on-rails
run: cd packages/react-on-rails && yalc publish
- name: yalc add react-on-rails
run: cd spec/dummy && yalc add react-on-rails
run: cd react_on_rails/spec/dummy && yalc add react-on-rails
- name: Install Node modules with Yarn for dummy app
run: cd spec/dummy && yarn install --no-progress --no-emoji ${{ matrix.dependency-level == 'latest' && '--frozen-lockfile' || '' }}
run: cd react_on_rails/spec/dummy && yarn install --no-progress --no-emoji ${{ matrix.dependency-level == 'latest' && '--frozen-lockfile' || '' }}
- name: Dummy JS tests
run: |
cd spec/dummy
cd react_on_rails/spec/dummy
yarn run test:js
- name: Install Ruby Gems for package
run: |
cd react_on_rails
bundle lock --add-platform 'x86_64-linux'
if ! bundle check --path=vendor/bundle; then
bundle _2.5.9_ install --path=vendor/bundle --jobs=4 --retry=3
fi
- name: Install Ruby Gems for dummy app
run: |
cd spec/dummy
cd react_on_rails/spec/dummy
bundle lock --add-platform 'x86_64-linux'
if ! bundle check --path=vendor/bundle; then
bundle _2.5.9_ install --path=vendor/bundle --jobs=4 --retry=3
Expand All @@ -273,19 +274,19 @@ jobs:
- name: Increase the amount of inotify watchers
run: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
- name: generate file system-based packs
run: cd spec/dummy && RAILS_ENV="test" bundle exec rake react_on_rails:generate_packs
run: cd react_on_rails/spec/dummy && RAILS_ENV="test" bundle exec rake react_on_rails:generate_packs
- name: Git Stuff
if: matrix.dependency-level == 'minimum'
run: |
git config user.email "you@example.com"
git config user.name "Your Name"
git commit -am "stop generators from complaining about uncommitted code"
- run: cd spec/dummy && bundle info shakapacker
- run: cd react_on_rails/spec/dummy && bundle info shakapacker
- name: Set packer version environment variable
run: |
echo "CI_DEPENDENCY_LEVEL=ruby${{ matrix.ruby-version }}-${{ matrix.dependency-level }}" >> $GITHUB_ENV
- name: Main CI
run: bundle exec rake run_rspec:all_dummy
run: cd react_on_rails && bundle exec rake run_rspec:all_dummy
- name: Store test results
uses: actions/upload-artifact@v4
with:
Expand All @@ -295,14 +296,14 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: dummy-app-capybara-${{ github.run_id }}-${{ github.job }}-ruby${{ matrix.ruby-version }}-${{ matrix.dependency-level }}
path: spec/dummy/tmp/capybara
path: react_on_rails/spec/dummy/tmp/capybara
- name: Store artifacts
uses: actions/upload-artifact@v4
with:
name: dummy-app-test-log-${{ github.run_id }}-${{ github.job }}-ruby${{ matrix.ruby-version }}-${{ matrix.dependency-level }}
path: spec/dummy/log/test.log
path: react_on_rails/spec/dummy/log/test.log
- name: Store artifacts
uses: actions/upload-artifact@v4
with:
name: dummy-app-yarn-log-${{ github.run_id }}-${{ github.job }}-ruby${{ matrix.ruby-version }}-${{ matrix.dependency-level }}
path: spec/dummy/yarn-error.log
path: react_on_rails/spec/dummy/yarn-error.log
23 changes: 11 additions & 12 deletions .github/workflows/lint-js-and-ruby.yml
Original file line number Diff line number Diff line change
Expand Up @@ -112,46 +112,45 @@ jobs:
- name: Save root ruby gems to cache
uses: actions/cache@v4
with:
path: vendor/bundle
key: package-app-gem-cache-${{ hashFiles('Gemfile.lock') }}-lint
path: react_on_rails/vendor/bundle
key: package-app-gem-cache-${{ hashFiles('react_on_rails/Gemfile.lock') }}-lint
- name: Install Node modules with Yarn for renderer package
run: |
yarn install --no-progress --no-emoji --frozen-lockfile
sudo yarn global add yalc
- name: yalc publish for react-on-rails
run: cd packages/react-on-rails && yalc publish
- name: yalc add react-on-rails
run: cd spec/dummy && yalc add react-on-rails
run: cd react_on_rails/spec/dummy && yalc add react-on-rails
- name: Install Node modules with Yarn for dummy app
run: cd spec/dummy && yarn install --no-progress --no-emoji --frozen-lockfile
run: cd react_on_rails/spec/dummy && yarn install --no-progress --no-emoji
- name: Install Ruby Gems for package
run: bundle check --path=vendor/bundle || bundle _2.5.9_ install --path=vendor/bundle --jobs=4 --retry=3
run: cd react_on_rails && bundle check --path=vendor/bundle || bundle _2.5.9_ install --path=vendor/bundle --jobs=4 --retry=3
- name: Lint Ruby
run: bundle exec rubocop
run: cd react_on_rails && bundle exec rubocop
- name: Validate RBS type signatures
run: bundle exec rake rbs:validate
run: cd react_on_rails && bundle exec rake rbs:validate
# TODO: Re-enable Steep once RBS signatures are complete for all checked files
# Currently disabled because 374 type errors need to be fixed first
# - name: Run Steep type checker
# run: bundle exec rake rbs:steep
- name: Save dummy app ruby gems to cache
uses: actions/cache@v4
with:
path: spec/dummy/vendor/bundle
key: dummy-app-gem-cache-${{ hashFiles('spec/dummy/Gemfile.lock') }}-lint
path: react_on_rails/spec/dummy/vendor/bundle
key: dummy-app-gem-cache-${{ hashFiles('react_on_rails/spec/dummy/Gemfile.lock') }}-lint
- name: Install Ruby Gems for dummy app
run: |
cd spec/dummy
cd react_on_rails/spec/dummy
bundle lock --add-platform 'x86_64-linux'
if ! bundle check --path=vendor/bundle; then
bundle _2.5.9_ install --path=vendor/bundle --jobs=4 --retry=3
fi
- name: generate file system-based packs
run: cd spec/dummy && RAILS_ENV="test" bundle exec rake react_on_rails:generate_packs
run: cd react_on_rails/spec/dummy && RAILS_ENV="test" bundle exec rake react_on_rails:generate_packs
- name: Detect dead code
run: |
yarn run knip --exclude binaries
yarn run knip --production --exclude binaries
- name: Lint JS
run: yarn run eslint --report-unused-disable-directives
- name: Check formatting
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/package-js-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ on:
paths-ignore:
- '**.md'
- 'docs/**'
- 'lib/**'
- 'spec/react_on_rails/**'
- 'react_on_rails/lib/**'
- 'react_on_rails/spec/react_on_rails/**'
- 'react_on_rails_pro/**'
workflow_dispatch:
inputs:
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/playwright.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,32 +61,32 @@ jobs:
run: yarn install

- name: Install dummy app dependencies
working-directory: spec/dummy
working-directory: react_on_rails/spec/dummy
run: |
bundle install
yarn install

- name: Install Playwright browsers
working-directory: spec/dummy
working-directory: react_on_rails/spec/dummy
run: yarn playwright install --with-deps

- name: Generate React on Rails packs
working-directory: spec/dummy
working-directory: react_on_rails/spec/dummy
env:
RAILS_ENV: test
run: bundle exec rake react_on_rails:generate_packs

- name: Build test assets
working-directory: spec/dummy
working-directory: react_on_rails/spec/dummy
run: yarn run build:test

- name: Run Playwright tests
working-directory: spec/dummy
working-directory: react_on_rails/spec/dummy
run: yarn run test:e2e

- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report
path: spec/dummy/e2e/playwright-report/
path: react_on_rails/spec/dummy/e2e/playwright-report/
retention-days: 30
4 changes: 2 additions & 2 deletions .github/workflows/pro-integration-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ on:
paths-ignore:
- '**.md'
- 'docs/**'
- 'lib/**'
- 'spec/**'
- 'react_on_rails/lib/**'
- 'react_on_rails/spec/**'
- 'packages/react_on_rails/**'
workflow_dispatch:
inputs:
Expand Down
5 changes: 3 additions & 2 deletions .github/workflows/pro-lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ on:
paths-ignore:
- '**.md'
- 'docs/**'
- 'lib/**'
- 'spec/**'
- 'react_on_rails/lib/**'
- 'react_on_rails/spec/**'
- 'packages/react_on_rails/**'
workflow_dispatch:
inputs:
Expand Down Expand Up @@ -178,4 +178,5 @@ jobs:
run: yarn run nps format.listDifferent

- name: Check TypeScript
working-directory: .
run: yarn run nps check-typescript
5 changes: 3 additions & 2 deletions .github/workflows/pro-test-package-and-gem.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ on:
paths-ignore:
- '**.md'
- 'docs/**'
- 'lib/**'
- 'spec/**'
- 'react_on_rails/lib/**'
- 'react_on_rails/spec/**'
- 'packages/react_on_rails/**'
workflow_dispatch:
inputs:
Expand Down Expand Up @@ -241,6 +241,7 @@ jobs:
yarn install --frozen-lockfile --no-progress --no-emoji
- name: Run JS unit tests for Pro package
working-directory: .
run: yarn workspace react-on-rails-pro-node-renderer run ci
env:
JEST_JUNIT_OUTPUT_DIR: ./jest
Expand Down
Loading
Loading