failproofai 0.0.1-beta.6 → 0.0.1-beta.7

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.
Files changed (91) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +3 -3
  3. package/.next/standalone/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  5. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  6. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  9. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  10. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  11. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  12. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  13. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  16. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  18. package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
  19. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  20. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  21. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
  22. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  23. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  24. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  25. package/.next/standalone/.next/server/app/index.html +1 -1
  26. package/.next/standalone/.next/server/app/index.rsc +15 -15
  27. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  28. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  29. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  30. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
  31. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  32. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  33. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  35. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
  36. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  38. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  39. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  42. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  43. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  46. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/chunks/[root-of-the-server]__02nt~6d._.js +1 -1
  49. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
  50. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
  51. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
  52. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__10xz9fd._.js → [root-of-the-server]__0cnhb7_._.js} +2 -2
  53. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
  54. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
  55. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0osi8nq._.js +2 -2
  56. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +2 -2
  57. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0t6id1-._.js → [root-of-the-server]__0xmjv9e._.js} +2 -2
  58. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
  59. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
  60. package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
  61. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
  62. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
  63. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  64. package/.next/standalone/.next/server/pages/404.html +2 -2
  65. package/.next/standalone/.next/server/pages/500.html +1 -1
  66. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/server-reference-manifest.json +9 -9
  68. package/.next/standalone/.next/static/chunks/{0vka59vj~_p84.js → 00qeuetfdsgjk.js} +1 -1
  69. package/.next/standalone/.next/static/chunks/{1281t-wuuwf5w.js → 07nvevyjq47qo.js} +1 -1
  70. package/.next/standalone/.next/static/chunks/{0xcw_k6u.z2ji.js → 0b.lzb_keexdb.js} +3 -3
  71. package/.next/standalone/.next/static/chunks/{13_h4vv__dm-j.js → 0iv-rbjm2j5nc.js} +1 -1
  72. package/.next/standalone/.next/static/chunks/{0g0lmawbbronf.js → 0jfhld9mk1zm4.js} +1 -1
  73. package/.next/standalone/.next/static/chunks/{0y.26ewi_d6ao.js → 0jzowkzl-dd6s.js} +1 -1
  74. package/.next/standalone/.next/static/chunks/{15e_zyvm~z00h.js → 0w4.ug1d.ok15.js} +1 -1
  75. package/.next/standalone/.next/static/chunks/{096d4k7vsm6js.js → 16_nu40klq96n.js} +1 -1
  76. package/.next/standalone/bin/failproofai.mjs +131 -65
  77. package/.next/standalone/components/reach-developers.tsx +11 -1
  78. package/.next/standalone/package.json +1 -1
  79. package/.next/standalone/scripts/launch.ts +2 -0
  80. package/.next/standalone/scripts/postinstall.mjs +1 -1
  81. package/.next/standalone/src/hooks/install-prompt.ts +2 -2
  82. package/.next/standalone/src/hooks/manager.ts +5 -5
  83. package/bin/failproofai.mjs +131 -65
  84. package/package.json +1 -1
  85. package/scripts/launch.ts +2 -0
  86. package/scripts/postinstall.mjs +1 -1
  87. package/src/hooks/install-prompt.ts +2 -2
  88. package/src/hooks/manager.ts +5 -5
  89. /package/.next/standalone/.next/static/{-60bMZ3yrx1LbpOPZF1qZ → H15OMlkQejMvLowzdBldp}/_buildManifest.js +0 -0
  90. /package/.next/standalone/.next/static/{-60bMZ3yrx1LbpOPZF1qZ → H15OMlkQejMvLowzdBldp}/_clientMiddlewareManifest.js +0 -0
  91. /package/.next/standalone/.next/static/{-60bMZ3yrx1LbpOPZF1qZ → H15OMlkQejMvLowzdBldp}/_ssgManifest.js +0 -0
@@ -326,8 +326,8 @@ export async function installHooks(
326
326
  console.log();
327
327
  console.log(`\x1B[33mWarning: Failproof AI hooks are also installed at ${scopeList}.\x1B[0m`);
328
328
  console.log(`Having hooks in multiple scopes may cause duplicate policy evaluation.`);
329
- console.log(`Use \`failproofai --remove-policies --scope ${duplicates[0]}\` to remove the other installation,`);
330
- console.log(`or \`failproofai --list-policies\` to see all scopes.`);
329
+ console.log(`Use \`failproofai policies --uninstall --scope ${duplicates[0]}\` to remove the other installation,`);
330
+ console.log(`or \`failproofai policies\` to see all scopes.`);
331
331
  }
332
332
  }
333
333
 
@@ -528,9 +528,9 @@ export async function listHooks(cwd?: string): Promise<void> {
528
528
  printBetaSection(printSimpleRow);
529
529
 
530
530
  if (config.enabledPolicies.length > 0) {
531
- console.log("\n Policies not installed. Run `failproofai --install-policies` to activate.");
531
+ console.log("\n Policies not installed. Run `failproofai policies --install` to activate.");
532
532
  } else {
533
- console.log("\n Run `failproofai --install-policies` to get started.");
533
+ console.log("\n Run `failproofai policies --install` to get started.");
534
534
  }
535
535
  console.log(" Config: ~/.failproofai/policies-config.json\n");
536
536
  } else if (installedScopes.length === 1) {
@@ -594,7 +594,7 @@ export async function listHooks(cwd?: string): Promise<void> {
594
594
  const scopeNames = installedScopes.join(", ");
595
595
  console.log();
596
596
  console.log(`\x1B[33m\u26A0 Hooks in multiple scopes (${scopeNames}).\x1B[0m`);
597
- console.log(" Consider keeping one. Remove with: failproofai --remove-policies --scope <scope>\n");
597
+ console.log(" Consider keeping one. Remove with: failproofai policies --uninstall --scope <scope>\n");
598
598
  }
599
599
 
600
600
  // Warn about unknown policyParams keys
@@ -6,9 +6,7 @@
6
6
  * --hook <event> Hook event from Claude Code (minimal startup latency)
7
7
  * --version / -v Print version and exit
8
8
  * --help / -h Show usage and exit
9
- * --install-policies Install hooks + enable policies in Claude Code settings
10
- * --remove-policies Remove hooks or disable policies from Claude Code settings
11
- * --list-policies List available policies and their status
9
+ * policies Manage policies (list / install / uninstall)
12
10
  * (default) Launch production dashboard
13
11
  */
14
12
  import { realpathSync } from "node:fs";
@@ -28,8 +26,9 @@ if (!process.env.FAILPROOFAI_PACKAGE_ROOT) {
28
26
 
29
27
  const args = process.argv.slice(2);
30
28
 
31
- // --help / -h
32
- if (args.includes("--help") || args.includes("-h")) {
29
+ // --help / -h (only when not inside a subcommand that handles its own --help)
30
+ const SUBCOMMANDS = ["policies"];
31
+ if ((args.includes("--help") || args.includes("-h")) && !SUBCOMMANDS.includes(args[0])) {
33
32
  console.log(`
34
33
  failproofai v${version}
35
34
 
@@ -39,28 +38,36 @@ USAGE
39
38
  COMMANDS
40
39
  (no args) Launch the policy dashboard
41
40
 
42
- --install-policies [names...] Enable policies in Claude Code settings
41
+ policies List all available policies and their status
42
+ policies --install, -i Enable policies in Claude Code settings
43
+ [names...] Specific policy names to enable
43
44
  --scope user|project|local Config scope to write to (default: user)
44
45
  --beta Include beta policies
45
- --custom <path> Path to a JS file of custom policies
46
+ --custom, -c <path> Path to a JS file of custom policies
46
47
 
47
- --remove-policies [names...] Disable policies or remove hooks
48
+ policies --uninstall, -u Disable policies or remove hooks
49
+ [names...] Specific policy names to disable
48
50
  --scope user|project|local|all Config scope to remove from (default: user)
49
51
  --beta Remove only beta policies
50
- --custom Clear the customPoliciesPath from config
52
+ --custom, -c Clear the customPoliciesPath from config
51
53
 
52
- --list-policies List all available policies and their status
54
+ policies --help, -h Show this help for the policies command
53
55
 
54
56
  --version, -v Print version and exit
55
57
  --help, -h Show this help message
56
58
 
57
59
  EXAMPLES
58
- failproofai --install-policies
59
- failproofai --install-policies block-sudo sanitize-api-keys --scope project
60
- failproofai --install-policies --custom ./my-policies.js
61
- failproofai --remove-policies block-sudo
62
- failproofai --remove-policies --custom
63
- failproofai --list-policies
60
+ failproofai policies
61
+ failproofai policies --install
62
+ failproofai policies --install block-sudo sanitize-api-keys --scope project
63
+ failproofai policies --install --custom ./my-policies.js
64
+ failproofai policies -i -c ./my-policies.js
65
+ failproofai policies --uninstall block-sudo
66
+ failproofai policies --uninstall --custom
67
+
68
+ LINKS
69
+ ⭐ Star us: https://github.com/exospherehost/failproofai
70
+ 📖 Docs: https://befailproof.ai
64
71
  `.trimStart());
65
72
  process.exit(0);
66
73
  }
@@ -79,70 +86,121 @@ if (hookIdx >= 0 && args[hookIdx + 1]) {
79
86
  process.exit(exitCode);
80
87
  }
81
88
 
82
- // --install-policies [policyNames...] [--scope user|project|local] [--beta] [--custom <path>]
83
- if (args.includes("--install-policies")) {
84
- const { installHooks } = await import("../src/hooks/manager");
89
+ // policies [--install|-i|--uninstall|-u|--help|-h] [names...] [--scope] [--beta] [--custom|-c <path>]
90
+ if (args[0] === "policies") {
91
+ const subArgs = args.slice(1);
85
92
 
86
- const scopeIdx = args.indexOf("--scope");
87
- const scope = scopeIdx >= 0 ? args[scopeIdx + 1] : "user";
93
+ const isInstall = subArgs.includes("--install") || subArgs.includes("-i");
94
+ const isUninstall = subArgs.includes("--uninstall") || subArgs.includes("-u");
95
+ const isHelp = subArgs.includes("--help") || subArgs.includes("-h");
88
96
 
89
- const customIdx = args.indexOf("--custom");
90
- const customPoliciesPath = customIdx >= 0 ? args[customIdx + 1] : undefined;
97
+ if (isHelp) {
98
+ console.log(`
99
+ failproofai policies — manage Failproof AI policies
91
100
 
92
- const includeBeta = args.includes("--beta");
101
+ USAGE
102
+ failproofai policies List all policies and their status
103
+ failproofai policies --install, -i Enable policies
104
+ failproofai policies --uninstall, -u Disable policies or remove hooks
105
+
106
+ OPTIONS (install)
107
+ [names...] Specific policy names to enable (omit for interactive)
108
+ --scope user|project|local Config scope to write to (default: user)
109
+ --beta Include beta policies
110
+ --custom, -c <path> Path to a JS file of custom policies
111
+ (skips interactive prompt; validates file first)
112
+
113
+ OPTIONS (uninstall)
114
+ [names...] Specific policy names to disable (omit to remove hooks)
115
+ --scope user|project|local|all Config scope to remove from (default: user)
116
+ --beta Remove only beta policies
117
+ --custom, -c Clear the customPoliciesPath from config
93
118
 
94
- // Collect positional policy names (args after --install-policies that don't start with --)
95
- const installIdx = args.indexOf("--install-policies");
96
- const policyNames = args
97
- .slice(installIdx + 1)
98
- .filter((a) => !a.startsWith("--") && a !== scope && a !== customPoliciesPath);
119
+ EXAMPLES
120
+ failproofai policies
121
+ failproofai policies --install
122
+ failproofai policies --install block-sudo sanitize-api-keys
123
+ failproofai policies --install --custom ./my-policies.js
124
+ failproofai policies -i -c ./my-policies.js
125
+ failproofai policies --uninstall block-sudo
126
+ failproofai policies -u
127
+ failproofai policies --uninstall --custom
128
+ `.trimStart());
129
+ process.exit(0);
130
+ }
99
131
 
100
- await installHooks(
101
- policyNames.length > 0 ? policyNames : undefined,
102
- scope,
103
- undefined,
104
- includeBeta,
105
- undefined,
106
- customPoliciesPath,
107
- );
108
- process.exit(0);
109
- }
132
+ if (isInstall) {
133
+ const { installHooks } = await import("../src/hooks/manager");
110
134
 
111
- // --remove-policies [policyNames...] [--scope user|project|local|all] [--beta] [--custom]
112
- if (args.includes("--remove-policies")) {
113
- const { removeHooks } = await import("../src/hooks/manager");
135
+ const scopeIdx = subArgs.indexOf("--scope");
136
+ const scope = scopeIdx >= 0 ? subArgs[scopeIdx + 1] : "user";
114
137
 
115
- const scopeIdx = args.indexOf("--scope");
116
- const scope = scopeIdx >= 0 ? args[scopeIdx + 1] : "user";
138
+ const customIdx = subArgs.includes("--custom") ? subArgs.indexOf("--custom")
139
+ : subArgs.includes("-c") ? subArgs.indexOf("-c")
140
+ : -1;
141
+ const customPoliciesPath = customIdx >= 0 ? subArgs[customIdx + 1] : undefined;
117
142
 
118
- const betaOnly = args.includes("--beta");
119
- const removeCustomHooks = args.includes("--custom");
143
+ const includeBeta = subArgs.includes("--beta");
120
144
 
121
- const removeIdx = args.indexOf("--remove-policies");
122
- const policyNames = args
123
- .slice(removeIdx + 1)
124
- .filter((a) => !a.startsWith("--") && a !== scope);
145
+ // Collect positional policy names — args that don't start with - and aren't
146
+ // values consumed by --scope or --custom/-c.
147
+ const consumed = new Set([scope, customPoliciesPath].filter(Boolean));
148
+ const flags = new Set(["--install", "-i", "--scope", "--beta", "--custom", "-c"]);
149
+ const explicitPolicyNames = subArgs.filter(
150
+ (a) => !a.startsWith("-") && !flags.has(a) && !consumed.has(a)
151
+ );
125
152
 
126
- await removeHooks(
127
- policyNames.length > 0 ? policyNames : undefined,
128
- scope,
129
- undefined,
130
- { betaOnly, removeCustomHooks },
131
- );
132
- process.exit(0);
133
- }
153
+ // When --custom/-c is present but no explicit policy names, pass [] so
154
+ // installHooks uses the existing enabled policies and skips the interactive
155
+ // prompt — validation of the custom file happens inside installHooks.
156
+ const policyNames =
157
+ explicitPolicyNames.length > 0 ? explicitPolicyNames
158
+ : customPoliciesPath !== undefined ? []
159
+ : undefined;
160
+
161
+ await installHooks(
162
+ policyNames,
163
+ scope,
164
+ undefined,
165
+ includeBeta,
166
+ undefined,
167
+ customPoliciesPath,
168
+ );
169
+ process.exit(0);
170
+ }
134
171
 
135
- // --list-policies
136
- if (args.includes("--list-policies")) {
172
+ if (isUninstall) {
173
+ const { removeHooks } = await import("../src/hooks/manager");
174
+
175
+ const scopeIdx = subArgs.indexOf("--scope");
176
+ const scope = scopeIdx >= 0 ? subArgs[scopeIdx + 1] : "user";
177
+
178
+ const betaOnly = subArgs.includes("--beta");
179
+ const removeCustomHooks = subArgs.includes("--custom") || subArgs.includes("-c");
180
+
181
+ const consumed = new Set([scope].filter(Boolean));
182
+ const flags = new Set(["--uninstall", "-u", "--scope", "--beta", "--custom", "-c"]);
183
+ const policyNames = subArgs.filter(
184
+ (a) => !a.startsWith("-") && !flags.has(a) && !consumed.has(a)
185
+ );
186
+
187
+ await removeHooks(
188
+ policyNames.length > 0 ? policyNames : undefined,
189
+ scope,
190
+ undefined,
191
+ { betaOnly, removeCustomHooks },
192
+ );
193
+ process.exit(0);
194
+ }
195
+
196
+ // Default: list policies
137
197
  const { listHooks } = await import("../src/hooks/manager");
138
198
  await listHooks();
139
199
  process.exit(0);
140
200
  }
141
201
 
142
202
  // Unknown flag guard — must appear after all known-flag branches
143
- const knownFlags = ["--version", "-v", "--help", "-h", "--hook",
144
- "--install-policies", "--remove-policies", "--list-policies",
145
- "--scope", "--beta", "--custom"];
203
+ const knownFlags = ["--version", "-v", "--help", "-h", "--hook"];
146
204
  const unknownFlag = args.find(a => a.startsWith("-") && !knownFlags.includes(a));
147
205
 
148
206
  if (unknownFlag) {
@@ -159,8 +217,7 @@ if (unknownFlag) {
159
217
  return dp[m][n];
160
218
  }
161
219
 
162
- const primary = ["--version", "--help", "--hook", "--install-policies",
163
- "--remove-policies", "--list-policies"];
220
+ const primary = ["--version", "--help", "--hook", "policies"];
164
221
  const closest = primary.reduce((best, flag) => {
165
222
  const dist = levenshtein(unknownFlag, flag);
166
223
  return dist < best.dist ? { flag, dist } : best;
@@ -172,6 +229,15 @@ if (unknownFlag) {
172
229
  process.exit(1);
173
230
  }
174
231
 
232
+ // Unknown subcommand guard (non-flag args that aren't "policies")
233
+ const unknownSubcommand = args.find(a => !a.startsWith("-") && a !== "policies");
234
+ if (unknownSubcommand) {
235
+ console.error(`Unknown command: ${unknownSubcommand}`);
236
+ console.error(`Did you mean: failproofai policies?`);
237
+ console.error(`Run \`failproofai --help\` for usage details.`);
238
+ process.exit(1);
239
+ }
240
+
175
241
  // Dashboard launch — always production mode
176
242
  const { launch } = await import("../scripts/launch");
177
243
  launch("start");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "failproofai",
3
- "version": "0.0.1-beta.6",
3
+ "version": "0.0.1-beta.7",
4
4
  "description": "Open-source hooks, policies, and project visualization for Claude Code & Agents SDK",
5
5
  "bin": {
6
6
  "failproofai": "./bin/failproofai.mjs"
package/scripts/launch.ts CHANGED
@@ -20,6 +20,8 @@ export function launch(mode: "dev" | "start"): void {
20
20
  /_/ \\__,_/_/_/ .___/_/ \\____/\\____/_/ /_/ |_/___/
21
21
  /_/ v${version}
22
22
  `);
23
+ console.log(` ⭐ Star us: https://github.com/exospherehost/failproofai`);
24
+ console.log(` 📖 Docs: https://befailproof.ai\n`);
23
25
 
24
26
  let claudeProjectsPath = parsedPath;
25
27
 
@@ -87,7 +87,7 @@ function printHooksWarning() {
87
87
  console.log(
88
88
  `\n[failproofai] Warning: hooks config exists with enabled policies, but hooks are not registered in Claude Code settings.\n` +
89
89
  ` To re-register hooks, run:\n` +
90
- ` failproofai --remove-policies && failproofai --install-policies\n`
90
+ ` failproofai policies --uninstall && failproofai policies --install\n`
91
91
  );
92
92
  }
93
93
 
@@ -263,11 +263,11 @@ export async function promptPolicySelection(
263
263
  );
264
264
  lines.push("");
265
265
  lines.push(
266
- " \x1B[2mTip: --list-policies for a flat list \u00b7 --install-policies <name\u2026> to skip prompt\x1B[0m",
266
+ " \x1B[2mTip: `policies` for a flat list \u00b7 `policies --install <name\u2026>` to skip prompt\x1B[0m",
267
267
  );
268
268
  if (!includeBeta) {
269
269
  lines.push(
270
- " \x1B[2mTip: --install-policies all --beta to include beta policies\x1B[0m",
270
+ " \x1B[2mTip: `policies --install --beta` to include beta policies\x1B[0m",
271
271
  );
272
272
  }
273
273
 
@@ -326,8 +326,8 @@ export async function installHooks(
326
326
  console.log();
327
327
  console.log(`\x1B[33mWarning: Failproof AI hooks are also installed at ${scopeList}.\x1B[0m`);
328
328
  console.log(`Having hooks in multiple scopes may cause duplicate policy evaluation.`);
329
- console.log(`Use \`failproofai --remove-policies --scope ${duplicates[0]}\` to remove the other installation,`);
330
- console.log(`or \`failproofai --list-policies\` to see all scopes.`);
329
+ console.log(`Use \`failproofai policies --uninstall --scope ${duplicates[0]}\` to remove the other installation,`);
330
+ console.log(`or \`failproofai policies\` to see all scopes.`);
331
331
  }
332
332
  }
333
333
 
@@ -528,9 +528,9 @@ export async function listHooks(cwd?: string): Promise<void> {
528
528
  printBetaSection(printSimpleRow);
529
529
 
530
530
  if (config.enabledPolicies.length > 0) {
531
- console.log("\n Policies not installed. Run `failproofai --install-policies` to activate.");
531
+ console.log("\n Policies not installed. Run `failproofai policies --install` to activate.");
532
532
  } else {
533
- console.log("\n Run `failproofai --install-policies` to get started.");
533
+ console.log("\n Run `failproofai policies --install` to get started.");
534
534
  }
535
535
  console.log(" Config: ~/.failproofai/policies-config.json\n");
536
536
  } else if (installedScopes.length === 1) {
@@ -594,7 +594,7 @@ export async function listHooks(cwd?: string): Promise<void> {
594
594
  const scopeNames = installedScopes.join(", ");
595
595
  console.log();
596
596
  console.log(`\x1B[33m\u26A0 Hooks in multiple scopes (${scopeNames}).\x1B[0m`);
597
- console.log(" Consider keeping one. Remove with: failproofai --remove-policies --scope <scope>\n");
597
+ console.log(" Consider keeping one. Remove with: failproofai policies --uninstall --scope <scope>\n");
598
598
  }
599
599
 
600
600
  // Warn about unknown policyParams keys