Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
7b9d89a
Created URDF diagnostic rules
pichifkes May 21, 2026
22c1972
fix syntax
pichifkes May 21, 2026
a53b1ae
Fix a lot of problems
pichifkes May 21, 2026
46f5bab
mathematical operations excluded from variable names
pichifkes May 21, 2026
63f91cb
Add Gazebo schema support and code quality fixes
pichifkes May 21, 2026
1e0e838
Add kinematic tree validation
pichifkes May 21, 2026
ecdd120
Point tag-mismatch errors at the opening tag, not the closing one
pichifkes May 21, 2026
06e0667
Add inlay hints for xacro ${...} expressions
pichifkes May 21, 2026
31ff668
Trigger completion on $, {, \", <
pichifkes May 21, 2026
4335027
Detect unclosed ${...} xacro expressions
pichifkes May 21, 2026
54bac30
Enable completion auto-trigger inside strings for urdf files
pichifkes May 21, 2026
a5e5b2f
Add quick-fix code actions for typos and missing required attributes
pichifkes May 21, 2026
02ab6e9
Skip semantic checks when XML parsing fails
pichifkes May 21, 2026
a69d55a
Add folding ranges for multi-line XML elements
pichifkes May 21, 2026
941f149
Parse XML error position from message tail, not just the prefix
pichifkes May 21, 2026
f4a114a
Add color swatches + picker, expand syntax highlighting
pichifkes May 21, 2026
8363ffa
Use theme-differentiated scopes for new URDF highlighting
pichifkes May 21, 2026
db26d2c
Rewrite TextMate grammar with own tag begin/end so scopes actually apply
pichifkes May 21, 2026
1e27e99
Use \A/\z string anchors instead of ^/$ in capture sub-patterns
pichifkes May 21, 2026
9a38939
One tag rule per scope category — assign scope directly via beginCapt…
pichifkes May 21, 2026
50f5609
add ReadMe
pichifkes May 21, 2026
43da97f
added vsix file
pichifkes May 21, 2026
a364983
address brutal CoPilot review: SSOT tables, UTF8 encoding, establish …
pichifkes May 21, 2026
657750d
stop tracking prebuilt (.vsix). rewrite install instructions.
pichifkes May 21, 2026
4fd04a4
prep 0.5.0 marketplace release
pichifkes May 22, 2026
2a015d1
release.yml: use darwin-universal to avoid macos-13 queue
pichifkes May 22, 2026
9e98a09
release.yml: split universal binary into darwin-x64 and darwin-arm64 …
pichifkes May 22, 2026
0abd7bc
fix skipping variables for complex operations
pichifkes May 22, 2026
9a0ce14
Change version name; same fix as before with a 0.1 added
pichifkes May 22, 2026
5fcca32
added cross file variable checks
pichifkes May 22, 2026
e4e93b2
Added cross file links
pichifkes May 23, 2026
da89946
chnage the code to look at the files like a giant urdf inted of small…
pichifkes May 24, 2026
ff7bd47
fix 'Joint not connected' bug; fix 'is xacro=flase' bug
pichifkes May 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: Build and Package

on:
push:
branches: [master, main]
pull_request:

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Rust
uses: dtolnay/rust-toolchain@stable

- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: client/package-lock.json

- name: Cache Rust dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
server/target
key: ${{ runner.os }}-cargo-${{ hashFiles('server/Cargo.lock') }}

- name: Test server
run: cargo test --manifest-path server/Cargo.toml --release

- name: Build server (release)
run: cargo build --release --manifest-path server/Cargo.toml

- name: Stage server binary
run: |
mkdir -p server/bin
cp server/target/release/urdf-lsp server/bin/urdf-lsp
chmod +x server/bin/urdf-lsp

- name: Install client dependencies
run: npm --prefix client ci

- name: Build client
run: npm run build:client

- name: Package extension
run: |
npm install -g @vscode/vsce
vsce package --no-dependencies --out urdf-$(node -p "require('./package.json').version")-linux-x64.vsix
Comment on lines +53 to +54

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added esbuild to client/package.json — extension.ts gets bundled into a single out/extension.js with --bundle --external:vscode, which inlines vscode-languageclient and its deps into that one file. The .vsix ships only the bundle, so client/node_modules being excluded no longer matters.


- name: Upload .vsix artifact
uses: actions/upload-artifact@v4
with:
name: urdf-extension
path: '*.vsix'
retention-days: 30
109 changes: 109 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
name: Release

on:
push:
tags:
- 'v*.*.*'

jobs:
build:
name: Build ${{ matrix.label }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
label: linux-x64
rust-targets: x86_64-unknown-linux-gnu
vsce-targets: linux-x64
- os: macos-latest
label: darwin-universal
rust-targets: x86_64-apple-darwin aarch64-apple-darwin
vsce-targets: darwin-x64 darwin-arm64
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4

- name: Set up Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.rust-targets }}

- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: client/package-lock.json

- name: Cache Rust dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
server/target
key: ${{ runner.os }}-${{ matrix.label }}-cargo-${{ hashFiles('server/Cargo.lock') }}

- name: Test server
if: matrix.label == 'linux-x64'
run: cargo test --manifest-path server/Cargo.toml --release

- name: Build server (release) for each Rust target
run: |
for t in ${{ matrix.rust-targets }}; do
cargo build --release --manifest-path server/Cargo.toml --target "$t"
done

- name: Stage server binary
run: |
mkdir -p server/bin
targets=(${{ matrix.rust-targets }})
if [ ${#targets[@]} -eq 1 ]; then
cp "server/target/${targets[0]}/release/urdf-lsp" server/bin/urdf-lsp
else
lipo -create -output server/bin/urdf-lsp \
server/target/x86_64-apple-darwin/release/urdf-lsp \
server/target/aarch64-apple-darwin/release/urdf-lsp
fi
chmod +x server/bin/urdf-lsp

- name: Install client dependencies
run: npm --prefix client ci

- name: Build client
run: npm run build:client

- name: Package extension(s)
run: |
npm install -g @vscode/vsce
for t in ${{ matrix.vsce-targets }}; do
vsce package --no-dependencies --target "$t" --out "urdf-$t.vsix"
done

- name: Upload .vsix
uses: actions/upload-artifact@v4
with:
name: vsix-${{ matrix.label }}
path: urdf-*.vsix
retention-days: 7

release:
name: Create GitHub Release
needs: build
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Download .vsix artifacts
uses: actions/download-artifact@v4
with:
pattern: vsix-*
merge-multiple: true

- name: Create release
uses: softprops/action-gh-release@v2
with:
files: '*.vsix'
fail_on_unmatched_files: true
generate_release_notes: true
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
out
node_modules
.vscode-test/
.vsix
server/target/
server/bin/
client/out/
*.vsix
27 changes: 9 additions & 18 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -1,28 +1,19 @@
// A launch configuration that compiles the extension and then opens it inside a new window
{
"version": "0.1.0",
"version": "0.2.0",
"configurations": [
{
"name": "Extension",
"name": "Run Extension",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": ["--extensionDevelopmentPath=${workspaceRoot}" ],
"stopOnEntry": false,
"args": [
"--extensionDevelopmentPath=${workspaceFolder}"
],
"sourceMaps": true,
"outFiles": [ "${workspaceRoot}/out/**/*.js" ],
"preLaunchTask": "npm: watch"
},
{
"name": "Extension Tests",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test" ],
"stopOnEntry": false,
"sourceMaps": true,
"outFiles": [ "${workspaceRoot}/out/test/**/*.js" ],
"preLaunchTask": "npm: watch"
"outFiles": [
"${workspaceFolder}/client/out/**/*.js"
],
"preLaunchTask": "build"
}
]
}
34 changes: 25 additions & 9 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -1,20 +1,36 @@
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "watch",
"problemMatcher": "$tsc-watch",
"isBackground": true,
"presentation": {
"reveal": "never"
"label": "build",
"type": "shell",
"command": "npm run build",
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": ["$tsc", "$rustc"],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "build:server",
"type": "shell",
"command": "cargo build",
"options": {
"cwd": "${workspaceFolder}/server"
},
"problemMatcher": ["$rustc"]
},
{
"label": "build:client",
"type": "shell",
"command": "npm run compile",
"options": {
"cwd": "${workspaceFolder}/client"
},
"problemMatcher": ["$tsc"]
}
]
}
}
23 changes: 19 additions & 4 deletions .vscodeignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,23 @@
.vscode/**
.vscode-test/**
out/test/**
out/**/*.map
src/**
*.vsix
client/out/**/*.map
client/src/**
client/tsconfig.json
client/node_modules/**

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bundled the client with esbuild — client/package.json now has a bundle script (esbuild ... --bundle --platform=node --external:vscode) that produces a self-contained client/out/extension.js, so vscode-languageclient/node is inlined and .vscodeignore excluding client/node_modules/ is fine.

client/package.json
client/package-lock.json
server/src/**
server/target/**
server/Cargo.toml
server/Cargo.lock
.github/**
.gitignore
tsconfig.json
vsc-extension-quickstart.md
examples/**
.claude/**
build/**
install/**
log/**
**/COLCON_IGNORE
**/.built_by
27 changes: 27 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,35 @@ All notable changes to the "urdf" extension will be documented in this file.

Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.

## [0.5.2] - 2026-05-22

### Added
- **Joint type dropdown**: typing `type="` inside a `<joint>` element now shows a completion dropdown with all 6 valid URDF joint types (`revolute`, `continuous`, `prismatic`, `fixed`, `floating`, `planar`).
- **Workspace cross-file analysis**: links, joints, and xacro properties defined in other open or workspace-scanned files no longer produce false-positive diagnostics. On startup the server scans all `.urdf`/`.xacro` files in the workspace; files opened later update the index incrementally. Cross-file references in `.xacro` fragment files are suppressed entirely when the entity is found in the workspace.

## [0.5.1] - 2026-05-22

### Fixed
- Tag-mismatch diagnostic now points at the unexpected closing tag (where the problem is), not the last open element on the stack.
- Undefined xacro properties inside complex `${...}` expressions (e.g. `${(1/12)*mass*(width*typo_var)}`) are now flagged; previously only single-identifier expressions like `${typo_var}` were checked.

## [0.5.0] - 2026-05-22

First marketplace release.

- Published to VS Code Marketplace and Open VSX under publisher `Roy-Pichifkes`.
- Platform-specific .vsix per target: `linux-x64`, `darwin-x64`, `darwin-arm64`. The two Darwin .vsix files share one lipo'd universal binary built on a single Apple Silicon CI runner.
- Native server binary bundled inside each .vsix; no Rust toolchain required for end users.

## [Unreleased]

### 0.4.0-dev

- Reworked from a snippets-only extension into a full language extension.
- Added Rust-based language server (`urdf-lsp`, built with `tower-lsp`) and a thin TypeScript client.
- Registered `urdf` as a first-class language id (no longer aliased to `xml`); kept `.urdf` and `.xacro` file associations.
- Linux x86_64 only for now.

## [0.0.1]

- Initial release
Loading