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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Antigravity</title><mask height="23" id="lobe-icons-antigravity-0-_R_0_" maskUnits="userSpaceOnUse" width="24" x="0" y="1"><path d="M21.751 22.607c1.34 1.005 3.35.335 1.508-1.508C17.73 15.74 18.904 1 12.037 1 5.17 1 6.342 15.74.815 21.1c-2.01 2.009.167 2.511 1.507 1.506 5.192-3.517 4.857-9.714 9.715-9.714 4.857 0 4.522 6.197 9.714 9.715z" fill="#fff"></path></mask><g mask="url(#lobe-icons-antigravity-0-_R_0_)"><g filter="url(#lobe-icons-antigravity-1-_R_0_)"><path d="M-1.018-3.992c-.408 3.591 2.686 6.89 6.91 7.37 4.225.48 7.98-2.043 8.387-5.633.408-3.59-2.686-6.89-6.91-7.37-4.225-.479-7.98 2.043-8.387 5.633z" fill="#FFE432"></path></g><g filter="url(#lobe-icons-antigravity-2-_R_0_)"><path d="M15.269 7.747c1.058 4.557 5.691 7.374 10.348 6.293 4.657-1.082 7.575-5.653 6.516-10.21-1.058-4.556-5.691-7.374-10.348-6.292-4.657 1.082-7.575 5.653-6.516 10.21z" fill="#FC413D"></path></g><g filter="url(#lobe-icons-antigravity-3-_R_0_)"><path d="M-12.443 10.804c1.338 4.703 7.36 7.11 13.453 5.378 6.092-1.733 9.947-6.95 8.61-11.652C8.282-.173 2.26-2.58-3.833-.848-9.925.884-13.78 6.1-12.443 10.804z" fill="#00B95C"></path></g><g filter="url(#lobe-icons-antigravity-4-_R_0_)"><path d="M-12.443 10.804c1.338 4.703 7.36 7.11 13.453 5.378 6.092-1.733 9.947-6.95 8.61-11.652C8.282-.173 2.26-2.58-3.833-.848-9.925.884-13.78 6.1-12.443 10.804z" fill="#00B95C"></path></g><g filter="url(#lobe-icons-antigravity-5-_R_0_)"><path d="M-7.608 14.703c3.352 3.424 9.126 3.208 12.896-.483 3.77-3.69 4.108-9.459.756-12.883C2.69-2.087-3.083-1.871-6.853 1.82c-3.77 3.69-4.108 9.458-.755 12.883z" fill="#00B95C"></path></g><g filter="url(#lobe-icons-antigravity-6-_R_0_)"><path d="M9.932 27.617c1.04 4.482 5.384 7.303 9.7 6.3 4.316-1.002 6.971-5.448 5.93-9.93-1.04-4.483-5.384-7.304-9.7-6.301-4.316 1.002-6.971 5.448-5.93 9.93z" fill="#3186FF"></path></g><g filter="url(#lobe-icons-antigravity-7-_R_0_)"><path d="M2.572-8.185C.392-3.329 2.778 2.472 7.9 4.771c5.122 2.3 11.042.227 13.222-4.63 2.18-4.855-.205-10.656-5.327-12.955-5.122-2.3-11.042-.227-13.222 4.63z" fill="#FBBC04"></path></g><g filter="url(#lobe-icons-antigravity-8-_R_0_)"><path d="M-3.267 38.686c-5.277-2.072 3.742-19.117 5.984-24.83 2.243-5.712 8.34-8.664 13.616-6.592 5.278 2.071 11.533 13.482 9.29 19.195-2.242 5.713-23.613 14.298-28.89 12.227z" fill="#3186FF"></path></g><g filter="url(#lobe-icons-antigravity-9-_R_0_)"><path d="M28.71 17.471c-1.413 1.649-5.1.808-8.236-1.878-3.135-2.687-4.531-6.201-3.118-7.85 1.412-1.649 5.1-.808 8.235 1.878s4.532 6.2 3.119 7.85z" fill="#749BFF"></path></g><g filter="url(#lobe-icons-antigravity-10-_R_0_)"><path d="M18.163 9.077c5.81 3.93 12.502 4.19 14.946.577 2.443-3.612-.287-9.727-6.098-13.658-5.81-3.931-12.502-4.19-14.946-.577-2.443 3.612.287 9.727 6.098 13.658z" fill="#FC413D"></path></g><g filter="url(#lobe-icons-antigravity-11-_R_0_)"><path d="M-.915 2.684c-1.44 3.473-.97 6.967 1.05 7.804 2.02.837 4.824-1.3 6.264-4.772 1.44-3.473.97-6.967-1.05-7.804-2.02-.837-4.824 1.3-6.264 4.772z" fill="#FFEE48"></path></g></g><defs><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="17.587" id="lobe-icons-antigravity-1-_R_0_" width="19.838" x="-3.288" y="-11.917"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="1.117"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="38.565" id="lobe-icons-antigravity-2-_R_0_" width="38.9" x="4.251" y="-13.493"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="5.4"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="36.517" id="lobe-icons-antigravity-3-_R_0_" width="40.955" x="-21.889" y="-10.592"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="4.591"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="36.517" id="lobe-icons-antigravity-4-_R_0_" width="40.955" x="-21.889" y="-10.592"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="4.591"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="36.595" id="lobe-icons-antigravity-5-_R_0_" width="36.632" x="-19.099" y="-10.278"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="4.591"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="34.087" id="lobe-icons-antigravity-6-_R_0_" width="33.533" x=".981" y="8.758"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="4.363"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="35.276" id="lobe-icons-antigravity-7-_R_0_" width="35.978" x="-6.143" y="-21.659"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="3.954"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="46.523" id="lobe-icons-antigravity-8-_R_0_" width="45.114" x="-11.96" y="-.46"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="3.531"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="24.054" id="lobe-icons-antigravity-9-_R_0_" width="25.094" x="10.485" y=".58"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="3.159"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="30.007" id="lobe-icons-antigravity-10-_R_0_" width="33.508" x="5.833" y="-12.467"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="2.669"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="26.151" id="lobe-icons-antigravity-11-_R_0_" width="22.194" x="-8.355" y="-8.876"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="3.303"></feGaussianBlur></filter></defs></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Devin</title><path d="M2.033 9.867l2.554 1.483a.589.589 0 00.592 0l2.554-1.483.01-.008a.608.608 0 00.11-.084l.013-.015a.631.631 0 00.076-.1c.003-.005.008-.01.01-.016a.558.558 0 00.052-.125l.007-.028a.611.611 0 00.019-.14V7.868c0-.572.307-1.105.8-1.392a1.595 1.595 0 011.598 0l1.277.742a.54.54 0 00.129.053l.028.01c.044.01.088.015.133.016h.006l.013-.002a.587.587 0 00.27-.074l.011-.004 2.554-1.483a.596.596 0 00.297-.516V2.253a.595.595 0 00-.297-.516L12.293.257a.587.587 0 00-.591 0L9.148 1.737l-.01.01a.609.609 0 00-.109.083l-.014.015a.632.632 0 00-.076.1c-.003.005-.008.01-.01.016a.57.57 0 00-.052.124l-.007.028a.612.612 0 00-.018.14v1.483c0 .572-.307 1.105-.8 1.393a1.597 1.597 0 01-1.599 0l-1.276-.742a.603.603 0 00-.13-.053l-.028-.008a.658.658 0 00-.133-.018h-.02a.57.57 0 00-.269.074c-.003.002-.008.002-.012.005L2.033 5.872a.596.596 0 00-.297.515v2.966c0 .213.113.41.297.515z" fill="#3969CA"></path><path d="M15.943 10.607a1.596 1.596 0 011.599 0l1.276.74c.041.025.085.04.13.055l.028.008c.043.01.088.016.133.018h.005c.005 0 .01-.002.014-.003a.474.474 0 00.122-.016l.021-.005a.616.616 0 00.126-.052c.004-.002.009-.002.013-.005l2.554-1.482a.597.597 0 00.297-.516V6.383a.596.596 0 00-.297-.515l-2.552-1.483a.587.587 0 00-.592 0l-2.553 1.482-.011.008a.61.61 0 00-.108.084l-.014.016a.637.637 0 00-.076.1c-.003.005-.008.01-.01.016a.57.57 0 00-.052.124l-.007.029a.612.612 0 00-.018.14v1.482c0 .572-.307 1.105-.8 1.393a1.597 1.597 0 01-1.599 0l-1.276-.742a.584.584 0 00-.13-.053l-.028-.008a.62.62 0 00-.133-.018h-.02a.587.587 0 00-.269.074l-.012.004L9.15 10a.596.596 0 00-.296.516v2.966c0 .212.112.409.296.515l2.554 1.483s.008.002.012.005c.04.022.082.04.126.052l.02.004a.57.57 0 00.123.017l.014.002h.006c.054 0 .108-.01.16-.025a.587.587 0 00.13-.054l1.277-.741a1.597 1.597 0 012.398 1.392v1.482c0 .049.007.095.019.14l.007.028a.619.619 0 00.051.125c.004.006.008.01.01.016a.6.6 0 00.076.1l.014.015c.033.032.069.06.108.084.004.002.006.006.011.008l2.554 1.483a.59.59 0 00.593 0l2.554-1.483a.597.597 0 00.296-.516v-2.965a.595.595 0 00-.296-.516l-2.554-1.483s-.008-.002-.012-.005a.54.54 0 00-.126-.051c-.007-.003-.013-.003-.02-.005a.635.635 0 00-.125-.017h-.018a.557.557 0 00-.16.026.588.588 0 00-.13.053l-1.276.742a1.595 1.595 0 01-1.598 0 1.615 1.615 0 010-2.785l-.005-.001z" fill="#21C19A"></path><path d="M14.848 18.265l-2.554-1.482-.012-.005a.526.526 0 00-.126-.052c-.007-.002-.014-.002-.02-.005a.64.64 0 00-.124-.017h-.02a.56.56 0 00-.16.026.588.588 0 00-.13.053l-1.276.742a1.594 1.594 0 01-1.598 0c-.493-.286-.8-.82-.8-1.393V14.65a.563.563 0 00-.018-.14l-.008-.028a.604.604 0 00-.051-.124l-.01-.017a.603.603 0 00-.076-.1l-.014-.015a.596.596 0 00-.109-.084c-.003-.002-.005-.006-.01-.008L5.178 12.65a.587.587 0 00-.591 0l-2.554 1.483a.596.596 0 00-.297.516v2.965c0 .213.113.41.297.516l2.554 1.483.012.004a.618.618 0 00.267.074l.016.002h.007a.55.55 0 00.16-.026.584.584 0 00.129-.053l1.277-.742a1.597 1.597 0 012.398 1.393v1.482c0 .05.007.095.019.14l.007.028c.013.044.03.085.051.125l.01.016c.022.036.047.07.076.1l.014.015c.032.032.069.06.109.084l.01.008 2.554 1.483a.587.587 0 00.593 0l2.554-1.483a.596.596 0 00.296-.515v-2.966a.596.596 0 00-.296-.516h-.002z" fill="#0294DE"></path></svg>
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="#ffffff" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Goose</title><path d="M21.595 23.61c1.167-.254 2.405-.944 2.405-.944l-2.167-1.784a12.124 12.124 0 01-2.695-3.131 12.127 12.127 0 00-3.97-4.049l-.794-.462a1.115 1.115 0 01-.488-.815.844.844 0 01.154-.575c.413-.582 2.548-3.115 2.94-3.44.503-.416 1.065-.762 1.586-1.159.074-.056.148-.112.221-.17.003-.002.007-.004.009-.007.167-.131.325-.272.45-.438.453-.524.563-.988.59-1.193-.061-.197-.244-.639-.753-1.148.319.02.705.272 1.056.569.235-.376.481-.773.727-1.171.165-.266-.08-.465-.086-.471h-.001V3.22c-.007-.007-.206-.25-.471-.086-.567.35-1.134.702-1.639 1.021 0 0-.597-.012-1.305.599a2.464 2.464 0 00-.438.45l-.007.009c-.058.072-.114.147-.17.221-.397.521-.743 1.083-1.16 1.587-.323.391-2.857 2.526-3.44 2.94a.842.842 0 01-.574.153 1.115 1.115 0 01-.815-.488l-.462-.794a12.123 12.123 0 00-4.049-3.97 12.133 12.133 0 01-3.13-2.695L1.332 0S.643 1.238.39 2.405c.352.428 1.27 1.49 2.34 2.302C1.58 4.167.73 3.75.06 3.4c-.103.765-.063 1.92.043 2.816.726.317 1.961.806 3.219 1.066-1.006.236-2.11.278-2.961.262.15.554.358 1.119.64 1.688.119.263.25.52.39.77.452.125 2.222.383 3.164.171l-2.51.897a27.776 27.776 0 002.544 2.726c2.031-1.092 2.494-1.241 4.018-2.238-2.467 2.008-3.108 2.828-3.8 3.67l-.483.678c-.25.351-.469.725-.65 1.117-.61 1.31-1.47 4.1-1.47 4.1-.154.486.202.842.674.674 0 0 2.79-.861 4.1-1.47.392-.182.766-.4 1.118-.65l.677-.483c.227-.187.453-.37.701-.586 0 0 1.705 2.02 3.458 3.349l.896-2.511c-.211.942.046 2.712.17 3.163.252.142.509.272.772.392.569.28 1.134.49 1.688.64-.016-.853.026-1.956.261-2.962.26 1.258.75 2.493 1.067 3.219.895.106 2.051.146 2.816.043a73.87 73.87 0 01-1.308-2.67c.811 1.07 1.874 1.988 2.302 2.34h-.001z"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="#111111" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Goose</title><path d="M21.595 23.61c1.167-.254 2.405-.944 2.405-.944l-2.167-1.784a12.124 12.124 0 01-2.695-3.131 12.127 12.127 0 00-3.97-4.049l-.794-.462a1.115 1.115 0 01-.488-.815.844.844 0 01.154-.575c.413-.582 2.548-3.115 2.94-3.44.503-.416 1.065-.762 1.586-1.159.074-.056.148-.112.221-.17.003-.002.007-.004.009-.007.167-.131.325-.272.45-.438.453-.524.563-.988.59-1.193-.061-.197-.244-.639-.753-1.148.319.02.705.272 1.056.569.235-.376.481-.773.727-1.171.165-.266-.08-.465-.086-.471h-.001V3.22c-.007-.007-.206-.25-.471-.086-.567.35-1.134.702-1.639 1.021 0 0-.597-.012-1.305.599a2.464 2.464 0 00-.438.45l-.007.009c-.058.072-.114.147-.17.221-.397.521-.743 1.083-1.16 1.587-.323.391-2.857 2.526-3.44 2.94a.842.842 0 01-.574.153 1.115 1.115 0 01-.815-.488l-.462-.794a12.123 12.123 0 00-4.049-3.97 12.133 12.133 0 01-3.13-2.695L1.332 0S.643 1.238.39 2.405c.352.428 1.27 1.49 2.34 2.302C1.58 4.167.73 3.75.06 3.4c-.103.765-.063 1.92.043 2.816.726.317 1.961.806 3.219 1.066-1.006.236-2.11.278-2.961.262.15.554.358 1.119.64 1.688.119.263.25.52.39.77.452.125 2.222.383 3.164.171l-2.51.897a27.776 27.776 0 002.544 2.726c2.031-1.092 2.494-1.241 4.018-2.238-2.467 2.008-3.108 2.828-3.8 3.67l-.483.678c-.25.351-.469.725-.65 1.117-.61 1.31-1.47 4.1-1.47 4.1-.154.486.202.842.674.674 0 0 2.79-.861 4.1-1.47.392-.182.766-.4 1.118-.65l.677-.483c.227-.187.453-.37.701-.586 0 0 1.705 2.02 3.458 3.349l.896-2.511c-.211.942.046 2.712.17 3.163.252.142.509.272.772.392.569.28 1.134.49 1.688.64-.016-.853.026-1.956.261-2.962.26 1.258.75 2.493 1.067 3.219.895.106 2.051.146 2.816.043a73.87 73.87 0 01-1.308-2.67c.811 1.07 1.874 1.988 2.302 2.34h-.001z"></path></svg>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<svg viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="lobster-gradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
+
<stop offset="0%" stop-color="#ff4d4d"/>
|
|
5
|
+
<stop offset="100%" stop-color="#991b1b"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
<!-- Body -->
|
|
9
|
+
<path d="M60 10 C30 10 15 35 15 55 C15 75 30 95 45 100 L45 110 L55 110 L55 100 C55 100 60 102 65 100 L65 110 L75 110 L75 100 C90 95 105 75 105 55 C105 35 90 10 60 10Z" fill="url(#lobster-gradient)"/>
|
|
10
|
+
<!-- Left Claw -->
|
|
11
|
+
<path d="M20 45 C5 40 0 50 5 60 C10 70 20 65 25 55 C28 48 25 45 20 45Z" fill="url(#lobster-gradient)"/>
|
|
12
|
+
<!-- Right Claw -->
|
|
13
|
+
<path d="M100 45 C115 40 120 50 115 60 C110 70 100 65 95 55 C92 48 95 45 100 45Z" fill="url(#lobster-gradient)"/>
|
|
14
|
+
<!-- Antenna -->
|
|
15
|
+
<path d="M45 15 Q35 5 30 8" stroke="#ff4d4d" stroke-width="3" stroke-linecap="round"/>
|
|
16
|
+
<path d="M75 15 Q85 5 90 8" stroke="#ff4d4d" stroke-width="3" stroke-linecap="round"/>
|
|
17
|
+
<!-- Eyes -->
|
|
18
|
+
<circle cx="45" cy="35" r="6" fill="#050810"/>
|
|
19
|
+
<circle cx="75" cy="35" r="6" fill="#050810"/>
|
|
20
|
+
<circle cx="46" cy="34" r="2.5" fill="#00e5cc"/>
|
|
21
|
+
<circle cx="76" cy="34" r="2.5" fill="#00e5cc"/>
|
|
22
|
+
</svg>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# failproofai CLI-canary sandbox — base image
|
|
2
|
+
#
|
|
3
|
+
# Design goals (see failproofai-cli-canary-design.md §4):
|
|
4
|
+
# - SAFE: non-root user, NO sudo installed, no host FS mounted at runtime.
|
|
5
|
+
# The canary fires `sudo whoami` / `.env`-read deny-probes; here they
|
|
6
|
+
# are inert BY CONSTRUCTION even on a day enforcement is broken.
|
|
7
|
+
# - LIGHT: ephemeral daily container (`docker run --rm`), not a daemon.
|
|
8
|
+
# Only this image + one named volume persist; zero idle CPU/RAM.
|
|
9
|
+
# - FRESH: CLIs are NOT baked in — they are `@latest`-installed into the
|
|
10
|
+
# persistent HOME volume at run time (the whole point of the canary),
|
|
11
|
+
# so this base image rebuilds rarely.
|
|
12
|
+
#
|
|
13
|
+
# The HOME volume (mounted at /home/canary) holds: npm-global CLIs, every
|
|
14
|
+
# vendor login/token, and per-CLI config — so logins survive across daily runs.
|
|
15
|
+
|
|
16
|
+
FROM node:22-bookworm-slim
|
|
17
|
+
|
|
18
|
+
# bun from the official image — no `curl | bash` needed at build time.
|
|
19
|
+
COPY --from=oven/bun:latest /usr/local/bin/bun /usr/local/bin/bun
|
|
20
|
+
|
|
21
|
+
# Minimal tooling for the various vendor CLI installers. Deliberately NO sudo.
|
|
22
|
+
# Tooling for the various vendor installers. Deliberately NO sudo.
|
|
23
|
+
# bzip2/xz-utils : goose extracts its Rust binary with these
|
|
24
|
+
# libsecret-1-0 : antigravity caches login tokens via libsecret (best-effort)
|
|
25
|
+
RUN apt-get update -qq \
|
|
26
|
+
&& apt-get install -y -qq --no-install-recommends \
|
|
27
|
+
git ca-certificates curl unzip bzip2 xz-utils libsecret-1-0 \
|
|
28
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
29
|
+
|
|
30
|
+
# Unprivileged user. HOME is the mount point for the persistent named volume;
|
|
31
|
+
# because the image ships a canary-owned /home/canary, an empty named volume
|
|
32
|
+
# mounted here is initialised canary-owned (Docker copies image content+owner).
|
|
33
|
+
# node:22-slim already ships a `node` user at UID 1000, so pin canary to 1001.
|
|
34
|
+
RUN useradd --create-home --uid 1001 --shell /bin/bash canary
|
|
35
|
+
USER canary
|
|
36
|
+
WORKDIR /home/canary
|
|
37
|
+
RUN mkdir -p /home/canary/.npm-global/bin /home/canary/.local/bin
|
|
38
|
+
|
|
39
|
+
# NPM_CONFIG_PREFIX via ENV (not `npm config set`) so it survives the volume
|
|
40
|
+
# mount shadowing /home/canary at runtime. Runtime `npm i -g` lands in the volume.
|
|
41
|
+
ENV NPM_CONFIG_PREFIX=/home/canary/.npm-global
|
|
42
|
+
ENV PATH=/home/canary/.npm-global/bin:/home/canary/.local/bin:/usr/local/bin:/usr/bin:/bin
|
|
43
|
+
|
|
44
|
+
# Sanity: fail the build if bun/node/npm aren't all runnable as the canary user.
|
|
45
|
+
RUN bun --version && node --version && npm --version
|
|
46
|
+
|
|
47
|
+
CMD ["bash"]
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# CLI integration tests
|
|
2
|
+
|
|
3
|
+
A daily **live-enforcement integration test** for failproofai. It answers one
|
|
4
|
+
question the unit/e2e suites can't: *does failproofai still enforce against every
|
|
5
|
+
supported agent CLI, at the versions users actually install today?*
|
|
6
|
+
|
|
7
|
+
Every day (`.github/workflows/cli-integration.yml`) it installs all 12 agent
|
|
8
|
+
CLIs **@latest** into an isolated Docker sandbox, drives each one against
|
|
9
|
+
failproofai's own policies (built from this repo's HEAD), and confirms the hook
|
|
10
|
+
log shows a **DENY**. A *silent-allow* — a blocked action that ran with no deny —
|
|
11
|
+
means enforcement broke against that CLI (e.g. a vendor changed their hook schema
|
|
12
|
+
out from under us). The test asserts the deny **positively**, so drift surfaces
|
|
13
|
+
as a red run + a Slack alert instead of going unnoticed until a user hits it.
|
|
14
|
+
|
|
15
|
+
## Why it's separate from `__tests__/`
|
|
16
|
+
|
|
17
|
+
It drives **real vendor CLIs against real gateway models** — it needs network,
|
|
18
|
+
Docker, credentials, and ~7-10 min, none of which belong in the fast in-process
|
|
19
|
+
vitest suites. So it's a scheduled workflow, not a PR gate.
|
|
20
|
+
|
|
21
|
+
## How a run works
|
|
22
|
+
|
|
23
|
+
1. Build failproofai under test (`dist/index.js` + `dist/cli.mjs`) from this repo.
|
|
24
|
+
2. Restore `cli-integration-state.json` from Actions cache (version-gate +
|
|
25
|
+
broke/recovered diff).
|
|
26
|
+
3. Build the sandbox image, install all 12 CLIs (`install-clis.sh`), inject the
|
|
27
|
+
OAuth credential files from secrets (`inject-tokens.sh`).
|
|
28
|
+
4. `run.sh` probes each non-gated CLI (`probe-cli.sh`), builds the report
|
|
29
|
+
(`report.js`), and POSTs it to Slack.
|
|
30
|
+
|
|
31
|
+
**Version-gate:** a CLI is re-probed only when its binary version **or**
|
|
32
|
+
failproofai's HEAD changed since its last green run — unchanged ⇒ can't have
|
|
33
|
+
drifted ⇒ skip, protecting LLM/vendor quota. `FAIL`/`INCONCLUSIVE`/`ERROR` always
|
|
34
|
+
re-probe until they recover. Dispatch with **force** to probe everything.
|
|
35
|
+
|
|
36
|
+
## Auth & secrets (the `cli-integration` Environment)
|
|
37
|
+
|
|
38
|
+
Because this repo is public, all credentials live in a scoped **GitHub
|
|
39
|
+
Environment** (`cli-integration`) — only this workflow's job can read them — and
|
|
40
|
+
the workflow triggers on `schedule`/`workflow_dispatch` **only**, so fork PRs can
|
|
41
|
+
never reach them.
|
|
42
|
+
|
|
43
|
+
| Auth | CLIs | Secret(s) |
|
|
44
|
+
|------|------|-----------|
|
|
45
|
+
| Env-var (gateway) | claude, codex, goose, opencode, pi, hermes, openclaw, factory | `CANARY_LLM_API_KEY`, `CANARY_LLM_BASE_URL` |
|
|
46
|
+
| Env-var (PAT) | copilot | `COPILOT_GITHUB_TOKEN` |
|
|
47
|
+
| Injected token file | cursor, devin, antigravity | `CURSOR_/DEVIN_/ANTIGRAVITY_TOKEN_TGZ_B64` |
|
|
48
|
+
| Delivery | — | `SLACK_WEBHOOK_URL` |
|
|
49
|
+
|
|
50
|
+
The injected-token CLIs carry OAuth session tokens captured from a logged-in
|
|
51
|
+
machine (see `capture-tokens.sh`). They authenticate on a fresh runner, but may
|
|
52
|
+
eventually expire — when that happens the test reports `⚠️ ERROR` for that CLI;
|
|
53
|
+
re-login on the capture machine and refresh the secret.
|
|
54
|
+
|
|
55
|
+
> Note: env-var / secret names keep the historical `CANARY_` prefix internally —
|
|
56
|
+
> renaming them across the harness would be churn with no user-visible benefit.
|
|
57
|
+
|
|
58
|
+
## Files
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
Dockerfile non-root sandbox base image
|
|
62
|
+
install-clis.sh install/upgrade all 12 CLIs @latest (with retries)
|
|
63
|
+
inject-tokens.sh write captured OAuth creds into the fresh volume
|
|
64
|
+
probe-cli.sh live enforcement probe for ONE CLI (the oracle)
|
|
65
|
+
canary-policies.mjs benign-marker custom policies the probe trips
|
|
66
|
+
run.sh orchestrator (gate → probe → report → Slack)
|
|
67
|
+
report.js build the Slack report + diff state (broke/recovered)
|
|
68
|
+
capture-tokens.sh (run on a logged-in machine) refresh the OAuth token secrets
|
|
69
|
+
```
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canary custom policies — the DEFINITE probe.
|
|
3
|
+
*
|
|
4
|
+
* The canary probes use BENIGN actions an agent never refuses: `echo`-ing a
|
|
5
|
+
* token, and reading a plain local file. Because there's nothing scary about
|
|
6
|
+
* them, the model reliably issues the tool call — eliminating the self-censorship
|
|
7
|
+
* that made sudo/.env/system-read probes come back INCONCLUSIVE.
|
|
8
|
+
*
|
|
9
|
+
* These policies intercept exactly those benign markers. A deny in the hook log
|
|
10
|
+
* is therefore positive proof that the full enforcement pipeline works against
|
|
11
|
+
* the CLI's REAL tool payload: hook fired → payload normalized (tool_name +
|
|
12
|
+
* tool_input.command / file_path — the drift-prone fields behind the Copilot
|
|
13
|
+
* 1.0.70 silent-allow) → policy evaluated → deny emitted. If normalization ever
|
|
14
|
+
* drifts, ctx.toolInput.command/file_path go empty, no deny fires, the benign
|
|
15
|
+
* command runs, and the probe reports FAIL — never a false alarm, never a miss.
|
|
16
|
+
*/
|
|
17
|
+
import { customPolicies, allow, deny } from "failproofai";
|
|
18
|
+
|
|
19
|
+
// Bash-command path: deny a benign shell command carrying the probe token.
|
|
20
|
+
customPolicies.add({
|
|
21
|
+
name: "canary-bash",
|
|
22
|
+
description: "Canary: deny the benign probe shell command (CANARY_PROBE token)",
|
|
23
|
+
match: { events: ["PreToolUse"] },
|
|
24
|
+
fn: async (ctx) => {
|
|
25
|
+
if (ctx.toolName !== "Bash") return allow();
|
|
26
|
+
const cmd = String(ctx.toolInput?.command ?? "");
|
|
27
|
+
if (cmd.includes("CANARY_PROBE")) return deny("canary-bash probe intercepted");
|
|
28
|
+
return allow();
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// File-path path: deny reading the benign marker file (via Read tool OR `cat`).
|
|
33
|
+
customPolicies.add({
|
|
34
|
+
name: "canary-read",
|
|
35
|
+
description: "Canary: deny reading the benign probe marker file (CANARY_MARKER)",
|
|
36
|
+
match: { events: ["PreToolUse"] },
|
|
37
|
+
fn: async (ctx) => {
|
|
38
|
+
const path = String(ctx.toolInput?.file_path ?? "");
|
|
39
|
+
const cmd = String(ctx.toolInput?.command ?? "");
|
|
40
|
+
if (path.includes("CANARY_MARKER") || cmd.includes("CANARY_MARKER")) {
|
|
41
|
+
return deny("canary-read probe intercepted");
|
|
42
|
+
}
|
|
43
|
+
return allow();
|
|
44
|
+
},
|
|
45
|
+
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
3
|
+
# capture-tokens.sh — run on the OFFICE BOX (has the logged-in canary volume).
|
|
4
|
+
# ./capture-tokens.sh <owner/repo>
|
|
5
|
+
#
|
|
6
|
+
# Captures each OAuth CLI's credential tree from the persistent HOME volume as a
|
|
7
|
+
# base64 gzip-tar rooted at $HOME, and stores it as a GitHub Actions secret on
|
|
8
|
+
# the canary repo. The CI workflow decodes it back onto the ephemeral runner's
|
|
9
|
+
# volume (see sandbox/inject-tokens.sh), so cursor/devin/antigravity authenticate
|
|
10
|
+
# in CI without an interactive login.
|
|
11
|
+
#
|
|
12
|
+
# Re-run this whenever the canary reports ERROR (not-logged-in / 401) for one of
|
|
13
|
+
# these CLIs — i.e. after you re-login on the box — to refresh the secret.
|
|
14
|
+
#
|
|
15
|
+
# NB: these are real credentials for internal@exosphere.host. They live only in
|
|
16
|
+
# GitHub *encrypted secrets*, never in the repo tree.
|
|
17
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
18
|
+
set -euo pipefail
|
|
19
|
+
REPO="${1:?usage: capture-tokens.sh <owner/repo>}"
|
|
20
|
+
VOL="${CANARY_VOL:-failproofai-canary-home}"
|
|
21
|
+
IMAGE="${CANARY_IMAGE:-failproofai-canary:base}"
|
|
22
|
+
|
|
23
|
+
# secret-name → $HOME-relative path(s) to tar from the volume
|
|
24
|
+
capture() {
|
|
25
|
+
local secret="$1"; shift
|
|
26
|
+
local paths=("$@")
|
|
27
|
+
echo "── $secret ($(printf '%s ' "${paths[@]}"))"
|
|
28
|
+
# Tar the paths (rooted at $HOME) inside the container, gzip, base64 → host.
|
|
29
|
+
local b64
|
|
30
|
+
b64="$(docker run --rm -v "$VOL:/home/canary" "$IMAGE" bash -c "
|
|
31
|
+
cd \$HOME || exit 1
|
|
32
|
+
miss=1
|
|
33
|
+
for p in ${paths[*]}; do [ -e \"\$p\" ] && miss=0; done
|
|
34
|
+
[ \$miss = 1 ] && { echo 'MISSING' >&2; exit 3; }
|
|
35
|
+
tar -czf - ${paths[*]} 2>/dev/null | base64 -w0
|
|
36
|
+
")" || { echo " ⚠️ none of the paths exist in the volume — skipping (login first)"; return 0; }
|
|
37
|
+
if [ -z "$b64" ]; then echo " ⚠️ empty capture — skipping"; return 0; fi
|
|
38
|
+
printf '%s' "$b64" | gh secret set "$secret" --repo "$REPO" --body -
|
|
39
|
+
echo " ✓ set $secret (${#b64} b64 chars)"
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
echo "Capturing OAuth credential trees from volume '$VOL' → secrets on $REPO"
|
|
43
|
+
capture CURSOR_TOKEN_TGZ_B64 .config/cursor
|
|
44
|
+
capture DEVIN_TOKEN_TGZ_B64 .local/share/devin/credentials.toml
|
|
45
|
+
# antigravity: capture ONLY the small OAuth token file — the full ~/.gemini tree
|
|
46
|
+
# is ~15 MB (CLI binary + brain/ + logs), far over GitHub's 48 KB secret cap.
|
|
47
|
+
capture ANTIGRAVITY_TOKEN_TGZ_B64 .gemini/antigravity-cli/antigravity-oauth-token
|
|
48
|
+
echo "done."
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
3
|
+
# Token injection — runs INSIDE the sandbox container, against the fresh per-run
|
|
4
|
+
# HOME volume, BEFORE the probes.
|
|
5
|
+
#
|
|
6
|
+
# On the office box the OAuth logins (cursor / devin / antigravity) live in a
|
|
7
|
+
# PERSISTENT volume. GitHub-Actions runners are ephemeral, so instead each of
|
|
8
|
+
# those credential trees is captured once (see capture-tokens.sh) into a GitHub
|
|
9
|
+
# secret as a base64 gzip-tar rooted at $HOME, decoded by the workflow into
|
|
10
|
+
# /opt/tokens/<name>.tgz, and extracted here into the fresh volume's $HOME.
|
|
11
|
+
#
|
|
12
|
+
# Extraction is rooted at $HOME and the tarballs were created with $HOME-relative
|
|
13
|
+
# paths (e.g. `.config/cursor`, `.local/share/devin/credentials.toml`), so each
|
|
14
|
+
# file lands exactly where its CLI expects it. Env-var-auth CLIs (gateway key,
|
|
15
|
+
# copilot PAT, factory BYOK) need NO file here — they authenticate from env.
|
|
16
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
17
|
+
set -u
|
|
18
|
+
TOK="${1:-/opt/tokens}"
|
|
19
|
+
|
|
20
|
+
if [ ! -d "$TOK" ]; then
|
|
21
|
+
echo "inject-tokens: no token dir at $TOK — nothing to inject (env-var CLIs only)"
|
|
22
|
+
exit 0
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
shopt -s nullglob
|
|
26
|
+
found=0
|
|
27
|
+
for t in "$TOK"/*.tgz "$TOK"/*.tar.gz; do
|
|
28
|
+
found=1
|
|
29
|
+
echo "── injecting $(basename "$t") → \$HOME ──"
|
|
30
|
+
if tar -C "$HOME" -xzf "$t"; then
|
|
31
|
+
tar -tzf "$t" 2>/dev/null | sed 's/^/ /' | head -8
|
|
32
|
+
else
|
|
33
|
+
echo " WARN: extract failed for $t (skipping — that CLI will report ERROR)"
|
|
34
|
+
fi
|
|
35
|
+
done
|
|
36
|
+
[ "$found" = 0 ] && echo "inject-tokens: token dir present but empty — env-var CLIs only"
|
|
37
|
+
|
|
38
|
+
echo "── credential files now present in volume ──"
|
|
39
|
+
for f in "$HOME/.config/cursor/auth.json" \
|
|
40
|
+
"$HOME/.local/share/devin/credentials.toml" \
|
|
41
|
+
"$HOME/.gemini/antigravity-cli"; do
|
|
42
|
+
[ -e "$f" ] && echo " ✓ $f" || echo " ✗ $f (absent)"
|
|
43
|
+
done
|
|
44
|
+
exit 0
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
3
|
+
# Tier-0 install probe — runs INSIDE the canary sandbox container.
|
|
4
|
+
#
|
|
5
|
+
# Installs/upgrades all 12 agent CLIs to @latest into the persistent HOME volume,
|
|
6
|
+
# then records which resolve to a runnable binary + their version. This is both
|
|
7
|
+
# the daily "fresh upgrade" step AND the Tier-0 canary signal (packaging/binary
|
|
8
|
+
# breaks show up here as a FAIL).
|
|
9
|
+
#
|
|
10
|
+
# Install methods verified 2026-07-16 (see failproofai-cli-canary-design.md).
|
|
11
|
+
# Vendor installers scatter binaries across several dirs, so we search an
|
|
12
|
+
# expanded PATH and fall back to a bounded `find` under $HOME.
|
|
13
|
+
#
|
|
14
|
+
# Output: a JSON array at $CANARY_RESULTS (default ~/canary-tier0.json) + a
|
|
15
|
+
# human table on stdout. Never `set -e` — one CLI failing must not abort the rest.
|
|
16
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
17
|
+
set -u
|
|
18
|
+
|
|
19
|
+
RESULTS="${CANARY_RESULTS:-$HOME/canary-tier0.json}"
|
|
20
|
+
LOGDIR="${CANARY_LOGDIR:-$HOME/canary-logs}"
|
|
21
|
+
mkdir -p "$LOGDIR"
|
|
22
|
+
|
|
23
|
+
# Cover every dir the vendor installers are known to drop binaries into.
|
|
24
|
+
export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$HOME/.factory/bin:$HOME/.hermes/bin:$HOME/.cursor/bin:$HOME/.codex/bin:$HOME/bin:$PATH"
|
|
25
|
+
|
|
26
|
+
ROWS=()
|
|
27
|
+
|
|
28
|
+
probe() {
|
|
29
|
+
local id="$1" bin="$2" vflag="$3" install="$4"
|
|
30
|
+
echo "════════════════════ $id ════════════════════"
|
|
31
|
+
local t0 t1 rc=1; t0=$SECONDS
|
|
32
|
+
# Retry transient install failures. Flaky vendor CDNs / HTTP-2 stream resets are
|
|
33
|
+
# common on ephemeral CI runners (e.g. factory's `curl … | sh` dropping the
|
|
34
|
+
# download mid-stream with `curl: (18)`). Break as soon as the binary resolves;
|
|
35
|
+
# otherwise give it up to 3 attempts so one bad download isn't a false FAIL.
|
|
36
|
+
for attempt in 1 2 3; do
|
|
37
|
+
bash -c "$install" >"$LOGDIR/$id.install.log" 2>&1
|
|
38
|
+
rc=$?
|
|
39
|
+
hash -r 2>/dev/null
|
|
40
|
+
command -v "$bin" >/dev/null 2>&1 && break
|
|
41
|
+
find "$HOME" -maxdepth 5 -name "$bin" -type f -perm -u+x 2>/dev/null | grep -q . && break
|
|
42
|
+
[ "$attempt" -lt 3 ] && { echo " ↻ $id install attempt $attempt failed (rc=$rc) — retrying in 5s"; sleep 5; }
|
|
43
|
+
done
|
|
44
|
+
t1=$SECONDS
|
|
45
|
+
hash -r 2>/dev/null
|
|
46
|
+
|
|
47
|
+
# Resolve the binary: PATH first, then a bounded find under $HOME.
|
|
48
|
+
local resolved; resolved="$(command -v "$bin" 2>/dev/null || true)"
|
|
49
|
+
if [ -z "$resolved" ]; then
|
|
50
|
+
resolved="$(find "$HOME" -maxdepth 5 -name "$bin" -type f -perm -u+x 2>/dev/null | head -1)"
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
local ver="" status="FAIL"
|
|
54
|
+
if [ -n "$resolved" ]; then
|
|
55
|
+
status="OK"
|
|
56
|
+
ver="$("$resolved" $vflag 2>&1 | head -1 | tr -cd '[:alnum:] ._+:/-')"
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
printf ' rc=%s time=%ss bin=%s ver=%s => %s\n' \
|
|
60
|
+
"$rc" "$((t1 - t0))" "${resolved:-<none>}" "${ver:-<none>}" "$status"
|
|
61
|
+
[ "$status" = FAIL ] && echo " ↳ last install log lines:" && tail -3 "$LOGDIR/$id.install.log" | sed 's/^/ /'
|
|
62
|
+
|
|
63
|
+
ROWS+=("$(printf '{"cli":"%s","status":"%s","binary":"%s","version":"%s","install_rc":%s,"secs":%s}' \
|
|
64
|
+
"$id" "$status" "${resolved:-}" "${ver:-}" "$rc" "$((t1 - t0))")")
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
# id binary --ver flag install command (@latest)
|
|
68
|
+
probe claude claude "--version" 'curl -fsSL https://claude.ai/install.sh | bash'
|
|
69
|
+
probe codex codex "--version" 'npm install -g @openai/codex@latest'
|
|
70
|
+
probe copilot copilot "--version" 'npm install -g @github/copilot@latest'
|
|
71
|
+
probe cursor cursor-agent "--version" 'curl https://cursor.com/install -fsS | bash'
|
|
72
|
+
probe opencode opencode "--version" 'npm install -g opencode-ai@latest'
|
|
73
|
+
probe pi pi "--version" 'npm install -g @mariozechner/pi-coding-agent@latest'
|
|
74
|
+
probe hermes hermes "--version" 'curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash'
|
|
75
|
+
probe openclaw openclaw "--version" 'npm install -g openclaw@latest'
|
|
76
|
+
probe factory droid "--version" 'curl -fsSL https://app.factory.ai/cli | sh'
|
|
77
|
+
probe devin devin "--version" 'curl -fsSL https://cli.devin.ai/install.sh | bash'
|
|
78
|
+
probe antigravity agy "--version" 'curl -fsSL https://antigravity.google/cli/install.sh | bash'
|
|
79
|
+
probe goose goose "--version" 'curl -fsSL https://github.com/aaif-goose/goose/releases/download/stable/download_cli.sh | CONFIGURE=false bash'
|
|
80
|
+
|
|
81
|
+
# Emit JSON array.
|
|
82
|
+
{ printf '['; IFS=,; printf '%s' "${ROWS[*]}"; printf ']\n'; } > "$RESULTS"
|
|
83
|
+
|
|
84
|
+
echo
|
|
85
|
+
echo "════════════════════ TIER-0 SUMMARY ════════════════════"
|
|
86
|
+
ok=0; fail=0
|
|
87
|
+
for r in "${ROWS[@]}"; do
|
|
88
|
+
case "$r" in *'"status":"OK"'*) ok=$((ok+1));; *) fail=$((fail+1));; esac
|
|
89
|
+
done
|
|
90
|
+
printf 'installed OK: %s / 12 failed: %s\n' "$ok" "$fail"
|
|
91
|
+
echo "results JSON: $RESULTS"
|