File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -15,6 +15,7 @@ This document defines execution constraints for AI agents. For general contribut
1515## Agent-Specific Verification Rules
1616
1717- Always run Dev Container smoke + ` make ready ` for changes.
18+ - For frontend changes or API contract/spec changes, run ` make ci-ready ` to mirror CI parity checks.
1819- For frontend changes, also verify in ` chrome-devtools ` MCP at ` http://127.0.0.1:4001/ ` while the Dev Container is running.
1920- Capture a quick state check for all affected UI states (e.g., guest/member/result) to enforce state parity and avoid duplicate actions.
2021
Original file line number Diff line number Diff line change 11# frozen_string_literal: true
22
3- .PHONY : help test lint lint-js lint-ruby lintfix lintfix-js lintfix-ruby setup dev clean frontend-setup check-frontend quick-check ready yard-verify-public-docs openapi openapi-verify openapi-client openapi-client-verify openapi-lint openapi-lint-redocly openapi-lint-spectral openai-lint-spectral test-frontend-e2e
3+ .PHONY : help test lint lint-js lint-ruby lintfix lintfix-js lintfix-ruby setup dev clean frontend-setup check-frontend quick-check ready ci-ready yard-verify-public-docs openapi openapi-verify openapi-client openapi-client-verify openapi-lint openapi-lint-redocly openapi-lint-spectral openai-lint-spectral test-frontend-e2e
44
55RUBOCOP_FLAGS ?= --cache false
66
@@ -107,6 +107,13 @@ ready: ## Pre-commit gate (quick checks + RSpec)
107107 bundle exec rspec
108108 @echo " Pre-commit checks complete!"
109109
110+ ci-ready : # # CI parity gate (ready + OpenAPI verify + frontend e2e smoke)
111+ @echo " Running CI parity checks..."
112+ $(MAKE ) ready
113+ $(MAKE ) openapi-verify
114+ $(MAKE ) test-frontend-e2e
115+ @echo " CI parity checks complete!"
116+
110117yard-verify-public-docs : # # Verify essential YARD docs for all public methods in app/
111118 bundle exec rake yard:verify_public_docs
112119
Original file line number Diff line number Diff line change @@ -42,6 +42,7 @@ Running the app directly on the host is not supported.
4242| ` make setup ` | Install Ruby and Node dependencies. |
4343| ` make dev ` | Run Ruby (port 4000) and frontend (port 4001) dev servers. |
4444| ` make ready ` | Pre-commit gate: ` make quick-check ` + ` bundle exec rspec ` . |
45+ | ` make ci-ready ` | CI parity gate: ` make ready ` + ` make openapi-verify ` + frontend e2e smoke. |
4546| ` make test ` | Run Ruby and frontend test suites. |
4647| ` make lint ` | Run all linters. |
4748| ` make yard-verify-public-docs ` | Enforce typed YARD docs for public methods in ` app/ ` . |
@@ -90,6 +91,12 @@ Always run this before pushing or committing:
9091make ready
9192```
9293
94+ For frontend changes and API contract/OpenAPI changes, run the CI-parity gate:
95+
96+ ``` bash
97+ make ci-ready
98+ ```
99+
93100### Testing Layers
94101
95102| Layer | Tooling | Focus |
Original file line number Diff line number Diff line change @@ -184,6 +184,8 @@ describe('App', () => {
184184 feed_token : 'generated-token' ,
185185 public_url : '/api/v1/feeds/generated-token' ,
186186 json_public_url : '/api/v1/feeds/generated-token.json' ,
187+ created_at : '2026-04-05T08:59:00.000Z' ,
188+ updated_at : '2026-04-05T09:00:00.000Z' ,
187189 } ,
188190 preview : {
189191 items : [ ] ,
@@ -412,10 +414,10 @@ describe('App', () => {
412414 expect ( utilityItems ) . toEqual ( [
413415 'Try included feeds' ,
414416 'Bookmarklet' ,
417+ 'Clear saved token' ,
418+ 'Install from Docker Hub' ,
415419 'OpenAPI spec' ,
416420 'Source code' ,
417- 'Install from Docker Hub' ,
418- 'Clear saved token' ,
419421 ] ) ;
420422 } ) ;
421423
@@ -671,9 +673,9 @@ describe('App', () => {
671673 expect ( utilityLinks ) . toEqual ( [
672674 'Try included feeds' ,
673675 'Bookmarklet' ,
676+ 'Install from Docker Hub' ,
674677 'OpenAPI spec' ,
675678 'Source code' ,
676- 'Install from Docker Hub' ,
677679 ] ) ;
678680
679681 expect ( screen . getByRole ( 'link' , { name : 'OpenAPI spec' } ) ) . toHaveAttribute (
Original file line number Diff line number Diff line change @@ -275,6 +275,19 @@ export function UtilityStrip({
275275 Try included feeds
276276 </ a >
277277 < Bookmarklet />
278+ { hasAccessToken && (
279+ < button type = "button" class = "utility-button" onClick = { onClearToken } >
280+ Clear saved token
281+ </ button >
282+ ) }
283+ < a
284+ href = "https://hub.docker.com/r/html2rss/web"
285+ target = "_blank"
286+ rel = "noopener noreferrer"
287+ class = "utility-link"
288+ >
289+ Install from Docker Hub
290+ </ a >
278291 { openapiUrl && (
279292 < a
280293 href = { normalizedOpenapiUrl ?? openapiUrl }
@@ -293,19 +306,6 @@ export function UtilityStrip({
293306 >
294307 Source code
295308 </ a >
296- < a
297- href = "https://hub.docker.com/r/html2rss/web"
298- target = "_blank"
299- rel = "noopener noreferrer"
300- class = "utility-link"
301- >
302- Install from Docker Hub
303- </ a >
304- { hasAccessToken && (
305- < button type = "button" class = "utility-button" onClick = { onClearToken } >
306- Clear saved token
307- </ button >
308- ) }
309309 </ div >
310310 </ section >
311311 ) ;
You can’t perform that action at this time.
0 commit comments