Skip to content

Add domain skills: youtube/upload, dev-to/publish, google-search-console/check#476

Open
engmsaleh wants to merge 4 commits into
browser-use:mainfrom
engmsaleh:skill/youtube-upload
Open

Add domain skills: youtube/upload, dev-to/publish, google-search-console/check#476
engmsaleh wants to merge 4 commits into
browser-use:mainfrom
engmsaleh:skill/youtube-upload

Conversation

@engmsaleh

@engmsaleh engmsaleh commented Jun 28, 2026

Copy link
Copy Markdown

Adds domain-skills/youtube/upload.md — a battle-tested browser-harness flow for publishing a video to YouTube via Studio.

Captured end-to-end while actually publishing a video, so it documents the real selectors + the non-obvious traps:

  • Create → Upload videos, file via DOM.setFileInputFiles (use the last input[type=file])
  • Title/description are contenteditable #textbox divs (not inputs)
  • 'Made for Kids' radio label uses curly quotes (No, it's not 'Made for Kids') — loose-match it; it's required before Next
  • Visibility radios resist JS selectors — coordinate-click them; selecting a visibility relabels the bottom button Save→Publish
  • Coordinate conversion note for 2× retina screenshots (css = displayed × 0.96)
  • Don't re-upload: check the dashboard for an existing video first

Follows the existing tiktok/upload.md pattern. No secrets; the one example video URL is a public launch demo.

🤖 Generated with Claude Code


Summary by cubic

Adds battle‑tested domain skills for youtube/upload, dev-to/publish, and google-search-console/check that map reliable publish and indexing flows for browser‑harness. Enables first‑try YouTube uploads, instant DEV.to cross‑posts with dofollow links, and quick GSC sitemap submits + index checks, with safer duplicate checks and stronger YAML handling.

  • New Features
    • domain-skills/youtube/upload.md: Create → Upload; set file via DOM.setFileInputFiles (last input); edit contenteditable #textbox; coord‑click visibility; capture immediate youtu.be link. Duplicate check now matches by title across the full Content list; notes: curly‑quoted Kids label, 2× retina coord conversion.
    • domain-skills/dev-to/publish.md: YAML front matter + body in one textarea; set via native setter and fire input/change; Save changes publishes when published: true. Quote YAML scalars (title/description/canonical_url), include import json, and reload/re‑insert on CSRF “Invalid authenticity token”.
    • domain-skills/google-search-console/check.md: Submit sitemap and check indexing via GSC. Domain properties require the full URL (https://<domain>/sitemap-index.xml) and targeting the sitemap card input (two‑input gotcha); read Pages “Why pages aren’t indexed,” and use URL Inspection + Request indexing (reports lag).

Written for commit 6f99dc8. Summary will update on new commits.

Review in cubic

Step-by-step browser-harness flow for publishing to YouTube via Studio: Create->Upload videos, file via DOM.setFileInputFiles (last input), contenteditable #textbox title/desc, 'Made for Kids' curly-quote gotcha, coordinate-click visibility radios, Publish confirmation. Captured 2026-06-28 while publishing the Skilly Builders demo.
@browser-harness-review

browser-harness-review Bot commented Jun 28, 2026

Copy link
Copy Markdown

✅ Skill review passed

Reviewed 3 file(s) — no findings.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 1 file

Reply with feedback, questions, or to request a fix.

Fix all with cubic | Re-trigger cubic

Comment thread domain-skills/youtube/upload.md Outdated
DEV.to markdown-editor publish flow: front-matter+body in one textarea via React-safe native setter, published flag for draft/live, Save-changes-publishes, and the 'Invalid authenticity token' CSRF gotcha (reload to refresh). Captured 2026-06-28 cross-posting the Skilly Realtime-API article.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@engmsaleh engmsaleh changed the title Add youtube/upload domain skill (Studio publish flow) Add youtube/upload + devto/publish domain skills Jun 28, 2026

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3 issues found across 1 file (changes from recent commits).

Reply with feedback, questions, or to request a fix.

Fix all with cubic | Re-trigger cubic

Comment thread domain-skills/devto/publish.md Outdated
Comment thread domain-skills/dev-to/publish.md
Comment thread domain-skills/devto/publish.md Outdated
…match video by title

Fixes flagged by the automated reviewer (cubic) on PR browser-use#476: (1) move devto/publish.md into the existing dev-to/ dir (+ cross-ref scraping.md); (2) quote YAML front-matter scalars to survive colons/# in title/description; (3) add missing 'import json' to the snippet; (4) youtube/upload existing-video check now matches by title across the full Content list instead of trusting the latest dashboard card.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@engmsaleh

Copy link
Copy Markdown
Author

Thanks — all four issues identified by cubic are fixed in 322f3e7:

  1. Moved devto/publish.md into the existing dev-to/ directory (next to scraping.md, with a cross-reference) — no more split convention.
  2. Quoted the YAML front-matter scalars (title/description/canonical_url) so colons/# don't break the parse.
  3. Added the missing import json to the insert snippet.
  4. youtube/upload existing-video check now matches by title across the full Content list instead of trusting the latest dashboard card.

(Skill review bot was already green.)

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3 issues found across 2 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="domain-skills/youtube/upload.md">

<violation number="1" location="domain-skills/youtube/upload.md:7">
P2: Duplicate detection relies on the video title as the only identity key. Because YouTube allows multiple videos with the same title, this can cause the harness to reuse the wrong existing URL or skip a valid upload when titles collide. The instruction should disambiguate using a secondary discriminator (e.g. upload date, duration, source asset) or surface ambiguity for confirmation.</violation>

<violation number="2" location="domain-skills/youtube/upload.md:7">
P2: Duplicate-check content list doesn't handle pagination — videos on page 2+ are invisible to the scrape, so the agent may still re-upload an existing video when the match is on a later page.</violation>
</file>

<file name="domain-skills/dev-to/publish.md">

<violation number="1" location="domain-skills/dev-to/publish.md:25">
P2: Double-quote-only YAML guidance is incomplete; embedded quotes and backslashes in user-supplied scalars still break front matter parsing.</violation>
</file>

Tip: Review your code locally with the cubic CLI to iterate faster.

Fix all with cubic | Re-trigger cubic


## Pre-flight
- User must be logged into the target channel in Chrome. Confirm: `page_info()` on `studio.youtube.com` returns `.../channel/<CHANNEL_ID>` and title contains "YouTube Studio".
- **Check for an existing video first (match by title, not position).** Go to `.../videos/upload` (the full Content list, not just the dashboard's "Latest video" card — that card only shows the most recent one and will miss older duplicates). Scrape each row's title cell **and** its `a[href*="/video/"]` → `/video/(<id>)/` together, then find the row whose title matches the video you intend to publish; build `https://youtu.be/<id>` from that row's id. Never assume the first/most-recent row is the match — confirm the title, or you'll reuse (or skip over) the wrong video.

@cubic-dev-ai cubic-dev-ai Bot Jun 28, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Duplicate detection relies on the video title as the only identity key. Because YouTube allows multiple videos with the same title, this can cause the harness to reuse the wrong existing URL or skip a valid upload when titles collide. The instruction should disambiguate using a secondary discriminator (e.g. upload date, duration, source asset) or surface ambiguity for confirmation.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At domain-skills/youtube/upload.md, line 7:

<comment>Duplicate detection relies on the video title as the only identity key. Because YouTube allows multiple videos with the same title, this can cause the harness to reuse the wrong existing URL or skip a valid upload when titles collide. The instruction should disambiguate using a secondary discriminator (e.g. upload date, duration, source asset) or surface ambiguity for confirmation.</comment>

<file context>
@@ -4,7 +4,7 @@ Driving `studio.youtube.com` with browser-harness against the user's logged-in C
 ## Pre-flight
 - User must be logged into the target channel in Chrome. Confirm: `page_info()` on `studio.youtube.com` returns `.../channel/<CHANNEL_ID>` and title contains "YouTube Studio".
-- **Check for an existing video first.** The channel dashboard "Latest video performance" card shows the most recent upload — don't create a duplicate. To reuse an existing video's URL instead of uploading: go to `.../videos/upload`, scrape `a[href*="/video/"]` → `/video/(<id>)/` and build `https://youtu.be/<id>`.
+- **Check for an existing video first (match by title, not position).** Go to `.../videos/upload` (the full Content list, not just the dashboard's "Latest video" card — that card only shows the most recent one and will miss older duplicates). Scrape each row's title cell **and** its `a[href*="/video/"]` → `/video/(<id>)/` together, then find the row whose title matches the video you intend to publish; build `https://youtu.be/<id>` from that row's id. Never assume the first/most-recent row is the match — confirm the title, or you'll reuse (or skip over) the wrong video.
 - Have the absolute path to the local `.mp4` ready.
 
</file context>
Fix with cubic


## Pre-flight
- User must be logged into the target channel in Chrome. Confirm: `page_info()` on `studio.youtube.com` returns `.../channel/<CHANNEL_ID>` and title contains "YouTube Studio".
- **Check for an existing video first (match by title, not position).** Go to `.../videos/upload` (the full Content list, not just the dashboard's "Latest video" card — that card only shows the most recent one and will miss older duplicates). Scrape each row's title cell **and** its `a[href*="/video/"]` → `/video/(<id>)/` together, then find the row whose title matches the video you intend to publish; build `https://youtu.be/<id>` from that row's id. Never assume the first/most-recent row is the match — confirm the title, or you'll reuse (or skip over) the wrong video.

@cubic-dev-ai cubic-dev-ai Bot Jun 28, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Duplicate-check content list doesn't handle pagination — videos on page 2+ are invisible to the scrape, so the agent may still re-upload an existing video when the match is on a later page.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At domain-skills/youtube/upload.md, line 7:

<comment>Duplicate-check content list doesn't handle pagination — videos on page 2+ are invisible to the scrape, so the agent may still re-upload an existing video when the match is on a later page.</comment>

<file context>
@@ -4,7 +4,7 @@ Driving `studio.youtube.com` with browser-harness against the user's logged-in C
 ## Pre-flight
 - User must be logged into the target channel in Chrome. Confirm: `page_info()` on `studio.youtube.com` returns `.../channel/<CHANNEL_ID>` and title contains "YouTube Studio".
-- **Check for an existing video first.** The channel dashboard "Latest video performance" card shows the most recent upload — don't create a duplicate. To reuse an existing video's URL instead of uploading: go to `.../videos/upload`, scrape `a[href*="/video/"]` → `/video/(<id>)/` and build `https://youtu.be/<id>`.
+- **Check for an existing video first (match by title, not position).** Go to `.../videos/upload` (the full Content list, not just the dashboard's "Latest video" card — that card only shows the most recent one and will miss older duplicates). Scrape each row's title cell **and** its `a[href*="/video/"]` → `/video/(<id>)/` together, then find the row whose title matches the video you intend to publish; build `https://youtu.be/<id>` from that row's id. Never assume the first/most-recent row is the match — confirm the title, or you'll reuse (or skip over) the wrong video.
 - Have the absolute path to the local `.mp4` ready.
 
</file context>
Fix with cubic


<markdown body>
```
Quote any user-supplied scalar (title/description/canonical_url). dev.to's front matter is YAML, so an unquoted value containing `:` or a leading `#` will fail the parse or be misread, and the publish silently breaks.

@cubic-dev-ai cubic-dev-ai Bot Jun 28, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Double-quote-only YAML guidance is incomplete; embedded quotes and backslashes in user-supplied scalars still break front matter parsing.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At domain-skills/dev-to/publish.md, line 25:

<comment>Double-quote-only YAML guidance is incomplete; embedded quotes and backslashes in user-supplied scalars still break front matter parsing.</comment>

<file context>
@@ -11,21 +13,23 @@ Driving `dev.to/new` with browser-harness against the user's logged-in Chrome. D
 
 <markdown body>

+Quote any user-supplied scalar (title/description/canonical_url). dev.to's front matter is YAML, so an unquoted value containing : or a leading # will fail the parse or be misread, and the publish silently breaks.

  • YouTube / Tweet embeds: liquid tag on its own line — {% embed https://youtu.be/<id> %}.
  • Body links are normal markdown [text](https://...) and render dofollow.
    </file context>

</details>

```suggestion
Quote any user-supplied scalar (title/description/canonical_url) and YAML-escape it inside the quotes — escape embedded double quotes (`"`) as `\"` and backslashes (`\`) as `\\`. dev.to's front matter is YAML, so an unquoted value containing `:` or a leading `#`, or an improperly escaped quoted value, will fail the parse or be misread, and the publish silently breaks. Prefer generating the front matter with a YAML library to avoid hand-escaping.
Fix with cubic

Browser-harness flow for GSC: sitemap submit (domain-property full-URL gotcha + two-input targeting), Pages indexing report, URL inspection, Performance — plus how to read 'Discovered – currently not indexed' (authority/crawl-budget, not a bug). Captured 2026-06-29 submitting the tryskilly.app sitemap + reading the indexing report.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@engmsaleh engmsaleh changed the title Add youtube/upload + devto/publish domain skills Add domain skills: youtube/upload, dev-to/publish, google-search-console/check Jun 28, 2026

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 issues found across 1 file (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="domain-skills/google-search-console/check.md">

<violation number="1" location="domain-skills/google-search-console/check.md:35">
P2: The 'Discovered – currently not indexed' guidance is overly definitive and contradicts Google's documentation by ruling out technical causes.</violation>

<violation number="2" location="domain-skills/google-search-console/check.md:42">
P2: The API note overstates automation capabilities: the Search Console URL Inspection API cannot replace the 'Request indexing' click in step 3, and the Indexing API only supports specific schema types (JobPosting/BroadcastEvent).</violation>
</file>

Tip: Review your code locally with the cubic CLI to iterate faster.

Fix all with cubic | Re-trigger cubic

- Impressions / clicks / avg position / top queries. Early-stage sites show little — that's expected.

## Interpreting "not indexed" reasons
- **"Discovered – currently not indexed"** → Google found the URL (via sitemap/links) but deprioritized crawling it. This is a **domain-authority / crawl-budget** signal, NOT a technical error. Fix: earn backlinks, strengthen internal linking (hub→spoke), Request-Indexing the key pages, and wait. If most pages sit here, **do not mass-generate more pages** — they'll pile up unindexed; raise authority first.

@cubic-dev-ai cubic-dev-ai Bot Jun 28, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The 'Discovered – currently not indexed' guidance is overly definitive and contradicts Google's documentation by ruling out technical causes.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At domain-skills/google-search-console/check.md, line 35:

<comment>The 'Discovered – currently not indexed' guidance is overly definitive and contradicts Google's documentation by ruling out technical causes.</comment>

<file context>
@@ -0,0 +1,42 @@
+- Impressions / clicks / avg position / top queries. Early-stage sites show little — that's expected.
+
+## Interpreting "not indexed" reasons
+- **"Discovered – currently not indexed"** → Google found the URL (via sitemap/links) but deprioritized crawling it. This is a **domain-authority / crawl-budget** signal, NOT a technical error. Fix: earn backlinks, strengthen internal linking (hub→spoke), Request-Indexing the key pages, and wait. If most pages sit here, **do not mass-generate more pages** — they'll pile up unindexed; raise authority first.
+- **"Crawled – currently not indexed"** → crawled but judged low-value/thin/duplicate. Improve content quality/uniqueness.
+- **"Page with redirect"** → usually benign (trailing-slash or http→https canonicalization); the redirect target is the indexed URL.
</file context>
Fix with cubic

- **"Not found (404)"** → a referenced URL is broken; find + fix or remove the reference.

## Why no API
GSC has a Search Console API (sitemaps, URL inspection, search analytics) but it needs a **service account added to the property** or an **OAuth client** — neither is set up here (a prior attempt stalled on service-account propagation). Until that's configured, this browser flow is the way. If you do set it up, the `searchconsole.googleapis.com` URL-inspection + `webmasters` sitemaps endpoints replace steps 1–3.

@cubic-dev-ai cubic-dev-ai Bot Jun 28, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The API note overstates automation capabilities: the Search Console URL Inspection API cannot replace the 'Request indexing' click in step 3, and the Indexing API only supports specific schema types (JobPosting/BroadcastEvent).

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At domain-skills/google-search-console/check.md, line 42:

<comment>The API note overstates automation capabilities: the Search Console URL Inspection API cannot replace the 'Request indexing' click in step 3, and the Indexing API only supports specific schema types (JobPosting/BroadcastEvent).</comment>

<file context>
@@ -0,0 +1,42 @@
+- **"Not found (404)"** → a referenced URL is broken; find + fix or remove the reference.
+
+## Why no API
+GSC has a Search Console API (sitemaps, URL inspection, search analytics) but it needs a **service account added to the property** or an **OAuth client** — neither is set up here (a prior attempt stalled on service-account propagation). Until that's configured, this browser flow is the way. If you do set it up, the `searchconsole.googleapis.com` URL-inspection + `webmasters` sitemaps endpoints replace steps 1–3.
</file context>
Fix with cubic

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant