askill
pipeline-tracker

pipeline-trackerSafety 85Repository

Syncs pipeline status to Notion and views dashboard. Use to check pipeline status, sync to Notion, resume runs, or archive completed work.

1 stars
1.2k downloads
Updated 2/8/2026

Package Files

Loading files...
SKILL.md

Pipeline Tracker

Tracks ticket-to-PR pipeline runs, syncs status to Notion, and provides a dashboard view.

Commands

Parse the user's request to determine which command to run:

  • status (default) - Show dashboard of all tickets
  • sync - Queue Notion updates for current status
  • resume {ticket-id} - Resume a paused run
  • check-merged - Check for merged PRs and update to Done

Configuration

The skill uses the production API by default. No configuration needed for read-only operations.

Defaults (no setup required):

  • API URL: https://api-gateway-856475788601.us-central1.run.app
  • Read-only endpoints at /public/* require no authentication

For write operations (transitions, sync), set:

export PIPELINE_API_KEY="..."  # Get from GCP Secret Manager or ask admin

Command: status (default)

  1. Query tickets from public API (no auth required):

    # Use the public endpoint directly - no auth needed
    curl -s "https://api-gateway-856475788601.us-central1.run.app/public/tickets" | jq
    

    Or fetch with standard HTTP request:

    const API_URL = process.env.PIPELINE_API_URL || 'https://api-gateway-856475788601.us-central1.run.app'
    const response = await fetch(`${API_URL}/public/tickets`)
    const { tickets } = await response.json()
    
  2. Present dashboard:

    # Pipeline Dashboard
    
    ## Active Tickets
    
    | Ticket  | State         | PR   | Last Updated |
    | ------- | ------------- | ---- | ------------ |
    | {title} | 🟒 RESEARCH   | -    | 2h ago       |
    | {title} | 🟑 PR_CREATED | #123 | 1d ago       |
    | {title} | πŸ”΄ BLOCKED    | -    | 3d ago       |
    
    ## Details
    
    ### {Ticket Title}
    
    - **URL:** {ticketUrl}
    - **State:** {state}
    - **Started:** {created_at}
    - **Last Updated:** {updated_at}
    - **PR:** {pr_url or "not created"}
    
  3. Offer options:

    Options:
    A) Sync all to Notion
    B) View details for specific ticket
    C) Resume a ticket
    

State Icons

  • 🟒 Active: INTAKE, RESEARCH, PLANNING, IMPLEMENTATION
  • 🟑 Review: PR_CREATED, CI_PASSED
  • πŸ”΄ Blocked: BLOCKED
  • βœ… Done: DONE

Command: sync

Queue Notion updates for all tickets via the sync queue.

Requires PIPELINE_API_KEY for authentication.

  1. List tickets from public API:

    const API_URL = process.env.PIPELINE_API_URL || 'https://api-gateway-856475788601.us-central1.run.app'
    const response = await fetch(`${API_URL}/public/tickets`)
    const { tickets } = await response.json()
    
  2. Map state to Notion Status:

    Pipeline StateNotion Status
    INTAKE, RESEARCH, PLANNING, IMPLEMENTATIONIn Progress
    PR_CREATED, CI_PASSEDIn Review
    DONEDone
    BLOCKED(keep current)
  3. Queue sync for each ticket:

    for (const ticket of tickets) {
      const notionStatus = mapStateToNotionStatus(ticket.state)
      await client.queueSync(ticket.id, 'update_notion', {
        status: notionStatus,
        prUrl: ticket.pr_url,
      })
    }
    
  4. Report results:

    Queued {X} Notion syncs:
    - {Ticket 1}: Status β†’ In Progress
    - {Ticket 2}: Status β†’ In Review, PR β†’ #123
    

Command: resume {ticket-id}

Resume a paused or stale ticket.

  1. Fetch ticket from API:

    const ticket = await client.getTicket(ticketId)
    
  2. Determine next skill based on state:

    StateNext Skill
    RESEARCHresearch-orchestrator
    PLANNINGplan-generator
    IMPLEMENTATIONimplementation-runner
    PR_CREATED(wait for merge)
    BLOCKED(show blockers, ask user)
  3. Prompt user:

    Resuming: {ticket.title}
    
    Current state: {ticket.state}
    Last updated: {ticket.updated_at}
    
    Next step: Load {skill-name} skill
    
    Continue? (Y/n)
    
  4. If confirmed, load the appropriate skill.

Empty State

If no tickets exist:

# Pipeline Dashboard

No active tickets.

To start a new ticket, use the ticket-intake skill.

Command: check-merged

Check for merged PRs and update to Done. This handles the common case where you close the agent before PR merge.

  1. Find tickets in review state:

    const { tickets } = await client.listTickets({ state: 'PR_CREATED' })
    
  2. Check each PR's merge status:

    gh pr view $PR_NUMBER --json state,mergedAt
    
  3. For merged PRs, transition to DONE:

    await client.transitionState(ticketId, 'DONE', 'PR merged')
    
  4. Report:

    Checked {X} open PRs:
    - ABC-123: PR #456 merged βœ… β†’ Transitioned to DONE
    - DEF-456: PR #789 still open
    

For detailed merge watching (including closed PR handling), use /skill pr-merge-watcher.

Auto-Check on Status

When running status command, automatically check for merged PRs:

# Pipeline Dashboard

⚑ Quick check: Found 1 merged PR not yet marked Done
β†’ ABC-123: PR #456 merged 2 days ago

Update now? (Y/n)

API Client Reference

Available Methods

MethodDescription
listTickets({ state, agent_id, limit, offset })List tickets with optional filters
getTicket(id)Retrieve a ticket by ID
transitionState(id, state, reason)Move ticket to a new state
queueSync(id, action, payload)Queue a sync action (e.g., Notion status update)

Listing Tickets

// List all tickets
const { tickets, total } = await client.listTickets({})

// Filter by state
const prCreated = await client.listTickets({ state: 'PR_CREATED' })
const research = await client.listTickets({ state: 'RESEARCH' })

// Filter by agent
const myTickets = await client.listTickets({ agent_id: 'my-agent' })

// Pagination
const page2 = await client.listTickets({ limit: 10, offset: 10 })

The listTickets() method returns:

{
  tickets: Ticket[];  // array of ticket objects
  total: number;      // total count matching filter
  limit: number;      // page size
  offset: number;     // current offset
}

Error Handling

import { PipelineClient, PipelineAPIError } from '@pipeline/client'

try {
  const ticket = await client.getTicket('invalid-id')
} catch (error) {
  if (error instanceof PipelineAPIError) {
    console.error(`API error ${error.status}: ${error.message}`)
  }
}

Install

Download ZIP
Requires askill CLI v1.0+β–Ά

AI Quality Score

82/100Analyzed 2/24/2026

Well-structured skill with clear commands, comprehensive documentation, and practical examples. Includes dedicated sections for configuration, error handling, and API reference. Located in proper skills folder. Minor deduction for being tied to a specific external API, but otherwise highly actionable and complete.

85
85
70
90
85

Metadata

Licenseunknown
Version-
Updated2/8/2026
Publisherchristian-byrne

Tags

apici-cdpromptingsecurity