Loading...
Loading...
Scan, assess, plan, and replace SaaS tools with AI-built code. Analyzes your codebase for SaaS integrations, generates migration plans, executes replacements, and validates results.
npx skill4agent add vendor-rip/rip vendor-ripScan, assess, plan, and replace SaaS tools in any codebase. Works with any AI agent: Claude Code, Cursor, Windsurf, or any tool with codebase access.
design/agent-skill-spec.mdprofiles/{tool}/vendor-rip scan <tool>vendor-rip discovervendor-rip plan <tool>┌─────────────────────────────────────────────────────────────┐
│ ○ Scan ○ Plan ○ Execute ○ Validate ○ Done │
└─────────────────────────────────────────────────────────────┘discover~/.vendor-rip/session--token=vrip_h_...~/.vendor-rip/sessionvrip_h_Do you have a vendor.rip token from a previous assessment? (paste token or press Enter to skip)
GET https://vendor.rip/api/handoff/{token}~/.vendor-rip/sessionpackage.jsonrequirements.txtpyproject.tomlgo.modGemfilebuild.gradlepom.xmlCargo.tomlprofiles/{tool}/{method, calls_count, files_count, pattern_type}pattern_typewrapperscatteredembeddedprofiles/{tool}/features.yamlamplitude.track()amplitude.identify()amplitude.Experiment.fetch()trivialmoderatehardvery_hardlock_hash{name}@{version}scan_duration_secondsdependency_countdependencies./vendor-rip-report.json{
"tool": {
"name": "<tool_name>",
"slug": "<tool_slug>",
"sdk_package": "<package_name>",
"sdk_version": "<version>"
},
"integration_points": [
{
"method": "<method_name>",
"calls_count": 14,
"files_count": 4,
"pattern_type": "wrapper|scattered|embedded",
"feature_category": "<feature_category>",
"complexity_assessment": "trivial|moderate|hard|very_hard",
"reasoning": "<brief justification>"
}
],
"feature_coverage": {
"detected_features": ["<feature_1>", "<feature_2>"],
"estimated_total_features": 12,
"coverage_pct": 25
},
"data_dependencies": [
{ "type": "env_var|config_file|data_store|api_key", "name": "<name>", "description": "<desc>" }
],
"dependencies": ["<pkg_1>", "<pkg_2>"],
"agent_assessment": {
"overall_complexity": "trivial|moderate|hard|very_hard",
"estimated_days_min": 3,
"estimated_days_max": 5,
"key_risks": ["<risk_1>"],
"recommended_approach": "<approach and rationale>"
},
"evidence": {
"package_lock_hash": "sha256:<hash>",
"scan_duration_seconds": 12.4,
"sdk_dependency_tree": ["<pkg_1>@<version>", "<pkg_2>@<version>"]
}
}data_dependenciesprocess.envos.environ.envamplitude.config.js.amplitudercintegration_pointsfeature_coverage.estimated_total┌─────────────────────────────────────────────────────────────┐
│ ✓ Scan ▸ Plan ○ Execute ○ Validate ○ Done │
└─────────────────────────────────────────────────────────────┘
{tool} | {sdk_package} v{sdk_version}
Method Calls Files Feature Complexity Pattern
-------------------------------------------------------------------------------------
{method} {n} {n} {feature} {complexity} {pattern}
...
Features: {n} of ~{total} ({pct}%) | Complexity: {level} | Est: {min}-{max} days
Risks:
- {risk_1}
- {risk_2}
Saved: ./vendor-rip-report.json
────────────────────────────────────────────────────────────────
Next: Get community context for your migration plan.
1. Copy the block below
2. Paste at vendor.rip/calibrate
3. Paste the insights code you get back here
tool: {tool_name}
sdk: {sdk_package}@{sdk_version}
features:
- {feature}: {calls_count} calls
complexity: {overall_complexity}
depth: {methods} methods across {files} files
evidence:
lock_hash: {sha256}
scan_duration: {seconds}s
session: {token or empty}
(saved to ./vendor-rip-scan-summary.txt)
────────────────────────────────────────────────────────────────
Insights code: ___ (or Enter to plan with local analysis only) Note: Agent assessment — no community-calibrated rules for this tool.▸ Plan./vendor-rip-scan-summary.txttool: {tool_name}
sdk: {sdk_package}@{sdk_version}
features:
- {feature}: {calls_count} calls
complexity: {overall_complexity}
depth: {methods} methods across {files} files
evidence:
deps: {comma-separated dependency list}
lock_hash: {sha256}
scan_duration: {seconds}s
session: {read from ~/.vendor-rip/session if it exists, otherwise leave empty}vrip_8nK3qM2pL4...https://api.vendor.rip/insights/{code}~/.vendor-rip/session┌─────────────────────────────────────────────────────────────┐
│ ✓ Scan ▸ Plan ○ Execute ○ Validate ○ Done │
└─────────────────────────────────────────────────────────────┘
Community context loaded.
Compared to {N} similar scans:
Your integration depth: {percentile}th percentile
Calibrated estimate: {days} days (vs local estimate: {local_days})
Recommended approach: {approach} ({success_rate}% success rate)
Watch out: {common_gotcha}
Generate migration plan? (y/n)┌─────────────────────────────────────────────────────────────┐
│ ✓ Scan ▸ Plan ○ Execute ○ Validate ○ Done │
└─────────────────────────────────────────────────────────────┘
Generate migration plan? (y/n)~/.vendor-rip/sessionvrip_h_session:| Integration pattern | Recommended approach |
|---|---|
| Few calls, concentrated in one or two files | Direct replacement — rewrite the files |
| Many calls scattered across many files | Adapter pattern — create a wrapper, replace behind it |
| Deep integration with business logic | Incremental replacement — swap feature by feature |
| Mixed patterns | Adapter + incremental — wrap first, then replace incrementally |
./vendor-rip-plan.json{
"phases": [
{
"phase_name": "<name>",
"estimated_days": 0.5,
"tasks": ["<task_1>"],
"pitfalls": ["<pitfall_1>"],
"validation_criteria": ["<criterion_1>"]
}
],
"total_estimated_days": 6.0,
"approach": { "name": "<approach>", "rationale": "<why>" },
"risk_flags": ["<risk_1>"],
"parallel_run_strategy": "<strategy>"
}┌─────────────────────────────────────────────────────────────┐
│ ✓ Scan ▸ Plan ○ Execute ○ Validate ○ Done │
└─────────────────────────────────────────────────────────────┘
Migration Plan: amplitude -> custom replacement
Approach: Adapter pattern
Wrap all Amplitude calls behind src/lib/analytics.ts
Replace implementation behind the adapter
Rationale: 14 track() calls across 4 files — easier to change one adapter than 14 call sites
Phase 1: Setup (0.5 days)
Tasks:
- Create src/lib/analytics.ts adapter module
- Define interface matching current usage patterns
- Point adapter to existing Amplitude SDK (no behavior change)
Validation: All existing tests pass. No behavior change.
Phase 2: Core build (2-3 days)
Tasks:
- Implement event tracking behind adapter (trivial — 0.5 days)
- Implement user identification behind adapter (trivial — 0.3 days)
- Implement experimentation replacement (hard — 1.5-2 days)
WARNING: experiment assignment logic often has hidden state
Validation: Each feature works independently behind the adapter.
Phase 3: Data migration (1 day)
Tasks:
- Export historical events if needed
- Set up new event storage (or decide to start fresh)
Validation: Historical data accessible in new system (or conscious decision to skip).
Phase 4: Parallel run (1-2 days)
Tasks:
- Run both Amplitude and replacement simultaneously
- Compare outputs for consistency
- Monitor for edge cases
Validation: 48+ hours of parallel operation with no discrepancies.
IMPORTANT: Do NOT cancel the Amplitude subscription until parallel run completes.
Phase 5: Cutover & cleanup (0.5 days)
Tasks:
- Switch adapter to new implementation only
- Remove @amplitude/* packages from dependencies
- Remove Amplitude-specific config and env vars
- Clean up unused imports
Validation: Full test suite passes. No Amplitude references remain in codebase.
Total: 5-7 days
Risk flags:
- Experimentation module is the hardest part — budget extra time
- Session replay plugin needs an alternative or conscious removal
Ready to start? (y/n)┌─────────────────────────────────────────────────────────────┐
│ ✓ Scan ✓ Plan ▸ Execute ○ Validate ○ Done │
│ Phase 2/5: Core Build │
└─────────────────────────────────────────────────────────────┘npm testpytest.envamplitude.config.js.amplituderc┌─────────────────────────────────────────────────────────────┐
│ ✓ Scan ✓ Plan ✓ Execute ▸ Validate ○ Done │
└─────────────────────────────────────────────────────────────┘
Validation Results:
Tests: 47 passed, 0 failed
Old SDK references: 0 remaining
Old config entries: 0 remaining
Dependencies removed: <list>
Manual checks needed:
- <check_1>
- <check_2>
All automated checks passed../vendor-rip-completion.jsonvendor-rip-report.json{
"tool": { "name": "...", "slug": "...", "sdk_package": "...", "sdk_version": "..." },
"integration_points": [ "... (same as scan report)" ],
"feature_coverage": { "... (same as scan report)" },
"data_dependencies": [ "... (same as scan report)" ],
"dependencies": ["..."],
"agent_assessment": { "... (same as scan report)" },
"evidence": {
"package_lock_hash_before": "sha256:<hash>",
"package_lock_hash_after": "sha256:<hash>",
"scan_duration_seconds": 12.4,
"sdk_dependency_tree": ["<removed packages>"]
},
"migration": {
"approach": "<approach_used>",
"duration_days": 5.2,
"features_replaced": ["event_tracking", "user_identification", "experimentation"],
"outcome": "success|partial|reverted"
},
"per_feature_timing": [
{ "feature": "<feature>", "days": 0.5, "notes": "" }
],
"gotchas_encountered": ["<gotcha_1>"],
"validation_results": {
"tests_passed": 47, "tests_failed": 0,
"manual_checks": ["<check_1>"]
}
}phasesactual_days./vendor-rip-completion-summary.txttool: amplitude
sdk: @amplitude/analytics-browser@2.8.0
features:
- event_tracking: 14 calls -> replaced (0.5 days)
- user_identification: 3 calls -> replaced (0.3 days)
- experimentation: 4 calls -> replaced (2.5 days)
approach: adapter pattern
duration: 5.2 days
outcome: success
gotcha: experiment assignment had hidden state in localStorage — needed migration
evidence:
lock_hash_before: sha256:a1b2c3d4e5f6
lock_hash_after: sha256:x7y8z9a0b1c2
scan_duration: 12.4s
session: {read from ~/.vendor-rip/session, or empty}┌─────────────────────────────────────────────────────────────┐
│ ✓ Scan ✓ Plan ✓ Execute ✓ Validate ▸ Done │
└─────────────────────────────────────────────────────────────┘
{tool} replaced in {days} days | {approach} | {outcome}
Feature Calls Actual Days Notes
-----------------------------------------------------------
{feature} {n} {days} {notes or blank}
...
Gotchas:
- {gotcha_1}
- {gotcha_2}
Validation: {passed} passed, {failed} failed | {remaining} old references remaining
Saved: ./vendor-rip-completion.json
────────────────────────────────────────────────────────────────
Next: See what teams like yours did after this.
1. Copy the block below
2. Paste at vendor.rip/calibrate
3. Paste the insights code you get back here
tool: {tool_name}
sdk: {sdk_package}@{sdk_version}
features:
- {feature}: {calls_count} calls -> replaced ({days} days)
approach: {approach}
duration: {total_days} days
outcome: {outcome}
gotcha: {gotcha or "none"}
evidence:
lock_hash_before: {sha256}
lock_hash_after: {sha256}
scan_duration: {seconds}s
session: {token or empty}
(saved to ./vendor-rip-completion-summary.txt)
────────────────────────────────────────────────────────────────
Insights code: ___ (or Enter to finish)https://api.vendor.rip/insights/{code}~/.vendor-rip/session┌─────────────────────────────────────────────────────────────┐
│ ✓ Scan ✓ Plan ✓ Execute ✓ Validate ✓ Done │
└─────────────────────────────────────────────────────────────┘
Your Rip Receipt:
RIP {tool} — {days} days — {approach}
Teams in your cluster typically find opportunities in:
{category_1} — {pct}% had rippable tools
{category_2} — {pct}% had rippable tools
{category_3} — {pct}% had rippable tools
{total_tools} tools across these categories.
Run a discovery scan? (y/n)┌─────────────────────────────────────────────────────────────┐
│ ✓ Scan ✓ Plan ✓ Execute ✓ Validate ✓ Done │
└─────────────────────────────────────────────────────────────┘
Done. Reports saved to ./vendor-rip-completion.json and ./vendor-rip-completion-summary.txtvendor-rip discoverpackage.jsonrequirements.txtpyproject.tomlgo.modGemfilebuild.gradlepom.xmlCargo.tomlcomposer.json@amplitude/*@datadog/*launchdarkly-*pricing.yaml./vendor-rip-discovery.json{
"tools_detected": [
{
"name": "<tool>",
"package": "<pkg>",
"version": "<version>",
"integration_points_count": 8,
"quick_assessment": "<one-line summary>",
"rip_score_estimate": 85,
"savings_estimate": "$12k/yr or null"
}
],
"categorized": {
"quick_wins": [{ "name": "<tool>", "package": "<pkg>", "reason": "<why>" }],
"bigger_projects": [{ "name": "<tool>", "package": "<pkg>", "reason": "<why>" }],
"probably_keep": [{ "name": "<tool>", "package": "<pkg>", "reason": "<why>" }]
},
"total_addressable_savings_estimate": "$40k-80k/yr or null"
}┌──────────────────────────────────────┐
│ ▸ Discover ○ Scan ○ Plan ... │
└──────────────────────────────────────┘
Found 6 SaaS tools:
Tool Category Points Complexity Est. Days Savings
---------------------------------------------------------------------------
LaunchDarkly feature flags 8 trivial 1-2 $12k/yr
Datadog monitoring 14 moderate 6-8 $50k/yr
Auth0 auth 6 moderate 3-5
Retool internal tools 3 moderate 4-6
Contentful CMS 4 trivial 2-3
Statuspage status page 1 trivial 0.5 $3k/yr
Quick wins (< 3 days):
LaunchDarkly, Contentful, Statuspage
Bigger projects:
Datadog (RUM replacement is the hard part), Retool (internal tool rebuild)
Probably keep:
Auth0 — deep integration, good value for money
Addressable savings: $65k+/yr (partial — pricing unknown for 3 tools)
Saved: ./vendor-rip-discovery.json
Deep scan a tool? (type name, or Enter to finish)┌─────────────────────────────────────────────────────────────┐
│ ✓ Discover ▸ Scan ○ Plan ○ Execute ... │
└─────────────────────────────────────────────────────────────┘| Situation | What to do |
|---|---|
| Tool not found in dependencies | "No SDK detected for {tool}." List the dependency files you checked. Suggest retrying with the exact package name, or running |
| Scan interrupted | Do not save partial results. Report what happened. The developer can re-run — scans are idempotent. |
| Migration fails (tests break) | Show the failing tests. Do NOT overwrite the developer's code without confirmation. Offer: fix the issue, revert to last checkpoint (git commit), or abort. |
| Validation fails | Show specific failures. Offer: fix and re-validate, accept as partial outcome, or abandon. |
| Network unavailable | "Cannot reach vendor.rip. Skipping community insights." All local functionality works — the skill never blocks on network. |
| Invalid insights code | "That code didn't work. Try copying it again, or press Enter to skip." Allow retry. |
| Tool profile malformed | Log a warning. Fall back to agent-only reasoning. Do not fail the scan. |
| Insufficient file permissions | Report which files are inaccessible. Proceed with what's available. Note the gap in the report. |
profiles/{tool-slug}/features.yamlpatterns.yamlcomplexity.yamlmigration.yamlpricing.yamldata.yaml| File | Created when | Purpose |
|---|---|---|
| After scan (Phase 1) | Full local scan report |
| After scan (Phase 2) | Scan summary for community calibration exchange |
| After planning (Phase 3) | Migration plan with phases, tasks, validation criteria |
| After migration (Phase 6) | Full completion report extending scan report |
| After migration (Phase 6) | Completion summary for community calibration exchange |
| After discovery (Phase 7) | All detected SaaS tools with quick assessments |
| After first calibration exchange | Session token for linking exchanges across projects |
package.jsonhttps://api.vendor.rip/insights/{code}~/.vendor-rip/session