failproofai 0.0.1 → 0.0.2-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/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- 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/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 +2 -2
- 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 +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 +1 -1
- 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/server-reference-manifest.json +8 -8
- 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/server-reference-manifest.json +1 -1
- 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/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.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/server-reference-manifest.json +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]__02nt~6d._.js +1 -1
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09z7o2x._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0jvf9jj._.js → [root-of-the-server]__0a3kr67._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0osi8nq._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0~7bzp~._.js → [root-of-the-server]__0rbuarm._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_0rd0oc-._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +2 -2
- 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 +9 -9
- package/.next/standalone/.next/static/chunks/{066e8ajzl234v.js → 0a08gn8709y98.js} +1 -1
- package/.next/standalone/.next/static/chunks/{15lp0u9f5fwae.js → 0gcz-jqgqz~9m.js} +1 -1
- package/.next/standalone/.next/static/chunks/{17q_c2.bbcoh1.js → 0jhw8ofx.5g_e.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0wmsi.tszy~9y.js → 0kob_5.phc~sk.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0eh2hq9~6bf53.js → 0mjc3aq2wxvlt.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0nwr.y4dwla00.js → 0mr-jhx402yci.js} +1 -1
- package/.next/standalone/.next/static/chunks/{056c865hodfe7.js → 0q7z97izctgrw.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0o04-obbhh9.s.js → 0qvj8bhl661lq.js} +1 -1
- package/.next/standalone/README.md +9 -1
- package/.next/standalone/dist/cli.mjs +2891 -0
- package/.next/standalone/docs/architecture.md +5 -1
- package/.next/standalone/docs/built-in-policies.md +5 -1
- package/.next/standalone/docs/cli-reference.md +5 -1
- package/.next/standalone/docs/configuration.md +5 -1
- package/.next/standalone/docs/custom-hooks.md +5 -1
- package/.next/standalone/docs/dashboard.md +5 -1
- package/.next/standalone/docs/docs.json +83 -0
- package/.next/standalone/docs/favicon.ico +0 -0
- package/.next/standalone/docs/getting-started.md +8 -2
- package/.next/standalone/docs/introduction.md +47 -0
- package/.next/standalone/docs/logo/exosphere-dark.png +0 -0
- package/.next/standalone/docs/logo/exosphere-light.png +0 -0
- package/.next/standalone/docs/package-aliases.md +7 -1
- package/.next/standalone/docs/testing.md +5 -1
- package/.next/standalone/package.json +6 -5
- package/.next/standalone/scripts/launch.ts +1 -1
- package/.next/standalone/scripts/postinstall.mjs +11 -0
- package/README.md +9 -1
- package/dist/cli.mjs +2891 -0
- package/package.json +6 -5
- package/scripts/launch.ts +1 -1
- package/scripts/postinstall.mjs +11 -0
- package/.next/standalone/docs/index.md +0 -48
- /package/.next/standalone/.next/static/{odPaRK23IkTvoPxqrn_8P → Dnk96sbMPjYOx1pdLdOH0}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{odPaRK23IkTvoPxqrn_8P → Dnk96sbMPjYOx1pdLdOH0}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{odPaRK23IkTvoPxqrn_8P → Dnk96sbMPjYOx1pdLdOH0}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
title: Architecture
|
|
3
|
+
description: "How the hook handler, config loading, and policy evaluation work internally"
|
|
4
|
+
icon: sitemap
|
|
5
|
+
---
|
|
2
6
|
|
|
3
7
|
This document explains how failproofai works internally: how the hook system processes events, how configuration is loaded and merged, how policies are evaluated, and how the dashboard fits in.
|
|
4
8
|
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
title: Built-in Policies
|
|
3
|
+
description: "All 35+ security policies with descriptions and parameters"
|
|
4
|
+
icon: shield
|
|
5
|
+
---
|
|
2
6
|
|
|
3
7
|
failproofai ships with 35+ built-in security policies. Each policy fires on a specific hook event type and tool name. Eight policies accept parameters that let you tune their behavior without writing code.
|
|
4
8
|
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
title: Configuration
|
|
3
|
+
description: "Config file format, three-scope system, and merge rules"
|
|
4
|
+
icon: gear
|
|
5
|
+
---
|
|
2
6
|
|
|
3
7
|
failproofai uses JSON configuration files to control which policies are active, how they behave, and where custom hooks are loaded from.
|
|
4
8
|
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
title: Custom Hooks
|
|
3
|
+
description: "Write your own policies in JavaScript with allow, deny, and instruct decisions"
|
|
4
|
+
icon: code
|
|
5
|
+
---
|
|
2
6
|
|
|
3
7
|
Custom hooks let you write your own policies in JavaScript. They integrate with the same hook event system as built-in policies and support the same `allow`, `deny`, and `instruct` decisions.
|
|
4
8
|
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://mintlify.com/docs.json",
|
|
3
|
+
"theme": "luma",
|
|
4
|
+
"name": "FailproofAI",
|
|
5
|
+
"colors": {
|
|
6
|
+
"primary": "#002CA7",
|
|
7
|
+
"light": "#e4587d",
|
|
8
|
+
"dark": "#002CA7"
|
|
9
|
+
},
|
|
10
|
+
"favicon": "/favicon.ico",
|
|
11
|
+
"navigation": {
|
|
12
|
+
"tabs": [
|
|
13
|
+
{
|
|
14
|
+
"tab": "Docs",
|
|
15
|
+
"groups": [
|
|
16
|
+
{
|
|
17
|
+
"group": "Getting Started",
|
|
18
|
+
"pages": [
|
|
19
|
+
"introduction",
|
|
20
|
+
"getting-started"
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"group": "Core Concepts",
|
|
25
|
+
"pages": [
|
|
26
|
+
"configuration",
|
|
27
|
+
"built-in-policies",
|
|
28
|
+
"custom-hooks"
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"group": "Tools",
|
|
33
|
+
"pages": [
|
|
34
|
+
"cli-reference",
|
|
35
|
+
"dashboard"
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"group": "Advanced",
|
|
40
|
+
"pages": [
|
|
41
|
+
"architecture",
|
|
42
|
+
"testing",
|
|
43
|
+
"package-aliases"
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
"global": {
|
|
50
|
+
"anchors": [
|
|
51
|
+
{
|
|
52
|
+
"anchor": "GitHub",
|
|
53
|
+
"href": "https://github.com/exospherehost/failproofai",
|
|
54
|
+
"icon": "github"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"anchor": "npm",
|
|
58
|
+
"href": "https://www.npmjs.com/package/failproofai",
|
|
59
|
+
"icon": "npm"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"anchor": "Discord",
|
|
63
|
+
"href": "https://discord.com/invite/zT92CAgvkj",
|
|
64
|
+
"icon": "discord"
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"navbar": {
|
|
70
|
+
"links": [],
|
|
71
|
+
"primary": {
|
|
72
|
+
"type": "button",
|
|
73
|
+
"label": "Get started",
|
|
74
|
+
"href": "/getting-started"
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"footer": {
|
|
78
|
+
"socials": {
|
|
79
|
+
"github": "https://github.com/exospherehost/failproofai",
|
|
80
|
+
"x": "https://x.com/exospherehost"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
Binary file
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
title: Getting Started
|
|
3
|
+
description: "Install failproofai, enable policies, and take it for a spin"
|
|
4
|
+
icon: rocket
|
|
5
|
+
---
|
|
2
6
|
|
|
3
7
|
## Requirements
|
|
4
8
|
|
|
5
9
|
- **Node.js** >= 20.9.0
|
|
6
|
-
- **Bun** >= 1.3.0 (
|
|
10
|
+
- **Bun** >= 1.3.0 (optional — only needed for development / building from source)
|
|
7
11
|
|
|
8
12
|
---
|
|
9
13
|
|
|
@@ -11,6 +15,8 @@
|
|
|
11
15
|
|
|
12
16
|
```bash
|
|
13
17
|
npm install -g failproofai
|
|
18
|
+
# or
|
|
19
|
+
bun add -g failproofai
|
|
14
20
|
```
|
|
15
21
|
|
|
16
22
|
---
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Introduction
|
|
3
|
+
description: "Open-source hooks, policies, and session visualization for Claude Code and the Agents SDK"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Failproof AI
|
|
7
|
+
|
|
8
|
+
Open-source hooks, policies, and session visualization for **Claude Code** and the **Agents SDK**. Runs entirely locally — no data leaves your machine.
|
|
9
|
+
|
|
10
|
+
## What is Failproof AI?
|
|
11
|
+
|
|
12
|
+
Failproof AI is a security and observability toolkit that intercepts Claude Code tool calls in real time. It evaluates configurable policies — blocking dangerous commands, redacting secrets, and adding safety instructions — before Claude can act.
|
|
13
|
+
|
|
14
|
+
It also includes a local web dashboard for browsing Claude Code sessions, inspecting tool calls, and managing policies visually.
|
|
15
|
+
|
|
16
|
+
## Key features
|
|
17
|
+
|
|
18
|
+
| Feature | Description |
|
|
19
|
+
|---------|-------------|
|
|
20
|
+
| [35+ Built-in Policies](./built-in-policies.md) | Block sudo, rm -rf, force-push, secret leaks, and more — out of the box. |
|
|
21
|
+
| [Custom Hooks](./custom-hooks.md) | Write your own policies in JavaScript with a simple allow/deny/instruct API. |
|
|
22
|
+
| [Session Dashboard](./dashboard.md) | Browse projects, inspect sessions, and review every tool call and policy decision. |
|
|
23
|
+
| [Three-Scope Config](./configuration.md) | Global, project, and local configuration with automatic merging. |
|
|
24
|
+
|
|
25
|
+
## Quick start
|
|
26
|
+
|
|
27
|
+
Install globally:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm install -g failproofai
|
|
31
|
+
# or
|
|
32
|
+
bun add -g failproofai
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Enable policies:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
failproofai --install-policies
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Launch the dashboard:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
failproofai
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
See the [Getting Started](./getting-started.md) guide for a full walkthrough.
|
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
title: Package Aliases
|
|
3
|
+
description: "Registered typosquat-prevention aliases and how they work"
|
|
4
|
+
icon: copy
|
|
5
|
+
---
|
|
2
6
|
|
|
3
7
|
## Official package
|
|
4
8
|
|
|
@@ -6,6 +10,8 @@ The canonical npm package is **`failproofai`**:
|
|
|
6
10
|
|
|
7
11
|
```bash
|
|
8
12
|
npm install -g failproofai
|
|
13
|
+
# or
|
|
14
|
+
bun add -g failproofai
|
|
9
15
|
```
|
|
10
16
|
|
|
11
17
|
---
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "failproofai",
|
|
3
|
-
"version": "0.0.1",
|
|
3
|
+
"version": "0.0.2-beta.1",
|
|
4
4
|
"description": "Open-source hooks, policies, and project visualization for Claude Code & Agents SDK",
|
|
5
5
|
"bin": {
|
|
6
|
-
"failproofai": "./
|
|
6
|
+
"failproofai": "./dist/cli.mjs"
|
|
7
7
|
},
|
|
8
8
|
"files": [
|
|
9
9
|
"bin/",
|
|
@@ -19,10 +19,11 @@
|
|
|
19
19
|
"bun": ">=1.3.0"
|
|
20
20
|
},
|
|
21
21
|
"scripts": {
|
|
22
|
-
"predev": "bun link",
|
|
22
|
+
"predev": "bun run build:cli && bun link",
|
|
23
23
|
"dev": "FAILPROOFAI_TELEMETRY_DISABLED=1 bun scripts/dev.ts --port 8020",
|
|
24
|
-
"build": "bun build --target=node --format=
|
|
25
|
-
"
|
|
24
|
+
"build:cli": "bun build --target=node --format=esm --outfile=dist/cli.mjs bin/failproofai.mjs --external posthog-node && node -e \"const fs=require('fs');const c=fs.readFileSync('dist/cli.mjs','utf8');fs.writeFileSync('dist/cli.mjs',c.replace('#!/usr/bin/env bun','#!/usr/bin/env node').replace('// @bun\\n',''))\"",
|
|
25
|
+
"build": "bun build --target=node --format=cjs --outfile=dist/index.js src/index.ts && bun run build:cli && bun --bun next build && node -e \"const {cpSync}=require('fs');cpSync('.next/static','.next/standalone/.next/static',{recursive:true});\"",
|
|
26
|
+
"prestart": "bun run build:cli && bun link",
|
|
26
27
|
"start": "FAILPROOFAI_TELEMETRY_DISABLED=1 bun scripts/start.ts",
|
|
27
28
|
"test": "vitest",
|
|
28
29
|
"test:run": "vitest run",
|
|
@@ -49,7 +49,7 @@ export function launch(mode: "dev" | "start"): void {
|
|
|
49
49
|
const serverJsPath = resolve(packageRoot, ".next/standalone/server.js");
|
|
50
50
|
if (!existsSync(serverJsPath)) {
|
|
51
51
|
console.error(
|
|
52
|
-
`\nError: Cannot find server
|
|
52
|
+
`\nError: Cannot find server.js at:\n ${serverJsPath}\n\n` +
|
|
53
53
|
`The package may be missing its build output.\n` +
|
|
54
54
|
`Try reinstalling:\n npm install -g failproofai@latest\n`
|
|
55
55
|
);
|
|
@@ -18,6 +18,17 @@ import { trackInstallEvent } from "./install-telemetry.mjs";
|
|
|
18
18
|
// from process.cwd() only when we are being installed as a dependency by someone else.
|
|
19
19
|
if (!process.env.INIT_CWD || process.env.INIT_CWD === process.cwd()) process.exit(0);
|
|
20
20
|
|
|
21
|
+
// Verify server.js exists — fail the install early if the dashboard build is missing.
|
|
22
|
+
const serverJsPath = resolve(process.cwd(), ".next", "standalone", "server.js");
|
|
23
|
+
if (!existsSync(serverJsPath)) {
|
|
24
|
+
console.error(
|
|
25
|
+
`\n[failproofai] Error: server.js not found at:\n ${serverJsPath}\n\n` +
|
|
26
|
+
` The package may not have been built correctly.\n` +
|
|
27
|
+
` Try reinstalling: npm install -g failproofai@latest\n`
|
|
28
|
+
);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
|
|
21
32
|
const FAILPROOFAI_HOOK_MARKER = "__failproofai_hook__";
|
|
22
33
|
const NAMESPACE = "failproofai-telemetry-v1";
|
|
23
34
|
|
package/README.md
CHANGED
|
@@ -9,6 +9,12 @@
|
|
|
9
9
|
|
|
10
10
|
# Failproof AI
|
|
11
11
|
|
|
12
|
+
[](https://befailproof.ai)
|
|
13
|
+
[](https://www.npmjs.com/package/failproofai)
|
|
14
|
+
[](LICENSE)
|
|
15
|
+
[](https://github.com/exospherehost/failproofai/actions)
|
|
16
|
+
[](https://discord.com/invite/zT92CAgvkj)
|
|
17
|
+
|
|
12
18
|
Open-source hooks, policies, and project visualization for **Claude Code** & the **Agents SDK**.
|
|
13
19
|
|
|
14
20
|
- **Hooks & Policies** — 35+ built-in security policies that run as Claude Code hooks. Block dangerous commands, sanitize secrets, restrict file access, and more.
|
|
@@ -23,7 +29,7 @@ Everything runs locally — no data leaves your machine.
|
|
|
23
29
|
## Requirements
|
|
24
30
|
|
|
25
31
|
- Node.js >= 20.9.0
|
|
26
|
-
- Bun >= 1.3.0
|
|
32
|
+
- Bun >= 1.3.0 (optional — only needed for development / building from source)
|
|
27
33
|
|
|
28
34
|
---
|
|
29
35
|
|
|
@@ -31,6 +37,8 @@ Everything runs locally — no data leaves your machine.
|
|
|
31
37
|
|
|
32
38
|
```bash
|
|
33
39
|
npm install -g failproofai
|
|
40
|
+
# or
|
|
41
|
+
bun add -g failproofai
|
|
34
42
|
```
|
|
35
43
|
|
|
36
44
|
---
|