{"id":51246896,"url":"https://github.com/rt2zz/sidecar","last_synced_at":"2026-06-29T05:01:25.133Z","repository":{"id":367207616,"uuid":"1279588599","full_name":"rt2zz/sidecar","owner":"rt2zz","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-25T01:46:13.000Z","size":37,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-25T03:15:14.901Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rt2zz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-24T20:39:16.000Z","updated_at":"2026-06-25T01:46:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rt2zz/sidecar","commit_stats":null,"previous_names":["rt2zz/sidecar"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/rt2zz/sidecar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rt2zz%2Fsidecar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rt2zz%2Fsidecar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rt2zz%2Fsidecar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rt2zz%2Fsidecar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rt2zz","download_url":"https://codeload.github.com/rt2zz/sidecar/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rt2zz%2Fsidecar/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34913586,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-29T02:00:05.398Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-29T05:01:22.678Z","updated_at":"2026-06-29T05:01:25.123Z","avatar_url":"https://github.com/rt2zz.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sidecar\n\n`sidecar` is a small Git-backed sidecar for repo-local development metadata:\nagent plans, scratch artifacts, todo logs, session memory, and other files that\nshould be captured aggressively without making the main repo noisy.\n\nThe model is intentionally simple:\n\n- A main repo commits a `.sidecar` file.\n- The sidecar repo is cloned into `./sidecar` and gitignored by the main repo.\n- Local changes are committed and pushed to `sidecar-inbox/\u003cuser\u003e/\u003crandom\u003e`.\n- A merge command folds inbox branches into canonical `main`.\n- Conflicted files can be forked into explicit per-branch versions with\n  `sidecar merge --fork-files`.\n\n## Quick start\n\nInstall from GitHub:\n\n```sh\nnpm install -g github:rt2zz/sidecar\n```\n\nOr link a local checkout:\n\n```sh\ngit clone git@github.com:rt2zz/sidecar.git\ncd sidecar\nnpm install\nnpm run build\nnpm link\n```\n\n`sidecar` requires Node.js 20 or newer and Git.\n\n```sh\ncd ~/dev/my-repo\nsidecar init git@github.com:org/my-repo-sidecar.git\nsidecar status\nsidecar watch\n```\n\nWhen you want to consolidate inbox branches:\n\n```sh\nsidecar merge --fork-files\n```\n\n## `.sidecar`\n\nThe `.sidecar` file is committed in the main repo:\n\n```toml\nversion = 1\nremote = \"git@github.com:org/my-repo-sidecar.git\"\npath = \"sidecar\"\nbranch = \"main\"\ninbox = \"sidecar-inbox/{user}/{random}\"\n```\n\n`{user}`, `{host}`, and `{random}` are expanded by the CLI and sanitized for Git\nbranch names. `{random}` is generated once per sidecar checkout and stored under\nthe sidecar repo's Git metadata, so multiple clones on the same machine get\nseparate inbox branches.\n\n## Commands\n\n```sh\nsidecar init \u003cremote\u003e [--path sidecar]\nsidecar clone\nsidecar status\nsidecar snapshot [--push]\nsidecar push\nsidecar watch [--debounce 30] [--interval 2] [--max-interval 300]\nsidecar merge [--fork-files] [--no-push]\n```\n\n`sidecar push` snapshots local sidecar changes and pushes them to the configured\ninbox branch. Before snapshotting, `sidecar` best-effort redacts common secrets\nand PII from text files, including API keys, bearer tokens, secret/password\nassignments, email addresses, phone numbers, SSNs, and credit-card-looking\nvalues. Binary and non-UTF-8 files are left untouched.\n\n`sidecar watch` polls for file changes. It waits for a quiet period before\nsnapshotting and pushing, and it also flushes changes after the max interval if\nfiles keep changing.\n\n`sidecar merge --fork-files` handles conflicted files without semantic merging.\nFor each conflicted path, it writes the conflicting branch versions to files such\nas:\n\n```text\nnotes/plan.conflict.main.abc1234.md\nnotes/plan.conflict.sidecar-inbox-zack-79ffcdaf92aa.def5678.md\n```\n\nThe original conflicted path is removed from the merge commit, and a JSON\nmanifest is written under `.sidecar-conflicts/`.\n\nMerged inbox branches are kept on the remote. Future merges skip branches whose\ncurrent tip is already contained in canonical `main`, and merge them again only\nwhen new commits appear.\n\n## LLM resolution\n\nThe first implementation keeps LLM resolution out of the default path. The merge\ncommand accepts `--llm` as an explicit marker, but there is no built-in provider\nyet. The intended shape is:\n\n```sh\nsidecar merge --llm\n```\n\nwith a configured resolver that proposes a patch, shows the diff, and requires\nconfirmation before committing.\n\nUntil that resolver is wired, use:\n\n```sh\nsidecar merge --fork-files\n```\n\nand clean up the forked files manually or with a future interactive resolver.\n\n## Development\n\n```sh\nnpm install\nnpm run check\nnpm test\nnpm run build\n```\n\n`npm test` runs the build first, then executes unit and integration tests.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frt2zz%2Fsidecar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frt2zz%2Fsidecar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frt2zz%2Fsidecar/lists"}