recce-nightly 1.4.0.20250520__py3-none-any.whl → 1.5.0.20250521__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of recce-nightly might be problematic. Click here for more details.

Files changed (33) hide show
  1. recce/VERSION +1 -1
  2. recce/cli.py +40 -23
  3. recce/data/404.html +1 -1
  4. recce/data/_next/static/chunks/{778-aef312bffb4c0312.js → 758-5bc37e5174e24ea3.js} +2 -2
  5. recce/data/_next/static/chunks/9746af58-013fa80917592388.js +1 -0
  6. recce/data/_next/static/chunks/app/page-4b2bbb416449c209.js +1 -0
  7. recce/data/index.html +2 -2
  8. recce/data/index.txt +2 -2
  9. recce/event/__init__.py +4 -0
  10. recce/models/__init__.py +3 -0
  11. recce/tasks/__init__.py +16 -0
  12. recce/util/__init__.py +3 -0
  13. recce/util/api_token.py +69 -0
  14. recce/util/io.py +3 -0
  15. recce/util/recce_cloud.py +18 -0
  16. {recce_nightly-1.4.0.20250520.dist-info → recce_nightly-1.5.0.20250521.dist-info}/METADATA +1 -1
  17. {recce_nightly-1.4.0.20250520.dist-info → recce_nightly-1.5.0.20250521.dist-info}/RECORD +31 -30
  18. tests/adapter/dbt_adapter/dbt_test_helper.py +2 -2
  19. tests/tasks/conftest.py +1 -1
  20. tests/tasks/test_profile.py +0 -1
  21. tests/tasks/test_query.py +7 -7
  22. tests/test_core.py +1 -1
  23. tests/test_dbt.py +1 -1
  24. tests/test_server.py +1 -1
  25. tests/test_state.py +0 -2
  26. recce/data/_next/static/chunks/9746af58-d74bef4d03eea6ab.js +0 -1
  27. recce/data/_next/static/chunks/app/page-7086764277331fcb.js +0 -1
  28. /recce/data/_next/static/{POqJHyxRZAKc5Vb7Bi6Gz → c4FL-WGbZZW6QqfPTZTNc}/_buildManifest.js +0 -0
  29. /recce/data/_next/static/{POqJHyxRZAKc5Vb7Bi6Gz → c4FL-WGbZZW6QqfPTZTNc}/_ssgManifest.js +0 -0
  30. {recce_nightly-1.4.0.20250520.dist-info → recce_nightly-1.5.0.20250521.dist-info}/WHEEL +0 -0
  31. {recce_nightly-1.4.0.20250520.dist-info → recce_nightly-1.5.0.20250521.dist-info}/entry_points.txt +0 -0
  32. {recce_nightly-1.4.0.20250520.dist-info → recce_nightly-1.5.0.20250521.dist-info}/licenses/LICENSE +0 -0
  33. {recce_nightly-1.4.0.20250520.dist-info → recce_nightly-1.5.0.20250521.dist-info}/top_level.txt +0 -0
recce/VERSION CHANGED
@@ -1 +1 @@
1
- 1.4.0.20250520
1
+ 1.5.0.20250521
recce/cli.py CHANGED
@@ -5,21 +5,23 @@ from typing import List
5
5
 
6
6
  import click
7
7
  import uvicorn
8
+ from click import Abort
8
9
 
9
10
  from recce import event
10
11
  from recce.artifact import download_dbt_artifacts, upload_dbt_artifacts
11
12
  from recce.config import RECCE_CONFIG_FILE, RECCE_ERROR_LOG_FILE, RecceConfig
12
- from recce.event import get_recce_api_token, update_user_profile
13
+ from recce.exceptions import RecceConfigException
13
14
  from recce.git import current_branch, current_default_branch
14
15
  from recce.run import check_github_ci_env, cli_run
15
16
  from recce.state import RecceCloudStateManager, RecceShareStateManager, RecceStateLoader
16
17
  from recce.summary import generate_markdown_summary
18
+ from recce.util.api_token import prepare_api_token, show_invalid_api_token_message
17
19
  from recce.util.logger import CustomFormatter
18
20
  from recce.util.recce_cloud import (
19
- RECCE_CLOUD_API_HOST,
20
21
  RecceCloudException,
21
22
  get_recce_cloud_onboarding_state,
22
23
  )
24
+
23
25
  from .core import RecceContext, set_default_context
24
26
  from .event.track import TrackCommand
25
27
 
@@ -102,7 +104,9 @@ recce_options = [
102
104
 
103
105
  recce_cloud_options = [
104
106
  click.option("--cloud", is_flag=True, help="Fetch the state file from cloud."),
105
- click.option("--cloud-token", help="The token used by Recce Cloud.", type=click.STRING, envvar="GITHUB_TOKEN"),
107
+ click.option(
108
+ "--cloud-token", help="The GitHub token used by Recce Cloud.", type=click.STRING, envvar="GITHUB_TOKEN"
109
+ ),
106
110
  click.option(
107
111
  "--state-file-host",
108
112
  help="The host to fetch the state file from.",
@@ -249,7 +253,9 @@ def diff(sql, primary_keys: List[str] = None, keep_shape: bool = False, keep_equ
249
253
  @click.option("--port", default=8000, show_default=True, help="The port to bind to.", type=int)
250
254
  @click.option("--lifetime", default=0, show_default=True, help="The lifetime of the server in seconds.", type=int)
251
255
  @click.option("--review", is_flag=True, help="Open the state file in the review mode.")
252
- @click.option("--api-token", help="The token used by Recce Cloud API.", type=click.STRING, envvar="RECCE_API_TOKEN")
256
+ @click.option(
257
+ "--api-token", help="The personal token generated by Recce Cloud.", type=click.STRING, envvar="RECCE_API_TOKEN"
258
+ )
253
259
  @add_options(dbt_related_options)
254
260
  @add_options(sqlmesh_related_options)
255
261
  @add_options(recce_options)
@@ -304,7 +310,11 @@ def server(host, port, lifetime, state_file=None, **kwargs):
304
310
  flag["show_onboarding_guide"] = False if cloud_onboarding_state == "completed" else True
305
311
 
306
312
  auth_options = {}
307
- api_token = kwargs.get("api_token") if kwargs.get("api_token") else get_recce_api_token()
313
+ try:
314
+ api_token = prepare_api_token(**kwargs)
315
+ except RecceConfigException:
316
+ show_invalid_api_token_message()
317
+ exit(1)
308
318
  auth_options["api_token"] = api_token
309
319
 
310
320
  # Check Single Environment Onboarding Mode if the review mode is False
@@ -534,7 +544,7 @@ def cloud(**kwargs):
534
544
 
535
545
 
536
546
  @cloud.command(cls=TrackCommand)
537
- @click.option("--cloud-token", help="The token used by Recce Cloud.", type=click.STRING, envvar="GITHUB_TOKEN")
547
+ @click.option("--cloud-token", help="The GitHub token used by Recce Cloud.", type=click.STRING, envvar="GITHUB_TOKEN")
538
548
  @click.option(
539
549
  "--state-file-host",
540
550
  help="The host to fetch the state file from.",
@@ -618,7 +628,7 @@ def purge(**kwargs):
618
628
 
619
629
  @cloud.command(cls=TrackCommand)
620
630
  @click.argument("state_file", type=click.Path(exists=True))
621
- @click.option("--cloud-token", help="The token used by Recce Cloud.", type=click.STRING, envvar="GITHUB_TOKEN")
631
+ @click.option("--cloud-token", help="The GitHub token used by Recce Cloud.", type=click.STRING, envvar="GITHUB_TOKEN")
622
632
  @click.option(
623
633
  "--state-file-host",
624
634
  help="The host to fetch the state file from.",
@@ -686,7 +696,7 @@ def upload(state_file, **kwargs):
686
696
  default=DEFAULT_RECCE_STATE_FILE,
687
697
  show_default=True,
688
698
  )
689
- @click.option("--cloud-token", help="The token used by Recce Cloud.", type=click.STRING, envvar="GITHUB_TOKEN")
699
+ @click.option("--cloud-token", help="The GitHub token used by Recce Cloud.", type=click.STRING, envvar="GITHUB_TOKEN")
690
700
  @click.option(
691
701
  "--state-file-host",
692
702
  help="The host to fetch the state file from.",
@@ -738,7 +748,7 @@ def download(**kwargs):
738
748
 
739
749
 
740
750
  @cloud.command(cls=TrackCommand)
741
- @click.option("--cloud-token", help="The token used by Recce Cloud.", type=click.STRING, envvar="GITHUB_TOKEN")
751
+ @click.option("--cloud-token", help="The GitHub token used by Recce Cloud.", type=click.STRING, envvar="GITHUB_TOKEN")
742
752
  @click.option(
743
753
  "--branch",
744
754
  "-b",
@@ -835,7 +845,7 @@ def _download_artifacts(branch, cloud_token, console, kwargs, password, target_p
835
845
 
836
846
 
837
847
  @cloud.command(cls=TrackCommand)
838
- @click.option("--cloud-token", help="The token used by Recce Cloud.", type=click.STRING, envvar="GITHUB_TOKEN")
848
+ @click.option("--cloud-token", help="The GitHub token used by Recce Cloud.", type=click.STRING, envvar="GITHUB_TOKEN")
839
849
  @click.option(
840
850
  "--branch",
841
851
  "-b",
@@ -883,7 +893,7 @@ def download_artifacts(**kwargs):
883
893
 
884
894
 
885
895
  @cloud.command(cls=TrackCommand)
886
- @click.option("--cloud-token", help="The token used by Recce Cloud.", type=click.STRING, envvar="GITHUB_TOKEN")
896
+ @click.option("--cloud-token", help="The GitHub token used by Recce Cloud.", type=click.STRING, envvar="GITHUB_TOKEN")
887
897
  @click.option(
888
898
  "--branch",
889
899
  "-b",
@@ -957,7 +967,9 @@ def artifact(**kwargs):
957
967
 
958
968
  @cli.command(cls=TrackCommand)
959
969
  @click.argument("state_file", type=click.Path(exists=True))
960
- @click.option("--api-token", help="The token used by Recce Cloud API.", type=click.STRING, envvar="RECCE_API_TOKEN")
970
+ @click.option(
971
+ "--api-token", help="The personal token generated by Recce Cloud.", type=click.STRING, envvar="RECCE_API_TOKEN"
972
+ )
961
973
  def share(state_file, **kwargs):
962
974
  """
963
975
  Share the state file
@@ -969,15 +981,14 @@ def share(state_file, **kwargs):
969
981
  cloud_options = None
970
982
 
971
983
  # read or input the api token
972
- api_token = kwargs.get("api_token") if kwargs.get("api_token") else get_recce_api_token()
973
- if api_token is None:
974
- console.print(
975
- "An API token is required to this. This can be obtained in your user account settings.\n"
976
- f"{RECCE_CLOUD_API_HOST}/settings#tokens\n"
977
- "Your API token will be added to '~/.recce/profile.yml' for more convenient sharing."
978
- )
979
- api_token = click.prompt("Your Recce API token", type=str, hide_input=True, show_default=False)
980
- update_user_profile({"api_token": api_token})
984
+ try:
985
+ api_token = prepare_api_token(interaction=True, **kwargs)
986
+ except Abort:
987
+ console.print("[yellow]Abort[/yellow]")
988
+ exit(0)
989
+ except RecceConfigException:
990
+ show_invalid_api_token_message()
991
+ exit(1)
981
992
 
982
993
  auth_options = {"api_token": api_token}
983
994
 
@@ -1047,8 +1058,14 @@ def read_only(host, port, lifetime, state_file=None, **kwargs):
1047
1058
  console.print(f"[[red]Error[/red]] {message}")
1048
1059
  exit(1)
1049
1060
 
1050
- app.state = AppState(command="read_only", state_loader=state_loader, kwargs=kwargs, flag=flag, lifetime=lifetime,
1051
- share_url=kwargs.get("share_url"))
1061
+ app.state = AppState(
1062
+ command="read_only",
1063
+ state_loader=state_loader,
1064
+ kwargs=kwargs,
1065
+ flag=flag,
1066
+ lifetime=lifetime,
1067
+ share_url=kwargs.get("share_url"),
1068
+ )
1052
1069
  set_default_context(RecceContext.load(**kwargs, review=is_review, state_loader=state_loader))
1053
1070
 
1054
1071
  uvicorn.run(app, host=host, port=port, lifespan="on")
recce/data/404.html CHANGED
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/88b8abc134cfd59a.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-b787cb1a4f2293de.js"/><script src="/_next/static/chunks/1f229bf6-d9fe92e56db8d93b.js" async=""></script><script src="/_next/static/chunks/700-3b65fc3666820d00.js" async=""></script><script src="/_next/static/chunks/main-app-0225a2255968e566.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>recce</title><meta name="description" content="Recce: Data validation toolkit for comprehensive PR review"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-b787cb1a4f2293de.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/88b8abc134cfd59a.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[37194,[],\"\"]\n4:I[79137,[],\"\"]\n5:I[63846,[],\"\"]\nb:I[67160,[],\"\"]\n6:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n7:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n8:{\"display\":\"inline-block\"}\n9:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nc:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"POqJHyxRZAKc5Vb7Bi6Gz\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/88b8abc134cfd59a.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$6\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$7\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$8\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$9\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$La\"],\"globalErrorComponent\":\"$b\",\"missingSlots\":\"$Wc\"}]\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"recce\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Recce: Data validation toolkit for comprehensive PR review\"}]]\n3:null\n"])</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/88b8abc134cfd59a.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-b787cb1a4f2293de.js"/><script src="/_next/static/chunks/1f229bf6-d9fe92e56db8d93b.js" async=""></script><script src="/_next/static/chunks/700-3b65fc3666820d00.js" async=""></script><script src="/_next/static/chunks/main-app-0225a2255968e566.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>recce</title><meta name="description" content="Recce: Data validation toolkit for comprehensive PR review"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-b787cb1a4f2293de.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/88b8abc134cfd59a.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[37194,[],\"\"]\n4:I[79137,[],\"\"]\n5:I[63846,[],\"\"]\nb:I[67160,[],\"\"]\n6:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n7:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n8:{\"display\":\"inline-block\"}\n9:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nc:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"c4FL-WGbZZW6QqfPTZTNc\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/88b8abc134cfd59a.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$6\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$7\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$8\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$9\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$La\"],\"globalErrorComponent\":\"$b\",\"missingSlots\":\"$Wc\"}]\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"recce\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Recce: Data validation toolkit for comprehensive PR review\"}]]\n3:null\n"])</script></body></html>