failproofai 0.0.13 → 0.0.14-beta.1
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.
- package/.next/standalone/.codex/hooks.json +6 -6
- package/.next/standalone/.cursor/hooks.json +6 -6
- package/.next/standalone/.factory/hooks.json +112 -0
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/run/route.js +3 -3
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +2 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
- package/.next/standalone/.next/server/app/policies/page.js +1 -1
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js +3 -2
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +5 -3
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js +1 -1
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0--lkk6._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-219ec._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__04_h-a5._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06cuf1y._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08w4wmd._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g6bbuw._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jllheg._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jnjf2t._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q-v9z2._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q0qzx1._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q2nbsl._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rv7m0k._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__16le-kd._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__17g9wh7._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1d9qen3._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ffkmds._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1fwl2mz._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1legmza._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1mrihkj._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1myjm-d._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qb590j._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qxztj-._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1shcqgr._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1xuedea._.js +3 -0
- package/.next/standalone/.next/server/chunks/{_1z062h5._.js → _1vslkoe._.js} +2 -2
- package/.next/standalone/.next/server/chunks/lib_factory-projects_ts_1eo_bk-._.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_openclaw-projects_ts_0gc-p24._.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_17k9e3w.js +24 -12
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oi._.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +1 -1
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00cz9as._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__015_i4t._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__030k0c6._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__03lv-pe._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__042d3cd._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__05r_17v._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09q1168._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__108slqn._.js → [root-of-the-server]__0brjczq._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e2l3c1._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0hci7t3._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0hdsupo._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0p84xee._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qeuy9c._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s89hoe._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__07iom4f._.js → [root-of-the-server]__0wp9w6i._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ynf7tx._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__170799-._.js +12 -9
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__17ai7sy._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1d8omgc._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1nq7ivq._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1tkjqka._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_05whahf._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0_9_ytf._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_11_p9y8._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0ul5rf_._.js → _1_ozgif._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_1p0-leb._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_087bt9w._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_1fvisnp._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_209u41o._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/lib_0xkhw_v._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/lib_antigravity-projects_ts_0_6zf11._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/lib_devin-projects_ts_0a64qdy._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/lib_factory-projects_ts_1uyaahq._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/lib_goose-projects_ts_0zkscri._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/lib_openclaw-projects_ts_0qxq3bp._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_html-to-image_es_index_13p7zob.js → node_modules_html-to-image_es_index_12rjfea.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1ezd2jf._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1tnuifj._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +5 -5
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +10 -10
- package/.next/standalone/.next/static/chunks/{13f1kmjea-0md.js → 02jcotghcxrbu.js} +1 -1
- package/.next/standalone/.next/static/chunks/{30ysv-_8jj052.js → 0d5lypu1zs21r.js} +1 -1
- package/.next/standalone/.next/static/chunks/0emg30_6svycu.js +1 -0
- package/.next/standalone/.next/static/chunks/0o9wpnze1ey8y.js +6 -0
- package/.next/standalone/.next/static/chunks/{05apzuand0c22.js → 1359o5785rmve.js} +2 -2
- package/.next/standalone/.next/static/chunks/20tuctw38jbgw.js +1 -0
- package/.next/standalone/.next/static/chunks/{0vc0eak148vo6.js → 2ldhnaweu9ew3.js} +1 -1
- package/.next/standalone/.next/static/chunks/{23c7v2svx90dp.js → 2vav_x0_336ds.js} +1 -1
- package/.next/standalone/.next/static/chunks/3-ogr79xqbw0h.js +1 -0
- package/.next/standalone/.next/static/chunks/36j05kb2x323i.css +2 -0
- package/.next/standalone/.next/static/chunks/3cg7x0joi2b98.js +1 -0
- package/.next/standalone/.next/static/chunks/{36wdtkgdf0zrd.js → 3k87p-tijud-4.js} +1 -1
- package/.next/standalone/.next/static/chunks/{2cejn75gug3j8.js → 3kmaqcp7rldad.js} +1 -1
- package/.next/standalone/.next/static/chunks/{turbopack-0vavqo2d-tlt3.js → turbopack-10hj8t5pf33tu.js} +1 -1
- package/.next/standalone/.opencode/plugins/failproofai.mjs +30 -11
- package/.next/standalone/app/api/audit/run/route.ts +2 -0
- package/.next/standalone/app/audit/_components/empty-state.tsx +1 -1
- package/.next/standalone/app/components/global-error-listeners.tsx +27 -0
- package/.next/standalone/app/globals.css +25 -1
- package/.next/standalone/app/policies/hooks-client.tsx +2 -4
- package/.next/standalone/app/project/[name]/page.tsx +30 -10
- package/.next/standalone/app/project/[name]/session/[sessionId]/page.tsx +71 -21
- package/.next/standalone/assets/logos/antigravity.svg +1 -0
- package/.next/standalone/assets/logos/devin.svg +1 -0
- package/.next/standalone/assets/logos/factory-dark.png +0 -0
- package/.next/standalone/assets/logos/factory-light.png +0 -0
- package/.next/standalone/assets/logos/goose-dark.svg +1 -0
- package/.next/standalone/assets/logos/goose-light.svg +1 -0
- package/.next/standalone/assets/logos/openclaw.svg +22 -0
- package/.next/standalone/ci/cli-integration/Dockerfile +47 -0
- package/.next/standalone/ci/cli-integration/README.md +69 -0
- package/.next/standalone/ci/cli-integration/canary-policies.mjs +45 -0
- package/.next/standalone/ci/cli-integration/capture-tokens.sh +48 -0
- package/.next/standalone/ci/cli-integration/inject-tokens.sh +44 -0
- package/.next/standalone/ci/cli-integration/install-clis.sh +91 -0
- package/.next/standalone/ci/cli-integration/probe-cli.sh +208 -0
- package/.next/standalone/ci/cli-integration/report.js +74 -0
- package/.next/standalone/ci/cli-integration/run.sh +107 -0
- package/.next/standalone/components/navbar.tsx +5 -11
- package/.next/standalone/components/reach-developers.tsx +2 -2
- package/.next/standalone/docker-hook-sync/Dockerfile +8 -4
- package/.next/standalone/lib/antigravity-projects.ts +224 -0
- package/.next/standalone/lib/antigravity-sessions.ts +283 -0
- package/.next/standalone/lib/cli-registry.ts +26 -6
- package/.next/standalone/lib/devin-projects.ts +141 -0
- package/.next/standalone/lib/devin-sessions.ts +343 -0
- package/.next/standalone/lib/download-session.ts +56 -5
- package/.next/standalone/lib/error-origin.ts +67 -0
- package/.next/standalone/lib/factory-projects.ts +109 -0
- package/.next/standalone/lib/factory-sessions.ts +312 -0
- package/.next/standalone/lib/goose-projects.ts +148 -0
- package/.next/standalone/lib/goose-sessions.ts +296 -0
- package/.next/standalone/lib/install-check.ts +231 -0
- package/.next/standalone/lib/openclaw-projects.ts +182 -0
- package/.next/standalone/lib/openclaw-sessions.ts +284 -0
- package/.next/standalone/lib/projects.ts +33 -9
- package/.next/standalone/lib/telemetry-sanitize.ts +43 -0
- package/.next/standalone/openclaw-plugin/index.js +223 -0
- package/.next/standalone/openclaw-plugin/openclaw.plugin.json +6 -0
- package/.next/standalone/openclaw-plugin/package.json +12 -0
- package/.next/standalone/package.json +2 -3
- package/.next/standalone/server.js +1 -1
- package/README.md +94 -62
- package/bin/failproofai.mjs +98 -30
- package/dist/cli.mjs +12499 -9243
- package/lib/antigravity-projects.ts +224 -0
- package/lib/antigravity-sessions.ts +283 -0
- package/lib/cli-registry.ts +26 -6
- package/lib/devin-projects.ts +141 -0
- package/lib/devin-sessions.ts +343 -0
- package/lib/download-session.ts +56 -5
- package/lib/error-origin.ts +67 -0
- package/lib/factory-projects.ts +109 -0
- package/lib/factory-sessions.ts +312 -0
- package/lib/goose-projects.ts +148 -0
- package/lib/goose-sessions.ts +296 -0
- package/lib/install-check.ts +231 -0
- package/lib/openclaw-projects.ts +182 -0
- package/lib/openclaw-sessions.ts +284 -0
- package/lib/projects.ts +33 -9
- package/lib/telemetry-sanitize.ts +43 -0
- package/openclaw-plugin/index.js +223 -0
- package/openclaw-plugin/openclaw.plugin.json +6 -0
- package/openclaw-plugin/package.json +12 -0
- package/package.json +2 -3
- package/scripts/dev-hook.mjs +292 -0
- package/scripts/install-diagnosis.mjs +5 -8
- package/scripts/install-telemetry.mjs +12 -4
- package/scripts/launch.ts +4 -8
- package/scripts/sync-agent-cli-harnesses-prompt.md +7 -10
- package/scripts/translate-docs/cli.ts +120 -53
- package/scripts/translate-docs/config.ts +57 -13
- package/scripts/translate-docs/mdx-translator.ts +177 -28
- package/scripts/translate-docs/mintlify-nav.ts +91 -10
- package/scripts/translate-docs/readme-translator.ts +13 -5
- package/scripts/translate-docs/translator.ts +38 -2
- package/scripts/translate-docs/types.ts +3 -0
- package/scripts/validate-mdx.ts +12 -4
- package/src/audit/cli-adapters/antigravity.ts +87 -0
- package/src/audit/cli-adapters/devin.ts +53 -0
- package/src/audit/cli-adapters/factory.ts +75 -0
- package/src/audit/cli-adapters/goose.ts +53 -0
- package/src/audit/cli-adapters/index.ts +30 -6
- package/src/audit/cli-adapters/openclaw.ts +56 -0
- package/src/audit/cli.ts +83 -8
- package/src/audit/report.ts +1 -1
- package/src/audit/types.ts +1 -1
- package/src/hooks/builtin-policies.ts +5 -5
- package/src/hooks/configure-wizard.ts +356 -0
- package/src/hooks/handler.ts +283 -218
- package/src/hooks/hook-telemetry.ts +43 -3
- package/src/hooks/install-prompt.ts +92 -173
- package/src/hooks/integrations.ts +739 -138
- package/src/hooks/manager.ts +46 -2
- package/src/hooks/policy-evaluator.ts +301 -121
- package/src/hooks/policy-presets.ts +71 -0
- package/src/hooks/resolve-cwd.ts +1 -1
- package/src/hooks/resolve-permission-mode.ts +1 -5
- package/src/hooks/resolve-transcript-path.ts +25 -7
- package/src/hooks/tool-name-canonicalize.ts +36 -3
- package/src/hooks/tui.ts +578 -0
- package/src/hooks/types.ts +447 -109
- package/.next/standalone/.gemini/settings.json +0 -147
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cag8qd._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cefjd9._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ekj92q._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__12v-lma._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__136y39g._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13h8pzr._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1hgv_75._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04bqvos._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dqgs96._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0q5rfxg._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qukut7._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ql-mch._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_11v0g3z._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/lib_gemini-projects_ts_1c7bgx-._.js +0 -3
- package/.next/standalone/.next/static/chunks/0fa7j157kg9_d.js +0 -1
- package/.next/standalone/.next/static/chunks/0nrah-qv6smeg.js +0 -6
- package/.next/standalone/.next/static/chunks/0wtagd8a5gwq-.js +0 -1
- package/.next/standalone/.next/static/chunks/1c8i78p7t1i-5.js +0 -1
- package/.next/standalone/.next/static/chunks/25qr0e6ez0ei0.js +0 -1
- package/.next/standalone/.next/static/chunks/25s52un3k_wht.css +0 -2
- package/.next/standalone/assets/logos/gemini-dark.svg +0 -13
- package/.next/standalone/assets/logos/gemini-light.svg +0 -13
- package/.next/standalone/lib/gemini-projects.ts +0 -243
- package/.next/standalone/lib/gemini-sessions.ts +0 -365
- package/lib/gemini-projects.ts +0 -243
- package/lib/gemini-sessions.ts +0 -365
- package/scripts/postinstall.mjs +0 -243
- package/scripts/preuninstall.mjs +0 -131
- package/src/audit/cli-adapters/gemini.ts +0 -51
- package/src/hooks/first-run-nudge.ts +0 -146
- /package/.next/standalone/.next/static/{kmzdjTLVs6LqsfyOaUf69 → LkN-JjmhKGmL-WklH7WVi}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{kmzdjTLVs6LqsfyOaUf69 → LkN-JjmhKGmL-WklH7WVi}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{kmzdjTLVs6LqsfyOaUf69 → LkN-JjmhKGmL-WklH7WVi}/_ssgManifest.js +0 -0
|
@@ -32,7 +32,6 @@ tracked in `src/hooks/types.ts` and written to disk by `src/hooks/integrations.t
|
|
|
32
32
|
| Cursor Agent | `CURSOR_HOOK_EVENT_TYPES` | `CURSOR_EVENT_MAP` | `.cursor/hooks.json` |
|
|
33
33
|
| OpenCode | `OPENCODE_HOOK_EVENT_TYPES` | `OPENCODE_EVENT_MAP` | `.opencode/opencode.json` + `.opencode/plugins/failproofai.mjs` |
|
|
34
34
|
| Pi | `PI_HOOK_EVENT_TYPES` | `PI_EVENT_MAP` | `.pi/settings.json` |
|
|
35
|
-
| Gemini CLI | `GEMINI_HOOK_EVENT_TYPES` | `GEMINI_EVENT_MAP` | `.gemini/settings.json` |
|
|
36
35
|
|
|
37
36
|
## What "drift" means — three scopes
|
|
38
37
|
|
|
@@ -62,7 +61,7 @@ For each verified CLI, compare the upstream docs to this repo across three scope
|
|
|
62
61
|
when you only need to **inspect** a committed fixture, prefer
|
|
63
62
|
`git show HEAD:<path>` (e.g. `git show HEAD:.codex/hooks.json`) — it is never
|
|
64
63
|
blocked and is the reliable way to read `.claude/settings.json`, `.codex/hooks.json`,
|
|
65
|
-
`.cursor/hooks.json`, `.github/hooks/failproofai.json`,
|
|
64
|
+
`.cursor/hooks.json`, `.github/hooks/failproofai.json`,
|
|
66
65
|
`.pi/settings.json`, and `.opencode/*`.
|
|
67
66
|
- Do **NOT** run `failproofai policies --install` (or any `failproofai` subcommand)
|
|
68
67
|
to regenerate a fixture — it is blocked. Edit fixtures by hand.
|
|
@@ -76,7 +75,7 @@ Spawn one subagent per CLI (seven, in parallel). Each subagent, for its CLI:
|
|
|
76
75
|
**settings-file schema** (top-level keys, per-entry shape, command field name,
|
|
77
76
|
timeout field name **and unit**, and whether `matcher` / `version` / `$schema`
|
|
78
77
|
are present). **Use upstream casing exactly** — Codex snake_case, Cursor
|
|
79
|
-
camelCase, OpenCode dot.namespaced, Pi snake_case, Claude/Copilot
|
|
78
|
+
camelCase, OpenCode dot.namespaced, Pi snake_case, Claude/Copilot
|
|
80
79
|
PascalCase. Do **not** normalize.
|
|
81
80
|
2. Compare against this repo: the CLI's `*HOOK_EVENT_TYPES` array + paired
|
|
82
81
|
`*EVENT_MAP` (scope 1); its `*_TOOL_MAP` / `*_TOOL_INPUT_MAP` and its branch in
|
|
@@ -98,7 +97,6 @@ surface is documented in the package source, not a clean enumeration).
|
|
|
98
97
|
| Cursor | https://cursor.com/docs/hooks |
|
|
99
98
|
| OpenCode | https://opencode.ai/docs/plugins/ |
|
|
100
99
|
| Pi | https://www.npmjs.com/package/@mariozechner/pi-coding-agent |
|
|
101
|
-
| Gemini | https://geminicli.com/docs/hooks/ · https://geminicli.com/docs/reference/tools/ (tool names) |
|
|
102
100
|
|
|
103
101
|
## Phase 2 — Decide what to do (do this BEFORE editing any files)
|
|
104
102
|
|
|
@@ -122,7 +120,6 @@ changes that block a clean stop on the comment / no-op paths below.
|
|
|
122
120
|
|
|
123
121
|
> This open sync PR is missing newly-detected drift:
|
|
124
122
|
> - **Cursor**: upstream added event `afterEdit` — append to `CURSOR_HOOK_EVENT_TYPES` (+ a `CURSOR_EVENT_MAP` entry).
|
|
125
|
-
> - **Gemini**: the `run_shell_command` tool was renamed to `shell` — the `GEMINI_TOOL_MAP` key is stale.
|
|
126
123
|
>
|
|
127
124
|
> (hook-sync bot — please fold these into this PR rather than opening a second sync PR.)
|
|
128
125
|
|
|
@@ -140,7 +137,7 @@ requires.
|
|
|
140
137
|
- **Append** new events just before `] as const`, preserving upstream casing.
|
|
141
138
|
- **Delete** removed events; if the CLI has an `*EVENT_MAP`, also delete the same
|
|
142
139
|
key from that map (the `Record` is exhaustive — a stale key fails `tsc`).
|
|
143
|
-
- For **map-bearing CLIs** (Codex, Cursor, OpenCode, Pi
|
|
140
|
+
- For **map-bearing CLIs** (Codex, Cursor, OpenCode, Pi), do **NOT** invent
|
|
144
141
|
the canonical mapping for a newly-added event — leave it out of the `*EVENT_MAP`
|
|
145
142
|
so `tsc` fails intentionally, and add a reviewer-checklist item to the PR body
|
|
146
143
|
(see below). For **Claude and Copilot** (no map), the build stays green.
|
|
@@ -148,9 +145,9 @@ requires.
|
|
|
148
145
|
- If `HOOK_EVENT_TYPES` (Claude) changed: in `__tests__/hooks/manager.test.ts`,
|
|
149
146
|
update the `installs hooks for all <N> event types` description AND both
|
|
150
147
|
`expect(Object.keys(written.hooks)).toHaveLength(<N>)` assertions.
|
|
151
|
-
- If `
|
|
152
|
-
update the `expect(
|
|
153
|
-
|
|
148
|
+
- If a CLI's `*_HOOK_EVENT_TYPES` changed: in `__tests__/hooks/integrations.test.ts`,
|
|
149
|
+
update the matching `expect(<cli>.eventTypes).toHaveLength(<N>)` assertion AND the
|
|
150
|
+
description string.
|
|
154
151
|
- Locate these by searching for the current count number.
|
|
155
152
|
|
|
156
153
|
### Scope 2 / Scope 3 (tool schema / settings-file shape)
|
|
@@ -211,7 +208,7 @@ The PR **body** must contain, in order:
|
|
|
211
208
|
`__tests__/e2e/hooks/<cli>-integration.e2e.test.ts`, the seven dogfood fixtures
|
|
212
209
|
(`.claude/settings.json`, `.codex/hooks.json`, `.cursor/hooks.json`,
|
|
213
210
|
`.github/hooks/failproofai.json`, `.opencode/opencode.json`,
|
|
214
|
-
`.opencode/plugins/failproofai.mjs`, `.pi/settings.json
|
|
211
|
+
`.opencode/plugins/failproofai.mjs`, `.pi/settings.json`),
|
|
215
212
|
and `CHANGELOG.md`.
|
|
216
213
|
- Do **NOT** edit `.failproofai/policies-config.json` (the entrypoint manages it),
|
|
217
214
|
`src/hooks/handler.ts`, `src/hooks/manager.ts`, or any other source file.
|
|
@@ -3,10 +3,23 @@ import { parseArgs } from "node:util";
|
|
|
3
3
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
4
4
|
import { dirname, join, relative } from "node:path";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
|
-
import {
|
|
7
|
-
|
|
6
|
+
import {
|
|
7
|
+
LANGUAGES,
|
|
8
|
+
getLanguagesByTier,
|
|
9
|
+
getLanguageByCode,
|
|
10
|
+
getModelForTier,
|
|
11
|
+
} from "./config";
|
|
12
|
+
import {
|
|
13
|
+
getEnglishMdxPages,
|
|
14
|
+
translateMdxPage,
|
|
15
|
+
pruneOrphanedTranslations,
|
|
16
|
+
} from "./mdx-translator";
|
|
8
17
|
import { translateReadme } from "./readme-translator";
|
|
9
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
getNavigationPageReferences,
|
|
20
|
+
updateDocsJson,
|
|
21
|
+
readDocsConfig,
|
|
22
|
+
} from "./mintlify-nav";
|
|
10
23
|
import { readCache, writeCache, isCached, setCacheEntry } from "./cache";
|
|
11
24
|
import type { TranslationResult } from "./types";
|
|
12
25
|
|
|
@@ -24,6 +37,8 @@ const { values: args } = parseArgs({
|
|
|
24
37
|
force: { type: "boolean", short: "f", default: false },
|
|
25
38
|
"update-nav": { type: "boolean", default: false },
|
|
26
39
|
validate: { type: "boolean", default: false },
|
|
40
|
+
prune: { type: "boolean", default: false },
|
|
41
|
+
"no-prune": { type: "boolean", default: false },
|
|
27
42
|
model: { type: "string", short: "m" },
|
|
28
43
|
help: { type: "boolean", short: "h", default: false },
|
|
29
44
|
},
|
|
@@ -44,6 +59,8 @@ Options:
|
|
|
44
59
|
-f, --force Ignore cache, re-translate everything
|
|
45
60
|
--update-nav Regenerate docs.json navigation after translation
|
|
46
61
|
--validate Check all nav references resolve to files
|
|
62
|
+
--prune Only delete translations whose English source is gone
|
|
63
|
+
--no-prune Skip the prune step during a normal translation run
|
|
47
64
|
-m, --model <model> Claude model override (default: Sonnet for Tier 1, Haiku for Tier 2/3)
|
|
48
65
|
-h, --help Show this help
|
|
49
66
|
|
|
@@ -56,6 +73,7 @@ Examples:
|
|
|
56
73
|
bun scripts/translate-docs/cli.ts --dry-run --tier 3 # Preview all translations
|
|
57
74
|
bun scripts/translate-docs/cli.ts --validate # Check nav references
|
|
58
75
|
bun scripts/translate-docs/cli.ts --update-nav # Regenerate docs.json
|
|
76
|
+
bun scripts/translate-docs/cli.ts --prune --tier 3 # Drop orphaned translations
|
|
59
77
|
`);
|
|
60
78
|
process.exit(0);
|
|
61
79
|
}
|
|
@@ -87,44 +105,14 @@ async function validateNavReferences(): Promise<boolean> {
|
|
|
87
105
|
let total = 0;
|
|
88
106
|
let missing = 0;
|
|
89
107
|
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
groups: Array<{ pages: string[] }>;
|
|
99
|
-
}>;
|
|
100
|
-
for (const tab of tabs) {
|
|
101
|
-
for (const group of tab.groups) {
|
|
102
|
-
for (const page of group.pages) {
|
|
103
|
-
total++;
|
|
104
|
-
const filePath = join(DOCS_DIR, `${page}.mdx`);
|
|
105
|
-
if (!existsSync(filePath)) {
|
|
106
|
-
console.error(` MISSING: ${page} -> ${filePath}`);
|
|
107
|
-
missing++;
|
|
108
|
-
valid = false;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
} else {
|
|
114
|
-
for (const langEntry of languages) {
|
|
115
|
-
for (const tab of langEntry.tabs) {
|
|
116
|
-
for (const group of tab.groups) {
|
|
117
|
-
for (const page of group.pages) {
|
|
118
|
-
total++;
|
|
119
|
-
const filePath = join(DOCS_DIR, `${page}.mdx`);
|
|
120
|
-
if (!existsSync(filePath)) {
|
|
121
|
-
console.error(` MISSING [${langEntry.language}]: ${page} -> ${filePath}`);
|
|
122
|
-
missing++;
|
|
123
|
-
valid = false;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
108
|
+
for (const reference of getNavigationPageReferences(nav)) {
|
|
109
|
+
total++;
|
|
110
|
+
const filePath = join(DOCS_DIR, `${reference.page}.mdx`);
|
|
111
|
+
if (!existsSync(filePath)) {
|
|
112
|
+
const context = reference.language ? ` [${reference.language}]` : "";
|
|
113
|
+
console.error(` MISSING${context}: ${reference.page} -> ${filePath}`);
|
|
114
|
+
missing++;
|
|
115
|
+
valid = false;
|
|
128
116
|
}
|
|
129
117
|
}
|
|
130
118
|
|
|
@@ -153,6 +141,26 @@ async function main() {
|
|
|
153
141
|
return;
|
|
154
142
|
}
|
|
155
143
|
|
|
144
|
+
// Prune-only mode
|
|
145
|
+
if (args.prune) {
|
|
146
|
+
const langCodes = resolveLanguages();
|
|
147
|
+
const cache = readCache();
|
|
148
|
+
const pruned = pruneOrphanedTranslations(langCodes, {
|
|
149
|
+
dryRun: args["dry-run"],
|
|
150
|
+
cache,
|
|
151
|
+
});
|
|
152
|
+
for (const file of pruned) {
|
|
153
|
+
console.log(
|
|
154
|
+
` ${args["dry-run"] ? "would remove" : "removed"}: ${file}`,
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
if (pruned.length > 0 && !args["dry-run"]) writeCache(cache);
|
|
158
|
+
console.log(
|
|
159
|
+
`\n${pruned.length} orphaned translation(s)${args["dry-run"] ? " would be" : ""} removed.`,
|
|
160
|
+
);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
156
164
|
const langCodes = resolveLanguages();
|
|
157
165
|
const isDryRun = args["dry-run"];
|
|
158
166
|
const isForce = args.force;
|
|
@@ -169,7 +177,9 @@ async function main() {
|
|
|
169
177
|
`${isDryRun ? "[DRY RUN] " : ""}Translating into: ${langCodes.join(", ")}`,
|
|
170
178
|
);
|
|
171
179
|
if (!modelOverride) {
|
|
172
|
-
console.log(
|
|
180
|
+
console.log(
|
|
181
|
+
`Models: Tier 1 -> ${getModelForTier(1)}, Tier 2/3 -> ${getModelForTier(2)}`,
|
|
182
|
+
);
|
|
173
183
|
} else {
|
|
174
184
|
console.log(`Model override: ${modelOverride}`);
|
|
175
185
|
}
|
|
@@ -186,10 +196,17 @@ async function main() {
|
|
|
186
196
|
// configured in translator.ts) to absorb per-request transient
|
|
187
197
|
// `Connection error.` from LB-induced replica flapping.
|
|
188
198
|
// Override via TRANSLATE_MAX_CONCURRENT (integer >= 1; otherwise default).
|
|
189
|
-
const parsedConcurrent = Number.parseInt(
|
|
199
|
+
const parsedConcurrent = Number.parseInt(
|
|
200
|
+
process.env.TRANSLATE_MAX_CONCURRENT ?? "",
|
|
201
|
+
10,
|
|
202
|
+
);
|
|
190
203
|
const MAX_CONCURRENT =
|
|
191
|
-
Number.isInteger(parsedConcurrent) && parsedConcurrent > 0
|
|
192
|
-
|
|
204
|
+
Number.isInteger(parsedConcurrent) && parsedConcurrent > 0
|
|
205
|
+
? parsedConcurrent
|
|
206
|
+
: 4;
|
|
207
|
+
async function runWithConcurrency<T>(
|
|
208
|
+
tasks: (() => Promise<T>)[],
|
|
209
|
+
): Promise<T[]> {
|
|
193
210
|
const results: T[] = [];
|
|
194
211
|
let i = 0;
|
|
195
212
|
async function next(): Promise<void> {
|
|
@@ -198,12 +215,33 @@ async function main() {
|
|
|
198
215
|
results[idx] = await tasks[idx]();
|
|
199
216
|
}
|
|
200
217
|
}
|
|
201
|
-
await Promise.all(
|
|
218
|
+
await Promise.all(
|
|
219
|
+
Array.from({ length: Math.min(MAX_CONCURRENT, tasks.length) }, () =>
|
|
220
|
+
next(),
|
|
221
|
+
),
|
|
222
|
+
);
|
|
202
223
|
return results;
|
|
203
224
|
}
|
|
204
225
|
|
|
205
226
|
// Translate docs
|
|
206
227
|
if (!args["readme-only"]) {
|
|
228
|
+
// Drop translations orphaned by an upstream English deletion before
|
|
229
|
+
// translating, so a stale locale page can never outlive its source.
|
|
230
|
+
if (!args["no-prune"]) {
|
|
231
|
+
const pruned = pruneOrphanedTranslations(langCodes, {
|
|
232
|
+
dryRun: isDryRun,
|
|
233
|
+
cache,
|
|
234
|
+
});
|
|
235
|
+
for (const file of pruned) {
|
|
236
|
+
console.log(` ${isDryRun ? "would prune" : "pruned"}: ${file}`);
|
|
237
|
+
}
|
|
238
|
+
if (pruned.length > 0) {
|
|
239
|
+
console.log(
|
|
240
|
+
`${pruned.length} orphaned translation(s)${isDryRun ? " would be" : ""} removed.`,
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
207
245
|
const pages = getEnglishMdxPages();
|
|
208
246
|
const filteredPages = args.pages
|
|
209
247
|
? pages.filter((p) => {
|
|
@@ -227,7 +265,11 @@ async function main() {
|
|
|
227
265
|
for (const page of filteredPages) {
|
|
228
266
|
const relPath = relative(DOCS_DIR, page);
|
|
229
267
|
const task = { page, relPath, lang };
|
|
230
|
-
if (
|
|
268
|
+
if (
|
|
269
|
+
!isForce &&
|
|
270
|
+
!isDryRun &&
|
|
271
|
+
isCached(cache, relPath, lang, pageContents.get(page)!)
|
|
272
|
+
) {
|
|
231
273
|
cachedTasks.push(task);
|
|
232
274
|
} else {
|
|
233
275
|
uncachedTasks.push(task);
|
|
@@ -235,7 +277,9 @@ async function main() {
|
|
|
235
277
|
}
|
|
236
278
|
}
|
|
237
279
|
|
|
238
|
-
console.log(
|
|
280
|
+
console.log(
|
|
281
|
+
`\n${filteredPages.length} MDX pages x ${langCodes.length} languages = ${filteredPages.length * langCodes.length} total`,
|
|
282
|
+
);
|
|
239
283
|
console.log(` Cached (unchanged): ${cachedTasks.length}`);
|
|
240
284
|
console.log(` Need translation: ${uncachedTasks.length}`);
|
|
241
285
|
|
|
@@ -268,7 +312,14 @@ async function main() {
|
|
|
268
312
|
console.log(` ${relPath} [${lang}] -> ${status}`);
|
|
269
313
|
results.push(result);
|
|
270
314
|
if (!result.cached && !isDryRun) {
|
|
271
|
-
setCacheEntry(
|
|
315
|
+
setCacheEntry(
|
|
316
|
+
cache,
|
|
317
|
+
relPath,
|
|
318
|
+
lang,
|
|
319
|
+
pageContents.get(page)!,
|
|
320
|
+
result.inputTokens,
|
|
321
|
+
result.outputTokens,
|
|
322
|
+
);
|
|
272
323
|
}
|
|
273
324
|
} catch (err) {
|
|
274
325
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -285,10 +336,17 @@ async function main() {
|
|
|
285
336
|
console.log(`\nTranslating README...`);
|
|
286
337
|
|
|
287
338
|
// Read README once
|
|
288
|
-
const readmeSource = readFileSync(
|
|
339
|
+
const readmeSource = readFileSync(
|
|
340
|
+
join(DOCS_DIR, "..", "README.md"),
|
|
341
|
+
"utf-8",
|
|
342
|
+
);
|
|
289
343
|
const uncachedLangs: string[] = [];
|
|
290
344
|
for (const lang of langCodes) {
|
|
291
|
-
if (
|
|
345
|
+
if (
|
|
346
|
+
!isForce &&
|
|
347
|
+
!isDryRun &&
|
|
348
|
+
isCached(cache, "README.md", lang, readmeSource)
|
|
349
|
+
) {
|
|
292
350
|
console.log(` README.${lang}.md -> cached`);
|
|
293
351
|
results.push({
|
|
294
352
|
lang,
|
|
@@ -317,10 +375,19 @@ async function main() {
|
|
|
317
375
|
const status = isDryRun
|
|
318
376
|
? "would translate"
|
|
319
377
|
: `translated (${result.inputTokens}+${result.outputTokens} tokens)`;
|
|
320
|
-
console.log(
|
|
378
|
+
console.log(
|
|
379
|
+
` README.${lang}.md -> ${langConfig.nativeName}: ${status}`,
|
|
380
|
+
);
|
|
321
381
|
results.push(result);
|
|
322
382
|
if (!result.cached && !isDryRun) {
|
|
323
|
-
setCacheEntry(
|
|
383
|
+
setCacheEntry(
|
|
384
|
+
cache,
|
|
385
|
+
"README.md",
|
|
386
|
+
lang,
|
|
387
|
+
readmeSource,
|
|
388
|
+
result.inputTokens,
|
|
389
|
+
result.outputTokens,
|
|
390
|
+
);
|
|
324
391
|
}
|
|
325
392
|
} catch (err) {
|
|
326
393
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -2,22 +2,60 @@ import type { LanguageConfig } from "./types";
|
|
|
2
2
|
|
|
3
3
|
export const LANGUAGES: LanguageConfig[] = [
|
|
4
4
|
// Tier 1 — largest developer populations
|
|
5
|
-
{
|
|
5
|
+
{
|
|
6
|
+
code: "zh",
|
|
7
|
+
name: "Chinese (Simplified)",
|
|
8
|
+
nativeName: "\u7b80\u4f53\u4e2d\u6587",
|
|
9
|
+
tier: 1,
|
|
10
|
+
},
|
|
6
11
|
{ code: "ja", name: "Japanese", nativeName: "\u65e5\u672c\u8a9e", tier: 1 },
|
|
7
12
|
{ code: "ko", name: "Korean", nativeName: "\ud55c\uad6d\uc5b4", tier: 1 },
|
|
8
13
|
{ code: "es", name: "Spanish", nativeName: "Espa\u00f1ol", tier: 1 },
|
|
9
|
-
{
|
|
14
|
+
{
|
|
15
|
+
code: "pt-br",
|
|
16
|
+
mintlifyCode: "pt-BR",
|
|
17
|
+
name: "Portuguese (Brazil)",
|
|
18
|
+
nativeName: "Portugu\u00eas",
|
|
19
|
+
tier: 1,
|
|
20
|
+
},
|
|
10
21
|
{ code: "de", name: "German", nativeName: "Deutsch", tier: 1 },
|
|
11
22
|
{ code: "fr", name: "French", nativeName: "Fran\u00e7ais", tier: 1 },
|
|
12
23
|
// Tier 2 — strong tech communities
|
|
13
|
-
{
|
|
14
|
-
|
|
24
|
+
{
|
|
25
|
+
code: "ru",
|
|
26
|
+
name: "Russian",
|
|
27
|
+
nativeName: "\u0420\u0443\u0441\u0441\u043a\u0438\u0439",
|
|
28
|
+
tier: 2,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
code: "hi",
|
|
32
|
+
name: "Hindi",
|
|
33
|
+
nativeName: "\u0939\u093f\u0928\u094d\u0926\u0940",
|
|
34
|
+
tier: 2,
|
|
35
|
+
},
|
|
15
36
|
{ code: "tr", name: "Turkish", nativeName: "T\u00fcrk\u00e7e", tier: 2 },
|
|
16
|
-
{
|
|
37
|
+
{
|
|
38
|
+
code: "vi",
|
|
39
|
+
name: "Vietnamese",
|
|
40
|
+
nativeName: "Ti\u1ebfng Vi\u1ec7t",
|
|
41
|
+
tier: 2,
|
|
42
|
+
},
|
|
17
43
|
{ code: "it", name: "Italian", nativeName: "Italiano", tier: 2 },
|
|
18
44
|
// Tier 3 — RTL languages
|
|
19
|
-
{
|
|
20
|
-
|
|
45
|
+
{
|
|
46
|
+
code: "ar",
|
|
47
|
+
name: "Arabic",
|
|
48
|
+
nativeName: "\u0627\u0644\u0639\u0631\u0628\u064a\u0629",
|
|
49
|
+
tier: 3,
|
|
50
|
+
rtl: true,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
code: "he",
|
|
54
|
+
name: "Hebrew",
|
|
55
|
+
nativeName: "\u05e2\u05d1\u05e8\u05d9\u05ea",
|
|
56
|
+
tier: 3,
|
|
57
|
+
rtl: true,
|
|
58
|
+
},
|
|
21
59
|
];
|
|
22
60
|
|
|
23
61
|
export function getLanguagesByTier(maxTier: number): LanguageConfig[] {
|
|
@@ -184,17 +222,21 @@ export const NAV_TRANSLATIONS: Record<
|
|
|
184
222
|
ru: {
|
|
185
223
|
docs: "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f",
|
|
186
224
|
examples: "\u041f\u0440\u0438\u043c\u0435\u0440\u044b",
|
|
187
|
-
gettingStarted:
|
|
188
|
-
|
|
225
|
+
gettingStarted:
|
|
226
|
+
"\u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b",
|
|
227
|
+
coreConcepts:
|
|
228
|
+
"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438",
|
|
189
229
|
cli: "CLI",
|
|
190
230
|
tools: "\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b",
|
|
191
|
-
advanced:
|
|
231
|
+
advanced:
|
|
232
|
+
"\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439",
|
|
192
233
|
},
|
|
193
234
|
hi: {
|
|
194
235
|
docs: "\u0926\u0938\u094d\u0924\u093e\u0935\u0947\u091c\u093c",
|
|
195
236
|
examples: "\u0909\u0926\u093e\u0939\u0930\u0923",
|
|
196
237
|
gettingStarted: "\u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
|
|
197
|
-
coreConcepts:
|
|
238
|
+
coreConcepts:
|
|
239
|
+
"\u092e\u0942\u0932 \u0905\u0935\u0927\u093e\u0930\u0923\u093e\u090f\u0901",
|
|
198
240
|
cli: "CLI",
|
|
199
241
|
tools: "\u0909\u092a\u0915\u0930\u0923",
|
|
200
242
|
advanced: "\u0909\u0928\u094d\u0928\u0924",
|
|
@@ -230,7 +272,8 @@ export const NAV_TRANSLATIONS: Record<
|
|
|
230
272
|
docs: "\u0627\u0644\u0645\u0633\u062a\u0646\u062f\u0627\u062a",
|
|
231
273
|
examples: "\u0623\u0645\u062b\u0644\u0629",
|
|
232
274
|
gettingStarted: "\u0627\u0644\u0628\u062f\u0627\u064a\u0629",
|
|
233
|
-
coreConcepts:
|
|
275
|
+
coreConcepts:
|
|
276
|
+
"\u0627\u0644\u0645\u0641\u0627\u0647\u064a\u0645 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629",
|
|
234
277
|
cli: "CLI",
|
|
235
278
|
tools: "\u0627\u0644\u0623\u062f\u0648\u0627\u062a",
|
|
236
279
|
advanced: "\u0645\u062a\u0642\u062f\u0645",
|
|
@@ -238,7 +281,8 @@ export const NAV_TRANSLATIONS: Record<
|
|
|
238
281
|
he: {
|
|
239
282
|
docs: "\u05ea\u05d9\u05e2\u05d5\u05d3",
|
|
240
283
|
examples: "\u05d3\u05d5\u05d2\u05de\u05d0\u05d5\u05ea",
|
|
241
|
-
gettingStarted:
|
|
284
|
+
gettingStarted:
|
|
285
|
+
"\u05ea\u05d7\u05d9\u05dc\u05ea \u05e2\u05d1\u05d5\u05d3\u05d4",
|
|
242
286
|
coreConcepts: "\u05de\u05d5\u05e9\u05d2\u05d9 \u05d9\u05e1\u05d5\u05d3",
|
|
243
287
|
cli: "CLI",
|
|
244
288
|
tools: "\u05db\u05dc\u05d9\u05dd",
|