{"id":32861543,"url":"https://github.com/couimet/rangelink","last_synced_at":"2026-05-04T00:34:46.996Z","repository":{"id":321828979,"uuid":"1084912197","full_name":"couimet/rangeLink","owner":"couimet","description":"RangeLink - Share Code Across Editors \u0026 Tools","archived":false,"fork":false,"pushed_at":"2025-11-08T01:31:52.000Z","size":27244,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-08T03:28:06.217Z","etag":null,"topics":["ai-tools","claude-code","code-navigation","code-reference","code-sharing","collaboration","cursor","developer-tools","documentation","github","productivity","typescript","vscode-extension"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/couimet.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-28T10:35:11.000Z","updated_at":"2025-11-08T01:32:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/couimet/rangeLink","commit_stats":null,"previous_names":["couimet/rangelink"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/couimet/rangeLink","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/couimet%2FrangeLink","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/couimet%2FrangeLink/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/couimet%2FrangeLink/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/couimet%2FrangeLink/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/couimet","download_url":"https://codeload.github.com/couimet/rangeLink/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/couimet%2FrangeLink/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":283418035,"owners_count":26832617,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-08T02:00:06.281Z","response_time":57,"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":["ai-tools","claude-code","code-navigation","code-reference","code-sharing","collaboration","cursor","developer-tools","documentation","github","productivity","typescript","vscode-extension"],"created_at":"2025-11-08T21:01:24.976Z","updated_at":"2026-05-04T00:34:46.979Z","avatar_url":"https://github.com/couimet.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RangeLink\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./assets/icon.png\" alt=\"RangeLink Logo\" width=\"128\" /\u003e\n\u003c/div\u003e\n\n[![VS Code Marketplace](https://img.shields.io/visual-studio-marketplace/v/couimet.rangelink-vscode-extension?label=VS%20Code%20Marketplace\u0026color=blue)](https://marketplace.visualstudio.com/items?itemName=couimet.rangelink-vscode-extension)\n[![Open VSX Version](https://img.shields.io/open-vsx/v/couimet/rangelink-vscode-extension?label=Open%20VSX\u0026color=blue)](https://open-vsx.org/extension/couimet/rangelink-vscode-extension)\n[![License](https://img.shields.io/badge/license-MIT-green)](./LICENSE)\n![CodeRabbit Pull Request Reviews](https://img.shields.io/coderabbit/prs/github/couimet/rangeLink?utm_source=oss\u0026utm_medium=github\u0026utm_campaign=couimet%2FrangeLink\u0026link=https%3A%2F%2Fcoderabbit.ai\u0026label=CodeRabbit+Reviews)\n\n**\"Claude Code today. Cursor AI tomorrow. Different shortcuts, different muscle memory.\"** \u003cbr /\u003e\n**RangeLink ends it.** One keybinding. Any AI, any tool. Character-level precision. `recipes/baking/chickenpie.ts#L3C14-L314C16`\n\n\u003e [!IMPORTANT]\n\u003e Some features documented below are marked \u003csup\u003eUnreleased\u003c/sup\u003e — they are on `main` but not yet in a published release.\n\n---\n\n## Why RangeLink?\n\nEvery AI coding assistant has its own way to share code — different shortcuts, different formats, different muscle memory. If you use multiple AI tools, you're constantly context-switching.\n\n**RangeLink unifies it:**\n\n- **One keybinding** — `Cmd+R Cmd+L` works with Claude Code, Cursor AI, Copilot, terminal tools, text editors. Learn once, use everywhere.\n- **Better precision** — Character-level ranges, not just lines. Share exactly what matters.\n- **Universal format** — GitHub-style links work in PRs, Slack, docs. Not proprietary.\n- **AI-agnostic** — Your workflow doesn't change when you switch AI assistants.\n\n---\n\n## Quick Install\n\n**VS Code:**\n[📦 Install from VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=couimet.rangelink-vscode-extension)\n\n**Cursor:**\n[📦 Install from Open VSX Registry](https://open-vsx.org/extension/couimet/rangelink-vscode-extension)\n\nOr search for **\"RangeLink\"** in your editor's Extensions panel (`Cmd+Shift+X` / `Ctrl+Shift+X`)\n\n---\n\n## Try It\n\n1. **Bind a destination** (optional but recommended): Command Palette → \"Bind RangeLink to...\" (Claude Code, Cursor AI, Copilot Chat, Terminal, or Text Editor)\n2. **Select some code** in your editor\n3. **Generate link**: Command Palette → \"Copy Range Link\" (or `Cmd+R Cmd+L` / `Ctrl+R Ctrl+L` if no keybinding conflicts)\n4. **Done!** Link auto-pastes to your bound destination, or copies to clipboard if no destination bound\n\n**Example output:**\n\n```text\nrecipes/baking/chickenpie.ts#L3C14-L314C16\n```\n\n**Tip:** If `Cmd+R Cmd+L` doesn't work, another extension may have claimed that keybinding. Use Command Palette as the reliable fallback.\n\n---\n\n## Features at a Glance\n\n| Feature                   | Description                                                                                                                      |\n| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |\n| **Destinations**          | Auto-send links to Claude Code, Cursor AI, Copilot Chat, Terminal, Text Editor, or any custom AI assistant \u003csup\u003eUnreleased\u003c/sup\u003e |\n| **Link Navigation**       | Cmd+Click any RangeLink in terminal or editor to jump directly to code                                                           |\n| **Character Precision**   | `#L3C14-L314C16` — not just lines, exact character ranges                                                                        |\n| **Portable Links (BYOD)** | Links work regardless of recipient's delimiter configuration                                                                     |\n| **R-Keybinding Family**   | R-L (link), R-C (clipboard), R-V (paste text), R-J (jump to destination)                                                         |\n\n**📖 [Full Feature Guide →](./packages/rangelink-vscode-extension/#readme)**\n\n---\n\n## Perfect For\n\n- 🤖 **AI Assistants** — Claude Code, Cursor AI, GitHub Copilot, plus any custom AI tool via settings \u003csup\u003eUnreleased\u003c/sup\u003e — with exact context\n- 💬 **Code Reviews** — \"The bug is in `api/routes.ts#L215C8-L223C45`\" (click to view)\n- 👥 **Team Collaboration** — Universal format everyone can use and navigate\n- 📝 **Documentation** — Precise references in docs, Slack, PRs, anywhere\n\n---\n\n## Documentation\n\n### For Users\n\n- **[Extension README](./packages/rangelink-vscode-extension/#readme)** — Full feature guide, commands, configuration\n- **[Link Formats](./docs/LINK-FORMATS.md)** — Complete notation reference\n- **[BYOD Guide](./docs/BYOD.md)** — Portable links specification\n\n### For Contributors\n\n- **[Development Guide](./DEVELOPMENT.md)** — Setup, building, testing\n- **[Contributing Guide](./CONTRIBUTING.md)** — How to contribute\n- **[Architecture](./docs/ARCHITECTURE.md)** — Design principles and patterns\n- **[Open Issues](https://github.com/couimet/rangeLink/issues)** — Planned features and enhancement requests\n\n---\n\n## Monorepo Structure\n\nRangeLink is organized as a pnpm workspace with a platform-agnostic core library and editor-specific extensions. The core has zero dependencies and targets 100% test coverage.\n\n**[📁 See packages/ for details →](./packages/#readme)**\n\n---\n\n## History\n\nEven though I use Cursor daily, most of my AI work happens with `claude-code` running in a terminal _inside_ Cursor. The constant copy-pasting between terminal and editor was exhausting.\n\nOne day, frustrated after the hundredth copy-paste, I tried something: I sent claude-code a link like `recipes/baking/chickenpie.ts#L3C14-L314C16` pointing to a specific code snippet.\n\n**It just worked.** No explanation needed. Claude understood immediately.\n\nThat was the lightbulb moment: **precise code references should be universal**. Not just for AI assistants, but for code reviews, documentation, team collaboration — anywhere developers share code.\n\nI built the VS Code extension first, then extracted a platform-agnostic core library. The goal: make this work _everywhere_, for _everyone_.\n\nToday, with **destinations**, RangeLink sends links directly where you need them — Claude Code, Cursor AI, GitHub Copilot Chat, terminals, text editors, or custom AI tools \u003csup\u003eUnreleased\u003c/sup\u003e. No more copy-paste friction. It helps developers share code with precision across any AI assistant, VSCode, Cursor, GitHub, Slack, and more. One format, zero friction.\n\n**The best part?** Your teammates don't even need RangeLink installed to understand your links. The notation is GitHub-inspired — developers already know it.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e🕰️ The Original POC (Memorabilia)\u003c/b\u003e\u003c/summary\u003e\n\nBefore RangeLink became what it is today, it started as a rough-and-ready VS Code extension with just two files. Here's where it all began:\n\n**package.json:**\n\n```json\n{\n  \"name\": \"copy-reference\",\n  \"displayName\": \"Copy GitHub Reference\",\n  \"description\": \"Copy GitHub-style file references with line and column numbers\",\n  \"version\": \"0.1.0\",\n  \"publisher\": \"local\",\n  \"engines\": {\n    \"vscode\": \"^1.74.0\"\n  },\n  \"categories\": [\"Other\"],\n  \"main\": \"./extension.js\",\n  \"activationEvents\": [],\n  \"contributes\": {\n    \"commands\": [\n      {\n        \"command\": \"copyReference.copy\",\n        \"title\": \"Copy GitHub-style Reference\",\n        \"category\": \"Copy\"\n      }\n    ],\n    \"keybindings\": [\n      {\n        \"command\": \"copyReference.copy\",\n        \"key\": \"cmd+shift+l\",\n        \"mac\": \"cmd+shift+l\",\n        \"win\": \"ctrl+shift+l\",\n        \"linux\": \"ctrl+shift+l\",\n        \"when\": \"editorTextFocus\"\n      }\n    ],\n    \"menus\": {\n      \"editor/context\": [\n        {\n          \"when\": \"editorTextFocus\",\n          \"command\": \"copyReference.copy\",\n          \"group\": \"9_cutcopypaste@4\"\n        }\n      ]\n    }\n  }\n}\n```\n\n**extension.js:**\n\n```javascript\nconst vscode = require('vscode');\n\nfunction activate(context) {\n  let disposable = vscode.commands.registerCommand('copyReference.copy', () =\u003e {\n    const editor = vscode.window.activeTextEditor;\n    if (!editor) {\n      vscode.window.showErrorMessage('No active editor');\n      return;\n    }\n\n    const selection = editor.selection;\n    const document = editor.document;\n    const workspaceFolder = vscode.workspace.getWorkspaceFolder(document.uri);\n\n    // Get relative path from workspace root\n    const relativePath = workspaceFolder\n      ? document.uri.path.substring(workspaceFolder.uri.path.length + 1)\n      : vscode.workspace.asRelativeUri(document.uri).path;\n\n    const startLine = selection.start.line + 1;\n    const startChar = selection.start.character + 1;\n    const endLine = selection.end.line + 1;\n    const endChar = selection.end.character + 1;\n\n    // Format: path/to/file.rb#L1C1-L2C10\n    let reference;\n    if (selection.isEmpty) {\n      // Just cursor position, no selection\n      reference = `${relativePath}:${startLine}`;\n    } else if (startLine === endLine \u0026\u0026 startChar === 1 \u0026\u0026 endChar \u003e startChar) {\n      // Full line selection - use simple format\n      reference = `${relativePath}:${startLine}`;\n    } else if (startLine === endLine) {\n      // Single line selection with specific columns\n      reference = `${relativePath}#L${startLine}C${startChar}-L${endLine}C${endChar}`;\n    } else {\n      // Multi-line selection\n      reference = `${relativePath}#L${startLine}C${startChar}-L${endLine}C${endChar}`;\n    }\n\n    vscode.env.clipboard.writeText(reference);\n\n    // Show a subtle notification\n    vscode.window.setStatusBarMessage(`📋 Copied: ${reference}`, 3000);\n\n    // Optional: Also show as information message (can be disabled if too intrusive)\n    // vscode.window.showInformationMessage(`Copied: ${reference}`);\n  });\n\n  context.subscriptions.push(disposable);\n}\n\nfunction deactivate() {}\n\nmodule.exports = {\n  activate,\n  deactivate,\n};\n```\n\nFrom this humble beginning, RangeLink evolved into a comprehensive monorepo with a platform-agnostic core library, comprehensive testing, structured error handling, portable BYOD links, and support for advanced features like rectangular selections.\n\n\u003c/details\u003e\n\n---\n\n## About the Logo\n\nEver notice the chicken in our logo? That's not just any chicken — it's a **free-range** chicken. Because your code should roam free across editors, tools, and teams. No fences, no boundaries. 🐔\n\nThe chains? Those represent links — connections between developers, tools, and ideas. Collaboration without constraints.\n\nAnd here's the nerdy part: look closely at the numbers. You'll see **3.1416** instead of just 3.14. Because when you're sharing code references, **precision matters**. RangeLink shares exact ranges — period.\n\n\u003e [!TIP]\n\u003e **π Dad Joke:** Pi is irrational, and so are developers who don't use precise code references. At least Pi has an excuse.\n\n---\n\n## Links\n\n- 📦 [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=couimet.rangelink-vscode-extension)\n- 📦 [Open VSX Registry](https://open-vsx.org/extension/couimet/rangelink-vscode-extension)\n- 💎 [Core Library](./packages/rangelink-core-ts)\n- 🐛 [Report Issues](https://github.com/couimet/rangelink/issues)\n- 📚 [Full Documentation](./docs/)\n\n---\n\n## License\n\nMIT — see [LICENSE](./LICENSE) file for details.\n\n---\n\nMade with ❤️ for developers who love precision\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcouimet%2Frangelink","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcouimet%2Frangelink","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcouimet%2Frangelink/lists"}