Skip to content

Commit 7151a77

Browse files
kartikloopsluarssdependabot[bot]
authored
Scaffold TypeScript project for v1.0 npx migration (#118)
* chore: pin GitHub Actions to full commit SHAs Pins all third-party actions (actions/checkout, astral-sh/setup-uv, codecov/codecov-action, codecov/test-results-action, docker/login-action, actions/upload-artifact, actions/download-artifact, pypa/gh-action-pypi-publish, softprops/action-gh-release) to immutable commit SHAs to prevent supply-chain attacks via tag mutation. Original tag names retained as inline comments. * build(deps): bump starlette in the uv group across 1 directory (#117) Bumps the uv group with 1 update in the / directory: [starlette](https://github.com/Kludex/starlette). Updates `starlette` from 1.0.0 to 1.0.1 - [Release notes](https://github.com/Kludex/starlette/releases) - [Changelog](https://github.com/Kludex/starlette/blob/main/docs/release-notes.md) - [Commits](Kludex/starlette@1.0.0...1.0.1) --- updated-dependencies: - dependency-name: starlette dependency-version: 1.0.1 dependency-type: direct:production dependency-group: uv ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * ci: add cross-platform validation to ci.yaml (#89) * restructure cross-platform job * unavailable runner clean up * added matrix * fold macOS cross-platform jobs into test matrix * use docker/setup-docker-action for macOS Docker setup and drop missing pytest-timeout flag * removed docker-build matrix entry * fixed race conditions in test_basic_echo_command * use select() in executor instead of non-blocking read * _before_slave_close(slave_fd) hook added * replace one-shot select drain with background drain loop on macOS * docs: pin README install URLs to v0.5.2 and update release skill Pin all git+https://github.com/luarss/openroad-mcp URLs in README to @v0.5.2 to prevent supply chain attacks. Update release skill to cover README and MCP manifests in future releases. * chore: pin MCP manifest git URLs to v0.5.2 Also fix @ escaping in release skill perl command to prevent array interpolation mangling future version strings. * docs(skill): add note on opting out of version pinning * docs: add Goose, Cody, Codex CLI, PearAI, CodeBuddy, Hermes Agent to README Add support matrix entries and installation sections for six additional MCP-compatible agents. * chore: remove editor MCP manifest files from repo Users are responsible for configuring their own editor MCP settings. Install instructions remain in README. Also update release skill to no longer stage these files. * fix(skill): fix perl command to update all README URL formats on release Old command only matched bare quoted URLs. New command handles: - JSON/TOML quoted (existing @vX.Y.Z tags and bare URLs) - YAML unquoted list items (Goose, Hermes Agent configs) Also fixes delimiter clash: use ! instead of | to avoid conflict with the | inside the lookahead (?="|$). * docs: add GitHub Copilot CLI, Oh My Pi, OpenClaw, AstrBot, DeepCode, nanobot, Crush, Reasonix Add support matrix entries and installation sections for 8 additional MCP-compatible agents from the community list. * chore: release v0.5.3 * adds the typescript/ directory as the foundation for migrating the OpenROAD MCP server from python/uvx to typeScript/npx. * fixed symlink bypass, CI will now fail if no test files match the glob, for tsconfig new config extends the base, changed the workflow to include the main as well * fix(deps): upgrade urllib3 2.6.3 -> 2.7.0 (CVE sensitive header forwarding) * chore: migrate all luarss refs to The-OpenROAD-Project org (#120) * chore: migrate all luarss refs to The-OpenROAD-Project org Replace github.com/luarss/openroad-mcp with The-OpenROAD-Project, ghcr.io/luarss with ghcr.io/the-openroad-project, and MCP name io.github.luarss with io.github.the-openroad-project across all source files (README, CHANGELOG, ROADMAP, server.json, Makefile, docker-publish.yml, release.yml). Closes part of #119. * fix: update author email to it-support@precisioninno.com Part of migration issue #119 (§3 PyPI Package). * chore: release v0.5.4 * chore: release v0.5.5 * chore(skills): enforce PR workflow and org migration in release skill (#121) * chore(skills): enforce PR workflow and org migration in release skill Never push directly to main; always open a release/vX.Y.Z branch and request @vvbandeira as reviewer. Also updates all repo refs from luarss/openroad-mcp to The-OpenROAD-Project/openroad-mcp. * chore: update remaining luarss refs to The-OpenROAD-Project Updates install URL in .claude/settings.json and stale issue link in tests/performance/test_response_sizes.py. * fixed path bug for .. as the prefix * added test tsconfig * pinned version for the workflow * dead code cleanup * added ansi decoder and session config * added tests for session config and ansi decoder * updated ts config --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Shui Song Luar <song@zimalabs.ai> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Song Luar <jluar@precisioninno.com>
1 parent f2022ce commit 7151a77

41 files changed

Lines changed: 6793 additions & 157 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"command": "uvx",
55
"args": [
66
"--from",
7-
"git+https://github.com/luarss/openroad-mcp",
7+
"git+https://github.com/The-OpenROAD-Project/openroad-mcp",
88
"openroad-mcp"
99
]
1010
}

.claude/skills/release/SKILL.md

Lines changed: 79 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ project. It ensures every file that references the version gets updated consiste
2929
- **Version source**: `pyproject.toml` `[project] version`
3030
- **Changelog format**: Keep a Changelog
3131
- **Commit style**: Conventional Commits (`feat:`, `fix:`, `chore:`, etc.)
32-
- **GitHub repo**: `luarss/openroad-mcp`
32+
- **GitHub repo**: `The-OpenROAD-Project/openroad-mcp`
33+
- **Release gatekeeper**: @vvbandeira (org member) — must approve and merge all releases
3334

3435
## Workflow
3536

@@ -83,7 +84,7 @@ Read each commit message and sort into Keep a Changelog categories:
8384

8485
For each commit, format the changelog entry as:
8586
```
86-
- Description ([#PR](https://github.com/luarss/openroad-mcp/pull/PR))
87+
- Description ([#PR](https://github.com/The-OpenROAD-Project/openroad-mcp/pull/PR))
8788
```
8889

8990
Use the PR number from the commit message if present. For commits without a PR
@@ -99,15 +100,57 @@ one breaks the release consistency.
99100
**server.json** — Update all three version references:
100101
- Top-level `"version": "X.Y.Z"`
101102
- PyPI package `"version": "X.Y.Z"`
102-
- OCI identifier `"identifier": "ghcr.io/luarss/openroad-mcp:X.Y.Z"`
103+
- OCI identifier `"identifier": "ghcr.io/The-OpenROAD-Project/openroad-mcp:X.Y.Z"`
104+
105+
**MCP manifest files and README** — These files use `git+https://github.com/The-OpenROAD-Project/openroad-mcp`
106+
without a version pin. Update every occurrence to pin to the release tag, which
107+
prevents supply chain attacks by ensuring users install a known, reviewed commit:
108+
109+
Change:
110+
```
111+
"git+https://github.com/The-OpenROAD-Project/openroad-mcp"
112+
```
113+
To:
114+
```
115+
"git+https://github.com/The-OpenROAD-Project/openroad-mcp@vX.Y.Z"
116+
```
117+
118+
Use a single perl pass that handles all three URL patterns in the README:
119+
- JSON/TOML quoted: `"git+https://...openroad-mcp@v0.5.3"`
120+
- YAML unquoted list item: `- git+https://...openroad-mcp@v0.5.3` (end of line)
121+
- Bare (first-time pin): `"git+https://...openroad-mcp"`
122+
123+
```bash
124+
perl -i -pe 's!git\+https://github\.com/The-OpenROAD-Project/openroad-mcp(?:\@v[\d.]+)?(?="|$)!git+https://github.com/The-OpenROAD-Project/openroad-mcp\@vX.Y.Z!g' README.md
125+
```
126+
127+
The `!` delimiter avoids clashing with the `|` inside the lookahead `(?="|$)`.
128+
The lookahead matches either a closing quote (JSON/TOML) or end of line (YAML),
129+
so all config formats are covered.
130+
131+
After updating, verify all pinned URLs show the new tag:
132+
```bash
133+
grep "The-OpenROAD-Project/openroad-mcp@" README.md
134+
```
135+
Every line should show `@vX.Y.Z`. Also confirm no bare URLs remain:
136+
```bash
137+
grep 'The-OpenROAD-Project/openroad-mcp"' README.md
138+
```
139+
That should return no output.
140+
141+
> **Side note for users:** If you always want the latest version and prefer not
142+
> to pin, omit the `@vX.Y.Z` suffix and use the bare URL:
143+
> `git+https://github.com/The-OpenROAD-Project/openroad-mcp`. This trades supply chain
144+
> safety for convenience — acceptable for local/dev setups, not recommended
145+
> for shared or production environments.
103146
104147
**uv.lock** — Regenerate by running `uv lock`. Do NOT hand-edit this file.
105148

106149
**CHANGELOG.md** — Add new section before the previous version's section.
107150
Today's date goes in the header. Add the link at the bottom:
108151

109152
```
110-
[X.Y.Z]: https://github.com/luarss/openroad-mcp/releases/tag/vX.Y.Z
153+
[X.Y.Z]: https://github.com/The-OpenROAD-Project/openroad-mcp/releases/tag/vX.Y.Z
111154
```
112155

113156
**ROADMAP.md** — Find the "Version Milestones" table and add a new row for
@@ -125,12 +168,12 @@ python -m pytest --tb=short -q
125168
If tests fail, report the failures to the user before proceeding. Do not commit
126169
a broken release.
127170

128-
### Step 6: Create the release commit
171+
### Step 6: Create the release commit and open a PR
129172

130173
Stage only the release-related files:
131174

132175
```bash
133-
git add CHANGELOG.md ROADMAP.md pyproject.toml server.json uv.lock
176+
git add CHANGELOG.md ROADMAP.md pyproject.toml server.json uv.lock README.md
134177
```
135178

136179
Commit with the message:
@@ -139,17 +182,45 @@ Commit with the message:
139182
chore: release vX.Y.Z
140183
```
141184

142-
Do NOT push unless the user explicitly asks. The commit stays local for review.
185+
Then push to a dedicated release branch and open a PR:
186+
187+
```bash
188+
git checkout -b release/vX.Y.Z
189+
git push -u origin release/vX.Y.Z
190+
gh pr create \
191+
--title "chore: release vX.Y.Z" \
192+
--body "$(cat <<'EOF'
193+
## Release vX.Y.Z
194+
195+
See [CHANGELOG.md](CHANGELOG.md) for full details.
196+
197+
/cc @vvbandeira — please review and merge when ready.
198+
EOF
199+
)" \
200+
--reviewer vvbandeira
201+
```
202+
203+
**NEVER push directly to `main`.** The decision to merge and tag belongs exclusively
204+
to @vvbandeira. Once the PR is open, report the PR URL to the user and stop — do not
205+
merge, squash, or tag.
143206

144207
## Important details
145208

209+
- **Never push to `main` directly.** Always use a `release/vX.Y.Z` branch and open a PR.
210+
- **@vvbandeira must review and merge** — request them as a reviewer on every release PR.
146211
- Always use `uv lock` to regenerate the lockfile rather than editing it manually
147212
- The CHANGELOG date format is ISO: `YYYY-MM-DD`
148213
- Version tags use a `v` prefix: `v0.4.0` (but the version in files has no prefix)
149214
- Check for ALL files referencing the old version by running:
150215
```
151-
grep -r "0\.3\.0" --include="*.toml" --include="*.json" --include="*.lock" --include="*.md"
216+
grep -r "OLD_VERSION" --include="*.toml" --include="*.json" --include="*.lock" --include="*.md"
152217
```
218+
(replace `OLD_VERSION` with the actual previous version, e.g. `0\.5\.2`)
153219
before committing, to catch any missed references
220+
- Also verify the README git URLs were updated:
221+
```
222+
grep "openroad-mcp@" README.md
223+
```
224+
All occurrences should show the new `@vX.Y.Z` tag
154225
- If `server.json` doesn't exist, skip it (some repos may not have it)
155226
- If `ROADMAP.md` doesn't exist or has no version table, skip it

.cursor/mcp.json

Lines changed: 0 additions & 12 deletions
This file was deleted.

.github/workflows/ci.yaml

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,27 @@ env:
1414

1515
jobs:
1616
test:
17-
runs-on: ubuntu-latest
17+
runs-on: ${{ matrix.os }}
1818
timeout-minutes: 30
1919
strategy:
20+
fail-fast: false
2021
matrix:
22+
os: [ubuntu-latest]
2123
test-type: [lint, core, interactive, integration, tools]
24+
include:
25+
- os: ubuntu-22.04
26+
test-type: core
27+
- os: ubuntu-24.04
28+
test-type: core
29+
- os: macos-14
30+
test-type: core
31+
- os: macos-14
32+
test-type: host-pty
33+
pytest-args: -x
2234

2335
steps:
24-
- uses: actions/checkout@v4
25-
- uses: astral-sh/setup-uv@v6
36+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
37+
- uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6
2638
- run: make sync
2739

2840
- name: Run lint
@@ -45,13 +57,17 @@ jobs:
4557
if: matrix.test-type == 'tools'
4658
run: make test-tools
4759

60+
- name: Run host-PTY integration tests
61+
if: matrix.test-type == 'host-pty'
62+
run: uv run pytest tests/integration ${{ matrix.pytest-args || '' }}
63+
4864
nightly:
4965
runs-on: ubuntu-latest
5066
timeout-minutes: 45
5167
if: github.event_name == 'schedule' || github.event_name == 'pull_request'
5268
steps:
53-
- uses: actions/checkout@v4
54-
- uses: astral-sh/setup-uv@v6
69+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
70+
- uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6
5571
- run: make sync
5672
- run: make test-performance
5773

@@ -60,16 +76,16 @@ jobs:
6076
timeout-minutes: 20
6177
needs: test
6278
steps:
63-
- uses: actions/checkout@v4
64-
- uses: astral-sh/setup-uv@v6
79+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
80+
- uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6
6581
- run: make sync
6682
- run: make test-coverage
67-
- uses: codecov/codecov-action@v4
83+
- uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4
6884
with:
6985
file: ./coverage.xml
7086
token: ${{ secrets.CODECOV_TOKEN }}
7187
- name: Upload test results to Codecov
7288
if: ${{ !cancelled() }}
73-
uses: codecov/test-results-action@v1
89+
uses: codecov/test-results-action@0fa95f0e1eeaafde2c782583b36b28ad0d8c77d3 # v1
7490
with:
7591
token: ${{ secrets.CODECOV_TOKEN }}

.github/workflows/cross-platform.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ jobs:
2828

2929
steps:
3030
- name: Checkout
31-
uses: actions/checkout@v4
31+
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
3232

3333
- name: Run Ubuntu setup script
3434
run: bash scripts/setup-ubuntu.sh
@@ -47,7 +47,7 @@ jobs:
4747

4848
steps:
4949
- name: Checkout
50-
uses: actions/checkout@v4
50+
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
5151

5252
- name: Run macOS setup script
5353
run: bash scripts/setup-macos.sh

.github/workflows/docker-publish.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ jobs:
1818

1919
steps:
2020
- name: Checkout repository
21-
uses: actions/checkout@v4
21+
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
2222

2323
- name: Log in to GitHub Container Registry
24-
uses: docker/login-action@v3
24+
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
2525
with:
2626
registry: ghcr.io
2727
username: ${{ github.actor }}
@@ -33,7 +33,7 @@ jobs:
3333
- name: Tag and push Docker image
3434
run: |
3535
ORFS_VER=$(make --no-print-directory print-ORFS_VERSION)
36-
IMAGE=ghcr.io/luarss/openroad-mcp
36+
IMAGE=ghcr.io/the-openroad-project/openroad-mcp
3737
SEMVER="${IMAGE_TAG#v}"
3838
docker tag $IMAGE:$ORFS_VER $IMAGE:"$IMAGE_TAG"
3939
docker tag $IMAGE:$ORFS_VER $IMAGE:"$SEMVER"

.github/workflows/release.yml

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ jobs:
1515
name: Run tests
1616
runs-on: ubuntu-latest
1717
steps:
18-
- uses: actions/checkout@v4
18+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
1919

2020
- name: Install uv
21-
uses: astral-sh/setup-uv@v6
21+
uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6
2222

2323
- name: Install dependencies
2424
run: make sync
@@ -34,16 +34,16 @@ jobs:
3434
needs: test
3535
runs-on: ubuntu-latest
3636
steps:
37-
- uses: actions/checkout@v4
37+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
3838

3939
- name: Install uv
40-
uses: astral-sh/setup-uv@v6
40+
uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6
4141

4242
- name: Build package
4343
run: uv build
4444

4545
- name: Upload dist artifacts
46-
uses: actions/upload-artifact@v4
46+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
4747
with:
4848
name: dist
4949
path: dist/
@@ -52,23 +52,23 @@ jobs:
5252
name: Publish to PyPI
5353
needs: build
5454
runs-on: ubuntu-latest
55-
environment: pypi
55+
environment: pypi1
5656
steps:
5757
- name: Download dist artifacts
58-
uses: actions/download-artifact@v4
58+
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
5959
with:
6060
name: dist
6161
path: dist/
6262

6363
- name: Publish to PyPI
64-
uses: pypa/gh-action-pypi-publish@release/v1
64+
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
6565

6666
github-release:
6767
name: Create GitHub Release
6868
needs: build
6969
runs-on: ubuntu-latest
7070
steps:
71-
- uses: actions/checkout@v4
71+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
7272

7373
- name: Extract changelog for this version
7474
id: changelog
@@ -81,13 +81,13 @@ jobs:
8181
echo "EOF" >> $GITHUB_OUTPUT
8282
8383
- name: Download dist artifacts
84-
uses: actions/download-artifact@v4
84+
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
8585
with:
8686
name: dist
8787
path: dist/
8888

8989
- name: Create GitHub Release
90-
uses: softprops/action-gh-release@v2
90+
uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2
9191
with:
9292
body: ${{ steps.changelog.outputs.notes }}
9393
files: dist/*
@@ -110,13 +110,13 @@ jobs:
110110
id-token: write
111111
contents: read
112112
steps:
113-
- uses: actions/checkout@v4
113+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
114114

115115
- name: Update server.json version
116116
run: |
117117
VERSION="${GITHUB_REF_NAME#v}"
118118
sed -i "s/\"version\": \"[^\"]*\"/\"version\": \"$VERSION\"/g" server.json
119-
sed -i "s|ghcr.io/luarss/openroad-mcp:[^\"]*|ghcr.io/luarss/openroad-mcp:$VERSION|g" server.json
119+
sed -i "s|ghcr.io/the-openroad-project/openroad-mcp:[^\"]*|ghcr.io/the-openroad-project/openroad-mcp:$VERSION|g" server.json
120120
121121
- name: Install mcp-publisher
122122
run: |

.github/workflows/ts-ci.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
name: TypeScript CI
2+
3+
on:
4+
push:
5+
branches: [main, "feat/ts-migration**"]
6+
paths: ["typescript/**"]
7+
pull_request:
8+
branches: [main, "feat/ts-migration**"]
9+
paths: ["typescript/**"]
10+
11+
jobs:
12+
ts-check:
13+
runs-on: ubuntu-latest
14+
defaults:
15+
run:
16+
working-directory: typescript
17+
steps:
18+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
19+
- uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.4.0
20+
with:
21+
node-version: "22"
22+
cache: "npm"
23+
cache-dependency-path: typescript/package-lock.json
24+
- run: npm ci
25+
- run: npm run typecheck
26+
- run: npm run lint
27+
- run: npm run test

0 commit comments

Comments
 (0)