Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# Changelog

## 0.0.10-beta.10 — 2026-05-09
## 0.0.10-beta.10 — 2026-05-10

### Fixes
- `scripts/launch.ts`: drop the dashboard-startup ASCII wordmark entirely. Every iteration (the original 10-row pixel-block banner, the 6-row trim, and the colored half-block render of the brand PNG) read poorly in standard terminals — too tall, vertically stretched, or just visual noise. Replace with a plain-text `failproof ai` title and a `📦 Version: <ver>` line padded to the same column as the existing `⭐ Star us:` / `📖 Docs:` / `💬 Slack:` lines, so version and URLs form one cleanly-aligned block. Removes `scripts/generate-banner.ts`, `scripts/banner.generated.ts`, `assets/wordmark/source.png`, the `pngjs` + `@types/pngjs` devDeps, and `__tests__/scripts/banner.test.ts` that were added earlier in this branch's history (#338).
- Read full session UUID from each Gemini JSONL's metadata header at project-page session-listing time (`lib/gemini-projects.ts`), so links route to a valid `[sessionId]` segment instead of the 8-hex filename prefix that the session detail route's `UUID_RE` check rejects (404). Hooks-section links were already correct because hook stdin carries the full UUID; this aligns the projects-section with that path (#336).
- Canonicalize OpenCode and Pi tool-input arg keys so the path-checking builtin policies actually fire on `read` / `write` / `edit` tool calls. OpenCode delivers args as `filePath` / `oldString` / `newString` / `replaceAll`; Pi delivers `path`. The failproofai builtins read `ctx.toolInput.file_path`, so the shape mismatch silently no-op'd `block-read-outside-cwd` (OpenCode), `block-env-files`, and `block-secrets-write` for both CLIs — letting an OpenCode session read paths outside its CWD without any deny, and letting Pi sessions write to `.env` / SSH-key paths unchecked. Note: `block-read-outside-cwd` already worked on Pi via an existing `tool_input.path` fallback at `src/hooks/builtin-policies.ts:796`, so only `block-env-files` and `block-secrets-write` were affected on Pi. Mirrors the `OPENCODE_TOOL_MAP` / `PI_TOOL_MAP` pattern from PR #293 with two new per-tool maps keyed by canonical PascalCase tool name: `OPENCODE_TOOL_INPUT_MAP` (Read / Write / Edit) and `PI_TOOL_INPUT_MAP` (Read / Write / Edit, top-level `path` only — Pi's nested `edits[{oldText,newText}]` array isn't a flat key rename). Both maps are mirrored inline in their respective shims so `.opencode/plugins/failproofai.mjs` and `pi-extension/index.ts` stay self-contained; MCP `mcp_*` and any unmapped tool pass through unchanged. Existing OpenCode users must regenerate their shim via `failproofai policies --install --cli opencode` to pick up the fix; Pi users must reinstall via `failproofai policies --install --cli pi` (#337).
- Route OpenCode project pages by encoded cwd (`encodeFolderName(worktree)`) instead of opencode's project name / basename, fixing the dashboard `/project/<slug>` 404 for OpenCode-only sessions and merging same-cwd OpenCode + other-CLI rows on the Projects page (#335).
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
"access": "public"
},
"devDependencies": {
"@anthropic-ai/sdk": "^0.93.0",
"@tailwindcss/postcss": "^4.1.18",
"@tanstack/react-virtual": "^3.13.18",
"@testing-library/jest-dom": "^6.9.1",
Expand All @@ -91,7 +92,6 @@
"tailwind-merge": "^3.4.0",
"tailwindcss": "^4.1.18",
"typescript": "^6.0.2",
"@anthropic-ai/sdk": "^0.93.0",
"vitest": "^4.0.18"
},
"dependencies": {
Expand Down
34 changes: 5 additions & 29 deletions scripts/launch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,35 +12,11 @@ import { version } from "../package.json";
export function launch(mode: "dev" | "start"): void {
const { loggingLevel, disableTelemetry, allowedDevOrigins, remainingArgs } = parseScriptArgs(process.argv.slice(2));

// Hand-crafted pixel-block wordmark mirroring the hosted PNG logo at
// https://d2wq11aau0arks.cloudfront.net/failproof/logo-wordmark.png —
// chunky lowercase "failproof ai" compressed with Unicode 2x2 quadrant
// block characters (▖▗▘▙▚▛▜▝▞▟ + ▀ ▄ █ ▌ ▐) and then horizontally
// scaled 4:3 (every 4th source-pixel column dropped) so the full
// wordmark fits in ~75 cols × ~10 rows — clean on any standard ≥80-col
// terminal.
const bannerLines = [
" ███ ▐███ ▐█",
" ▐█▛▀▀ ▟█▖ ▟█▛▀▀ ▝▀",
" ██████ ▗████▌ ▝██▛ ██ ███ ▐██▙ ▗███ ▐██▙ ▗█████▙ ████▌ ▐█",
" ▀▜█▛▀▀ ▝▀▀▀▀█▙ ▄▙ ██ ▗▟▀▀▜▄▖ ▄▟▀▀▘ ▄▟▛▀▜▙▖ ▄█▀▀█▄▖▝▀██▛▀▀ ▀▀▀▀▙▄ ▐█",
" ▐█▌ ▗██████ ███ ██ ▐█ ▐█▌ ██ ██▌ ▐█▌ ██ ██▌ ██▌ ██████ ▐█",
" ▐█▌ ▐█▛▀▀██ ██▀ ██ ▐█ ▐█▌ ██ ██▌ ▐█▌ ██ ██▌ ██▌ █▛▀▀██ ▐█",
" ▐█▌ ▝▀█████ ██▄▄██ ▐████▀▘ ██ ▀▜███▀▘ ▀▜███▀▘ ██▌ ▀█████ ▐█",
" ▝▀▘ ▀▀▀▀▀ ▀▀▀▀▀▀ ▐█▀▀▀ ▀▀ ▝▀▀▀ ▝▀▀▀ ▀▀▘ ▀▀▀▀▀ ▝▀",
" ▐█",
" ▝▀",
];
// Fall back to plain text on narrow terminals so the wide pixel-block art
// doesn't wrap and shred itself. process.stdout.columns is undefined when
// stdout isn't a TTY (piped, captured, redirected to a file), in which case
// there's no width to compare against and we keep the full art as-is.
const bannerWidth = bannerLines.reduce((w, l) => Math.max(w, l.length), 0);
const cols = process.stdout.columns;
const banner = cols !== undefined && cols < bannerWidth
? " failproof ai"
: bannerLines.join("\n");
console.log(`\n${banner}\n\n v${version}\n`);
// Plain-text title + a labeled `Version` line that lines up with the
// `Star us` / `Docs` / `Slack` 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}`);
console.log(` ⭐ Star us: https://github.com/exospherehost/failproofai`);
console.log(` 📖 Docs: https://befailproof.ai`);
console.log(` 💬 Slack: https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ\n`);
Expand Down