Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
b4b8d7b
Add Quick fastener's screw, washer and nut features, and its catalog …
claude Oct 21, 2026
1f131d0
Report each hole's circular edges in Quick fastener's hole scan
claude Oct 21, 2026
ef3c462
Rewrap Quick fastener's writeup
claude Oct 21, 2026
92623ef
Build Quick fastener's catalog from FRCDesign's Fasteners group
claude Oct 21, 2026
e5185c6
Quick fastener: separate washers, Onshape configurations in the manif…
claude Oct 21, 2026
099e2a6
Quick fastener: name a selected circle's part by its evaluated body
claude Oct 21, 2026
0d1604e
Quick fastener: WCP's and AndyMark's screws from their stores
claude Oct 21, 2026
e3c00fb
Fasteners: name the screw, washer and nut as FRCDesign's library fast…
claude Oct 21, 2026
a9be8cc
Fasteners: drop Quick fastener's name from the library side
claude Oct 21, 2026
8706ebc
Fasteners: name every configuration's part in the generator, for inde…
claude Oct 21, 2026
ec4e72a
Fasteners: screw variants and washer finishes, shown only where a ven…
claude Oct 22, 2026
1cb140b
fs: build configured Part Studios instead of configuring hand-made ones
claude Oct 22, 2026
216ab40
fs: build a library's Part Studios only on release; ask before callin…
claude Oct 22, 2026
7674062
Fasteners: a screw's Finish before its Length, and Fully threaded last
claude Oct 22, 2026
82d1f00
Fasteners: keep only the stores' catalog screws
claude Oct 22, 2026
4f89f9a
fs parts: try and release part sets apart from user-facing FeatureScript
claude Oct 22, 2026
5453ba6
Push 5 files to Onshape
AlexKempen Oct 22, 2026
5d84e88
fs parts: name custom enum values' namespace, and say which step Onsh…
claude Oct 22, 2026
060957a
Merge remote-tracking branch 'origin/claude/zealous-shannon-e0iklk' i…
claude Oct 22, 2026
0dd86c7
fs parts: insert the feature plain, then configure it, and check Onsh…
claude Oct 22, 2026
55cfbed
Fasteners: McMaster-Carr's chamfers, button domes and socket depths; …
claude Oct 22, 2026
e827f78
fs parts diagnose: which part of a configuration Onshape refuses
claude Oct 22, 2026
4aead22
fastenerTables.py fetch-threads: snapshot FRCDesign's bolts' threaded…
claude Oct 22, 2026
8ce3add
Configured studios: conditions in the shape Onshape's UI makes; Fully…
claude Oct 22, 2026
957d1b6
fastenerTables.py: drop fetch-threads
claude Oct 22, 2026
34602aa
fs parts configuration: print a Part Studio's configuration as Onshap…
claude Oct 22, 2026
b066225
Configured studios: end each List's option rules with one showing the…
claude Oct 22, 2026
a226435
fs parts diagnose: write each input's option rules together
claude Oct 22, 2026
c551015
Fasteners: "in" without a period, and a finish enum for each kind
claude Oct 22, 2026
dfcf6e1
Configured studios: configured values don't name their parameter
claude Oct 22, 2026
933b369
fs: a backend workspace per git branch, and sync-main landing main by…
claude Oct 22, 2026
6400343
Release files: a branch asks for a release in releases/, made once it…
claude Oct 22, 2026
272aaa4
Branch workspaces on for robot-code: fs branches, the Onshape workflo…
claude Oct 22, 2026
eef1bcd
Robot color: standard, RGB, or hex appearances, on parts selected or …
claude Oct 22, 2026
b905069
Robot color: a Custom color checkbox, whose one field takes hex or RGB
claude Oct 22, 2026
20a5d8b
fs parts: --test, --diagnose, --release flags, release targets, and a…
claude Oct 22, 2026
b14e166
Part sets: the FRCDesignLib Test Document as the fasteners' test target
claude Oct 23, 2026
dda61da
Push fastenerHoleScan.fs, fastenerTables.gen.fs, fasteners.fs to Onshape
AlexKempen Oct 23, 2026
199a619
Merge branch 'claude/zealous-shannon-e0iklk' of https://github.com/ro…
AlexKempen Oct 23, 2026
1e6946a
fs features: print a Part Studio's features as Onshape stores them
claude Oct 23, 2026
31d8115
fs push: point imports of a recreated tab at its new one
claude Oct 23, 2026
22a6ccd
Fasteners: nuts shaped as McMaster-Carr models them
claude Oct 23, 2026
83df1a4
Fasteners: find a nut by the body its intersection makes
claude Oct 23, 2026
4c7c23f
Push fastenerTables.gen.fs, fasteners.fs to Onshape
AlexKempen Oct 23, 2026
8cc6796
fs parts: configure a feature in the namespaces Onshape stored
claude Oct 23, 2026
dbad9e7
Colors: FRCDesignLib's color standards
claude Oct 23, 2026
4343824
Fasteners: hide single-option inputs, AndyMark washers, usage defaults
claude Oct 23, 2026
03b874d
Fasteners: default the screw to Generic
claude Oct 23, 2026
7ef09b3
fs parts: delete the old feature before writing the configuration; va…
claude Oct 23, 2026
79d4d29
Fasteners: check each generated feature makes one mate connector
claude Oct 23, 2026
410cf85
Docs: Quick fastener reads the fasteners the library loaded
claude Oct 25, 2026
0dfaf19
Move the fastener hole scan to FRCDesignApp
claude Oct 25, 2026
3fa2e0a
Release each studio's mate connector id in its manifest
claude Oct 26, 2026
5f7bc82
Manifest names each studio's mate connector id, not the built one
claude Oct 26, 2026
e4872fc
Name FRCDesignApp's Auto Assembly in the parts docs
claude Oct 28, 2026
4c348e3
Push robotColor.fs, robotProperties.fs to Onshape
AlexKempen Oct 25, 2026
d9e9710
Delete tabs in Onshape
AlexKempen Oct 26, 2026
8dae2fd
Stand the custom 2x1 tube on a 1 in. face
claude Nov 2, 2026
5bf829a
Top rows go through the top: the walls facing X
claude Nov 2, 2026
beb26f6
Take the frame orientation fix back out of this branch
claude Nov 6, 2026
5858663
Catalog goBILDA's and REV's FTC fasteners, measured from their models
claude Nov 6, 2026
2d0a702
fs cots: FTC's library is ConfigLib
claude Nov 6, 2026
c561170
FTC fasteners: AndyMark's and McMaster-Carr's
claude Nov 6, 2026
205dc19
FTC fasteners default to the cheapest
claude Nov 8, 2026
bb37c46
FTC fasteners: McMaster-Carr's nylocks, and the cheapest from packs o…
claude Nov 8, 2026
e7b6d6c
FTC fasteners: vendors in a set order, finishes cheapest first
claude Nov 8, 2026
63ecade
FTC fasteners: McMaster-Carr's metric socket heads and nuts as data
claude Nov 8, 2026
f776a6f
FTC fasteners: McMaster-Carr's button heads, and no low profile heads
claude Nov 8, 2026
e25ae1a
FTC fasteners: McMaster-Carr's flat heads
claude Nov 8, 2026
47dacca
FTC fasteners: McMaster-Carr's M4 washers, and its nut and washer models
claude Nov 8, 2026
c65fe10
FTC fasteners: no lock washers, REV's washer as a standard M3
claude Nov 8, 2026
cbabc57
FTC fasteners: McMaster-Carr's M3 washers
claude Nov 8, 2026
99f7b5f
FTC fasteners: REV's hex nut takes McMaster-Carr's shape
claude Nov 8, 2026
001da91
FTC fasteners: metric screws, nuts and washers as a part set of their…
claude Nov 8, 2026
6f49be0
FTC fasteners: no T-slot screws; fs cots reads uses
claude Nov 8, 2026
752ff2c
Register FTC's fasteners as a part set, released into ConfigLib's doc…
claude Nov 8, 2026
c84a489
Push fastenerTables.gen.fs, fasteners.fs to Onshape
AlexKempen Nov 8, 2026
5093fc2
Push gearCommon.fs, robotGear.fs to Onshape
AlexKempen Nov 8, 2026
f66e694
Merge main into claude/zealous-shannon-e0iklk
claude Nov 8, 2026
9a4b509
Screw: cut the socket from the screw alone, not its cutter too
claude Nov 8, 2026
58a6120
Push 10 files to Onshape
AlexKempen Nov 8, 2026
08e09ca
Fasteners: resolve hidden inputs within their own part set, and build…
claude Nov 8, 2026
73369e8
fs push: push files after the files they import, so their imports sta…
claude Nov 8, 2026
26c849a
FTC fasteners: Generic hex nuts and nylocks, the default nut
claude Nov 8, 2026
c96147c
Release FRC's and FTC's fasteners
claude Nov 8, 2026
4aaf87a
Part releases leave the main document unversioned
claude Nov 8, 2026
ccbfeda
fs parts: take the import versions Onshape gave the set's FeatureScript
claude Nov 8, 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
18 changes: 18 additions & 0 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Tests, FeatureScript checks, and release files, before anything reaches Onshape (no API calls)
name: Checks

on:
pull_request:
push:
branches: [main]

jobs:
checks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v6
- run: uv sync --locked
- run: uv run pytest -q
- run: uv run fs check
- run: uv run fs releases
53 changes: 53 additions & 0 deletions .github/workflows/onshape.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Lands main in the backend's main workspace by merging, makes the releases it asks for in releases/, and deletes the
# workspaces of branches gone from origin (see docs/fs-cli.md#branches). Spends the API allocation of the account whose
# keys are in the ONSHAPE_ACCESS_KEY and ONSHAPE_SECRET_KEY secrets.
name: Onshape

on:
push:
branches: [main]
workflow_dispatch:

# One at a time, so two merges can't both version a document
concurrency:
group: onshape
cancel-in-progress: false

permissions:
# To commit what releases record, and push their tags
contents: write
# To find the pull request a commit merged
pull-requests: read

jobs:
onshape:
runs-on: ubuntu-latest
env:
API_ACCESS_KEY: ${{ secrets.ONSHAPE_ACCESS_KEY }}
API_SECRET_KEY: ${{ secrets.ONSHAPE_SECRET_KEY }}
FS_BRANCH: main
GH_TOKEN: ${{ github.token }}
steps:
- uses: actions/checkout@v4
with:
# fs recognizes Onshape's code in git history
fetch-depth: 0
- uses: astral-sh/setup-uv@v6
- run: uv sync --locked
- run: uv run pytest -q
- run: uv run fs check
- name: Configure git
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
- name: Land main in Onshape
run: |
# The pull request this commit merged, whose branch's workspace is landed; none for a direct push
branch=$(gh pr list --state merged --search "${{ github.sha }}" --json headRefName --jq '.[0].headRefName // empty')
uv run fs sync-main ${branch:+--branch "$branch"}
- name: Make the releases asked for
run: uv run fs run-releases
- name: Push what landing and releasing committed
run: git push origin HEAD:main
- name: Delete the workspaces of branches gone from origin
run: uv run fs branches --prune --yes
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ poetry.toml
creds.json

# fs CLI sync state (per machine)
.fs-state.json
.fs-state*.json
.fs.lock

# VS Code extension build output
Expand Down
22 changes: 22 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,17 @@
See `docs/fs-cli.md` for how the `fs` CLI works, and `docs/featurescript-style.md` for how to write
FeatureScript here (including selections, editing logic, and manipulator change functions).

## Onshape API calls

Ask before anything that calls Onshape, and run it only once the user says yes, every time: the Onshape FeatureScript
MCP's tools, and every `fs` command that talks to Onshape (`push`, `pull`, `sync`, `release`, `parts`, `configuration`,
`deprecate`, `sync-versions`, `release-tags`, `sync-main`, `run-releases`, `branches`, `features`, `pull-std`,
`update-std`, `released --detect`, and the
rest). Each call spends the
user's Onshape API allocation, and a write to a released or library document can't be undone. Offline work needs no
asking: `fs gen`, `check`, `format`, `audit`, `ui`, `eval`, `table`, and `pytest`, which run against fakes. When the
user runs a command themselves, say exactly what to run.

`README.md` is for users: an overview of the repo, setup, and links. How the tools work, and anything else written for
agents, goes in `docs/`, a skill, or here.

Expand Down Expand Up @@ -30,6 +41,13 @@ before stating how FeatureScript or Onshape behaves, or adding a rule here or to
For FeatureScript names, `fs doc NAME` shows a std or project symbol's signature and documentation, `fs refs NAME`
where it's used, and `fs rename NAME NEW` renames it everywhere; `fs check --fix` fixes problems with one right answer.

FeatureScript-backed parts (FRCDesign's fasteners) are part sets, tried and released by `fs parts`, never `fs release`;
see `docs/parts.md`.

Each git branch pushes to a backend workspace of its own; main reaches the main workspace only by `fs sync-main`, which
the Onshape workflow runs on merge, and releases are asked for in `releases/` files rather than run from a branch (see
`docs/fs-cli.md#branches`).

A "top level option" means a horizontal enum at the top of the feature (see `docs/featurescript-style.md`'s
"Horizontal enums go at the top").

Expand All @@ -50,5 +68,9 @@ Never rename a released feature's constant (the name `defineFeature` is exported
documents store it as the feature's type, and lose the feature if it changes. Rename its Feature Type Name and its file
instead (see `docs/featurescript-style.md`'s "Released feature constants").

FRCDesign's library fasteners' configured Part Studios are an exception too: FRCDesign inserts them with configurations of their
option ids, and recognizes the fasteners already in assemblies by them, so never rename or remove a released option
id (see `featurescripts/fasteners/fastenerTables.py`); add new ones.

The other exception is attributes, which other features and documents read back. When an attribute's format changes, either
handle old attributes or report them as an error; either is fine.
4 changes: 2 additions & 2 deletions docs/cots-research.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ FRCDesign's public API (no sign-in, and no Onshape API calls):

```
uv run fs cots 'hex shaft' # FRC parts matching a regular expression, most used first
uv run fs cots 'channel|beam' -l ftc # the FTC library (-l mkcad for MKCad's)
uv run fs cots 'channel|beam' -l config # ConfigLib, FTC's library (-l mkcad for MKCad's)
uv run fs cots 'hex shaft' -d # also each part's configuration usage, and part numbers with the options they're for
uv run fs cots --days 90 -n 100 # the top 100 parts over the last 90 days
```
Expand Down Expand Up @@ -40,7 +40,7 @@ need. These work without signing in; `{date}`s are like `2026-01-31`:
| `/search-db/library/{library}?v={version}` | The app's search index (a serialized MiniSearch index of part names, groups, and part numbers) |

Others (`/build-status/library/{library}`, `/job-status/library/{library}`, and `/favorites/library/{library}`) need
signing in to Onshape. Libraries are `frc-design-lib`, `ftc-design-lib`, and `mkcad`. A part's page in the app, like
signing in to Onshape. Libraries are `frc-design-lib`, `config-lib`, and `mkcad`. A part's page in the app, like
`https://app.frcdesign.org/app/library/frc-design-lib?part={insertable id}`, shows the options its configuration
endpoint returns. It rejects Python's `urllib` (by its user agent), so use `requests` or `curl`.

Expand Down
Loading
Loading