↯ RippleAI agents can search your codebase. Ripple already knows it. I gave an AI agent a refactor task on The agent read the Ripple focus file. Saw the risk. Stopped and confirmed before touching anything. Changed only the internals. Every caller kept working. 3 minutes 23 seconds. Zero debugging. That is what Ripple does for every file in your project. InstallSearch Ripple in the VS Code Extensions marketplace. Open any TypeScript or JavaScript project. Ripple starts working immediately. The ProblemYou build with AI. Changes happen fast. But when your agent changes a function, does it know which 28 other files depend on it? Does it know that changing the return type will cascade through 4 layers of your architecture? It does not. Unless it has already read your entire project. Ripple already has. Three Live Features↯ Impact Lens — SidebarOpen any file. See instantly what imports it and what it imports.
Click any file to open it. Includes CSS and style file dependencies. ↯ Ripple CodeLens — Caller CountEvery function shows its caller count permanently above the declaration.
Click any hint to open the full caller panel. No hovering required. Always visible. ↯ Safety Check — Pre-CommitStage any file for a git commit. Within 2 seconds Ripple shows which untested files in the blast radius will be affected.
Never blocks your commit. The AI Agent FeatureCopy Agent PromptRight-click any TypeScript file → ↯ Ripple: Copy Agent Prompt
Fill in your task. Paste to Claude Code, Cursor, Copilot, or any AI agent. WORKFLOW.md — Zero Repeated PromptsCopy
Planning for Complex Multi-File TasksWORKFLOW.md includes a built-in planning protocol for tasks that touch multiple files. Before writing any code, the agent:
This replaces guesswork with graph-driven precision. First-Time SetupWhen Ripple finishes scanning, a panel shows you the highest-risk file in your actual project with its real dependents. One click creates The
|
| Task | Tokens |
|---|---|
| Modify one specific file | ~200 (focus file) |
| Add a new component | ~500 (context.json) |
| Check file dependencies | ~3000 |
| Trace a call chain | ~5000 |
| Deep multi-file refactor | ~15000 |
A 300-file project never needs 250,000 tokens.
Focus File — What Agents Actually Read
packages/features/bookings/lib/handleCancelBooking.ts
→ .ripple/focus/bookings-lib-handleCancelBooking.json
{
"file": "handleCancelBooking.ts",
"modificationRisk": "dangerous",
"changeCount": 14,
"dataQuality": "complete",
"totalImporterCount": 7,
"focusKey": "bookings-lib-handleCancelBooking",
"instructions": [
"DANGER: This file has 7 importers. Top importers: api/cancel/route.ts, BookingListItem.tsx, handleNewBooking.ts. Any change has wide blast radius.",
"calledBy uses project/relative/file.tsx::functionName format — use it to locate callers directly.",
"Use layer field to confirm you are modifying the correct layer (logic/ui/handler)."
],
"importedBy": [
{
"file": "apps/web/components/booking/BookingListItem.tsx",
"modificationRisk": "safe"
},
{ "file": "apps/api/cancel/route.ts", "modificationRisk": "caution" }
],
"imports": [
"packages/lib/EventManager.ts",
"packages/features/webhooks/lib/getWebhooks.ts"
],
"symbols": [
{
"name": "handleCancelBooking",
"kind": "function",
"layer": "logic",
"callerCount": 3,
"calledBy": [
"apps/web/components/booking/BookingListItem.tsx::CancelBookingButton",
"apps/api/cancel/route.ts::DELETE"
],
"calls": [
"packages/lib/EventManager.ts::createEvent",
"packages/features/webhooks/lib/sendPayload.ts::sendWebhook"
]
}
]
}
Every path in importedBy, imports, calledBy, and calls is a project-relative path — unique across the entire project, usable as a direct lookup key in context.files.json.
Settings
| Setting | Default | Description |
|---|---|---|
ripple.enabled |
true |
Enable or disable Ripple entirely |
ripple.showCodeLens |
true |
Show caller counts above function declarations |
ripple.safetyCheck |
true |
Show blast radius warnings before git commits |
ripple.generateContext |
true |
Write .ripple/ context files on every save |
When ripple.generateContext is disabled, the live graph still builds — Impact Lens and CodeLens still work — but no files are written to .ripple/. Useful for projects where you want Ripple's UI features without the generated files.
Recommended .gitignore
# Ripple — regenerated automatically on every session
.ripple/graph.cache.json
.ripple/context.json
.ripple/context.files.json
.ripple/context.symbols.json
.ripple/focus/
.ripple/WORKFLOW.md
# Keep history.json — this is your permanent architectural memory.
# It records every function change, import edge, and blast radius
# since Ripple was installed. Useful for code reviews and audits.
# .ripple/history.json
Setup
- Install from the VS Code Marketplace
- Open any TypeScript or JavaScript project
- Wait for
↯ Ripple: readyin the status bar - Click Activate AI Mode in the setup panel (or copy
.ripple/WORKFLOW.mdtoCLAUDE.mdmanually) - Done — one-line prompts work safely from this point
To reopen the panel: Ctrl+Shift+P → Ripple: Show AI Setup Panel
What Ripple Tracks
✓ Named imports import { validateToken } from './auth'
✓ Default imports import Button from './Button'
✓ @/ alias imports import { db } from '@/lib/db'
✓ tsconfig path aliases import x from '~components/x'
✓ Style imports import styles from './Button.module.css'
✓ Barrel file re-exports export { x } from './index'
✓ Named function decls export function handleLogin() {}
✓ Arrow function decls const handleSubmit = () => {}
✓ Class declarations export class EventManager {}
✓ MobX class stores class CycleStore { @action fetch() {} }
✓ JSX component usage <Button /> counted as a caller
Known Limitations
✗ Namespace imports import * as Utils from './utils'
✗ Aliased imports import { Button as Btn } from './ui'
✗ Dynamic imports await import('./module')
✗ require() calls require('./config')
✗ Monorepo workspace pkgs @calcom/lib/* resolved via Turborepo workspace
(cross-package edges not tracked — project-internal files only)
✗ Constructor calls new ClassName() not tracked as calledBy edge
Framework Support
Detected automatically at install:
| Framework | Detection | Context |
|---|---|---|
| Next.js (App + Pages Router) | next.config.ts |
Route conventions, server components |
| Vite | vite.config.ts |
No SSR assumptions |
| React Router | react-router.config.ts |
SPA conventions |
| Turborepo | turbo.json |
Monorepo directory scanning |
| MobX | package.json + imports |
Class stores detected, correct constraint rule |
| React Query / tRPC / SWR | package.json |
Data-fetching state detected |
| Prisma | Method names | DB methods classified as data layer |
| Tailwind | tailwind.config.ts |
Styling constraint in WORKFLOW.md |
Works with: React · Node.js · NestJS · Remix · Astro · Any TypeScript/JS project
Privacy
Entirely local. No data leaves your machine. No telemetry. No account. No network requests.
Roadmap
- MCP server — agents call
ripple_get_blast_radius()directly without reading files - Architecture Rules Engine — define layer boundaries, flag violations in real time
- Cursor Marketplace listing
- Dynamic import tracking
Contributing
GitHub: https://github.com/raushankcode/ripple
Issues, feature requests, and pull requests welcome.
MIT License
↯ Ripple — AI agents that use Ripple behave like senior engineers who have read your entire codebase.