-
Notifications
You must be signed in to change notification settings - Fork 1
feat: auto-generate README repository table and software tools section #2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
4a173ce
feat: auto-generate README repository table and software tools section
bcastets-robotiq 1dc52ca
fix: address auto-merge and script review findings
bcastets-robotiq b983f32
fix: don't double /docs/ for site-root-relative doc links
bcastets-robotiq bb3b094
test: add fixture, idempotence, and unchanged-on-failure coverage
bcastets-robotiq File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| name: Test | ||
|
|
||
| # Runs scripts/update-readme.test.mjs on every PR into main. Intended to be | ||
| # added as a required status check on the prToMain ruleset, so a PR that | ||
| # breaks scripts/update-readme.mjs (including one opened by | ||
| # update-readme.yml's own daily run) can't merge — see the "required check" | ||
| # discussion on PR #2. | ||
|
|
||
| on: | ||
| pull_request: | ||
| branches: [main] | ||
|
|
||
| jobs: | ||
| test: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
|
|
||
| - uses: actions/setup-node@v4 | ||
| with: | ||
| node-version: 20 | ||
|
|
||
| - run: node --test scripts/*.test.mjs |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,111 @@ | ||
| name: Update README | ||
|
|
||
| # Daily refresh of profile/README.md's auto-generated sections (see | ||
| # scripts/update-readme.mjs): the repository table (from the GitHub API) and | ||
| # the software tools tables (imported from robotiq/robotiq.github.io's | ||
| # docs/intro.mdx). Opens a PR only when the regenerated content actually | ||
| # differs, then auto-merges it — mirroring | ||
| # robotiq.github.io's .github/workflows/dependabot-auto-merge.yml. | ||
| # | ||
| # Why this needs a PAT instead of just GITHUB_TOKEN: the prToMain ruleset's | ||
| # required-review rule blocks a PR's *author* from approving its own PR. In | ||
| # dependabot-auto-merge.yml, Dependabot (a distinct actor) opens the PR and | ||
| # GITHUB_TOKEN (github-actions[bot]) approves it — two different actors, so | ||
| # it's not self-approval. Here there's no Dependabot; this workflow itself | ||
| # generates the content. So the "open PR" step authenticates as | ||
| # README_BOT_PAT (a fine-grained PAT scoped to just this repo, Contents + | ||
| # Pull requests: write) instead of GITHUB_TOKEN, making its author a | ||
| # distinct actor from the github-actions[bot] identity that then approves | ||
| # and merges it in the next step. | ||
| # | ||
| # Why this is safe to merge without further human review: the generated | ||
| # content is either the GitHub API's own repo descriptions or | ||
| # robotiq.github.io's own published docs/intro.mdx — both already public and | ||
| # already reviewed upstream. What actually gates the merge is the "Test" | ||
| # workflow (.github/workflows/test.yml) as a required status check on the | ||
| # prToMain ruleset: `gh pr merge --auto` waits on it, so a change that breaks | ||
| # update-readme.mjs sits as an open, failing PR instead of reaching the org's | ||
| # public landing page. Without that required check, `--auto` has nothing to | ||
| # wait on and errors out instead of merging — see the review on PR #2. | ||
| # | ||
| # Also requires: `allow_auto_merge` enabled on this repo (Settings → General | ||
| # → Pull Requests), and the commit's author email resolving to a real GitHub | ||
| # account (below) so prToMain's require_extra_approval_for_unattributed_changes | ||
| # rule doesn't kick in and demand a second approval nothing here can produce. | ||
|
|
||
| on: | ||
| schedule: | ||
| - cron: '17 6 * * *' | ||
| workflow_dispatch: {} | ||
|
|
||
| permissions: | ||
| contents: write | ||
| pull-requests: write | ||
|
|
||
| jobs: | ||
| update-readme: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
| with: | ||
| token: ${{ secrets.README_BOT_PAT }} | ||
|
|
||
| - uses: actions/setup-node@v4 | ||
| with: | ||
| node-version: 20 | ||
|
|
||
| - name: Regenerate README | ||
| env: | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| run: node scripts/update-readme.mjs | ||
|
|
||
| - name: Open PR if content changed | ||
| id: pr | ||
| env: | ||
| GH_TOKEN: ${{ secrets.README_BOT_PAT }} | ||
| run: | | ||
| if git diff --quiet -- profile/README.md; then | ||
| echo "changed=false" >> "$GITHUB_OUTPUT" | ||
| exit 0 | ||
| fi | ||
|
|
||
| # Fixed name rather than one timestamped per run: a run that lands | ||
| # before yesterday's PR merged (still waiting on the required | ||
| # check) force-pushes onto the same branch/PR instead of piling up | ||
| # a new branch and a new unmergeable PR each day. | ||
| BRANCH="auto/update-readme" | ||
| git config user.name "robotiq-readme-bot" | ||
| # This must resolve to a real GitHub account (github-actions[bot]'s | ||
| # own noreply address) or the prToMain ruleset's | ||
| # require_extra_approval_for_unattributed_changes rule treats the | ||
| # commit as unattributed and demands a second approval this | ||
| # workflow has no way to produce. | ||
| git config user.email "41898282+github-actions[bot]@users.noreply.github.com" | ||
| git checkout -b "$BRANCH" | ||
| git add profile/README.md | ||
| git commit -m "chore: update README repository table and software tools section" | ||
| git push --force origin "$BRANCH" | ||
|
|
||
| EXISTING_PR=$(gh pr list --base main --head "$BRANCH" --state open --json url --jq '.[0].url') | ||
| if [ -n "$EXISTING_PR" ]; then | ||
| PR_URL="$EXISTING_PR" | ||
| else | ||
| PR_URL=$(gh pr create \ | ||
| --base main \ | ||
| --head "$BRANCH" \ | ||
| --title "chore: update README repository table" \ | ||
| --body "Automated daily refresh of the repository table (GitHub API) and software tools section (robotiq.github.io docs/intro.mdx) — see \`scripts/update-readme.mjs\`.") | ||
| fi | ||
|
|
||
| echo "changed=true" >> "$GITHUB_OUTPUT" | ||
| echo "url=$PR_URL" >> "$GITHUB_OUTPUT" | ||
|
|
||
| - name: Approve and auto-merge | ||
| if: steps.pr.outputs.changed == 'true' | ||
| env: | ||
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| PR_URL: ${{ steps.pr.outputs.url }} | ||
| run: | | ||
| gh pr review --approve "$PR_URL" | ||
| gh pr merge --auto --squash --delete-branch "$PR_URL" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,22 +1,88 @@ | ||
| # Robotiq | ||
|
|
||
| Open-source tools and drivers for Robotiq products. | ||
| Open-source software tools for Robotiq developers. | ||
|
|
||
| <p align="center"> | ||
| <a href="https://robotiq.github.io/docs/intro"> | ||
| <img src="https://img.shields.io/badge/📖_Documentation-robotiq.github.io-blue?style=for-the-badge" alt="Robotiq documentation website" /> | ||
| </a> | ||
| </p> | ||
|
|
||
| <p align="center"> | ||
| Full documentation, guides, and API references for `Robotiq` software tools.<br/> | ||
| Start there to find your product, then jump into the matching repository below. | ||
| </p> | ||
|
|
||
| ## Repositories | ||
|
|
||
| <!-- This section is auto-generated by scripts/update-readme.mjs from the | ||
| robotiq GitHub org's public repositories — do not edit by hand. --> | ||
| <!-- AUTO-GENERATED-REPOS-TABLE:START --> | ||
| | Repository | Description | | ||
| |---|---| | ||
| | [grippers](https://github.com/Robotiq/grippers) | Standalone C++ SDK for the 2F adaptive grippers (2F-85 / 2F-140 / Hand-E) over Modbus RTU | | ||
| | [tactile_sensors](https://github.com/Robotiq/tactile_sensors) | SDK, sensor I/O, and quickstart tools for the TSF-85 tactile sensor | | ||
| | [ros](https://github.com/Robotiq/ROS_Packages) | Robotiq ROS packages (grippers, tactile sensor) | | ||
| | [grippers](https://github.com/robotiq/grippers) | Standalone C++ SDK for Robotiq 2F adaptive grippers (2F-85 / 2F-140 / Hand-E) over Modbus RTU | | ||
| | [isaacsim_assets](https://github.com/robotiq/isaacsim_assets) | Our Isaac Sim assets available to the public | | ||
| | [ros](https://github.com/robotiq/ros) | Collection of ROS packages for controlling Robotiq hardware. | | ||
| | [tactile_sensors](https://github.com/robotiq/tactile_sensors) | Get started with Robotiqs TSF-85 tactile sensors | | ||
| <!-- AUTO-GENERATED-REPOS-TABLE:END --> | ||
|
|
||
| ## Community & Third-Party | ||
| ## Software tools | ||
|
|
||
| A curated list of community-maintained drivers and useful third-party projects related to Robotiq products and robotic grasping. | ||
| <!-- This section is auto-generated by scripts/update-readme.mjs from | ||
| https://github.com/robotiq/robotiq.github.io/blob/main/docs/intro.mdx — do not edit by hand. --> | ||
| <!-- AUTO-GENERATED-SOFTWARE-TOOLS:START --> | ||
| #### SDKs/languages | ||
|
|
||
| | Repository | Description | | ||
| | Product | C | C++ | Python | | ||
| |---|---|---|---| | ||
| | [2F / Hand-E](https://robotiq.github.io/docs/drivers/2F%20hande) | - | [](https://robotiq.github.io/docs/drivers/2F%20hande/SDK/C++) | [](https://robotiq.github.io/docs/drivers/2F%20hande/SDK/Python) | | ||
| | [FT300-S](https://robotiq.github.io/docs/drivers/FT300) | [](https://robotiq.github.io/docs/drivers/FT300/SDK/C) | - | [](https://robotiq.github.io/docs/drivers/FT300/SDK/Python) | | ||
| | [TSF-85](https://robotiq.github.io/docs/drivers/TSF-85) | - | [](https://robotiq.github.io/docs/drivers/TSF-85/SDK/C++) | [](https://robotiq.github.io/docs/drivers/TSF-85/SDK/Python) | | ||
|
|
||
| - **C** — Low-level C driver talking directly to the hardware's communication protocol (e.g. Modbus RTU, serial). | ||
| - **C++** — Low-level C++ driver/SDK for direct hardware integration. | ||
| - **Python** — Python driver/SDK for scripting and rapid prototyping. | ||
|
|
||
| #### ROS2 | ||
|
|
||
| | Product | Rolling | Jazzy | Iron | Humble | | ||
| |---|---|---|---|---| | ||
| | [2F / Hand-E](https://robotiq.github.io/docs/drivers/2F%20hande) | [](https://robotiq.github.io/docs/drivers/2F%20hande/ROS/ROS2-Rolling) | - | [](https://robotiq.github.io/docs/drivers/2F%20hande/ROS/ROS2-Iron) | [](https://robotiq.github.io/docs/drivers/2F%20hande/ROS/ROS2-Humble) | | ||
| | [FT300-S](https://robotiq.github.io/docs/drivers/FT300) | - | - | - | [](https://robotiq.github.io/docs/drivers/FT300/ROS/ROS2-Humble) | | ||
| | [TSF-85](https://robotiq.github.io/docs/drivers/TSF-85) | - | [](https://robotiq.github.io/docs/drivers/TSF-85/ROS/ROS2-Jazzy) | - | - | | ||
|
|
||
| - **Rolling** — ROS 2 rolling development distro, always tracking the latest sources. | ||
| - **Jazzy** — ROS 2 LTS release (2024), supported until 2029. | ||
| - **Iron** — ROS 2 release (2023), end of life. | ||
| - **Humble** — ROS 2 LTS release (2022), supported until 2027. | ||
|
|
||
| #### ROS1 | ||
|
|
||
| | Product | Melodic | Kinetic | Jade | Indigo | | ||
| |---|---|---|---|---| | ||
| | [2F / Hand-E](https://robotiq.github.io/docs/drivers/2F%20hande) | [](https://robotiq.github.io/docs/drivers/2F%20hande/ROS/ROS1-Melodic) | [](https://robotiq.github.io/docs/drivers/2F%20hande/ROS/ROS1-Kinetic) | [](https://robotiq.github.io/docs/drivers/2F%20hande/ROS/ROS1-Jade) | [](https://robotiq.github.io/docs/drivers/2F%20hande/ROS/ROS1-Indigo) | | ||
|
|
||
| - **Melodic** — ROS 1 release (2018), end of life. | ||
| - **Kinetic** — ROS 1 release (2016), end of life. | ||
| - **Jade** — ROS 1 release (2015), end of life. | ||
| - **Indigo** — ROS 1 release (2014), end of life. | ||
|
|
||
| #### Physics engine | ||
|
|
||
| | Product | Isaac Sim | PyBullet | | ||
| |---|---|---| | ||
| | [2F / Hand-E](https://robotiq.github.io/docs/drivers/2F%20hande) | [](https://robotiq.github.io/docs/drivers/2F%20hande/Physics%20Engine/Isaac%20Sim) | [](https://robotiq.github.io/docs/drivers/2F%20hande/Physics%20Engine/PyBullet) | | ||
| | [TSF-85](https://robotiq.github.io/docs/drivers/TSF-85) | [](https://robotiq.github.io/docs/drivers/TSF-85/Physics%20Engine/Isaac%20Sim) | - | | ||
|
|
||
| - **Isaac Sim** — NVIDIA Isaac Sim integration for simulating the hardware. | ||
| - **PyBullet** — PyBullet integration for physics-based simulation. | ||
|
|
||
| #### Other community projects | ||
|
|
||
| | Product | GraspGen | | ||
| |---|---| | ||
| | [TSF-85 Isaac Sim Extension](https://github.com/Lab-CORO/TSF-85) | An Isaac Sim extension generating synthetic tactile maps for the TSF-85 | | ||
| | [pyRobotiqGripper](https://github.com/castetsb/pyRobotiqGripper) | Python library for controlling Robotiq grippers (2F-85, 2F-140, Hand-E) via Modbus RTU | | ||
| | [ur_rtde](https://sdurobotics.gitlab.io/ur_rtde) | Provides some useful [instructions](https://sdurobotics.gitlab.io/ur_rtde/guides/guides.html#use-with-robotiq-gripper) on how to control a Robotiq gripper directly using a raw TCP socket | | ||
| | [pyFT300](https://github.com/castetsb/pyFT300) | Python library for reading data from the Robotiq FT-300 force-torque sensor | | ||
| | [pybullet_ur5_robotiq](https://github.com/ElectronicElephant/pybullet_ur5_robotiq) | UR5 + Robotiq 85/140 gripper simulation in PyBullet | | ||
| | [GraspGen](https://github.com/NVlabs/GraspGen) | GraspGen: a diffusion-based framework for 6-DOF grasping | | ||
|
bcastets-robotiq marked this conversation as resolved.
|
||
| | [2F / Hand-E](https://robotiq.github.io/docs/drivers/2F%20hande) | [](https://robotiq.github.io/docs/drivers/2F%20hande/Other/GraspGen) | | ||
|
|
||
| - **GraspGen** — NVIDIA GraspGen asset/model package with Robotiq gripper definitions for grasp synthesis research. | ||
| <!-- AUTO-GENERATED-SOFTWARE-TOOLS:END --> | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,83 @@ | ||
| --- | ||
| title: Overview | ||
| sidebar_label: Overview | ||
| sidebar_position: 0 | ||
| --- | ||
|
|
||
| ## Hardware documentation | ||
|
|
||
| Robotiq hardware communication protocols are described in detail in the product | ||
| manuals, which serve as the reference for developing custom drivers. | ||
|
|
||
| Hardware manuals are available on Robotiq support website: | ||
| https://robotiq.com/support | ||
|
|
||
| ## Software tools | ||
|
|
||
| Badge colors indicate who maintains the integration:  an official Robotiq-maintained driver,  a community-maintained project. | ||
|
|
||
| ### SDKs/languages | ||
|
|
||
| {/* AUTO-GENERATED-SDK-TABLE:START */} | ||
| | Product | C | C++ | Python | | ||
| |---|---|---|---| | ||
| | [2F / Hand-E](drivers/2F%20hande) | - | [](drivers/2F%20hande/SDK/C++) | [](drivers/2F%20hande/SDK/Python) | | ||
| | [FT300-S](drivers/FT300) | [](drivers/FT300/SDK/C) | - | [](drivers/FT300/SDK/Python) | | ||
| | [TSF-85](drivers/TSF-85) | - | [](drivers/TSF-85/SDK/C++) | [](drivers/TSF-85/SDK/Python) | | ||
|
|
||
| - **C** — Low-level C driver talking directly to the hardware's communication protocol (e.g. Modbus RTU, serial). | ||
| - **C++** — Low-level C++ driver/SDK for direct hardware integration. | ||
| - **Python** — Python driver/SDK for scripting and rapid prototyping. | ||
| {/* AUTO-GENERATED-SDK-TABLE:END */} | ||
|
|
||
| ### ROS | ||
|
|
||
| #### ROS2 | ||
|
|
||
| {/* AUTO-GENERATED-ROS2-TABLE:START */} | ||
| | Product | Rolling | Jazzy | Iron | Humble | | ||
| |---|---|---|---|---| | ||
| | [2F / Hand-E](drivers/2F%20hande) | [](drivers/2F%20hande/ROS/ROS2-Rolling) | - | [](drivers/2F%20hande/ROS/ROS2-Iron) | [](drivers/2F%20hande/ROS/ROS2-Humble) | | ||
| | [FT300-S](drivers/FT300) | - | - | - | [](drivers/FT300/ROS/ROS2-Humble) | | ||
| | [TSF-85](drivers/TSF-85) | - | [](drivers/TSF-85/ROS/ROS2-Jazzy) | - | - | | ||
|
|
||
| - **Rolling** — ROS 2 rolling development distro, always tracking the latest sources. | ||
| - **Jazzy** — ROS 2 LTS release (2024), supported until 2029. | ||
| - **Iron** — ROS 2 release (2023), end of life. | ||
| - **Humble** — ROS 2 LTS release (2022), supported until 2027. | ||
| {/* AUTO-GENERATED-ROS2-TABLE:END */} | ||
|
|
||
| #### ROS1 | ||
|
|
||
| {/* AUTO-GENERATED-ROS1-TABLE:START */} | ||
| | Product | Melodic | Kinetic | Jade | Indigo | | ||
| |---|---|---|---|---| | ||
| | [2F / Hand-E](drivers/2F%20hande) | [](drivers/2F%20hande/ROS/ROS1-Melodic) | [](drivers/2F%20hande/ROS/ROS1-Kinetic) | [](drivers/2F%20hande/ROS/ROS1-Jade) | [](drivers/2F%20hande/ROS/ROS1-Indigo) | | ||
|
|
||
| - **Melodic** — ROS 1 release (2018), end of life. | ||
| - **Kinetic** — ROS 1 release (2016), end of life. | ||
| - **Jade** — ROS 1 release (2015), end of life. | ||
| - **Indigo** — ROS 1 release (2014), end of life. | ||
| {/* AUTO-GENERATED-ROS1-TABLE:END */} | ||
|
|
||
| ### Physics engine | ||
|
|
||
| {/* AUTO-GENERATED-PHYSICS_ENGINE-TABLE:START */} | ||
| | Product | Isaac Sim | PyBullet | | ||
| |---|---|---| | ||
| | [2F / Hand-E](drivers/2F%20hande) | [](drivers/2F%20hande/Physics%20Engine/Isaac%20Sim) | [](drivers/2F%20hande/Physics%20Engine/PyBullet) | | ||
| | [TSF-85](drivers/TSF-85) | [](drivers/TSF-85/Physics%20Engine/Isaac%20Sim) | - | | ||
|
|
||
| - **Isaac Sim** — NVIDIA Isaac Sim integration for simulating the hardware. | ||
| - **PyBullet** — PyBullet integration for physics-based simulation. | ||
| {/* AUTO-GENERATED-PHYSICS_ENGINE-TABLE:END */} | ||
|
|
||
| ### Other community projects | ||
|
|
||
| {/* AUTO-GENERATED-OTHER-TABLE:START */} | ||
| | Product | GraspGen | | ||
| |---|---| | ||
| | [2F / Hand-E](drivers/2F%20hande) | [](drivers/2F%20hande/Other/GraspGen) | | ||
|
|
||
| - **GraspGen** — NVIDIA GraspGen asset/model package with Robotiq gripper definitions for grasp synthesis research. | ||
| {/* AUTO-GENERATED-OTHER-TABLE:END */} |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.