recce-nightly 1.4.0.20250519__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.
- recce/VERSION +1 -1
- recce/adapter/dbt_adapter/__init__.py +2 -1
- recce/cli.py +40 -23
- recce/data/404.html +1 -1
- recce/data/_next/static/chunks/{778-aef312bffb4c0312.js → 758-5bc37e5174e24ea3.js} +2 -2
- recce/data/_next/static/chunks/9746af58-013fa80917592388.js +1 -0
- recce/data/_next/static/chunks/app/page-4b2bbb416449c209.js +1 -0
- recce/data/index.html +2 -2
- recce/data/index.txt +2 -2
- recce/event/__init__.py +4 -0
- recce/models/__init__.py +3 -0
- recce/tasks/__init__.py +16 -0
- recce/util/__init__.py +3 -0
- recce/util/api_token.py +69 -0
- recce/util/breaking.py +2 -2
- recce/util/cll.py +231 -199
- recce/util/io.py +3 -0
- recce/util/recce_cloud.py +18 -0
- {recce_nightly-1.4.0.20250519.dist-info → recce_nightly-1.5.0.20250521.dist-info}/METADATA +1 -1
- {recce_nightly-1.4.0.20250519.dist-info → recce_nightly-1.5.0.20250521.dist-info}/RECORD +34 -33
- {recce_nightly-1.4.0.20250519.dist-info → recce_nightly-1.5.0.20250521.dist-info}/WHEEL +1 -1
- tests/adapter/dbt_adapter/dbt_test_helper.py +2 -2
- tests/tasks/conftest.py +1 -1
- tests/tasks/test_profile.py +0 -1
- tests/tasks/test_query.py +7 -7
- tests/test_core.py +1 -1
- tests/test_dbt.py +1 -1
- tests/test_server.py +1 -1
- tests/test_state.py +0 -2
- recce/data/_next/static/chunks/9746af58-d74bef4d03eea6ab.js +0 -1
- recce/data/_next/static/chunks/app/page-7086764277331fcb.js +0 -1
- /recce/data/_next/static/{eIqnO-Nu8atPURSm-S7vW → c4FL-WGbZZW6QqfPTZTNc}/_buildManifest.js +0 -0
- /recce/data/_next/static/{eIqnO-Nu8atPURSm-S7vW → c4FL-WGbZZW6QqfPTZTNc}/_ssgManifest.js +0 -0
- {recce_nightly-1.4.0.20250519.dist-info → recce_nightly-1.5.0.20250521.dist-info}/entry_points.txt +0 -0
- {recce_nightly-1.4.0.20250519.dist-info → recce_nightly-1.5.0.20250521.dist-info}/licenses/LICENSE +0 -0
- {recce_nightly-1.4.0.20250519.dist-info → recce_nightly-1.5.0.20250521.dist-info}/top_level.txt +0 -0
recce/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.
|
|
1
|
+
1.5.0.20250521
|
|
@@ -24,7 +24,8 @@ from typing import (
|
|
|
24
24
|
|
|
25
25
|
from recce.event import log_performance
|
|
26
26
|
from recce.exceptions import RecceException
|
|
27
|
-
from recce.util.cll import CLLPerformanceTracking
|
|
27
|
+
from recce.util.cll import CLLPerformanceTracking
|
|
28
|
+
from recce.util.cll import cll_old as cll
|
|
28
29
|
from recce.util.lineage import find_downstream, find_upstream
|
|
29
30
|
|
|
30
31
|
from ...tasks.profile import ProfileTask
|
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.
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
)
|
|
979
|
-
|
|
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(
|
|
1051
|
-
|
|
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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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\":\"
|
|
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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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>
|