@pencil-agent/nano-pencil 2.0.0 → 2.0.1

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.
Files changed (195) hide show
  1. package/README.md +267 -267
  2. package/dist/build-meta.json +3 -3
  3. package/dist/core/export-html/AGENT.md +11 -11
  4. package/dist/core/export-html/template.css +971 -971
  5. package/dist/core/export-html/template.html +54 -54
  6. package/dist/core/mcp/mcp-client.d.ts +3 -1
  7. package/dist/core/mcp/mcp-client.js +6 -6
  8. package/dist/core/mcp/mcp-config.d.ts +3 -3
  9. package/dist/core/mcp/mcp-config.js +1 -1
  10. package/dist/core/mcp/mcp-manager.d.ts +5 -1
  11. package/dist/core/mcp/mcp-manager.js +1 -1
  12. package/dist/core/platform/config/resource-loader.d.ts +2 -0
  13. package/dist/core/platform/config/resource-loader.js +2 -2
  14. package/dist/core/runtime/agent-session.d.ts +12 -0
  15. package/dist/core/runtime/agent-session.js +8 -8
  16. package/dist/core/runtime/sdk.d.ts +8 -0
  17. package/dist/core/runtime/sdk.js +1 -1
  18. package/dist/extensions/builtin/AGENT.md +115 -115
  19. package/dist/extensions/builtin/browser/AGENT.md +17 -17
  20. package/dist/extensions/builtin/browser/agent-workspace/agent_helpers.py +12 -12
  21. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/amazon/product-search.md +198 -198
  22. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/archive-org/scraping.md +341 -341
  23. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv/scraping.md +311 -311
  24. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv-bulk/scraping.md +333 -333
  25. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/atlas/overview.md +70 -70
  26. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/booking-com/scraping.md +578 -578
  27. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/capterra/scraping.md +440 -440
  28. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/centilebrain/generate-estimates.md +110 -110
  29. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coingecko/scraping.md +325 -325
  30. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coinmarketcap/scraping.md +463 -463
  31. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coursera/scraping.md +360 -360
  32. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/craigslist/scraping.md +390 -390
  33. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/crossref/scraping.md +568 -568
  34. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/dev-to/scraping.md +323 -323
  35. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/duckduckgo/scraping.md +349 -349
  36. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/ebay/scraping.md +435 -435
  37. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/etsy/scraping.md +506 -506
  38. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/eventbrite/scraping.md +363 -363
  39. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/expedia/automation.md +168 -168
  40. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/groups.md +236 -236
  41. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/pages.md +295 -295
  42. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/framer/editor.md +108 -108
  43. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/fred/scraping.md +493 -493
  44. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/g2/scraping.md +580 -580
  45. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/genius/scraping.md +511 -511
  46. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/repo-actions.md +65 -65
  47. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/scraping.md +184 -184
  48. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/glassdoor/scraping.md +543 -543
  49. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gmail/compose.md +122 -122
  50. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/goodreads/scraping.md +461 -461
  51. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gutenberg/scraping.md +383 -383
  52. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/hackernews/scraping.md +243 -243
  53. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/howlongtobeat/scraping.md +473 -473
  54. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/imdb/scraping.md +271 -271
  55. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/itch-io/scraping.md +436 -436
  56. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/job-boards/indeed-glassdoor.md +1021 -1021
  57. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/letterboxd/scraping.md +349 -349
  58. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/linkedin/invitation-manager.md +109 -109
  59. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/loom/folder-enumeration.md +170 -170
  60. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/macrotrends/scraping.md +537 -537
  61. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/article-hydration.md +120 -120
  62. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/scraping.md +414 -414
  63. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/metacritic/scraping.md +477 -477
  64. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/musicbrainz/scraping.md +478 -478
  65. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/nasa/scraping.md +339 -339
  66. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/news-aggregation/multi-source.md +205 -205
  67. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/open-library/scraping.md +472 -472
  68. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openalex/scraping.md +470 -470
  69. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openstreetmap/scraping.md +490 -490
  70. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/package-registries/npm-pypi.md +478 -478
  71. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/polymarket/scraping.md +234 -234
  72. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/producthunt/scraping.md +307 -307
  73. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/pubmed/scraping.md +421 -421
  74. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/quora/scraping.md +364 -364
  75. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rawg/scraping.md +352 -352
  76. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/reddit/scraping.md +124 -124
  77. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rest-countries/scraping.md +233 -233
  78. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/sec-edgar/scraping.md +361 -361
  79. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/README.md +36 -36
  80. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/embedded-apps.md +72 -72
  81. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/knowledge-base.md +109 -109
  82. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/polaris-inputs.md +137 -137
  83. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/soundcloud/scraping.md +362 -362
  84. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/spotify/scraping.md +339 -339
  85. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/stackoverflow/scraping.md +435 -435
  86. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/steam/scraping.md +575 -575
  87. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/substack/scraping.md +338 -338
  88. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/thetechgeeks/pricing.md +52 -52
  89. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tiktok/upload.md +107 -107
  90. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tradingview/scraping.md +309 -309
  91. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trello/boards-and-lists.md +88 -88
  92. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trustpilot/scraping.md +375 -375
  93. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/walmart/scraping.md +444 -444
  94. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wayback-machine/scraping.md +306 -306
  95. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/weather/scraping.md +398 -398
  96. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wellfound/scraping.md +596 -596
  97. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/world-bank/scraping.md +356 -356
  98. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/xiaohongshu/scraping.md +84 -84
  99. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/youtube/scraping.md +418 -418
  100. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/zillow/scraping.md +433 -433
  101. package/dist/extensions/builtin/browser/browser.md +73 -73
  102. package/dist/extensions/builtin/browser/install.md +142 -142
  103. package/dist/extensions/builtin/browser/interaction-skills/connection.md +48 -48
  104. package/dist/extensions/builtin/browser/interaction-skills/cookies.md +3 -3
  105. package/dist/extensions/builtin/browser/interaction-skills/cross-origin-iframes.md +3 -3
  106. package/dist/extensions/builtin/browser/interaction-skills/dialogs.md +64 -64
  107. package/dist/extensions/builtin/browser/interaction-skills/downloads.md +3 -3
  108. package/dist/extensions/builtin/browser/interaction-skills/drag-and-drop.md +3 -3
  109. package/dist/extensions/builtin/browser/interaction-skills/dropdowns.md +3 -3
  110. package/dist/extensions/builtin/browser/interaction-skills/iframes.md +3 -3
  111. package/dist/extensions/builtin/browser/interaction-skills/network-requests.md +3 -3
  112. package/dist/extensions/builtin/browser/interaction-skills/print-as-pdf.md +3 -3
  113. package/dist/extensions/builtin/browser/interaction-skills/profile-sync.md +90 -90
  114. package/dist/extensions/builtin/browser/interaction-skills/screenshots.md +17 -17
  115. package/dist/extensions/builtin/browser/interaction-skills/scrolling.md +3 -3
  116. package/dist/extensions/builtin/browser/interaction-skills/shadow-dom.md +3 -3
  117. package/dist/extensions/builtin/browser/interaction-skills/tabs.md +69 -69
  118. package/dist/extensions/builtin/browser/interaction-skills/uploads.md +1 -1
  119. package/dist/extensions/builtin/browser/interaction-skills/viewport.md +3 -3
  120. package/dist/extensions/builtin/browser/src/browser_harness/AGENT.md +15 -15
  121. package/dist/extensions/builtin/browser/src/browser_harness/__init__.py +8 -8
  122. package/dist/extensions/builtin/browser/src/browser_harness/_ipc.py +90 -90
  123. package/dist/extensions/builtin/browser/src/browser_harness/admin.py +722 -722
  124. package/dist/extensions/builtin/browser/src/browser_harness/daemon.py +328 -328
  125. package/dist/extensions/builtin/browser/src/browser_harness/helpers.py +396 -396
  126. package/dist/extensions/builtin/browser/src/browser_harness/run.py +103 -103
  127. package/dist/extensions/builtin/discipline/skills/brainstorming/SKILL.md +33 -33
  128. package/dist/extensions/builtin/discipline/skills/executing-plans/SKILL.md +25 -25
  129. package/dist/extensions/builtin/discipline/skills/finishing-development-branch/SKILL.md +25 -25
  130. package/dist/extensions/builtin/discipline/skills/receiving-code-review/SKILL.md +22 -22
  131. package/dist/extensions/builtin/discipline/skills/requesting-code-review/SKILL.md +31 -31
  132. package/dist/extensions/builtin/discipline/skills/systematic-debugging/SKILL.md +28 -28
  133. package/dist/extensions/builtin/discipline/skills/test-driven-development/SKILL.md +32 -32
  134. package/dist/extensions/builtin/discipline/skills/using-git-worktrees/SKILL.md +25 -25
  135. package/dist/extensions/builtin/discipline/skills/verification-before-completion/SKILL.md +27 -27
  136. package/dist/extensions/builtin/discipline/skills/writing-plans/SKILL.md +26 -26
  137. package/dist/extensions/builtin/goal/README.md +67 -67
  138. package/dist/extensions/builtin/grub/README.md +112 -112
  139. package/dist/extensions/builtin/link-world/agent-workspace/README.md +16 -16
  140. package/dist/extensions/builtin/link-world/internet-search/internet-search.md +65 -65
  141. package/dist/extensions/builtin/link-world/link-world-agent.md +82 -82
  142. package/dist/extensions/builtin/link-world/linkworld.md +313 -313
  143. package/dist/extensions/builtin/link-world/network-routing/network-routing.md +67 -67
  144. package/dist/extensions/builtin/loop/README.md +92 -92
  145. package/dist/extensions/builtin/mcp/figma-design.md +68 -68
  146. package/dist/extensions/builtin/mcp/mcp-management.md +85 -85
  147. package/dist/extensions/builtin/recap/AGENT.md +15 -15
  148. package/dist/extensions/builtin/sal/README.md +72 -72
  149. package/dist/extensions/builtin/security-audit/README.md +289 -289
  150. package/dist/extensions/builtin/team/AGENT.md +112 -112
  151. package/dist/extensions/builtin/team/TESTING.md +299 -299
  152. package/dist/extensions/builtin/token-save/README.md +56 -56
  153. package/dist/extensions/optional/AGENT.md +10 -10
  154. package/dist/modes/interactive/interactive-mode.js +36 -36
  155. package/dist/modes/interactive/theme/dark.json +85 -85
  156. package/dist/modes/interactive/theme/light.json +84 -84
  157. package/dist/modes/interactive/theme/theme-schema.json +335 -335
  158. package/dist/modes/interactive/theme/warm.json +81 -81
  159. package/dist/node_modules/@pencil-agent/agent-core/dist/agent-loop.js +3 -2
  160. package/dist/node_modules/@pencil-agent/agent-core/dist/structured-adaptive-agent-loop.js +2 -1
  161. package/dist/node_modules/@pencil-agent/ai/dist/cli.js +0 -0
  162. package/docs/cc-agent-design.md +1297 -0
  163. package/docs/cc-tui-design.md +1333 -0
  164. package/docs/codex-goal-command-impl.md +1055 -1055
  165. package/docs/codex-goal-vs-grub.md +500 -500
  166. package/docs/custom-provider.md +27 -27
  167. package/docs/extensions.md +27 -27
  168. package/docs/keybindings.md +27 -27
  169. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/200/273/347/273/223.md" +250 -250
  170. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md" +122 -122
  171. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210.md" +1222 -1222
  172. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210/345/256/236/347/216/260/346/212/245/345/221/212.md" +158 -158
  173. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210/345/257/271/346/257/224/345/210/206/346/236/220.md" +128 -128
  174. package/docs/loop /351/207/215/346/236/204/350/256/241/345/210/222.md" +320 -320
  175. package/docs/loop-usage-examples.md +214 -214
  176. package/docs/models.md +27 -27
  177. package/docs/nanoPencil-/345/255/246/344/271/240/350/256/241/345/210/222.md +170 -0
  178. package/docs/packages.md +27 -27
  179. package/docs/pi-design-philosophy.md +457 -457
  180. package/docs/planmode.md +1987 -1987
  181. package/docs/prompt-templates.md +27 -27
  182. package/docs/providers.md +27 -27
  183. package/docs/scan-report.md +3820 -0
  184. package/docs/sdk.md +27 -27
  185. package/docs/skills.md +27 -27
  186. package/docs/themes.md +27 -27
  187. package/docs/tui.md +27 -27
  188. package/docs//345/257/271/346/240/207Claude-Code.md +1775 -0
  189. package/docs//351/230/277/351/207/214/345/267/264/345/267/264/350/264/242/346/212/245/345/210/206/346/236/220/344/271/246.md +261 -0
  190. package/package.json +190 -190
  191. package/docs/ACP/345/215/217/350/256/256/351/233/206/346/210/220/345/274/200/345/217/221/346/226/207/346/241/243.md +0 -851
  192. package/docs/SDK-TESTING.md +0 -364
  193. package/docs/mem-core/346/212/200/346/234/257/346/226/207/346/241/243.md +0 -593
  194. package/docs/startup-performance-optimization.md +0 -301
  195. package/docs//350/256/244/347/237/245/345/234/260/345/233/276.md +0 -47
@@ -1,88 +1,88 @@
1
- # Trello — boards and lists
2
-
3
- Read-only pattern for Trello: land on a board URL, scrape lists and their
4
- cards. Works for signed-in agents that inherit Tom's Chrome session —
5
- no login dance, no captcha.
6
-
7
- ## URL patterns
8
-
9
- - `https://trello.com/` — marketing home for anonymous; when signed in,
10
- redirects to `https://trello.com/u/<username>/boards` (the dashboard).
11
- Note: `https://trello.com/boards` (no `/u/<username>`) returns an
12
- error page for signed-in users. Always route via `/u/<username>/boards`.
13
- - Board URL: `https://trello.com/b/<8-char-boardId>/<slug>`. The `slug`
14
- is cosmetic — the boardId is the canonical identifier.
15
- - Card URL: `https://trello.com/c/<8-char-cardId>/<n>-<slug>`, where
16
- `<n>` is the card's 1-based position within its list at creation time.
17
-
18
- ## Stable selectors
19
-
20
- - List: `[data-testid="list"]` — or `[data-list-id]` for the id. Returns
21
- exactly the lists on the board, no sidebar noise.
22
- - List header: within a list, `[data-testid="list-header-name"]`.
23
- Falling back to `h2` inside the list also works, but the board's
24
- outer chrome has h2s too (sidebar plans etc.) — stay scoped to the
25
- list element.
26
- - Card: `a[href*="/c/"]` — scoped to each list element. The `href` is
27
- the canonical link; the visible text is the card name.
28
- - Card name within the anchor: `[data-testid="card-name"]`. Anchor
29
- `innerText` is a reasonable fallback.
30
-
31
- ## Site structure
32
-
33
- The board page is a single-page React app. All lists render in one pass
34
- into horizontally scrolling columns. Cards within a list are vertical.
35
- Count via `document.querySelectorAll('[data-testid="list"]').length` —
36
- matches the visible column count.
37
-
38
- ## Framework / interaction quirks
39
-
40
- - `goto_url('https://trello.com/')` redirects asynchronously to the user's
41
- boards dashboard. After `wait_for_load()`, the URL in `page_info()`
42
- will be `.../u/<username>/boards`. Don't hard-code the username;
43
- read it back from `page_info()['url']` if you need it.
44
- - On initial load the board's lists can take ~1-2 s to render after
45
- `wait_for_load()` returns. A brief `time.sleep(2)` before scraping is
46
- reliable; alternatively, wait for `[data-testid="list"]` to be
47
- present with a count > 0.
48
-
49
- ## Waits
50
-
51
- - `wait_for_load()` on the board URL returns before all lists/cards are
52
- in the DOM. The list containers appear first (empty), then cards
53
- populate. Wait for a non-zero card count inside a list before
54
- declaring "done".
55
-
56
- ## Traps
57
-
58
- - A board user-link scrape (`a[href^="/b/"]`) on the dashboard returns
59
- each board twice (recent + starred/all). Deduplicate by `href`.
60
- - Sidebar h2 headings include plan names ("Standard", "Premium") —
61
- don't treat them as list names. Scope header reads to elements
62
- inside `[data-testid="list"]`.
63
-
64
- ## Read-only, one-hit scrape (JS-as-extract, fast path)
65
-
66
- ```js
67
- (() => Array.from(document.querySelectorAll('[data-testid="list"]'))
68
- .map(list => ({
69
- name: list.querySelector('[data-testid="list-header-name"]')?.innerText?.trim(),
70
- cards: Array.from(list.querySelectorAll('a[href*="/c/"]'))
71
- .map(a => ({
72
- href: a.getAttribute('href'),
73
- title: (a.querySelector('[data-testid="card-name"]')
74
- ?? a).innerText.trim()
75
- }))
76
- .filter(c => c.title)
77
- })))()
78
- ```
79
-
80
- Wrap in `js(...)` + `json.loads()` and you have structured board data
81
- in one round trip.
82
-
83
- ## What NOT to capture here
84
-
85
- Private API endpoints (Trello exposes `https://trello.com/1/...` REST
86
- endpoints, but those need a token). Keep this file DOM-only. If you
87
- discover public API shapes worth documenting, put them in a
88
- separate `api.md` under this skill folder.
1
+ # Trello — boards and lists
2
+
3
+ Read-only pattern for Trello: land on a board URL, scrape lists and their
4
+ cards. Works for signed-in agents that inherit Tom's Chrome session —
5
+ no login dance, no captcha.
6
+
7
+ ## URL patterns
8
+
9
+ - `https://trello.com/` — marketing home for anonymous; when signed in,
10
+ redirects to `https://trello.com/u/<username>/boards` (the dashboard).
11
+ Note: `https://trello.com/boards` (no `/u/<username>`) returns an
12
+ error page for signed-in users. Always route via `/u/<username>/boards`.
13
+ - Board URL: `https://trello.com/b/<8-char-boardId>/<slug>`. The `slug`
14
+ is cosmetic — the boardId is the canonical identifier.
15
+ - Card URL: `https://trello.com/c/<8-char-cardId>/<n>-<slug>`, where
16
+ `<n>` is the card's 1-based position within its list at creation time.
17
+
18
+ ## Stable selectors
19
+
20
+ - List: `[data-testid="list"]` — or `[data-list-id]` for the id. Returns
21
+ exactly the lists on the board, no sidebar noise.
22
+ - List header: within a list, `[data-testid="list-header-name"]`.
23
+ Falling back to `h2` inside the list also works, but the board's
24
+ outer chrome has h2s too (sidebar plans etc.) — stay scoped to the
25
+ list element.
26
+ - Card: `a[href*="/c/"]` — scoped to each list element. The `href` is
27
+ the canonical link; the visible text is the card name.
28
+ - Card name within the anchor: `[data-testid="card-name"]`. Anchor
29
+ `innerText` is a reasonable fallback.
30
+
31
+ ## Site structure
32
+
33
+ The board page is a single-page React app. All lists render in one pass
34
+ into horizontally scrolling columns. Cards within a list are vertical.
35
+ Count via `document.querySelectorAll('[data-testid="list"]').length` —
36
+ matches the visible column count.
37
+
38
+ ## Framework / interaction quirks
39
+
40
+ - `goto_url('https://trello.com/')` redirects asynchronously to the user's
41
+ boards dashboard. After `wait_for_load()`, the URL in `page_info()`
42
+ will be `.../u/<username>/boards`. Don't hard-code the username;
43
+ read it back from `page_info()['url']` if you need it.
44
+ - On initial load the board's lists can take ~1-2 s to render after
45
+ `wait_for_load()` returns. A brief `time.sleep(2)` before scraping is
46
+ reliable; alternatively, wait for `[data-testid="list"]` to be
47
+ present with a count > 0.
48
+
49
+ ## Waits
50
+
51
+ - `wait_for_load()` on the board URL returns before all lists/cards are
52
+ in the DOM. The list containers appear first (empty), then cards
53
+ populate. Wait for a non-zero card count inside a list before
54
+ declaring "done".
55
+
56
+ ## Traps
57
+
58
+ - A board user-link scrape (`a[href^="/b/"]`) on the dashboard returns
59
+ each board twice (recent + starred/all). Deduplicate by `href`.
60
+ - Sidebar h2 headings include plan names ("Standard", "Premium") —
61
+ don't treat them as list names. Scope header reads to elements
62
+ inside `[data-testid="list"]`.
63
+
64
+ ## Read-only, one-hit scrape (JS-as-extract, fast path)
65
+
66
+ ```js
67
+ (() => Array.from(document.querySelectorAll('[data-testid="list"]'))
68
+ .map(list => ({
69
+ name: list.querySelector('[data-testid="list-header-name"]')?.innerText?.trim(),
70
+ cards: Array.from(list.querySelectorAll('a[href*="/c/"]'))
71
+ .map(a => ({
72
+ href: a.getAttribute('href'),
73
+ title: (a.querySelector('[data-testid="card-name"]')
74
+ ?? a).innerText.trim()
75
+ }))
76
+ .filter(c => c.title)
77
+ })))()
78
+ ```
79
+
80
+ Wrap in `js(...)` + `json.loads()` and you have structured board data
81
+ in one round trip.
82
+
83
+ ## What NOT to capture here
84
+
85
+ Private API endpoints (Trello exposes `https://trello.com/1/...` REST
86
+ endpoints, but those need a token). Keep this file DOM-only. If you
87
+ discover public API shapes worth documenting, put them in a
88
+ separate `api.md` under this skill folder.