Files
ComfyUI_frontend/.claude/skills/ticket-intake/providers/notion.md
Dante 07d5bd50f6 feat: extract SeedControlButton component (#9744)
<img width="1048" height="482" alt="스크린샷 2026-03-12 오전 9 11 56"
src="https://github.com/user-attachments/assets/68009980-097c-4736-b7c4-eb8f9a6f05be"
/>

## Summary
- Extract inline value control button from `WidgetWithControl` into
reusable `SeedControlButton` component
- Support `badge` (pill) and `button` (square) variants per Figma design
system spec
- Use native `<button>` element for proper a11y (works with Reka UI's
`PopoverTrigger as-child`)

## Test plan
- [x] Verify seed control button renders correctly on KSampler node's
seed widget
- [x] Verify popover opens on click and mode selection works
- [x] Verify all 4 modes display correct icon/text (shuffle, pencil-off,
+1, -1)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9744-feat-extract-SeedControlButton-component-3206d73d365081a3823cc19e48d205c1)
by [Unito](https://www.unito.io)

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: github-actions <github-actions@github.com>
2026-03-13 02:49:18 -07:00

5.8 KiB

Notion Provider - Ticket Intake

Provider-specific logic for ingesting tickets from Notion.

URL Pattern

https://www.notion.so/workspace/Page-Title-abc123def456...
https://notion.so/Page-Title-abc123def456...
https://www.notion.so/abc123def456...

Page ID is the 32-character hex string (with or without hyphens).

Prerequisites

  • Notion MCP connected and authenticated
  • If not setup: claude mcp add --transport http notion https://mcp.notion.com/mcp
  • Authenticate via /mcp command if prompted

Fetch Ticket Content

Use Notion:notion-fetch with the page URL or ID:

Fetch the full page content including all properties

Extract Ticket Data

Extract these properties (names may vary):

Property Expected Name Type
Title Name / Title Title
Status Status Select
Assignee Assignee / Assigned To Person
Description - Page content
Slack Link Slack Link / Slack Thread URL
GitHub PR GitHub PR / PR Link URL
Priority Priority Select
Area Area / Category Select
Related Tasks Related Tasks Relation

If properties are missing: Note what's unavailable and continue with available data.

Update Source (REQUIRED)

⚠️ DO NOT SKIP THIS STEP. This is a required action, not optional.

⚠️ Notion Write Safety rules apply (see $PIPELINE_DIR/docs/notion-write-safety.md for full reference):

  • Whitelist: Only Status, GitHub PR, and Assignee fields may be written
  • Valid transitions: Not Started → In Progress, In Progress → In Review, In Review → Done
  • Logging: Every write attempt MUST be logged with timestamp, field, value, previous value, skill name, and success status

Use Notion:notion-update-page to update the ticket:

  1. Status: Set to "In Progress" (only valid from "Not Started")
  2. Assignee: Assign to pipeline owner (Notion ID: 175d872b-594c-81d4-ba5a-0002911c5966)
{
  "page_id": "{page_id_from_ticket}",
  "command": "update_properties",
  "properties": {
    "Status": "In Progress",
    "Assignee": "175d872b-594c-81d4-ba5a-0002911c5966"
  }
}

After the update succeeds, log the write via the Pipeline API:

await client.updateTicket(ticketId, {
  metadata: {
    ...ticket.metadata,
    notionWrites: [
      ...(ticket.metadata?.notionWrites || []),
      {
        field: 'Status',
        value: 'In Progress',
        previousValue: 'Not Started',
        at: new Date().toISOString(),
        skill: 'ticket-intake',
        success: true
      }
    ]
  }
})

If update fails, log with success: false and continue.

Notion-Specific Ticket Fields

Store via API using client.createTicket():

{
  "source": "notion",
  "notionPageId": "abc123def456...",
  "slackLink": "https://slack.com/...",
  "relatedTasks": ["page-id-1", "page-id-2"]
}

Slack Thread Handling

If a Slack link exists, use the slackdump skill to fetch the thread content programmatically.

Slack URL Conversion

Notion stores Slack links in slackMessage:// format:

slackMessage://comfy-organization.slack.com/CHANNEL_ID/THREAD_TS/MESSAGE_TS

Convert to browser-clickable format:

https://comfy-organization.slack.com/archives/CHANNEL_ID/pMESSAGE_TS_NO_DOT

Example:

  • Input: slackMessage://comfy-organization.slack.com/C075ANWQ8KS/1766022478.450909/1764772881.854829
  • Output: https://comfy-organization.slack.com/archives/C075ANWQ8KS/p1764772881854829

(Remove the dot from the last timestamp and prefix with p)

Fetching Thread Content

Load the slackdump skill and use the export-thread workflow:

# Export thread by URL
slackdump dump "https://comfy-organization.slack.com/archives/CHANNEL_ID/pMESSAGE_TS"

# Or by colon notation (channel_id:thread_ts)
slackdump dump CHANNEL_ID:THREAD_TS

Save the thread content to $RUN_DIR/slack-context.md and include it in the ticket metadata.

No manual action required. The slackdump CLI handles authentication via stored credentials at ~/.cache/slackdump/comfy-organization.bin.

Database Reference: Comfy Tasks

The "Comfy Tasks" database has these properties (verify via notion-search):

  • Status values: Not Started, In Progress, In Review, Done
  • Team assignment: "Frontend Team" for unassigned tickets
  • Filtering note: Team filtering in Notion may have quirks - handle gracefully

Pipeline Owner Details

When assigning tickets, use these identifiers:

Platform Identifier
Notion User ID 175d872b-594c-81d4-ba5a-0002911c5966
Notion Name Christian Byrne
Notion Email cbyrne@comfy.org
Slack User ID U087MJCDHHC
GitHub Username christian-byrne

To update Assignee, use the Notion User ID (not name):

properties: {"Assignee": "175d872b-594c-81d4-ba5a-0002911c5966"}

Finding Active Tickets

To list your active tickets:

Use Notion:notion-search for "Comfy Tasks"
Filter by Assignee = current user OR Team = "Frontend Team"

Error Handling

Authentication Error

⚠️ Notion authentication required.
Run: claude mcp add --transport http notion https://mcp.notion.com/mcp
Then authenticate via /mcp command.

Page Not Found

❌ Notion page not found or inaccessible.
- Check the URL is correct
- Ensure you have access to this page
- Try re-authenticating via /mcp