{"adoption": {"forks": 53, "observed_at": "2026-08-28T04:04:37.843239+00:00", "stars": 1403}, "canonical_url": "https://ross.abutalabs.com/products/ccundo", "card": {"archived": false, "artifact_type": "cli-tool", "description": "[claude now natively supports this feature] ccundo seamlessly integrates with Claude Code to provide granular undo functionality. It reads directly from Claude Code's session files to track file operations and allows you to selectively revert changes with full preview and cascading safety.", "domain": ["developer-tools"], "enriched": true, "function": ["cli", "developer-tools", "file-system", "backup", "version-control"], "health_score": 40, "homepage": null, "language": "JavaScript", "license": "NOASSERTION", "license_family": "other", "maturity": "maintenance", "member_repos": ["RonitSachdev/ccundo"], "name": "RonitSachdev/ccundo", "platform": ["cli", "cross-platform"], "pushed_at": "2025-07-27T07:06:46+00:00", "repo": "RonitSachdev/ccundo", "stars": 1403, "tags": ["claude-code", "undo", "redo", "session-management", "ai-development", "file-operations", "command-line", "automation", "nodejs"], "topics": [], "urls": [], "use_cases": ["undo changes made by claude code", "revert individual file operations from an ai coding session", "preview diffs before undoing ai edits", "redo previously undone claude code operations", "recover files deleted by an ai assistant", "track what files claude code modified in a session"], "what_it_is": "ccundo is a CLI tool that provides granular undo and redo functionality for Claude Code sessions by reading Claude Code's session files to track file operations. It lets developers selectively revert or restore changes with previews, cascading safety, and automatic backups.", "when_to_avoid": ["Claude Code now natively supports undo functionality", "you don't use Claude Code for AI-assisted development", "you need general-purpose version control rather than session-based undo"], "when_to_choose": ["you use Claude Code and want to selectively revert its file edits", "you need to preview diffs before undoing AI-generated changes", "you want cascading undo that keeps dependent operations consistent"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/ccundo", "repo": "RonitSachdev/ccundo", "role": "main", "score": 33}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:37.843239+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:38:53.828528+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b3f5720133ba9975a6862a2b53e9f61ac13d9d4f77c2673be9400ad1eac4d02c", "fetched_at": "2026-08-28T04:04:37.843239+00:00", "kind": "readme", "missing": false, "url": "https://github.com/RonitSachdev/ccundo"}, {"content_hash": "b8a0d4080baeb38058033713fdb2c8349f7126e736119eb22f0e3eb614824c95", "fetched_at": "2026-08-29T11:52:52.166628+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccundo"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:37.843239+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:38:53.828528+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b3f5720133ba9975a6862a2b53e9f61ac13d9d4f77c2673be9400ad1eac4d02c", "fetched_at": "2026-08-28T04:04:37.843239+00:00", "kind": "readme", "missing": false, "url": "https://github.com/RonitSachdev/ccundo"}, {"content_hash": "b8a0d4080baeb38058033713fdb2c8349f7126e736119eb22f0e3eb614824c95", "fetched_at": "2026-08-29T11:52:52.166628+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccundo"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:38:53.828528+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b3f5720133ba9975a6862a2b53e9f61ac13d9d4f77c2673be9400ad1eac4d02c", "fetched_at": "2026-08-28T04:04:37.843239+00:00", "kind": "readme", "missing": false, "url": "https://github.com/RonitSachdev/ccundo"}, {"content_hash": "b8a0d4080baeb38058033713fdb2c8349f7126e736119eb22f0e3eb614824c95", "fetched_at": "2026-08-29T11:52:52.166628+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccundo"}], "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:37.843239+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:37.843239+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:37.843239+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:38:53.828528+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b3f5720133ba9975a6862a2b53e9f61ac13d9d4f77c2673be9400ad1eac4d02c", "fetched_at": "2026-08-28T04:04:37.843239+00:00", "kind": "readme", "missing": false, "url": "https://github.com/RonitSachdev/ccundo"}, {"content_hash": "b8a0d4080baeb38058033713fdb2c8349f7126e736119eb22f0e3eb614824c95", "fetched_at": "2026-08-29T11:52:52.166628+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccundo"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:37.843239+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:37.843239+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:38:53.828528+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b3f5720133ba9975a6862a2b53e9f61ac13d9d4f77c2673be9400ad1eac4d02c", "fetched_at": "2026-08-28T04:04:37.843239+00:00", "kind": "readme", "missing": false, "url": "https://github.com/RonitSachdev/ccundo"}, {"content_hash": "b8a0d4080baeb38058033713fdb2c8349f7126e736119eb22f0e3eb614824c95", "fetched_at": "2026-08-29T11:52:52.166628+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccundo"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:37.843239+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:37.843239+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:37.843239+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:38:53.828528+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b3f5720133ba9975a6862a2b53e9f61ac13d9d4f77c2673be9400ad1eac4d02c", "fetched_at": "2026-08-28T04:04:37.843239+00:00", "kind": "readme", "missing": false, "url": "https://github.com/RonitSachdev/ccundo"}, {"content_hash": "b8a0d4080baeb38058033713fdb2c8349f7126e736119eb22f0e3eb614824c95", "fetched_at": "2026-08-29T11:52:52.166628+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccundo"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:37.843239+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:37.843239+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:38:53.828528+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b3f5720133ba9975a6862a2b53e9f61ac13d9d4f77c2673be9400ad1eac4d02c", "fetched_at": "2026-08-28T04:04:37.843239+00:00", "kind": "readme", "missing": false, "url": "https://github.com/RonitSachdev/ccundo"}, {"content_hash": "b8a0d4080baeb38058033713fdb2c8349f7126e736119eb22f0e3eb614824c95", "fetched_at": "2026-08-29T11:52:52.166628+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccundo"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:38:53.828528+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b3f5720133ba9975a6862a2b53e9f61ac13d9d4f77c2673be9400ad1eac4d02c", "fetched_at": "2026-08-28T04:04:37.843239+00:00", "kind": "readme", "missing": false, "url": "https://github.com/RonitSachdev/ccundo"}, {"content_hash": "b8a0d4080baeb38058033713fdb2c8349f7126e736119eb22f0e3eb614824c95", "fetched_at": "2026-08-29T11:52:52.166628+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccundo"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:38:53.828528+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b3f5720133ba9975a6862a2b53e9f61ac13d9d4f77c2673be9400ad1eac4d02c", "fetched_at": "2026-08-28T04:04:37.843239+00:00", "kind": "readme", "missing": false, "url": "https://github.com/RonitSachdev/ccundo"}, {"content_hash": "b8a0d4080baeb38058033713fdb2c8349f7126e736119eb22f0e3eb614824c95", "fetched_at": "2026-08-29T11:52:52.166628+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccundo"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:38:53.828528+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b3f5720133ba9975a6862a2b53e9f61ac13d9d4f77c2673be9400ad1eac4d02c", "fetched_at": "2026-08-28T04:04:37.843239+00:00", "kind": "readme", "missing": false, "url": "https://github.com/RonitSachdev/ccundo"}, {"content_hash": "b8a0d4080baeb38058033713fdb2c8349f7126e736119eb22f0e3eb614824c95", "fetched_at": "2026-08-29T11:52:52.166628+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/ccundo"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 33, "longevity": 30, "rhythm": 35}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["no_releases", "no_license"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 424, "days_push": 402, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 33, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}