From 9ca93c4f1aabe89f431c8f24c32298b244b1952b Mon Sep 17 00:00:00 2001 From: SiddarthAA Date: Wed, 24 Jun 2026 13:22:00 +0530 Subject: [PATCH 1/4] feat(ui): swap community Slack for Discord; collapse Reach Us feedback items - Replace the community Slack invite with Discord (https://discord.gg/2zjBZP7yQJ) in the `failproofai --help` banner, the dashboard "Reach Us" dropdown, and the README badge (English + 14 translated READMEs); tidy a stale Slack comment in scripts/launch.ts. - Collapse the dropdown's Request a Feature / Report an Issue / Ask a Question into one "Feedback & Issues" item linking to the GitHub issue chooser. - The Slack webhook notification example is left as-is (a feature, not an invite). Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 8 ++++ README.md | 2 +- .../components/reach-developers.test.tsx | 41 ++++++++----------- bin/failproofai.mjs | 2 +- components/reach-developers.tsx | 33 ++++----------- docs/i18n/README.ar.md | 2 +- docs/i18n/README.de.md | 2 +- docs/i18n/README.es.md | 2 +- docs/i18n/README.fr.md | 2 +- docs/i18n/README.he.md | 2 +- docs/i18n/README.hi.md | 2 +- docs/i18n/README.it.md | 2 +- docs/i18n/README.ja.md | 2 +- docs/i18n/README.ko.md | 2 +- docs/i18n/README.pt-br.md | 2 +- docs/i18n/README.ru.md | 2 +- docs/i18n/README.tr.md | 2 +- docs/i18n/README.vi.md | 2 +- docs/i18n/README.zh.md | 2 +- scripts/launch.ts | 2 +- 20 files changed, 51 insertions(+), 65 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff3f602d..ac6fcfeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.0.11-beta.12 — 2026-06-24 + +### Features +- Collapse the dashboard "Reach Us" dropdown's three GitHub links (Request a Feature / Report an Issue / Ask a Question) into a single **Feedback & Issues** entry pointing at the GitHub issue chooser (`/issues/new/choose`). + +### Docs +- Replace the community Slack invite with Discord (`https://discord.gg/2zjBZP7yQJ`) everywhere it's user-facing: the `failproofai --help` LINKS banner, the dashboard "Reach Us" dropdown, and the README community badge (English + 14 translations). The Slack *webhook notification example* (`examples/policies-notification.js`) is intentionally left as-is — it's a feature integration, not a community link. + ## 0.0.11-beta.11 — 2026-06-23 ### Features diff --git a/README.md b/README.md index 11dacd23..de0b3dd6 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![npm](https://img.shields.io/npm/v/failproofai?style=flat-square&color=CB3837)](https://www.npmjs.com/package/failproofai) [![CI](https://img.shields.io/github/actions/workflow/status/failproofai/failproofai/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/failproofai/failproofai/actions) [![Supply Chain](https://img.shields.io/badge/supply%20chain-secure-brightgreen?style=flat-square)](https://github.com/failproofai/failproofai/actions/workflows/osv-scanner.yml) -[![Slack](https://img.shields.io/badge/Slack-join%20us-4A154B?style=flat-square&logo=slack)](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ) +[![Discord](https://img.shields.io/badge/Discord-join%20us-5865F2?style=flat-square&logo=discord)](https://discord.gg/2zjBZP7yQJ) [![Docs](https://img.shields.io/badge/docs-befailproof.ai-002CA7?style=flat-square)](https://docs.befailproof.ai) [![License](https://img.shields.io/badge/license-MIT%20%2B%20Commons%20Clause-blue?style=flat-square)](./LICENSE) diff --git a/__tests__/components/reach-developers.test.tsx b/__tests__/components/reach-developers.test.tsx index 575136f9..f5267413 100644 --- a/__tests__/components/reach-developers.test.tsx +++ b/__tests__/components/reach-developers.test.tsx @@ -1,4 +1,4 @@ -import { describe, it, expect, vi } from "vitest"; +import { describe, it, expect } from "vitest"; import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { ReachDevelopers } from "@/components/reach-developers"; @@ -16,39 +16,31 @@ describe("ReachDevelopers", () => { render(); // Dropdown content should not be visible initially - expect(screen.queryByText("Request a Feature")).not.toBeInTheDocument(); + expect(screen.queryByText("Feedback & Issues")).not.toBeInTheDocument(); // Click the trigger button const btn = screen.getAllByRole("button")[0]; await user.click(btn); - // Dropdown should now be visible - expect(screen.getByText("Request a Feature")).toBeInTheDocument(); - expect(screen.getByText("Report an Issue")).toBeInTheDocument(); - expect(screen.getByText("Ask a Question")).toBeInTheDocument(); + // Dropdown should now be visible with the current items + expect(screen.getByText("Join our Discord")).toBeInTheDocument(); + expect(screen.getByText("Feedback & Issues")).toBeInTheDocument(); }); - it("contains correct mailto links with subjects", async () => { + it("Discord link and the combined feedback/issues link point to the right places", async () => { const user = userEvent.setup(); render(); const btn = screen.getAllByRole("button")[0]; await user.click(btn); - const featureLink = screen.getByText("Request a Feature").closest("a"); - expect(featureLink).toHaveAttribute( - "href", - expect.stringContaining("github.com/failproofai/failproofai") - ); - expect(featureLink).toHaveAttribute( - "href", - expect.stringContaining("labels=enhancement") - ); + const discordLink = screen.getByText("Join our Discord").closest("a"); + expect(discordLink).toHaveAttribute("href", "https://discord.gg/2zjBZP7yQJ"); - const bugLink = screen.getByText("Report an Issue").closest("a"); - expect(bugLink).toHaveAttribute( + const feedbackLink = screen.getByText("Feedback & Issues").closest("a"); + expect(feedbackLink).toHaveAttribute( "href", - expect.stringContaining("github.com/failproofai/failproofai") + expect.stringContaining("github.com/FailproofAI/failproofai/issues/new/choose"), ); }); @@ -59,12 +51,12 @@ describe("ReachDevelopers", () => { // Open dropdown const btn = screen.getAllByRole("button")[0]; await user.click(btn); - expect(screen.getByText("Request a Feature")).toBeInTheDocument(); + expect(screen.getByText("Feedback & Issues")).toBeInTheDocument(); // Click the backdrop overlay (the fixed inset-0 div rendered when open) const backdrop = container.querySelector('[aria-hidden="true"]') as HTMLElement; await user.click(backdrop); - expect(screen.queryByText("Report an Issue")).not.toBeInTheDocument(); + expect(screen.queryByText("Feedback & Issues")).not.toBeInTheDocument(); }); // ARIA attribute tests @@ -102,7 +94,8 @@ describe("ReachDevelopers", () => { const btn = screen.getAllByRole("button")[0]; await user.click(btn); const menuItems = screen.getAllByRole("menuitem"); - expect(menuItems).toHaveLength(6); + // Star, Documentation, Join our Discord, Feedback & Issues + expect(menuItems).toHaveLength(4); }); it("Escape key closes dropdown", async () => { @@ -110,9 +103,9 @@ describe("ReachDevelopers", () => { render(); const btn = screen.getAllByRole("button")[0]; await user.click(btn); - expect(screen.getByText("Request a Feature")).toBeInTheDocument(); + expect(screen.getByText("Feedback & Issues")).toBeInTheDocument(); await user.keyboard("{Escape}"); - expect(screen.queryByText("Report an Issue")).not.toBeInTheDocument(); + expect(screen.queryByText("Feedback & Issues")).not.toBeInTheDocument(); }); }); diff --git a/bin/failproofai.mjs b/bin/failproofai.mjs index c0db07a5..45237e72 100755 --- a/bin/failproofai.mjs +++ b/bin/failproofai.mjs @@ -191,7 +191,7 @@ EXAMPLES LINKS ⭐ Star us: https://github.com/failproofai/failproofai šŸ“– Docs: https://befailproof.ai - šŸ’¬ Slack: https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ + šŸ’¬ Discord: https://discord.gg/2zjBZP7yQJ `.trimStart()); process.exit(0); } diff --git a/components/reach-developers.tsx b/components/reach-developers.tsx index b7b1ac2b..e151642a 100644 --- a/components/reach-developers.tsx +++ b/components/reach-developers.tsx @@ -2,10 +2,9 @@ "use client"; import React, { useState, useCallback } from "react"; -import { GitBranch, Lightbulb, Bug, MessageSquare, ChevronDown, Star, BookOpen, Hash } from "lucide-react"; +import { GitBranch, ChevronDown, Star, BookOpen, MessageCircle, MessageSquareWarning } from "lucide-react"; import { Button } from "@/components/ui/button"; -const GITHUB_REPO = "https://github.com/failproofai/failproofai"; const CONTACT_EMAIL = "failproofai@exosphere.host"; const options = [ @@ -24,33 +23,19 @@ const options = [ bg: "rgba(96,165,250,0.08)", }, { - label: "Join our Slack", - icon: Hash, - href: "https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ", - color: "#a78bfa", - bg: "rgba(167,139,250,0.08)", + label: "Join our Discord", + icon: MessageCircle, + href: "https://discord.gg/2zjBZP7yQJ", + color: "#5865f2", + bg: "rgba(88,101,242,0.08)", }, { - label: "Request a Feature", - icon: Lightbulb, - href: `${GITHUB_REPO}/issues/new?labels=enhancement&title=Feature+Request%3A+`, + label: "Feedback & Issues", + icon: MessageSquareWarning, + href: "https://github.com/FailproofAI/failproofai/issues/new/choose", color: "#34d399", bg: "rgba(52,211,153,0.08)", }, - { - label: "Report an Issue", - icon: Bug, - href: `${GITHUB_REPO}/issues/new?labels=bug&title=Bug+Report%3A+`, - color: "#f87171", - bg: "rgba(248,113,113,0.08)", - }, - { - label: "Ask a Question", - icon: MessageSquare, - href: `${GITHUB_REPO}/discussions/new?category=q-a`, - color: "#fb923c", - bg: "rgba(251,146,60,0.08)", - }, ] as const; export const ReachDevelopers: React.FC = () => { diff --git a/docs/i18n/README.ar.md b/docs/i18n/README.ar.md index 20626dd6..c9a44b38 100644 --- a/docs/i18n/README.ar.md +++ b/docs/i18n/README.ar.md @@ -13,7 +13,7 @@ [![npm](https://img.shields.io/npm/v/failproofai?style=flat-square&color=CB3837)](https://www.npmjs.com/package/failproofai) [![CI](https://img.shields.io/github/actions/workflow/status/failproofai/failproofai/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/failproofai/failproofai/actions) [![Supply Chain](https://img.shields.io/badge/supply%20chain-secure-brightgreen?style=flat-square)](https://github.com/failproofai/failproofai/actions/workflows/osv-scanner.yml) -[![Slack](https://img.shields.io/badge/Slack-join%20us-4A154B?style=flat-square&logo=slack)](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ) +[![Discord](https://img.shields.io/badge/Discord-join%20us-5865F2?style=flat-square&logo=discord)](https://discord.gg/2zjBZP7yQJ) [![Docs](https://img.shields.io/badge/docs-befailproof.ai-002CA7?style=flat-square)](https://docs.befailproof.ai) [![License](https://img.shields.io/badge/license-MIT%20%2B%20Commons%20Clause-blue?style=flat-square)](./LICENSE) diff --git a/docs/i18n/README.de.md b/docs/i18n/README.de.md index d78b2bc4..f4481a9c 100644 --- a/docs/i18n/README.de.md +++ b/docs/i18n/README.de.md @@ -11,7 +11,7 @@ [![npm](https://img.shields.io/npm/v/failproofai?style=flat-square&color=CB3837)](https://www.npmjs.com/package/failproofai) [![CI](https://img.shields.io/github/actions/workflow/status/failproofai/failproofai/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/failproofai/failproofai/actions) [![Supply Chain](https://img.shields.io/badge/supply%20chain-secure-brightgreen?style=flat-square)](https://github.com/failproofai/failproofai/actions/workflows/osv-scanner.yml) -[![Slack](https://img.shields.io/badge/Slack-join%20us-4A154B?style=flat-square&logo=slack)](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ) +[![Discord](https://img.shields.io/badge/Discord-join%20us-5865F2?style=flat-square&logo=discord)](https://discord.gg/2zjBZP7yQJ) [![Docs](https://img.shields.io/badge/docs-befailproof.ai-002CA7?style=flat-square)](https://docs.befailproof.ai) [![License](https://img.shields.io/badge/license-MIT%20%2B%20Commons%20Clause-blue?style=flat-square)](./LICENSE) diff --git a/docs/i18n/README.es.md b/docs/i18n/README.es.md index 8da2cf9a..03ab49e3 100644 --- a/docs/i18n/README.es.md +++ b/docs/i18n/README.es.md @@ -11,7 +11,7 @@ [![npm](https://img.shields.io/npm/v/failproofai?style=flat-square&color=CB3837)](https://www.npmjs.com/package/failproofai) [![CI](https://img.shields.io/github/actions/workflow/status/failproofai/failproofai/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/failproofai/failproofai/actions) [![Supply Chain](https://img.shields.io/badge/supply%20chain-secure-brightgreen?style=flat-square)](https://github.com/failproofai/failproofai/actions/workflows/osv-scanner.yml) -[![Slack](https://img.shields.io/badge/Slack-join%20us-4A154B?style=flat-square&logo=slack)](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ) +[![Discord](https://img.shields.io/badge/Discord-join%20us-5865F2?style=flat-square&logo=discord)](https://discord.gg/2zjBZP7yQJ) [![Docs](https://img.shields.io/badge/docs-befailproof.ai-002CA7?style=flat-square)](https://docs.befailproof.ai) [![License](https://img.shields.io/badge/license-MIT%20%2B%20Commons%20Clause-blue?style=flat-square)](./LICENSE) diff --git a/docs/i18n/README.fr.md b/docs/i18n/README.fr.md index c2b599e5..2653d518 100644 --- a/docs/i18n/README.fr.md +++ b/docs/i18n/README.fr.md @@ -11,7 +11,7 @@ [![npm](https://img.shields.io/npm/v/failproofai?style=flat-square&color=CB3837)](https://www.npmjs.com/package/failproofai) [![CI](https://img.shields.io/github/actions/workflow/status/failproofai/failproofai/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/failproofai/failproofai/actions) [![Supply Chain](https://img.shields.io/badge/supply%20chain-secure-brightgreen?style=flat-square)](https://github.com/failproofai/failproofai/actions/workflows/osv-scanner.yml) -[![Slack](https://img.shields.io/badge/Slack-join%20us-4A154B?style=flat-square&logo=slack)](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ) +[![Discord](https://img.shields.io/badge/Discord-join%20us-5865F2?style=flat-square&logo=discord)](https://discord.gg/2zjBZP7yQJ) [![Docs](https://img.shields.io/badge/docs-befailproof.ai-002CA7?style=flat-square)](https://docs.befailproof.ai) [![License](https://img.shields.io/badge/license-MIT%20%2B%20Commons%20Clause-blue?style=flat-square)](./LICENSE) diff --git a/docs/i18n/README.he.md b/docs/i18n/README.he.md index e9f53c21..5cbe6ecb 100644 --- a/docs/i18n/README.he.md +++ b/docs/i18n/README.he.md @@ -13,7 +13,7 @@ [![npm](https://img.shields.io/npm/v/failproofai?style=flat-square&color=CB3837)](https://www.npmjs.com/package/failproofai) [![CI](https://img.shields.io/github/actions/workflow/status/failproofai/failproofai/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/failproofai/failproofai/actions) [![Supply Chain](https://img.shields.io/badge/supply%20chain-secure-brightgreen?style=flat-square)](https://github.com/failproofai/failproofai/actions/workflows/osv-scanner.yml) -[![Slack](https://img.shields.io/badge/Slack-join%20us-4A154B?style=flat-square&logo=slack)](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ) +[![Discord](https://img.shields.io/badge/Discord-join%20us-5865F2?style=flat-square&logo=discord)](https://discord.gg/2zjBZP7yQJ) [![Docs](https://img.shields.io/badge/docs-befailproof.ai-002CA7?style=flat-square)](https://docs.befailproof.ai) [![License](https://img.shields.io/badge/license-MIT%20%2B%20Commons%20Clause-blue?style=flat-square)](./LICENSE) diff --git a/docs/i18n/README.hi.md b/docs/i18n/README.hi.md index c58ca215..57a05e02 100644 --- a/docs/i18n/README.hi.md +++ b/docs/i18n/README.hi.md @@ -11,7 +11,7 @@ [![npm](https://img.shields.io/npm/v/failproofai?style=flat-square&color=CB3837)](https://www.npmjs.com/package/failproofai) [![CI](https://img.shields.io/github/actions/workflow/status/failproofai/failproofai/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/failproofai/failproofai/actions) [![Supply Chain](https://img.shields.io/badge/supply%20chain-secure-brightgreen?style=flat-square)](https://github.com/failproofai/failproofai/actions/workflows/osv-scanner.yml) -[![Slack](https://img.shields.io/badge/Slack-join%20us-4A154B?style=flat-square&logo=slack)](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ) +[![Discord](https://img.shields.io/badge/Discord-join%20us-5865F2?style=flat-square&logo=discord)](https://discord.gg/2zjBZP7yQJ) [![Docs](https://img.shields.io/badge/docs-befailproof.ai-002CA7?style=flat-square)](https://docs.befailproof.ai) [![License](https://img.shields.io/badge/license-MIT%20%2B%20Commons%20Clause-blue?style=flat-square)](./LICENSE) diff --git a/docs/i18n/README.it.md b/docs/i18n/README.it.md index b6103607..e2872dec 100644 --- a/docs/i18n/README.it.md +++ b/docs/i18n/README.it.md @@ -11,7 +11,7 @@ [![npm](https://img.shields.io/npm/v/failproofai?style=flat-square&color=CB3837)](https://www.npmjs.com/package/failproofai) [![CI](https://img.shields.io/github/actions/workflow/status/failproofai/failproofai/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/failproofai/failproofai/actions) [![Supply Chain](https://img.shields.io/badge/supply%20chain-secure-brightgreen?style=flat-square)](https://github.com/failproofai/failproofai/actions/workflows/osv-scanner.yml) -[![Slack](https://img.shields.io/badge/Slack-join%20us-4A154B?style=flat-square&logo=slack)](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ) +[![Discord](https://img.shields.io/badge/Discord-join%20us-5865F2?style=flat-square&logo=discord)](https://discord.gg/2zjBZP7yQJ) [![Docs](https://img.shields.io/badge/docs-befailproof.ai-002CA7?style=flat-square)](https://docs.befailproof.ai) [![License](https://img.shields.io/badge/license-MIT%20%2B%20Commons%20Clause-blue?style=flat-square)](./LICENSE) diff --git a/docs/i18n/README.ja.md b/docs/i18n/README.ja.md index da4d4085..b468ecbf 100644 --- a/docs/i18n/README.ja.md +++ b/docs/i18n/README.ja.md @@ -11,7 +11,7 @@ [![npm](https://img.shields.io/npm/v/failproofai?style=flat-square&color=CB3837)](https://www.npmjs.com/package/failproofai) [![CI](https://img.shields.io/github/actions/workflow/status/failproofai/failproofai/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/failproofai/failproofai/actions) [![Supply Chain](https://img.shields.io/badge/supply%20chain-secure-brightgreen?style=flat-square)](https://github.com/failproofai/failproofai/actions/workflows/osv-scanner.yml) -[![Slack](https://img.shields.io/badge/Slack-join%20us-4A154B?style=flat-square&logo=slack)](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ) +[![Discord](https://img.shields.io/badge/Discord-join%20us-5865F2?style=flat-square&logo=discord)](https://discord.gg/2zjBZP7yQJ) [![Docs](https://img.shields.io/badge/docs-befailproof.ai-002CA7?style=flat-square)](https://docs.befailproof.ai) [![License](https://img.shields.io/badge/license-MIT%20%2B%20Commons%20Clause-blue?style=flat-square)](./LICENSE) diff --git a/docs/i18n/README.ko.md b/docs/i18n/README.ko.md index af7872a4..07786d5d 100644 --- a/docs/i18n/README.ko.md +++ b/docs/i18n/README.ko.md @@ -11,7 +11,7 @@ [![npm](https://img.shields.io/npm/v/failproofai?style=flat-square&color=CB3837)](https://www.npmjs.com/package/failproofai) [![CI](https://img.shields.io/github/actions/workflow/status/failproofai/failproofai/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/failproofai/failproofai/actions) [![Supply Chain](https://img.shields.io/badge/supply%20chain-secure-brightgreen?style=flat-square)](https://github.com/failproofai/failproofai/actions/workflows/osv-scanner.yml) -[![Slack](https://img.shields.io/badge/Slack-join%20us-4A154B?style=flat-square&logo=slack)](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ) +[![Discord](https://img.shields.io/badge/Discord-join%20us-5865F2?style=flat-square&logo=discord)](https://discord.gg/2zjBZP7yQJ) [![Docs](https://img.shields.io/badge/docs-befailproof.ai-002CA7?style=flat-square)](https://docs.befailproof.ai) [![License](https://img.shields.io/badge/license-MIT%20%2B%20Commons%20Clause-blue?style=flat-square)](./LICENSE) diff --git a/docs/i18n/README.pt-br.md b/docs/i18n/README.pt-br.md index 4e9e5599..9300bc83 100644 --- a/docs/i18n/README.pt-br.md +++ b/docs/i18n/README.pt-br.md @@ -11,7 +11,7 @@ [![npm](https://img.shields.io/npm/v/failproofai?style=flat-square&color=CB3837)](https://www.npmjs.com/package/failproofai) [![CI](https://img.shields.io/github/actions/workflow/status/failproofai/failproofai/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/failproofai/failproofai/actions) [![Supply Chain](https://img.shields.io/badge/supply%20chain-secure-brightgreen?style=flat-square)](https://github.com/failproofai/failproofai/actions/workflows/osv-scanner.yml) -[![Slack](https://img.shields.io/badge/Slack-join%20us-4A154B?style=flat-square&logo=slack)](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ) +[![Discord](https://img.shields.io/badge/Discord-join%20us-5865F2?style=flat-square&logo=discord)](https://discord.gg/2zjBZP7yQJ) [![Docs](https://img.shields.io/badge/docs-befailproof.ai-002CA7?style=flat-square)](https://docs.befailproof.ai) [![License](https://img.shields.io/badge/license-MIT%20%2B%20Commons%20Clause-blue?style=flat-square)](./LICENSE) diff --git a/docs/i18n/README.ru.md b/docs/i18n/README.ru.md index c50d60bd..f4985ddc 100644 --- a/docs/i18n/README.ru.md +++ b/docs/i18n/README.ru.md @@ -11,7 +11,7 @@ [![npm](https://img.shields.io/npm/v/failproofai?style=flat-square&color=CB3837)](https://www.npmjs.com/package/failproofai) [![CI](https://img.shields.io/github/actions/workflow/status/failproofai/failproofai/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/failproofai/failproofai/actions) [![Supply Chain](https://img.shields.io/badge/supply%20chain-secure-brightgreen?style=flat-square)](https://github.com/failproofai/failproofai/actions/workflows/osv-scanner.yml) -[![Slack](https://img.shields.io/badge/Slack-join%20us-4A154B?style=flat-square&logo=slack)](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ) +[![Discord](https://img.shields.io/badge/Discord-join%20us-5865F2?style=flat-square&logo=discord)](https://discord.gg/2zjBZP7yQJ) [![Docs](https://img.shields.io/badge/docs-befailproof.ai-002CA7?style=flat-square)](https://docs.befailproof.ai) [![License](https://img.shields.io/badge/license-MIT%20%2B%20Commons%20Clause-blue?style=flat-square)](./LICENSE) diff --git a/docs/i18n/README.tr.md b/docs/i18n/README.tr.md index cbed35db..914079e2 100644 --- a/docs/i18n/README.tr.md +++ b/docs/i18n/README.tr.md @@ -11,7 +11,7 @@ [![npm](https://img.shields.io/npm/v/failproofai?style=flat-square&color=CB3837)](https://www.npmjs.com/package/failproofai) [![CI](https://img.shields.io/github/actions/workflow/status/failproofai/failproofai/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/failproofai/failproofai/actions) [![Supply Chain](https://img.shields.io/badge/supply%20chain-secure-brightgreen?style=flat-square)](https://github.com/failproofai/failproofai/actions/workflows/osv-scanner.yml) -[![Slack](https://img.shields.io/badge/Slack-join%20us-4A154B?style=flat-square&logo=slack)](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ) +[![Discord](https://img.shields.io/badge/Discord-join%20us-5865F2?style=flat-square&logo=discord)](https://discord.gg/2zjBZP7yQJ) [![Docs](https://img.shields.io/badge/docs-befailproof.ai-002CA7?style=flat-square)](https://docs.befailproof.ai) [![License](https://img.shields.io/badge/license-MIT%20%2B%20Commons%20Clause-blue?style=flat-square)](./LICENSE) diff --git a/docs/i18n/README.vi.md b/docs/i18n/README.vi.md index 1dc7b73e..06d977cf 100644 --- a/docs/i18n/README.vi.md +++ b/docs/i18n/README.vi.md @@ -11,7 +11,7 @@ [![npm](https://img.shields.io/npm/v/failproofai?style=flat-square&color=CB3837)](https://www.npmjs.com/package/failproofai) [![CI](https://img.shields.io/github/actions/workflow/status/failproofai/failproofai/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/failproofai/failproofai/actions) [![Supply Chain](https://img.shields.io/badge/supply%20chain-secure-brightgreen?style=flat-square)](https://github.com/failproofai/failproofai/actions/workflows/osv-scanner.yml) -[![Slack](https://img.shields.io/badge/Slack-join%20us-4A154B?style=flat-square&logo=slack)](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ) +[![Discord](https://img.shields.io/badge/Discord-join%20us-5865F2?style=flat-square&logo=discord)](https://discord.gg/2zjBZP7yQJ) [![Docs](https://img.shields.io/badge/docs-befailproof.ai-002CA7?style=flat-square)](https://docs.befailproof.ai) [![License](https://img.shields.io/badge/license-MIT%20%2B%20Commons%20Clause-blue?style=flat-square)](./LICENSE) diff --git a/docs/i18n/README.zh.md b/docs/i18n/README.zh.md index b70eecf3..32e1d156 100644 --- a/docs/i18n/README.zh.md +++ b/docs/i18n/README.zh.md @@ -11,7 +11,7 @@ [![npm](https://img.shields.io/npm/v/failproofai?style=flat-square&color=CB3837)](https://www.npmjs.com/package/failproofai) [![CI](https://img.shields.io/github/actions/workflow/status/failproofai/failproofai/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/failproofai/failproofai/actions) [![Supply Chain](https://img.shields.io/badge/supply%20chain-secure-brightgreen?style=flat-square)](https://github.com/failproofai/failproofai/actions/workflows/osv-scanner.yml) -[![Slack](https://img.shields.io/badge/Slack-join%20us-4A154B?style=flat-square&logo=slack)](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ) +[![Discord](https://img.shields.io/badge/Discord-join%20us-5865F2?style=flat-square&logo=discord)](https://discord.gg/2zjBZP7yQJ) [![Docs](https://img.shields.io/badge/docs-befailproof.ai-002CA7?style=flat-square)](https://docs.befailproof.ai) [![License](https://img.shields.io/badge/license-MIT%20%2B%20Commons%20Clause-blue?style=flat-square)](./LICENSE) diff --git a/scripts/launch.ts b/scripts/launch.ts index c0b68a35..363ee91a 100644 --- a/scripts/launch.ts +++ b/scripts/launch.ts @@ -15,7 +15,7 @@ export function launch(mode: "dev" | "start"): void { const { loggingLevel, disableTelemetry, allowedDevOrigins, remainingArgs } = parseScriptArgs(process.argv.slice(2)); // Plain-text title + a labeled `Version` line that lines up with the - // `Star us` / `Docs` / `Slack` lines below (all four labels pad to the + // `Star us` / `Docs` / `Discord` lines below (all four labels pad to the // same column so the values form a clean right-hand column). console.log(`\n failproof ai\n`); console.log(` šŸ“¦ Version: ${version}`); From 5bccf230463bf989686f7a80035964fa27f3c53e Mon Sep 17 00:00:00 2001 From: SiddarthAA Date: Wed, 24 Jun 2026 14:09:47 +0530 Subject: [PATCH 2/4] fix(dashboard): responsive policies activity table + column reorder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On narrow / portrait windows the policies → activity table collapsed and columns overlapped (e.g. DURATION/SESSION headers and the Event/CLI badges bled into each other). Each data cell now clips at its own edge (overflow-hidden + ellipsis, nowrap headers), the table holds a 1280px min-width and scrolls horizontally below that with a themed scrollbar, and the badge / long-header columns were widened so their content fits. Also reorders the columns to: time, decision, event, cli, tool, policy, reason, mode, duration, session. UI only — no data fetching, filters, row-expand, badges, or pagination logic changed. Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 4 +++ app/globals.css | 29 ++++++++++++++++++++-- app/policies/hooks-client.tsx | 46 +++++++++++++++++------------------ 3 files changed, 54 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac6fcfeb..bc4fb9a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ ### Features - Collapse the dashboard "Reach Us" dropdown's three GitHub links (Request a Feature / Report an Issue / Ask a Question) into a single **Feedback & Issues** entry pointing at the GitHub issue chooser (`/issues/new/choose`). +- Reorder the policies → activity table columns to: time Ā· decision Ā· event Ā· cli Ā· tool Ā· policy Ā· reason Ā· mode Ā· duration Ā· session. + +### Fixes +- Fix the policies → activity table collapsing on narrow / portrait windows. Columns no longer overlap — each data cell clips with an ellipsis at its own edge and headers stay on one line — and the table holds a readable `min-width` (1280px), scrolling horizontally below that via a themed scrollbar instead of squeezing columns into each other. The badge / long-header columns (event, cli, decision, duration, session) were widened so their content fits. ### Docs - Replace the community Slack invite with Discord (`https://discord.gg/2zjBZP7yQJ`) everywhere it's user-facing: the `failproofai --help` LINKS banner, the dashboard "Reach Us" dropdown, and the README community badge (English + 14 translations). The Slack *webhook notification example* (`examples/policies-notification.js`) is intentionally left as-is — it's a feature integration, not a community link. diff --git a/app/globals.css b/app/globals.css index 7d37a6a9..737305ba 100644 --- a/app/globals.css +++ b/app/globals.css @@ -387,8 +387,24 @@ input[type="date"] { color-scheme: dark; } border: 1px solid var(--line-2); border-top: 0; background: var(--bg-2); -} -.activity-table { width: 100%; } + /* Scroll horizontally on narrow / portrait viewports instead of letting the + fixed-layout columns collapse into each other. Themed thin scrollbar so it + reads as part of the same instrument family. */ + overflow-x: auto; + overflow-y: hidden; + scrollbar-width: thin; + scrollbar-color: var(--line-2) transparent; +} +.activity-table-wrap::-webkit-scrollbar { height: 10px; } +.activity-table-wrap::-webkit-scrollbar-track { background: var(--bg-3); } +.activity-table-wrap::-webkit-scrollbar-thumb { + background: var(--line-2); + border: 2px solid var(--bg-3); +} +.activity-table-wrap::-webkit-scrollbar-thumb:hover { background: var(--accent-green); } +/* min-width keeps every column wide enough for its header/badge; below it, + the wrap scrolls instead of squeezing columns into each other. */ +.activity-table { width: 100%; min-width: 1280px; } .activity-thead { background: var(--bg-3); } .activity-thead tr { border-bottom: 1px solid var(--line-2); } .activity-th { @@ -399,8 +415,17 @@ input[type="date"] { color-scheme: dark; } font-weight: 500; color: var(--accent-green); text-align: left; + white-space: nowrap; } .activity-th.text-right { text-align: right; } +/* Data cells stay on one line and clip (with ellipsis) at their own column + edge, so a wide badge/value/header can never overlap the next column. + Scoped to data rows so the expanded detail row (colSpan) is untouched. */ +.activity-data-row > td { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} /* zebra rhythm — adds ambient banding without breaking the dark feel. Hover overrides the stripe so rows feel responsive. */ diff --git a/app/policies/hooks-client.tsx b/app/policies/hooks-client.tsx index 88bbc93a..98e63b30 100644 --- a/app/policies/hooks-client.tsx +++ b/app/policies/hooks-client.tsx @@ -634,30 +634,30 @@ function ActivityTab({ - - - - - - + + + + + + + - + - - @@ -669,7 +669,7 @@ function ActivityTab({ toggleRow(i)} - className={`cursor-pointer transition-colors ${ + className={`activity-data-row cursor-pointer transition-colors ${ isDeny ? "bg-red-500/[0.03] hover:bg-red-500/[0.07] border-l-2 border-l-red-500/40" : isInstruct @@ -686,6 +686,12 @@ function ActivityTab({ }`} /> + @@ -714,6 +720,13 @@ function ActivityTab({ > {item.reason ?? "\u2014"} + @@ -725,19 +738,6 @@ function ActivityTab({ cwd={item.cwd} /> - - {isExpanded && } From a83739928c611df4c80e9fd623d623c4be9e9b9c Mon Sep 17 00:00:00 2001 From: SiddarthAA Date: Wed, 24 Jun 2026 15:21:57 +0530 Subject: [PATCH 3/4] copy(audit): reword invite card + grammar-pass share templates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Invite card heading 'unlock failproof perks' -> 'Share with friends'; subtitle -> 'wanna know how your friends' agents score?'. - Grammar pass over the X/LinkedIn share templates: add a missing article, 'runs local' -> 'runs locally' (adverb), fix one mis-coordinated 'and', a comma splice, and 'stops you trying' -> 'stops you from trying'. No emojis, no new content, CTAs/handles unchanged. UI copy only — no logic changes. Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 1 + app/audit/_components/come-back-better-section.tsx | 4 ++-- app/audit/_components/share-templates.ts | 14 +++++++------- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc4fb9a8..7d1f65ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ ### Docs - Replace the community Slack invite with Discord (`https://discord.gg/2zjBZP7yQJ`) everywhere it's user-facing: the `failproofai --help` LINKS banner, the dashboard "Reach Us" dropdown, and the README community badge (English + 14 translations). The Slack *webhook notification example* (`examples/policies-notification.js`) is intentionally left as-is — it's a feature integration, not a community link. +- Reword the `/audit` invite card ("Share with friends" / "wanna know how your friends' agents score?") and grammar-pass the X/LinkedIn share templates (article/adverb/coordination/comma-splice fixes only — no behavioral or structural change). ## 0.0.11-beta.11 — 2026-06-23 diff --git a/app/audit/_components/come-back-better-section.tsx b/app/audit/_components/come-back-better-section.tsx index 32a9b60f..9a3c12b2 100644 --- a/app/audit/_components/come-back-better-section.tsx +++ b/app/audit/_components/come-back-better-section.tsx @@ -35,7 +35,7 @@ const DEFAULT_REMINDER_DAYS = 7; const REMINDER_OPTIONS = [3, 7, 14, 30] as const; type Cadence = typeof REMINDER_OPTIONS[number]; -const PERKS_PERK = "share with 3 friends → unlock pro features for a month."; +const PERKS_PERK = "wanna know how your friends' agents score?"; // The AuthDialog is shared by the reminder and invite CTAs. The reminder path // keeps the dialog's default copy; the invite path swaps in login-required @@ -294,7 +294,7 @@ export function ComeBackBetterSection({ isRunning, onRerun, score }: Props) { {/* Perks card */}
-
unlock failproof perks
+
Share with friends
{PERKS_PERK}
+ Time Decision Event CLI Tool Policy ReasonMode Duration SessionModeTime
+ {formatRelativeTime(item.timestamp)} + + {item.permissionMode ? ( + + ) : ( + "\u2014" + )} + - {item.permissionMode ? ( - - ) : ( - "\u2014" - )} - - {formatRelativeTime(item.timestamp)} -
+ {/* Column widths (table-layout: fixed). Order must match : + chevron Ā· time Ā· decision Ā· event Ā· cli Ā· tool Ā· policy Ā· reason Ā· mode Ā· duration Ā· session. + Badge columns (decision/event/cli/mode) must stay wide enough for their widest + pill — mode holds "bypassPermissions", the longest badge text in the table. */} @@ -639,9 +648,9 @@ function ActivityTab({ - - - + + +