{"id":51102108,"url":"https://github.com/MorningFrog/zed-urdf","last_synced_at":"2026-07-12T16:01:02.983Z","repository":{"id":347051193,"uuid":"1192396410","full_name":"MorningFrog/zed-urdf","owner":"MorningFrog","description":"URDF language support for Zed with syntax highlighting, outline, and completions.","archived":false,"fork":false,"pushed_at":"2026-03-26T13:37:27.000Z","size":36,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-27T05:22:15.589Z","etag":null,"topics":["language","language-server-protocol","lsp-server","robotics","urdf","zed","zed-extension"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MorningFrog.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-03-26T07:08:58.000Z","updated_at":"2026-03-26T13:36:31.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/MorningFrog/zed-urdf","commit_stats":null,"previous_names":["morningfrog/zed-urdf"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/MorningFrog/zed-urdf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MorningFrog%2Fzed-urdf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MorningFrog%2Fzed-urdf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MorningFrog%2Fzed-urdf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MorningFrog%2Fzed-urdf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MorningFrog","download_url":"https://codeload.github.com/MorningFrog/zed-urdf/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MorningFrog%2Fzed-urdf/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35395749,"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-07-12T02:00:06.386Z","response_time":87,"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":["language","language-server-protocol","lsp-server","robotics","urdf","zed","zed-extension"],"created_at":"2026-06-24T12:00:22.797Z","updated_at":"2026-07-12T16:01:02.978Z","avatar_url":"https://github.com/MorningFrog.png","language":"Rust","funding_links":[],"categories":["🌐 Languages"],"sub_categories":[],"readme":"# URDF for Zed\n\nURDF language support for [Zed](https://zed.dev) with:\n\n- Syntax highlighting\n- Outline / structure view\n- Auto indentation\n- Context-aware completions for common URDF tags, attributes, and values\n\nThis extension targets `.urdf` files and builds on top of the XML Tree-sitter grammar plus an external URDF language server.\n\n## Features\n\n- Recognizes `.urdf` files as the `URDF` language\n- Reuses the XML Tree-sitter grammar for parsing\n- Provides syntax highlighting through Tree-sitter queries\n- Provides outline support for URDF/XML elements\n- Shows `name` context in outline entries for `robot`, `link`, and `joint`\n- Provides completions for common URDF tags such as:\n  - `robot`\n  - `link`\n  - `joint`\n  - `visual`\n  - `collision`\n  - `inertial`\n  - `geometry`\n  - `origin`\n  - `parent`\n  - `child`\n  - `axis`\n  - `limit`\n  - `material`\n  - `mesh`\n- Provides completions for common URDF attributes and values\n- Supports both block-style and self-closing completions for tags like `link` and `material`\n\n## Installation\n\nFor normal users:\n\n1. Install the extension in Zed\n2. Open a `.urdf` file\n3. The extension will look for a language server binary whose version exactly matches the extension version\n4. If that exact-version binary is not already cached, the extension downloads the matching GitHub Release asset for the same version\n\nThis extension intentionally uses a **strict version lock** between the extension and the language server.\n\nThat means:\n\n- extension version `0.1.0` only accepts language server release tag `v0.1.0`\n- extension version `0.1.1` only accepts language server release tag `v0.1.1`\n- the extension does **not** use the latest release automatically\n- the extension does **not** silently fall back to a different installed server version\n\n## Version Lock Policy\n\nThe repository follows these rules:\n\n- `Cargo.toml` version\n- `extension.toml` version\n- `urdf-language-server/Cargo.toml` version\n- Git tag name without the leading `v`\n\nmust all be identical.\n\nExamples:\n\n- extension version: `0.1.0`\n- language server crate version: `0.1.0`\n- Git tag: `v0.1.0`\n\nAt runtime, the extension downloads only the release with tag `v0.1.0` when the extension version is `0.1.0`.\n\n## Release Assets\n\nExpected release asset names:\n\n- `urdf-language-server-vX.Y.Z-x86_64-unknown-linux-musl.tar.gz`\n- `urdf-language-server-vX.Y.Z-x86_64-apple-darwin.tar.gz`\n- `urdf-language-server-vX.Y.Z-aarch64-apple-darwin.tar.gz`\n- `urdf-language-server-vX.Y.Z-x86_64-pc-windows-msvc.zip`\n\nEach archive must contain the executable at the archive root:\n\n- `urdf-language-server`\n- `urdf-language-server.exe` on Windows\n\n## Development\n\n### Prerequisites\n\nInstall Rust with `rustup`.\n\n### Install as a Dev Extension in Zed\n\n1. Open Zed\n2. Open the command palette\n3. Run `zed: install dev extension`\n4. Select this repository folder\n\nAfter changing the extension, open the Extensions page and click `Rebuild` for the dev extension.\n\n## Local Testing Without GitHub Release\n\nYou do **not** need to publish a GitHub Release every time you modify the language server during development.\n\nWith the strict version-locked setup used by this extension, the runtime behavior is:\n\n1. The extension first checks whether a language server binary for the **exact same version** already exists in the local versioned cache directory\n2. Only if that exact-version binary is missing does it try to download the matching GitHub Release asset for the same version tag\n\nThat means local development can use a manually built binary, as long as:\n\n- the extension version and language server version are the same\n- the binary is placed at the expected versioned cache path\n\n### Keep versions in sync\n\nBefore local testing, make sure these versions are identical:\n\n- `Cargo.toml`\n- `extension.toml`\n- `urdf-language-server/Cargo.toml`\n\nFor example, if the version is `0.1.0`, then all three files should use `0.1.0`.\n\n### Build the language server locally\n\nFrom the repository root:\n\n```sh\ncargo build --manifest-path ./urdf-language-server/Cargo.toml --release\n````\n\n### Put the binary into the expected local cache directory\n\nCreate the versioned cache directory expected by the extension:\n\nLinux:\n\n```text\n~/.local/share/zed/extensions/work/.zed-urdf/\u003cversion\u003e/\n```\n\nmacOS:\n\n```text\n~/Library/Application Support/zed/extensions/work/.zed-urdf/\u003cversion\u003e/\n```\n\nWindows:\n\n```text\n%LOCALAPPDATA%\\Zed\\extensions\\work\\.zed-urdf\\\u003cversion\u003e\\\n```\n\nThen copy the locally built binary into that directory.\n\n#### Linux\n\nIf you build for the default host target:\n\n```sh\nZED_EXT_DIR=\"$HOME/.local/share/zed/extensions/work/urdf/.zed-urdf/0.1.0\"\nmkdir -p \"$ZED_EXT_DIR\"\ncp urdf-language-server/target/release/urdf-language-server \"$ZED_EXT_DIR/urdf-language-server\"\nchmod +x \"$ZED_EXT_DIR/urdf-language-server\"\n```\n\nIf you explicitly build a target triple, your output path may instead look like this:\n\n```sh\nZED_EXT_DIR=\"$HOME/.local/share/zed/extensions/work/urdf/.zed-urdf/0.1.0\"\nmkdir -p \"$ZED_EXT_DIR\"\ncp urdf-language-server/target/x86_64-unknown-linux-gnu/release/urdf-language-server \"$ZED_EXT_DIR/urdf-language-server\"\nchmod +x \"$ZED_EXT_DIR/urdf-language-server\"\n```\n\n#### macOS\n\n```sh\nZED_EXT_DIR=\"$HOME/Library/Application Support/zed/extensions/work/urdf/.zed-urdf/0.1.0\"\nmkdir -p \"$ZED_EXT_DIR\"\ncp urdf-language-server/target/release/urdf-language-server \"$ZED_EXT_DIR/urdf-language-server\"\nchmod +x \"$ZED_EXT_DIR/urdf-language-server\"\n```\n\n#### Windows (PowerShell)\n\n```powershell\n$ZedExtDir = \"$env:LOCALAPPDATA\\Zed\\extensions\\work\\.zed-urdf\\0.1.0\"\nNew-Item -ItemType Directory -Force -Path $ZedExtDir | Out-Null\nCopy-Item \"urdf-language-server\\target\\release\\urdf-language-server.exe\" \"$ZedExtDir\\urdf-language-server.exe\"\n```\n\nReplace `0.1.0` with your actual current extension version.\n\n### Recommended local test workflow after changing the language server\n\nWhen you modify `urdf-language-server/src/main.rs`:\n\n1. Keep all versions unchanged if you are just testing local behavior\n2. Run the local release build\n3. Copy the new binary into `.zed-urdf/\u003cversion\u003e/`\n4. Rebuild the dev extension in Zed\n5. Reopen a `.urdf` file and verify completions\n\n### Testing a version bump locally\n\nIf you want to test a new version locally, such as moving from `0.1.0` to `0.1.1`:\n\n1. Update these files to `0.1.1`:\n\n   * `Cargo.toml`\n   * `extension.toml`\n   * `urdf-language-server/Cargo.toml`\n2. Build the language server again\n3. Copy the binary into `.zed-urdf/0.1.1/`\n4. Rebuild the dev extension in Zed\n\nThe extension will then use only the `0.1.1` binary and will not reuse the old `0.1.0` cache.\n\n### When is GitHub Release actually needed?\n\nA GitHub Release is only needed when you want to test the **real published download path**:\n\n* remove the local cached binary for the current version\n* keep the same version\n* create the matching Git tag such as `v0.1.0`\n* publish the release assets\n* let the extension download that exact-version asset automatically\n\n## Publishing Notes\n\nThis repository keeps the language server source code, but the published Zed extension does not ship the server binary inside the extension package.\n\nInstead:\n\n* GitHub Actions builds versioned language server binaries\n* those binaries are uploaded as GitHub Release assets\n* the extension downloads only the asset whose tag exactly matches the extension version\n\n## Troubleshooting\n\nIf the extension does not seem to work:\n\n* open `Zed.log` using `zed: open log`\n* or launch Zed from the command line with:\n\n```sh\nzed --foreground\n```\n\nThis usually shows more detailed extension and language server logs during development.\n\nYou may also want to check:\n\n* whether the three version fields are exactly the same\n* whether the local binary exists under `.zed-urdf/\u003cversion\u003e/`\n* whether the binary name is correct for your platform\n* whether the binary is executable on Unix-like systems\n\n## Project Structure\n\n```text\n.\n├── .github/\n│   └── workflows/\n│       ├── check-version-sync.yml\n│       └── release-language-server.yml\n├── README.md\n├── extension.toml\n├── Cargo.toml\n├── src/\n│   └── lib.rs\n├── languages/\n│   └── urdf/\n│       ├── config.toml\n│       ├── highlights.scm\n│       ├── indents.scm\n│       └── outline.scm\n└── urdf-language-server/\n    ├── Cargo.toml\n    └── src/\n        └── main.rs\n```\n\n## Example\n\n```xml\n\u003c?xml version=\"1.0\"?\u003e\n\u003crobot name=\"demo_robot\"\u003e\n  \u003clink name=\"base_link\" /\u003e\n\n  \u003clink name=\"arm_link\"\u003e\n    \u003cvisual\u003e\n      \u003cgeometry\u003e\n        \u003cbox size=\"1 1 1\" /\u003e\n      \u003c/geometry\u003e\n    \u003c/visual\u003e\n  \u003c/link\u003e\n\n  \u003cjoint name=\"base_to_arm\" type=\"revolute\"\u003e\n    \u003cparent link=\"base_link\" /\u003e\n    \u003cchild link=\"arm_link\" /\u003e\n    \u003corigin xyz=\"0 0 0.1\" rpy=\"0 0 0\" /\u003e\n    \u003caxis xyz=\"0 0 1\" /\u003e\n    \u003climit lower=\"-1.57\" upper=\"1.57\" effort=\"100\" velocity=\"1.0\" /\u003e\n  \u003c/joint\u003e\n\u003c/robot\u003e\n```\n\n## Notes\n\n* This extension currently uses the XML grammar for parsing URDF documents\n* Completions are provided by the external custom URDF language server\n* The completion engine is designed specifically for common URDF authoring workflows, rather than full XML Schema/XSD validation\n\n## Acknowledgements\n\nThis project builds on and draws inspiration from:\n\n* [tree-sitter-xml](https://github.com/tree-sitter-grammars/tree-sitter-xml)\n* [sweetppro/zed-xml](https://github.com/sweetppro/zed-xml)\n\nMany thanks to the maintainers and contributors of those projects.\n\n## License\n\nThis project is licensed under the Apache License 2.0.\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMorningFrog%2Fzed-urdf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FMorningFrog%2Fzed-urdf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMorningFrog%2Fzed-urdf/lists"}