{"adoption": {"forks": 395, "observed_at": "2026-08-28T04:04:58.090378+00:00", "stars": 1526}, "canonical_url": "https://ross.abutalabs.com/products/reversa", "card": {"archived": false, "artifact_type": "framework", "description": "Transform legacy systems into executable specifications for AI coding agents", "domain": ["developer-tools", "documentation", "artificial-intelligence", "reverse-engineering"], "enriched": true, "function": ["reverse-engineering", "documentation", "agent-framework", "developer-tools"], "health_score": 79, "homepage": null, "language": "JavaScript", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["sandeco/reversa"], "name": "sandeco/reversa", "platform": ["cli", "cross-platform"], "pushed_at": "2026-08-23T22:51:07+00:00", "repo": "sandeco/reversa", "stars": 1526, "tags": ["legacy-code", "executable-specifications", "ai-coding-agents", "specification-generation", "claude-code", "cursor", "ai-agents", "nodejs"], "topics": [], "urls": [], "use_cases": ["generate specifications from a legacy codebase for AI coding agents", "document undocumented business rules in old systems", "make a legacy project safe for AI-assisted refactoring", "reverse-engineer specs from vibe-coded projects", "create operational contracts from existing code", "prepare an old codebase for Claude Code or Cursor", "extract module contracts and architecture from legacy software"], "what_it_is": "Reversa is a specification reverse-engineering framework that installs into legacy codebases and coordinates specialized AI agents to analyze existing code. It extracts business rules, flows, and architectural decisions into executable, traceable specifications that AI coding agents can use to safely evolve the system.", "when_to_avoid": ["you are starting a greenfield project where you can write specs directly", "you only need human-readable documentation rather than agent-consumable contracts", "your project is not JavaScript/Node.js based"], "when_to_choose": ["you have a legacy system with no documentation and want AI agents to work on it safely", "you need traceable, executable specifications rather than human-readable docs", "you use Claude Code, Codex, Cursor, or similar AI coding engines"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/reversa", "repo": "sandeco/reversa", "role": "main", "score": 59}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.090378+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:31:37.875338+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b559cc07f14ba1d749ef827977d22625fc3bb60167a36eeb89f6f314c4a4300e", "fetched_at": "2026-08-28T04:04:58.090378+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sandeco/reversa"}, {"content_hash": "7d77990128c8bc33bdf233c6d30c9d037ac73fb21d675846500951c5e01bc854", "fetched_at": "2026-08-29T11:34:29.002627+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/reversa"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.090378+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:31:37.875338+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b559cc07f14ba1d749ef827977d22625fc3bb60167a36eeb89f6f314c4a4300e", "fetched_at": "2026-08-28T04:04:58.090378+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sandeco/reversa"}, {"content_hash": "7d77990128c8bc33bdf233c6d30c9d037ac73fb21d675846500951c5e01bc854", "fetched_at": "2026-08-29T11:34:29.002627+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/reversa"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:31:37.875338+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b559cc07f14ba1d749ef827977d22625fc3bb60167a36eeb89f6f314c4a4300e", "fetched_at": "2026-08-28T04:04:58.090378+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sandeco/reversa"}, {"content_hash": "7d77990128c8bc33bdf233c6d30c9d037ac73fb21d675846500951c5e01bc854", "fetched_at": "2026-08-29T11:34:29.002627+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/reversa"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.090378+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.090378+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.090378+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:31:37.875338+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b559cc07f14ba1d749ef827977d22625fc3bb60167a36eeb89f6f314c4a4300e", "fetched_at": "2026-08-28T04:04:58.090378+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sandeco/reversa"}, {"content_hash": "7d77990128c8bc33bdf233c6d30c9d037ac73fb21d675846500951c5e01bc854", "fetched_at": "2026-08-29T11:34:29.002627+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/reversa"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.090378+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.090378+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:31:37.875338+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b559cc07f14ba1d749ef827977d22625fc3bb60167a36eeb89f6f314c4a4300e", "fetched_at": "2026-08-28T04:04:58.090378+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sandeco/reversa"}, {"content_hash": "7d77990128c8bc33bdf233c6d30c9d037ac73fb21d675846500951c5e01bc854", "fetched_at": "2026-08-29T11:34:29.002627+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/reversa"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.090378+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.090378+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.090378+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:31:37.875338+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b559cc07f14ba1d749ef827977d22625fc3bb60167a36eeb89f6f314c4a4300e", "fetched_at": "2026-08-28T04:04:58.090378+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sandeco/reversa"}, {"content_hash": "7d77990128c8bc33bdf233c6d30c9d037ac73fb21d675846500951c5e01bc854", "fetched_at": "2026-08-29T11:34:29.002627+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/reversa"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.090378+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.090378+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:31:37.875338+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b559cc07f14ba1d749ef827977d22625fc3bb60167a36eeb89f6f314c4a4300e", "fetched_at": "2026-08-28T04:04:58.090378+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sandeco/reversa"}, {"content_hash": "7d77990128c8bc33bdf233c6d30c9d037ac73fb21d675846500951c5e01bc854", "fetched_at": "2026-08-29T11:34:29.002627+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/reversa"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:31:37.875338+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b559cc07f14ba1d749ef827977d22625fc3bb60167a36eeb89f6f314c4a4300e", "fetched_at": "2026-08-28T04:04:58.090378+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sandeco/reversa"}, {"content_hash": "7d77990128c8bc33bdf233c6d30c9d037ac73fb21d675846500951c5e01bc854", "fetched_at": "2026-08-29T11:34:29.002627+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/reversa"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:31:37.875338+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b559cc07f14ba1d749ef827977d22625fc3bb60167a36eeb89f6f314c4a4300e", "fetched_at": "2026-08-28T04:04:58.090378+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sandeco/reversa"}, {"content_hash": "7d77990128c8bc33bdf233c6d30c9d037ac73fb21d675846500951c5e01bc854", "fetched_at": "2026-08-29T11:34:29.002627+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/reversa"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:31:37.875338+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b559cc07f14ba1d749ef827977d22625fc3bb60167a36eeb89f6f314c4a4300e", "fetched_at": "2026-08-28T04:04:58.090378+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sandeco/reversa"}, {"content_hash": "7d77990128c8bc33bdf233c6d30c9d037ac73fb21d675846500951c5e01bc854", "fetched_at": "2026-08-29T11:34:29.002627+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/reversa"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 9, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases", "young"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 129, "days_push": 10, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 59, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}