@pencil-agent/nano-pencil 2.0.0-beta.8 → 2.0.0
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 +267 -267
- package/dist/build-meta.json +3 -3
- package/dist/core/export-html/AGENT.md +11 -11
- package/dist/core/export-html/template.css +971 -971
- package/dist/core/export-html/template.html +54 -54
- package/dist/core/extensions-host/index.d.ts +1 -1
- package/dist/core/extensions-host/loader.js +1 -1
- package/dist/core/extensions-host/runner.d.ts +1 -0
- package/dist/core/extensions-host/runner.js +2 -2
- package/dist/core/extensions-host/types.d.ts +17 -22
- package/dist/core/lib/ai/src/types.d.ts +12 -2
- package/dist/core/persona/persona-manager.js +5 -2
- package/dist/core/runtime/agent-session.js +3 -3
- package/dist/core/runtime/extension-core-bindings.d.ts +1 -0
- package/dist/core/runtime/extension-core-bindings.js +2 -2
- package/dist/extensions/builtin/AGENT.md +115 -115
- package/dist/extensions/builtin/browser/AGENT.md +17 -17
- package/dist/extensions/builtin/browser/agent-workspace/agent_helpers.py +12 -12
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/amazon/product-search.md +198 -198
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/archive-org/scraping.md +341 -341
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv/scraping.md +311 -311
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv-bulk/scraping.md +333 -333
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/atlas/overview.md +70 -70
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/booking-com/scraping.md +578 -578
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/capterra/scraping.md +440 -440
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/centilebrain/generate-estimates.md +110 -110
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coingecko/scraping.md +325 -325
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coinmarketcap/scraping.md +463 -463
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coursera/scraping.md +360 -360
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/craigslist/scraping.md +390 -390
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/crossref/scraping.md +568 -568
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/dev-to/scraping.md +323 -323
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/duckduckgo/scraping.md +349 -349
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/ebay/scraping.md +435 -435
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/etsy/scraping.md +506 -506
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/eventbrite/scraping.md +363 -363
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/expedia/automation.md +168 -168
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/groups.md +236 -236
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/pages.md +295 -295
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/framer/editor.md +108 -108
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/fred/scraping.md +493 -493
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/g2/scraping.md +580 -580
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/genius/scraping.md +511 -511
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/repo-actions.md +65 -65
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/scraping.md +184 -184
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/glassdoor/scraping.md +543 -543
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gmail/compose.md +122 -122
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/goodreads/scraping.md +461 -461
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gutenberg/scraping.md +383 -383
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/hackernews/scraping.md +243 -243
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/howlongtobeat/scraping.md +473 -473
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/imdb/scraping.md +271 -271
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/itch-io/scraping.md +436 -436
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/job-boards/indeed-glassdoor.md +1021 -1021
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/letterboxd/scraping.md +349 -349
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/linkedin/invitation-manager.md +109 -109
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/loom/folder-enumeration.md +170 -170
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/macrotrends/scraping.md +537 -537
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/article-hydration.md +120 -120
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/scraping.md +414 -414
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/metacritic/scraping.md +477 -477
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/musicbrainz/scraping.md +478 -478
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/nasa/scraping.md +339 -339
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/news-aggregation/multi-source.md +205 -205
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/open-library/scraping.md +472 -472
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openalex/scraping.md +470 -470
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openstreetmap/scraping.md +490 -490
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/package-registries/npm-pypi.md +478 -478
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/polymarket/scraping.md +234 -234
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/producthunt/scraping.md +307 -307
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/pubmed/scraping.md +421 -421
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/quora/scraping.md +364 -364
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rawg/scraping.md +352 -352
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/reddit/scraping.md +124 -124
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rest-countries/scraping.md +233 -233
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/sec-edgar/scraping.md +361 -361
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/README.md +36 -36
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/embedded-apps.md +72 -72
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/knowledge-base.md +109 -109
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/polaris-inputs.md +137 -137
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/soundcloud/scraping.md +362 -362
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/spotify/scraping.md +339 -339
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/stackoverflow/scraping.md +435 -435
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/steam/scraping.md +575 -575
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/substack/scraping.md +338 -338
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/thetechgeeks/pricing.md +52 -52
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tiktok/upload.md +107 -107
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tradingview/scraping.md +309 -309
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trello/boards-and-lists.md +88 -88
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trustpilot/scraping.md +375 -375
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/walmart/scraping.md +444 -444
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wayback-machine/scraping.md +306 -306
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/weather/scraping.md +398 -398
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wellfound/scraping.md +596 -596
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/world-bank/scraping.md +356 -356
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/xiaohongshu/scraping.md +84 -84
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/youtube/scraping.md +418 -418
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/zillow/scraping.md +433 -433
- package/dist/extensions/builtin/browser/browser.md +73 -73
- package/dist/extensions/builtin/browser/install.md +142 -142
- package/dist/extensions/builtin/browser/interaction-skills/connection.md +48 -48
- package/dist/extensions/builtin/browser/interaction-skills/cookies.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/cross-origin-iframes.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/dialogs.md +64 -64
- package/dist/extensions/builtin/browser/interaction-skills/downloads.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/drag-and-drop.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/dropdowns.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/iframes.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/network-requests.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/print-as-pdf.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/profile-sync.md +90 -90
- package/dist/extensions/builtin/browser/interaction-skills/screenshots.md +17 -17
- package/dist/extensions/builtin/browser/interaction-skills/scrolling.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/shadow-dom.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/tabs.md +69 -69
- package/dist/extensions/builtin/browser/interaction-skills/uploads.md +1 -1
- package/dist/extensions/builtin/browser/interaction-skills/viewport.md +3 -3
- package/dist/extensions/builtin/browser/src/browser_harness/AGENT.md +15 -15
- package/dist/extensions/builtin/browser/src/browser_harness/__init__.py +8 -8
- package/dist/extensions/builtin/browser/src/browser_harness/_ipc.py +90 -90
- package/dist/extensions/builtin/browser/src/browser_harness/admin.py +722 -722
- package/dist/extensions/builtin/browser/src/browser_harness/daemon.py +328 -328
- package/dist/extensions/builtin/browser/src/browser_harness/helpers.py +396 -396
- package/dist/extensions/builtin/browser/src/browser_harness/run.py +103 -103
- package/dist/extensions/builtin/discipline/skills/brainstorming/SKILL.md +33 -33
- package/dist/extensions/builtin/discipline/skills/executing-plans/SKILL.md +25 -25
- package/dist/extensions/builtin/discipline/skills/finishing-development-branch/SKILL.md +25 -25
- package/dist/extensions/builtin/discipline/skills/receiving-code-review/SKILL.md +22 -22
- package/dist/extensions/builtin/discipline/skills/requesting-code-review/SKILL.md +31 -31
- package/dist/extensions/builtin/discipline/skills/systematic-debugging/SKILL.md +28 -28
- package/dist/extensions/builtin/discipline/skills/test-driven-development/SKILL.md +32 -32
- package/dist/extensions/builtin/discipline/skills/using-git-worktrees/SKILL.md +25 -25
- package/dist/extensions/builtin/discipline/skills/verification-before-completion/SKILL.md +27 -27
- package/dist/extensions/builtin/discipline/skills/writing-plans/SKILL.md +26 -26
- package/dist/extensions/builtin/goal/README.md +67 -67
- package/dist/extensions/builtin/goal/goal-controller.d.ts +39 -10
- package/dist/extensions/builtin/goal/goal-controller.js +1 -1
- package/dist/extensions/builtin/goal/goal-format.js +1 -1
- package/dist/extensions/builtin/goal/goal-prompts.d.ts +2 -0
- package/dist/extensions/builtin/goal/goal-prompts.js +5 -4
- package/dist/extensions/builtin/goal/goal-store.js +1 -1
- package/dist/extensions/builtin/goal/index.d.ts +1 -1
- package/dist/extensions/builtin/goal/index.js +10 -7
- package/dist/extensions/builtin/grub/README.md +112 -112
- package/dist/extensions/builtin/link-world/agent-workspace/README.md +16 -16
- package/dist/extensions/builtin/link-world/index.js +6 -6
- package/dist/extensions/builtin/link-world/internet-search/internet-search.md +65 -65
- package/dist/extensions/builtin/link-world/link-world-agent.md +82 -82
- package/dist/extensions/builtin/link-world/linkworld.md +313 -313
- package/dist/extensions/builtin/link-world/{network-routing.md → network-routing/network-routing.md} +67 -67
- package/dist/extensions/builtin/loop/README.md +92 -92
- package/dist/extensions/builtin/mcp/figma-design.md +68 -68
- package/dist/extensions/builtin/mcp/mcp-management.md +85 -85
- package/dist/extensions/builtin/plan/index.js +1 -1
- package/dist/extensions/builtin/recap/AGENT.md +15 -15
- package/dist/extensions/builtin/sal/README.md +72 -72
- package/dist/extensions/builtin/security-audit/README.md +289 -289
- package/dist/extensions/builtin/task/task-store.d.ts +4 -0
- package/dist/extensions/builtin/task/task-store.js +1 -1
- package/dist/extensions/builtin/team/AGENT.md +112 -112
- package/dist/extensions/builtin/team/TESTING.md +299 -299
- package/dist/extensions/builtin/token-save/README.md +56 -56
- package/dist/extensions/optional/AGENT.md +10 -10
- package/dist/index.d.ts +5 -30
- package/dist/index.js +1 -1
- package/dist/models.d.ts +7 -0
- package/dist/models.js +1 -0
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/task-status-panel.d.ts +36 -0
- package/dist/modes/interactive/components/task-status-panel.js +1 -0
- package/dist/modes/interactive/controllers/stream-render-controller.d.ts +7 -0
- package/dist/modes/interactive/controllers/stream-render-controller.js +2 -2
- package/dist/modes/interactive/interactive-mode.js +40 -40
- package/dist/modes/interactive/state/interactive-state.d.ts +2 -0
- package/dist/modes/interactive/state/interactive-state.js +1 -1
- package/dist/modes/interactive/theme/dark.json +85 -85
- package/dist/modes/interactive/theme/light.json +84 -84
- package/dist/modes/interactive/theme/theme-schema.json +335 -335
- package/dist/modes/interactive/theme/warm.json +81 -81
- package/dist/node_modules/@pencil-agent/ai/dist/cli.js +0 -0
- package/dist/node_modules/@pencil-agent/ai/dist/models.generated.js +1 -1
- package/dist/node_modules/@pencil-agent/ai/dist/providers/anthropic.js +2 -2
- package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-completions.js +5 -5
- package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-responses.js +1 -1
- package/dist/node_modules/@pencil-agent/ai/dist/stream.js +1 -1
- package/dist/packages/protocol/src/commands.d.ts +33 -0
- package/dist/packages/protocol/src/flags.d.ts +20 -0
- package/dist/packages/protocol/src/hooks.d.ts +17 -0
- package/dist/packages/protocol/src/hooks.js +0 -0
- package/dist/packages/{extension-sdk → protocol}/src/index.d.ts +7 -4
- package/dist/packages/protocol/src/index.js +1 -0
- package/dist/packages/{extension-sdk → protocol}/src/lifecycle.d.ts +15 -27
- package/dist/packages/protocol/src/lifecycle.js +0 -0
- package/dist/packages/{extension-sdk → protocol}/src/tools.d.ts +1 -1
- package/dist/packages/protocol/src/tools.js +0 -0
- package/dist/public-config.d.ts +12 -0
- package/dist/public-config.js +1 -0
- package/dist/runtime.d.ts +9 -0
- package/dist/runtime.js +1 -0
- package/dist/session-compaction.d.ts +7 -0
- package/dist/session-compaction.js +1 -0
- package/dist/session.d.ts +7 -0
- package/dist/session.js +1 -0
- package/dist/skills.d.ts +7 -0
- package/dist/skills.js +1 -0
- package/dist/tools.d.ts +7 -0
- package/dist/tools.js +1 -0
- 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 +851 -0
- package/docs/SDK-TESTING.md +364 -0
- package/docs/codex-goal-command-impl.md +1055 -1055
- package/docs/codex-goal-vs-grub.md +500 -500
- package/docs/custom-provider.md +27 -27
- package/docs/extensions.md +27 -27
- package/docs/keybindings.md +27 -27
- package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/200/273/347/273/223.md" +250 -250
- package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md" +122 -122
- package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210.md" +1222 -1222
- 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
- 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
- package/docs/loop /351/207/215/346/236/204/350/256/241/345/210/222.md" +320 -320
- package/docs/loop-usage-examples.md +214 -214
- package/docs/mem-core/346/212/200/346/234/257/346/226/207/346/241/243.md +593 -0
- package/docs/models.md +27 -27
- package/docs/packages.md +27 -27
- package/docs/pi-design-philosophy.md +457 -457
- package/docs/planmode.md +1987 -1987
- package/docs/prompt-templates.md +27 -27
- package/docs/providers.md +27 -27
- package/docs/sdk.md +27 -27
- package/docs/skills.md +27 -27
- package/docs/startup-performance-optimization.md +301 -0
- package/docs/themes.md +27 -27
- package/docs/tui.md +27 -27
- package/docs//350/256/244/347/237/245/345/234/260/345/233/276.md +47 -0
- package/package.json +190 -162
- package/dist/packages/extension-sdk/src/index.js +0 -1
- package/docs/cc-agent-design.md +0 -1297
- package/docs/cc-tui-design.md +0 -1333
- package/docs//345/257/271/346/240/207Claude-Code.md +0 -1775
- /package/dist/packages/{extension-sdk/src/lifecycle.js → protocol/src/commands.js} +0 -0
- /package/dist/packages/{extension-sdk/src/tools.js → protocol/src/flags.js} +0 -0
package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trello/boards-and-lists.md
CHANGED
|
@@ -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.
|