hackshop-mcp 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -34
- package/catalog.json +55 -41
- package/dist/build-plan/index.d.ts +10 -0
- package/dist/build-plan/index.js +550 -0
- package/dist/build-plan/index.js.map +1 -0
- package/dist/build-plan/types.d.ts +153 -0
- package/dist/build-plan/types.js +2 -0
- package/dist/build-plan/types.js.map +1 -0
- package/dist/catalog/schema.d.ts +13 -7
- package/dist/catalog/schema.js +2 -0
- package/dist/catalog/schema.js.map +1 -1
- package/dist/core/assess.d.ts +36 -0
- package/dist/core/assess.js +100 -0
- package/dist/core/assess.js.map +1 -0
- package/dist/core/errors.d.ts +2 -0
- package/dist/core/errors.js +70 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/links.d.ts +3 -0
- package/dist/core/links.js +19 -0
- package/dist/core/links.js.map +1 -0
- package/dist/core/plan-gadget.d.ts +85 -0
- package/dist/core/plan-gadget.js +619 -0
- package/dist/core/plan-gadget.js.map +1 -0
- package/dist/core/resources.d.ts +37 -0
- package/dist/core/resources.js +143 -0
- package/dist/core/resources.js.map +1 -0
- package/dist/core/safety.d.ts +7 -0
- package/dist/core/safety.js +28 -0
- package/dist/core/safety.js.map +1 -0
- package/dist/core/tools.d.ts +247 -0
- package/dist/core/tools.js +164 -0
- package/dist/core/tools.js.map +1 -0
- package/dist/core/types.d.ts +163 -0
- package/dist/core/types.js +17 -0
- package/dist/core/types.js.map +1 -0
- package/dist/platforms/index.d.ts +1 -1
- package/dist/platforms/index.js +3 -2
- package/dist/platforms/index.js.map +1 -1
- package/dist/platforms/schema.d.ts +204 -0
- package/dist/platforms/schema.js +11 -0
- package/dist/platforms/schema.js.map +1 -1
- package/dist/sampling.d.ts +1 -0
- package/dist/sampling.js +28 -3
- package/dist/sampling.js.map +1 -1
- package/dist/server.d.ts +14 -1
- package/dist/server.js +97 -85
- package/dist/server.js.map +1 -1
- package/dist/site-url.d.ts +1 -0
- package/dist/site-url.js +4 -0
- package/dist/site-url.js.map +1 -0
- package/dist/tools/assess_hackability.d.ts +2 -33
- package/dist/tools/assess_hackability.js +11 -83
- package/dist/tools/assess_hackability.js.map +1 -1
- package/dist/tools/get_build_plan.d.ts +6 -0
- package/dist/tools/get_build_plan.js +16 -0
- package/dist/tools/get_build_plan.js.map +1 -0
- package/dist/tools/plan_gadget.d.ts +2 -64
- package/dist/tools/plan_gadget.js +9 -401
- package/dist/tools/plan_gadget.js.map +1 -1
- package/dist/tools/propose_hardware.d.ts +3 -0
- package/dist/tools/propose_hardware.js +23 -10
- package/dist/tools/propose_hardware.js.map +1 -1
- package/package.json +1 -1
- package/platforms.json +352 -21
package/README.md
CHANGED
|
@@ -14,27 +14,33 @@ Hackshop now knows about Meta's Muse Gadgets SDK: ESP32 boards and Linux machine
|
|
|
14
14
|
|
|
15
15
|
## Status
|
|
16
16
|
|
|
17
|
-
v0.0.
|
|
17
|
+
v0.0.5 - published on npm and hosted at `https://www.hackshop.dev/mcp`. The hosted MCP exposes the deterministic tools (`plan_gadget`, `get_build_plan`, `assess_hackability`); the npm server also includes `propose_hardware` and `simulate_assembly`. The simulation layer is live at [hackshop.dev](https://hackshop.dev).
|
|
18
18
|
|
|
19
19
|
## Install in 30 seconds
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Hosted connector, when your client supports streamable HTTP:
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"url": "https://www.hackshop.dev/mcp",
|
|
26
|
+
"transport": "streamable-http"
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Or add the local npm server to your MCP client config (Claude Desktop / Claude Code / Cursor):
|
|
22
31
|
|
|
23
32
|
```json
|
|
24
33
|
{
|
|
25
34
|
"mcpServers": {
|
|
26
35
|
"hackshop": {
|
|
27
36
|
"command": "npx",
|
|
28
|
-
"args": ["-y", "hackshop-mcp"]
|
|
29
|
-
"env": {
|
|
30
|
-
"ANTHROPIC_API_KEY": "sk-ant-..."
|
|
31
|
-
}
|
|
37
|
+
"args": ["-y", "hackshop-mcp"]
|
|
32
38
|
}
|
|
33
39
|
}
|
|
34
40
|
}
|
|
35
41
|
```
|
|
36
42
|
|
|
37
|
-
|
|
43
|
+
`ANTHROPIC_API_KEY` is optional. It only improves `propose_hardware` in the local npm server when the MCP host cannot sample; `plan_gadget`, `get_build_plan`, and `assess_hackability` never need a key. Anonymous usage telemetry (tool names and timings only) is on by default in the npm server; set `HACKSHOP_TELEMETRY=0` to turn it off.
|
|
38
44
|
|
|
39
45
|
## Tools
|
|
40
46
|
|
|
@@ -55,18 +61,31 @@ Returns 3-5 hardware proposals, each with:
|
|
|
55
61
|
|
|
56
62
|
Lookup by id, exact name, or substring. Returns the same shape as a single proposal. Use when you have a device in mind and want to verify hackability before searching for one to buy.
|
|
57
63
|
|
|
58
|
-
### `plan_gadget(idea, platform?, budget_usd?, owned_device_ids?, needs?, limit?)`
|
|
64
|
+
### `plan_gadget(idea, platform?, budget_usd?, owned_device_ids?, needs?, size?, limit?)`
|
|
59
65
|
|
|
60
66
|
Deterministically plans a physical gadget for an AI agent, with Meta Muse Gadgets as the first supported platform. It infers needs such as voice, screen, camera, air sensors, e-paper, round display, home-network tunnel, or Linux control; ranks supported boards; and returns:
|
|
61
67
|
|
|
62
|
-
- `inferred_needs` and ranked `picks`
|
|
63
|
-
- each pick's Muse platform, support level, tier, score, concrete `why`, gaps, price label, firmware/build links, setup steps, and caveats
|
|
68
|
+
- `inferred_needs`, `fit` (`all | partial | none`), `notes`, `warnings`, `questions`, and ranked `picks`
|
|
69
|
+
- each pick's Muse platform, support level, tier, score, concrete `why`, gaps, `needs_met`, `within_budget`, price label, firmware/build links, setup steps, and caveats
|
|
64
70
|
- `fabrication.printables` with STL/STEP/SVG/fab.json URLs when a stand or enclosure exists
|
|
65
71
|
- Muse SDK `terms` for every platform represented in the picks
|
|
66
|
-
- concrete `next_steps
|
|
72
|
+
- concrete `next_steps`, starting with the build page where the human can save progress
|
|
67
73
|
|
|
68
74
|
This tool does not call an LLM and does not use the network. It never suggests selling Muse devices; the Muse SDK token terms are personal and non-commercial.
|
|
69
75
|
|
|
76
|
+
### `get_build_plan(device_id)`
|
|
77
|
+
|
|
78
|
+
Returns the full, deterministic build plan for one device: parts (with store or search links), `shopping_list` with explicit purchase policy, numbered steps with exact commands, machine-readable `assembly`, `try_saying` prompts, caveats, the Muse SDK terms, and `agent_brief_md`, a self-contained Markdown brief a coding agent can follow. It also returns the human page (`https://www.hackshop.dev/build/<device_id>`), raw JSON (`/build/<device_id>/plan.json`) and raw brief (`/build/<device_id>/build.md`). It never buys anything; ordering parts is left to the human.
|
|
79
|
+
|
|
80
|
+
## Resources and Prompts
|
|
81
|
+
|
|
82
|
+
Both hosted MCP and npm expose:
|
|
83
|
+
|
|
84
|
+
- `hackshop://muse/boards` - JSON for every Muse board: ids, names, platform, tier, price, features, build command and build page URL.
|
|
85
|
+
- `hackshop://muse/sdk-terms` - text summary of Muse SDK token terms.
|
|
86
|
+
- `hackshop://catalog/tags` - catalog tag list.
|
|
87
|
+
- Prompt `plan-muse-gadget` - tells an agent to do intake, call `plan_gadget`, call `get_build_plan`, show the shopping list, ask before buying, assemble, flash and pair.
|
|
88
|
+
|
|
70
89
|
### `simulate_assembly(assembly)`
|
|
71
90
|
|
|
72
91
|
Takes an **Assembly IR** — `{ idea, components[{ref,device_id,name,role}], edges[], goal{kind,spec,success_metric}, world{template,goal_xy?} }` (build it from the site's assembly output or by hand) — drops it into a MuJoCo physics world, and runs a **bounded, synchronous** rollout (`duration_s` ≤ 10, default 8) on the sim-worker. It returns:
|
|
@@ -100,7 +119,7 @@ The `simulate_assembly` MCP tool above is the bounded, single-call entry point i
|
|
|
100
119
|
## Architecture
|
|
101
120
|
|
|
102
121
|
- TypeScript + `@modelcontextprotocol/sdk`
|
|
103
|
-
- LLM reasoning
|
|
122
|
+
- LLM reasoning for `propose_hardware` delegates to the host via `sampling/createMessage` first, then falls back to a direct Anthropic API call (`@anthropic-ai/sdk`) only when optional `ANTHROPIC_API_KEY` is set
|
|
104
123
|
- `simulate_assembly` calls out to a separate Python MuJoCo **sim-worker** over HTTP (`SIM_WORKER_URL`); the worker isn't bundled in the npm package
|
|
105
124
|
- Catalog stored as `catalog.json` in the repo (JSON, version-controllable, 80 devices and growing)
|
|
106
125
|
- Tag vocabulary in `tags.md`, validated at boot — server refuses to start on tag drift
|
|
@@ -117,28 +136,9 @@ npm test # safety + schema + lookup tests
|
|
|
117
136
|
npm run build # tsc -> dist/
|
|
118
137
|
```
|
|
119
138
|
|
|
120
|
-
## Troubleshooting:
|
|
121
|
-
|
|
122
|
-
`propose_hardware` reasons via `sampling/createMessage`. Some MCP hosts don't support it (and without an `ANTHROPIC_API_KEY` fallback you'll get degraded, raw-catalog responses). If proposals come back without reasoning, verify your host supports sampling with this quick smoke check.
|
|
123
|
-
|
|
124
|
-
```bash
|
|
125
|
-
npm install
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
Add this to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json`):
|
|
129
|
-
|
|
130
|
-
```json
|
|
131
|
-
{
|
|
132
|
-
"mcpServers": {
|
|
133
|
-
"hackshop-smoke": {
|
|
134
|
-
"command": "tsx",
|
|
135
|
-
"args": ["/Users/YOU/hackshop-mcp/scripts/smoke.ts"]
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
```
|
|
139
|
+
## Troubleshooting: quick deterministic check
|
|
140
140
|
|
|
141
|
-
|
|
141
|
+
Ask your agent to call `plan_gadget` with `a desk gadget I can talk to`. This should return Muse board picks instantly and without any API key. If `propose_hardware` returns catalog matches without reasoning, your host probably does not support sampling and no optional `ANTHROPIC_API_KEY` is set.
|
|
142
142
|
|
|
143
143
|
## Install (local build → host)
|
|
144
144
|
|
|
@@ -163,7 +163,7 @@ The founder had an Electric Objects EO1 picture frame. The company shut down; th
|
|
|
163
163
|
|
|
164
164
|
## Safety Rule (P0)
|
|
165
165
|
|
|
166
|
-
Bricking unrecoverable hardware is the single failure mode that ends this product. The catalog tracks brick-risk provenance: `founder-verified | community-reported | llm-inferred`. For categories where bricks are unrecoverable (`handheld`, `sbc`), the server **refuses to surface LLM-inferred brick-risk scores**. It returns "brick-risk unknown
|
|
166
|
+
Bricking unrecoverable hardware is the single failure mode that ends this product. The catalog tracks brick-risk provenance: `founder-verified | community-reported | vendor-docs | llm-inferred`. For categories where bricks are unrecoverable (`handheld`, `sbc`), the server **refuses to surface LLM-inferred brick-risk scores**. It returns "brick-risk unknown - research before flashing" instead. This is a tested release gate. See `src/safety.ts` and `test/safety.test.ts`.
|
|
167
167
|
|
|
168
168
|
## Telemetry
|
|
169
169
|
|
package/catalog.json
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
],
|
|
38
38
|
"hack_difficulty": 1,
|
|
39
39
|
"brick_risk": 1,
|
|
40
|
-
"brick_provenance": "
|
|
40
|
+
"brick_provenance": "vendor-docs",
|
|
41
41
|
"last_verified": "2026-05-04",
|
|
42
42
|
"firmware_links": [
|
|
43
43
|
"https://www.raspberrypi.com/documentation/"
|
|
@@ -48,7 +48,8 @@
|
|
|
48
48
|
"est_used_price_usd_max": 65,
|
|
49
49
|
"image_url": "https://en.wikipedia.org/wiki/Special:FilePath/Raspberry_Pi_4_Model_B_-_Side.jpg?width=640",
|
|
50
50
|
"est_setup_hours_min": 1,
|
|
51
|
-
"est_setup_hours_max": 2
|
|
51
|
+
"est_setup_hours_max": 2,
|
|
52
|
+
"buy_url": "https://www.raspberrypi.com/products/raspberry-pi-4-model-b/"
|
|
52
53
|
},
|
|
53
54
|
{
|
|
54
55
|
"id": "raspberry-pi-zero-2w",
|
|
@@ -64,7 +65,7 @@
|
|
|
64
65
|
],
|
|
65
66
|
"hack_difficulty": 1,
|
|
66
67
|
"brick_risk": 1,
|
|
67
|
-
"brick_provenance": "
|
|
68
|
+
"brick_provenance": "vendor-docs",
|
|
68
69
|
"last_verified": "2026-05-04",
|
|
69
70
|
"firmware_links": [
|
|
70
71
|
"https://www.raspberrypi.com/products/raspberry-pi-zero-2-w/"
|
|
@@ -74,7 +75,8 @@
|
|
|
74
75
|
"est_used_price_usd_min": 15,
|
|
75
76
|
"est_used_price_usd_max": 25,
|
|
76
77
|
"est_setup_hours_min": 1,
|
|
77
|
-
"est_setup_hours_max": 2
|
|
78
|
+
"est_setup_hours_max": 2,
|
|
79
|
+
"buy_url": "https://www.raspberrypi.com/products/raspberry-pi-zero-2-w/"
|
|
78
80
|
},
|
|
79
81
|
{
|
|
80
82
|
"id": "tidbyt-gen1",
|
|
@@ -279,7 +281,7 @@
|
|
|
279
281
|
"https://github.com/OLIMEX/ESP32-POE"
|
|
280
282
|
],
|
|
281
283
|
"community_size_bucket": "small",
|
|
282
|
-
"notes": "ESP32 with PoE Ethernet. Single cable for power and network
|
|
284
|
+
"notes": "ESP32 with PoE Ethernet. Single cable for power and network — good for wall-mounted displays/sensors with no wall-warts.",
|
|
283
285
|
"est_used_price_usd_min": 20,
|
|
284
286
|
"est_used_price_usd_max": 35,
|
|
285
287
|
"est_setup_hours_min": 2,
|
|
@@ -450,7 +452,7 @@
|
|
|
450
452
|
"https://github.com/LumaTeam/Luma3DS"
|
|
451
453
|
],
|
|
452
454
|
"community_size_bucket": "thriving",
|
|
453
|
-
"notes": "Massive modding scene. CFW (Luma3DS) enables homebrew, emulators, region-free play. Brick risk REAL on bad installs
|
|
455
|
+
"notes": "Massive modding scene. CFW (Luma3DS) enables homebrew, emulators, region-free play. Brick risk REAL on bad installs — the 3ds.hacks.guide walkthrough is the canonical source.",
|
|
454
456
|
"est_used_price_usd_min": 50,
|
|
455
457
|
"est_used_price_usd_max": 150,
|
|
456
458
|
"image_url": "https://en.wikipedia.org/wiki/Special:FilePath/Nintendo-3DS-AquaOpen.png?width=640",
|
|
@@ -583,7 +585,7 @@
|
|
|
583
585
|
"https://github.com/pimoroni/inky"
|
|
584
586
|
],
|
|
585
587
|
"community_size_bucket": "active",
|
|
586
|
-
"notes": "800x480 SEVEN-COLOR e-paper HAT. 7-color e-ink is rare
|
|
588
|
+
"notes": "800x480 SEVEN-COLOR e-paper HAT. 7-color e-ink is rare — great for ambient art rotation, family photos, weather displays. Slow refresh (~30s) so static-frame use only. Pi Zero W compatible.",
|
|
587
589
|
"est_used_price_usd_min": 90,
|
|
588
590
|
"est_used_price_usd_max": 130,
|
|
589
591
|
"est_setup_hours_min": 3,
|
|
@@ -688,7 +690,7 @@
|
|
|
688
690
|
"https://www.mobileread.com/forums/forumdisplay.php?f=275"
|
|
689
691
|
],
|
|
690
692
|
"community_size_bucket": "small",
|
|
691
|
-
"notes": "6\" e-ink with stock Android 10 + Google Play. Sideload any Android app
|
|
693
|
+
"notes": "6\" e-ink with stock Android 10 + Google Play. Sideload any Android app — Google Calendar, custom dashboards, kiosk launchers. Less hacking required than a Kindle/Kobo because it's already open.",
|
|
692
694
|
"est_used_price_usd_min": 90,
|
|
693
695
|
"est_used_price_usd_max": 160,
|
|
694
696
|
"est_setup_hours_min": 1,
|
|
@@ -1656,7 +1658,7 @@
|
|
|
1656
1658
|
],
|
|
1657
1659
|
"hack_difficulty": 2,
|
|
1658
1660
|
"brick_risk": 1,
|
|
1659
|
-
"brick_provenance": "
|
|
1661
|
+
"brick_provenance": "vendor-docs",
|
|
1660
1662
|
"last_verified": "2026-10-02",
|
|
1661
1663
|
"firmware_links": [
|
|
1662
1664
|
"https://github.com/facebookincubator/muse-gadget-sdk/tree/main/esp32",
|
|
@@ -1692,7 +1694,8 @@
|
|
|
1692
1694
|
"mounting": "No mounting holes on the dimension drawing.",
|
|
1693
1695
|
"printables": [],
|
|
1694
1696
|
"source_url": "https://dl.espressif.com/dl/schematics/Dimension_esp32-c5-devkitc-1_v1.2_20250509.pdf"
|
|
1695
|
-
}
|
|
1697
|
+
},
|
|
1698
|
+
"buy_url": "https://www.digikey.com/en/products/detail/espressif-systems/ESP32-C5-DEVKITC-1-N8R8/28718162"
|
|
1696
1699
|
},
|
|
1697
1700
|
{
|
|
1698
1701
|
"id": "ideaspark-esp32-1-9-lcd",
|
|
@@ -1706,7 +1709,7 @@
|
|
|
1706
1709
|
],
|
|
1707
1710
|
"hack_difficulty": 2,
|
|
1708
1711
|
"brick_risk": 1,
|
|
1709
|
-
"brick_provenance": "
|
|
1712
|
+
"brick_provenance": "vendor-docs",
|
|
1710
1713
|
"last_verified": "2026-10-02",
|
|
1711
1714
|
"firmware_links": [
|
|
1712
1715
|
"https://github.com/facebookincubator/muse-gadget-sdk/tree/main/esp32",
|
|
@@ -1739,7 +1742,8 @@
|
|
|
1739
1742
|
"mounting": null,
|
|
1740
1743
|
"printables": [],
|
|
1741
1744
|
"source_url": "https://manuals.plus/ae/1005007181435830"
|
|
1742
|
-
}
|
|
1745
|
+
},
|
|
1746
|
+
"buy_url": "https://www.amazon.com/dp/B0D6QXC813"
|
|
1743
1747
|
},
|
|
1744
1748
|
{
|
|
1745
1749
|
"id": "seeed-sensecap-indicator",
|
|
@@ -1755,7 +1759,7 @@
|
|
|
1755
1759
|
],
|
|
1756
1760
|
"hack_difficulty": 2,
|
|
1757
1761
|
"brick_risk": 1,
|
|
1758
|
-
"brick_provenance": "
|
|
1762
|
+
"brick_provenance": "vendor-docs",
|
|
1759
1763
|
"last_verified": "2026-10-02",
|
|
1760
1764
|
"firmware_links": [
|
|
1761
1765
|
"https://github.com/facebookincubator/muse-gadget-sdk/tree/main/esp32",
|
|
@@ -1793,7 +1797,8 @@
|
|
|
1793
1797
|
"mounting": "Fold-out kickstand and keyhole wall slot (no dimensions published).",
|
|
1794
1798
|
"printables": [],
|
|
1795
1799
|
"source_url": "https://www.thethingsnetwork.org/device-repository/devices/seeed/sensecap-indicator/"
|
|
1796
|
-
}
|
|
1800
|
+
},
|
|
1801
|
+
"buy_url": "https://www.seeedstudio.com/SenseCAP-Indicator-D1-p-5643.html"
|
|
1797
1802
|
},
|
|
1798
1803
|
{
|
|
1799
1804
|
"id": "seeed-reterminal-e1001",
|
|
@@ -1809,7 +1814,7 @@
|
|
|
1809
1814
|
],
|
|
1810
1815
|
"hack_difficulty": 2,
|
|
1811
1816
|
"brick_risk": 1,
|
|
1812
|
-
"brick_provenance": "
|
|
1817
|
+
"brick_provenance": "vendor-docs",
|
|
1813
1818
|
"last_verified": "2026-10-02",
|
|
1814
1819
|
"firmware_links": [
|
|
1815
1820
|
"https://github.com/facebookincubator/muse-gadget-sdk/tree/main/esp32",
|
|
@@ -1846,7 +1851,8 @@
|
|
|
1846
1851
|
"mounting": "Wall hole on the back; embedded nuts for the included stand.",
|
|
1847
1852
|
"printables": [],
|
|
1848
1853
|
"source_url": "https://wiki.seeedstudio.com/getting_started_with_reterminal_e1001/"
|
|
1849
|
-
}
|
|
1854
|
+
},
|
|
1855
|
+
"buy_url": "https://www.seeedstudio.com/reTerminal-E1001-p-6534.html"
|
|
1850
1856
|
},
|
|
1851
1857
|
{
|
|
1852
1858
|
"id": "home-assistant-voice-pe",
|
|
@@ -1861,7 +1867,7 @@
|
|
|
1861
1867
|
],
|
|
1862
1868
|
"hack_difficulty": 2,
|
|
1863
1869
|
"brick_risk": 1,
|
|
1864
|
-
"brick_provenance": "
|
|
1870
|
+
"brick_provenance": "vendor-docs",
|
|
1865
1871
|
"last_verified": "2026-10-02",
|
|
1866
1872
|
"firmware_links": [
|
|
1867
1873
|
"https://github.com/facebookincubator/muse-gadget-sdk/tree/main/esp32",
|
|
@@ -1898,7 +1904,8 @@
|
|
|
1898
1904
|
"mounting": null,
|
|
1899
1905
|
"printables": [],
|
|
1900
1906
|
"source_url": "https://www.home-assistant.io/voice-pe/"
|
|
1901
|
-
}
|
|
1907
|
+
},
|
|
1908
|
+
"buy_url": "https://www.home-assistant.io/voice-pe/"
|
|
1902
1909
|
},
|
|
1903
1910
|
{
|
|
1904
1911
|
"id": "waveshare-esp32-s3-touch-amoled-1-75c",
|
|
@@ -1914,7 +1921,7 @@
|
|
|
1914
1921
|
],
|
|
1915
1922
|
"hack_difficulty": 2,
|
|
1916
1923
|
"brick_risk": 1,
|
|
1917
|
-
"brick_provenance": "
|
|
1924
|
+
"brick_provenance": "vendor-docs",
|
|
1918
1925
|
"last_verified": "2026-10-02",
|
|
1919
1926
|
"firmware_links": [
|
|
1920
1927
|
"https://github.com/facebookincubator/muse-gadget-sdk/tree/main/esp32",
|
|
@@ -1932,8 +1939,8 @@
|
|
|
1932
1939
|
"orientation": "upright",
|
|
1933
1940
|
"shape": "round",
|
|
1934
1941
|
"size_mm": {
|
|
1935
|
-
"w": 55
|
|
1936
|
-
"h": 55
|
|
1942
|
+
"w": 55,
|
|
1943
|
+
"h": 55,
|
|
1937
1944
|
"t": 15.05
|
|
1938
1945
|
},
|
|
1939
1946
|
"size_confidence": "drawing",
|
|
@@ -1953,7 +1960,8 @@
|
|
|
1953
1960
|
"desk-stand"
|
|
1954
1961
|
],
|
|
1955
1962
|
"source_url": "https://www.waveshare.com/img/devkit/ESP32-S3-Touch-AMOLED-1.75C/ESP32-S3-Touch-AMOLED-1.75C-details-size.jpg"
|
|
1956
|
-
}
|
|
1963
|
+
},
|
|
1964
|
+
"buy_url": "https://www.waveshare.com/esp32-s3-touch-amoled-1.75c.htm"
|
|
1957
1965
|
},
|
|
1958
1966
|
{
|
|
1959
1967
|
"id": "aipi-lite",
|
|
@@ -1968,7 +1976,7 @@
|
|
|
1968
1976
|
],
|
|
1969
1977
|
"hack_difficulty": 2,
|
|
1970
1978
|
"brick_risk": 1,
|
|
1971
|
-
"brick_provenance": "
|
|
1979
|
+
"brick_provenance": "vendor-docs",
|
|
1972
1980
|
"last_verified": "2026-10-02",
|
|
1973
1981
|
"firmware_links": [
|
|
1974
1982
|
"https://github.com/facebookincubator/muse-gadget-sdk/tree/main/esp32",
|
|
@@ -2003,7 +2011,8 @@
|
|
|
2003
2011
|
"mounting": "Magnets in the case.",
|
|
2004
2012
|
"printables": [],
|
|
2005
2013
|
"source_url": "https://static.aipi.com/AIPI_InstructionBook/AIPI_InstructionBook.html"
|
|
2006
|
-
}
|
|
2014
|
+
},
|
|
2015
|
+
"buy_url": "https://aipi.com/products/aipi-lite"
|
|
2007
2016
|
},
|
|
2008
2017
|
{
|
|
2009
2018
|
"id": "waveshare-esp32-c6-touch-amoled-1-8",
|
|
@@ -2018,7 +2027,7 @@
|
|
|
2018
2027
|
],
|
|
2019
2028
|
"hack_difficulty": 2,
|
|
2020
2029
|
"brick_risk": 1,
|
|
2021
|
-
"brick_provenance": "
|
|
2030
|
+
"brick_provenance": "vendor-docs",
|
|
2022
2031
|
"last_verified": "2026-10-02",
|
|
2023
2032
|
"firmware_links": [
|
|
2024
2033
|
"https://github.com/facebookincubator/muse-gadget-sdk/tree/main/esp32",
|
|
@@ -2038,7 +2047,7 @@
|
|
|
2038
2047
|
"size_mm": {
|
|
2039
2048
|
"w": 37.6,
|
|
2040
2049
|
"h": 45.2,
|
|
2041
|
-
"t": 15
|
|
2050
|
+
"t": 15
|
|
2042
2051
|
},
|
|
2043
2052
|
"size_confidence": "drawing",
|
|
2044
2053
|
"size_note": "Portrait. Display window 28.70 x 34.94 mm.",
|
|
@@ -2057,7 +2066,8 @@
|
|
|
2057
2066
|
"desk-stand"
|
|
2058
2067
|
],
|
|
2059
2068
|
"source_url": "https://docs.waveshare.com/assets/images/ESP32-C6-Touch-AMOLED-1.8-size-567e74ffd49f34e5d3d0e9ef419fcb30.webp"
|
|
2060
|
-
}
|
|
2069
|
+
},
|
|
2070
|
+
"buy_url": "https://www.waveshare.com/esp32-c6-touch-amoled-1.8.htm"
|
|
2061
2071
|
},
|
|
2062
2072
|
{
|
|
2063
2073
|
"id": "seeed-sensecap-watcher",
|
|
@@ -2072,7 +2082,7 @@
|
|
|
2072
2082
|
],
|
|
2073
2083
|
"hack_difficulty": 2,
|
|
2074
2084
|
"brick_risk": 1,
|
|
2075
|
-
"brick_provenance": "
|
|
2085
|
+
"brick_provenance": "vendor-docs",
|
|
2076
2086
|
"last_verified": "2026-10-02",
|
|
2077
2087
|
"firmware_links": [
|
|
2078
2088
|
"https://github.com/facebookincubator/muse-gadget-sdk/tree/main/esp32",
|
|
@@ -2110,7 +2120,8 @@
|
|
|
2110
2120
|
"mounting": "Ships with a bracket, base plate and 1/4\" adapter set.",
|
|
2111
2121
|
"printables": [],
|
|
2112
2122
|
"source_url": "https://www.seeed.cc/product/sensecap-watcher-the-physical-ai-agent-for-smarter-spaces"
|
|
2113
|
-
}
|
|
2123
|
+
},
|
|
2124
|
+
"buy_url": "https://www.seeedstudio.com/SenseCAP-Watcher-W1-A-p-5979.html"
|
|
2114
2125
|
},
|
|
2115
2126
|
{
|
|
2116
2127
|
"id": "m5stack-sticks3",
|
|
@@ -2126,7 +2137,7 @@
|
|
|
2126
2137
|
],
|
|
2127
2138
|
"hack_difficulty": 2,
|
|
2128
2139
|
"brick_risk": 1,
|
|
2129
|
-
"brick_provenance": "
|
|
2140
|
+
"brick_provenance": "vendor-docs",
|
|
2130
2141
|
"last_verified": "2026-10-02",
|
|
2131
2142
|
"firmware_links": [
|
|
2132
2143
|
"https://github.com/facebookincubator/muse-gadget-sdk/tree/main/esp32",
|
|
@@ -2144,15 +2155,15 @@
|
|
|
2144
2155
|
"orientation": "upright",
|
|
2145
2156
|
"shape": "box",
|
|
2146
2157
|
"size_mm": {
|
|
2147
|
-
"w": 24
|
|
2148
|
-
"h": 48
|
|
2149
|
-
"t": 15
|
|
2158
|
+
"w": 24,
|
|
2159
|
+
"h": 48,
|
|
2160
|
+
"t": 15
|
|
2150
2161
|
},
|
|
2151
2162
|
"size_confidence": "drawing",
|
|
2152
2163
|
"size_note": "Corner radius R3. Hole positions were measured off the drawing; confirm against a unit.",
|
|
2153
2164
|
"corner_radius_mm": 3,
|
|
2154
2165
|
"comes_in_case": true,
|
|
2155
|
-
"mass_g": 20
|
|
2166
|
+
"mass_g": 20,
|
|
2156
2167
|
"usb": {
|
|
2157
2168
|
"type": "usb-c",
|
|
2158
2169
|
"count": 1,
|
|
@@ -2166,7 +2177,8 @@
|
|
|
2166
2177
|
"desk-stand"
|
|
2167
2178
|
],
|
|
2168
2179
|
"source_url": "https://docs.m5stack.com/en/core/StickS3"
|
|
2169
|
-
}
|
|
2180
|
+
},
|
|
2181
|
+
"buy_url": "https://shop.m5stack.com/products/m5sticks3-esp32s3-mini-iot-dev-kit"
|
|
2170
2182
|
},
|
|
2171
2183
|
{
|
|
2172
2184
|
"id": "m5stack-stickc-plus2",
|
|
@@ -2181,7 +2193,7 @@
|
|
|
2181
2193
|
],
|
|
2182
2194
|
"hack_difficulty": 2,
|
|
2183
2195
|
"brick_risk": 1,
|
|
2184
|
-
"brick_provenance": "
|
|
2196
|
+
"brick_provenance": "vendor-docs",
|
|
2185
2197
|
"last_verified": "2026-10-02",
|
|
2186
2198
|
"firmware_links": [
|
|
2187
2199
|
"https://github.com/facebookincubator/muse-gadget-sdk/tree/main/esp32",
|
|
@@ -2199,8 +2211,8 @@
|
|
|
2199
2211
|
"orientation": "upright",
|
|
2200
2212
|
"shape": "box",
|
|
2201
2213
|
"size_mm": {
|
|
2202
|
-
"w": 24
|
|
2203
|
-
"h": 48
|
|
2214
|
+
"w": 24,
|
|
2215
|
+
"h": 48,
|
|
2204
2216
|
"t": 13.5
|
|
2205
2217
|
},
|
|
2206
2218
|
"size_confidence": "published",
|
|
@@ -2221,7 +2233,8 @@
|
|
|
2221
2233
|
"desk-stand"
|
|
2222
2234
|
],
|
|
2223
2235
|
"source_url": "https://docs.m5stack.com/en/core/M5StickC%20PLUS2"
|
|
2224
|
-
}
|
|
2236
|
+
},
|
|
2237
|
+
"buy_url": "https://shop.m5stack.com/products/m5stickc-plus2-esp32-mini-iot-development-kit"
|
|
2225
2238
|
},
|
|
2226
2239
|
{
|
|
2227
2240
|
"id": "raspberry-pi-5",
|
|
@@ -2235,7 +2248,7 @@
|
|
|
2235
2248
|
],
|
|
2236
2249
|
"hack_difficulty": 1,
|
|
2237
2250
|
"brick_risk": 1,
|
|
2238
|
-
"brick_provenance": "
|
|
2251
|
+
"brick_provenance": "vendor-docs",
|
|
2239
2252
|
"last_verified": "2026-10-02",
|
|
2240
2253
|
"firmware_links": [
|
|
2241
2254
|
"https://github.com/facebookincubator/muse-gadget-sdk/tree/main/linux",
|
|
@@ -2246,6 +2259,7 @@
|
|
|
2246
2259
|
"est_used_price_usd_min": 50,
|
|
2247
2260
|
"est_used_price_usd_max": 120,
|
|
2248
2261
|
"est_setup_hours_min": 0.5,
|
|
2249
|
-
"est_setup_hours_max": 2
|
|
2262
|
+
"est_setup_hours_max": 2,
|
|
2263
|
+
"buy_url": "https://www.raspberrypi.com/products/raspberry-pi-5/"
|
|
2250
2264
|
}
|
|
2251
2265
|
]
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BuildPlan, DeviceEntry, Platform, PlatformBoard, Printable } from "./types.js";
|
|
2
|
+
export declare function buildPlan(input: {
|
|
3
|
+
device: DeviceEntry;
|
|
4
|
+
platform: Platform | null;
|
|
5
|
+
board: PlatformBoard | null;
|
|
6
|
+
printables: Printable[];
|
|
7
|
+
siteUrl: string;
|
|
8
|
+
}): BuildPlan;
|
|
9
|
+
export declare function buildUrls(deviceId: string, siteUrl: string, includeMusePage: boolean): BuildPlan["urls"];
|
|
10
|
+
export declare function platformCaveatsFor(platform: Platform, board: PlatformBoard): string[];
|