mcpbeat Sign in

Testdriver:dashcam Agent Skill

Record test execution with video and logs

2k tokens
context cost
the whole folder, loaded on every use
1
files
instructions only
0
copies elsewhere
how many repositories repackaged it
237
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/testdriverai/testdriverai --skill testdriver:dashcam

The instruction itself

28 sections, as written by the author

<!-- Generated from dashcam.mdx. DO NOT EDIT. -->

Overview

Dashcam provides automatic video recording and log aggregation for your tests. It captures screen recordings, application logs, and test execution details that can be reviewed later.

Basic Usage

With Presets

Most presets automatically include Dashcam:

import { test } from 'vitest';
import { chrome } from 'testdriverai/presets';

test('my test', async (context) => {
  const { testdriver, dashcam } = await chrome(context, {
    url: 'https://example.com'
  });
  
  // Test executes with recording automatically
  await testdriver.find('login button').then(el => el.click());
  
  // Dashcam URL available after test
  console.log('Replay:', dashcam.url);
});

Manual Setup

For more control, create a Dashcam instance directly:

import TestDriver from 'testdriverai';
import Dashcam from 'testdriverai/lib/core/Dashcam.js';

const client = await TestDriver.create({ os: 'linux' });
const dashcam = new Dashcam(client, {
  apiKey: process.env.DASHCAM_API_KEY
});

await dashcam.auth();
await dashcam.start();

// Run your tests

const url = await dashcam.stop();
console.log('Replay URL:', url);

Constructor

Create a new Dashcam instance:

new Dashcam(client, options)

Parameters

<ParamField path="client" type="TestDriver" required>

TestDriver client instance

</ParamField>

<ParamField path="options" type="object">

Configuration options

<Expandable title="options properties">

<ParamField path="apiKey" type="string">

Dashcam API key for authentication. Set via TD_API_KEY environment variable.

</ParamField>

<ParamField path="autoStart" type="boolean" default={false}>

Automatically start recording after authentication

</ParamField>

<ParamField path="logs" type="array" default={[]}>

Log configurations to add automatically

</ParamField>

</Expandable>

</ParamField>

Methods

auth()

Authenticate with Dashcam service:

await dashcam.auth(apiKey)

<ParamField path="apiKey" type="string" optional>

Override the API key set in constructor

</ParamField>

Returns: Promise<void>

Example:

await dashcam.auth('your-api-key');

start()

Start recording:

await dashcam.start()

Returns: Promise<void>

Example:

await dashcam.start();
console.log('Recording started');

stop()

Stop recording and retrieve replay URL:

await dashcam.stop()

Returns: Promise<string|null> - Replay URL if available

Example:

const url = await dashcam.stop();
if (url) {
  console.log('Watch replay:', url);
} else {
  console.log('No replay URL available');
}

addFileLog()

Track a log file in the recording:

await dashcam.addFileLog(path, name)

<ParamField path="path" type="string" required>

Path to the log file

</ParamField>

<ParamField path="name" type="string" required>

Display name for the log in Dashcam

</ParamField>

Returns: Promise<void>

Example:

// Linux/Mac
await dashcam.addFileLog('/tmp/app.log', 'Application Log');

// Windows
await dashcam.addFileLog('C:\\logs\\app.log', 'Application Log');

addApplicationLog()

Track application-specific logs:

await dashcam.addApplicationLog(application, name)

<ParamField path="application" type="string" required>

Application name to track

</ParamField>

<ParamField path="name" type="string" required>

Display name for the log

</ParamField>

Returns: Promise<void>

Example:

await dashcam.addApplicationLog('Google Chrome', 'Browser Logs');

addWebLog()

Track web request logs by URL pattern:

await dashcam.addWebLog(pattern, name)

<ParamField path="pattern" type="string" required>

URL pattern to match (e.g., "*example.com*")

</ParamField>

<ParamField path="name" type="string" required>

Display name for the log

</ParamField>

Returns: Promise<void>

Example:

await dashcam.addWebLog('*example.com*', 'Web Logs');

addLog()

Generic method to add any type of log:

await dashcam.addLog(config)

<ParamField path="config" type="object" required>

Log configuration

<Expandable title="config properties">

<ParamField path="name" type="string" required>

Display name for the log

</ParamField>

<ParamField path="type" type="string" required>

Log type: 'file', 'application', or 'web'

</ParamField>

<ParamField path="path" type="string">

File path (required for type='file')

</ParamField>

<ParamField path="application" type="string">

Application name (required for type='application')

</ParamField>

<ParamField path="pattern" type="string">

URL pattern to match (required for type='web', e.g., "*example.com*")

</ParamField>

</Expandable>

</ParamField>

Returns: Promise<void>

Example:

await dashcam.addLog({
  name: 'Test Output',
  type: 'file',
  path: '/tmp/test.log'
});

await dashcam.addLog({
  name: 'Chrome Logs',
  type: 'application',
  application: 'Google Chrome'
});

await dashcam.addLog({
  name: 'Web Logs',
  type: 'web',
  pattern: '*example.com*'
});

isRecording()

Check if currently recording:

await dashcam.isRecording()

Returns: Promise<boolean> - True if recording is active

Example:

if (await dashcam.isRecording()) {
  console.log('Recording in progress');
}

Properties

recording

Current recording state:

dashcam.recording // boolean

apiKey

Configured API key:

dashcam.apiKey // string

client

Associated TestDriver client:

dashcam.client // TestDriver instance

Complete Examples

Basic Recording

import { test } from 'vitest';
import TestDriver from 'testdriverai';
import Dashcam from 'testdriverai/lib/core/Dashcam.js';

test('record test execution', async () => {
  const client = await TestDriver.create({ os: 'linux' });
  const dashcam = new Dashcam(client);
  
  await dashcam.auth();
  await dashcam.start();
  
  // Run your test
  await client.find('button').then(el => el.click());
  
  const url = await dashcam.stop();
  console.log('Replay:', url);
  
  await client.cleanup();
});

With Log Tracking

test('record with logs', async () => {
  const client = await TestDriver.create({ os: 'linux' });
  const dashcam = new Dashcam(client);
  
  await dashcam.auth();
  
  // Add log files before starting
  await dashcam.addFileLog('/tmp/testdriver.log', 'TestDriver Log');
  await dashcam.addFileLog('/tmp/app.log', 'Application Log');
  
  await dashcam.start();
  
  // Test execution
  await client.find('login button').then(el => el.click());
  
  const url = await dashcam.stop();
  console.log('Replay with logs:', url);
  
  await client.cleanup();
});

Auto-start Configuration

test('auto-start recording', async () => {
  const client = await TestDriver.create({ os: 'linux' });
  const dashcam = new Dashcam(client, {
    autoStart: true,
    logs: [
      {
        name: 'App Log',
        type: 'file',
        path: '/tmp/app.log'
      }
    ]
  });
  
  await dashcam.auth(); // Automatically starts recording
  
  // Test execution
  await client.find('submit button').then(el => el.click());
  
  const url = await dashcam.stop();
  console.log('Replay:', url);
  
  await client.cleanup();
});

Using with Presets

import { chrome } from 'testdriverai/presets';

test('preset with dashcam', async (context) => {
  const { testdriver, dashcam } = await chrome(context, {
    url: 'https://example.com',
    dashcam: true // Enabled by default
  });
  
  // Test runs with automatic recording
  await testdriver.find('button').then(el => el.click());
  
  // URL automatically available
  console.log('Replay:', dashcam.url);
});

Disabling Dashcam in Presets

test('without dashcam', async (context) => {
  const { testdriver } = await chrome(context, {
    url: 'https://example.com',
    dashcam: false // Disable recording
  });
  
  // Test runs without recording (faster)
  await testdriver.find('button').then(el => el.click());
});

Platform Differences

Windows

On Windows, Dashcam uses PowerShell commands and installs via npm:

// Windows-specific paths
await dashcam.addFileLog(
  'C:\\Users\\testdriver\\Documents\\testdriver.log',
  'TestDriver Log'
);

Linux/Mac

On Linux/Mac, Dashcam uses shell commands:

// Unix-specific paths
await dashcam.addFileLog('/tmp/testdriver.log', 'TestDriver Log');

Other skills for the same job

different authors, same section of the catalogue
Dogfood
by vercel-labs
vendor ×2

Systematically explore and test a web application to find bugs, UX issues, and other problems. Use when asked to "dogfood", "QA", "exploratory test", "find issues", "bug hunt", "test this app/site/platform", or review the quality of a web application. Produces a structured report with full reproduction evidence -- step-by-step screenshots, repro videos, and detailed repro steps for every issue -- so findings can be handed directly to the responsible teams.

4k tokens
Export Download Debugging
by nexu-io

| Diagnose and fix browser, preview, or Electron export/download failures, especially image export issues involving Save As, Blob/Data URLs, the File System Access API, createWritable failures, and 0 KB files.

725 tokens
Prioritize Assumptions
by phuryn

Prioritize assumptions using an Impact × Risk matrix and suggest experiments for each. Use when triaging a list of assumptions, deciding what to test first, or applying the assumption prioritization canvas.

577 tokens
Hatch Pet
by openai
vendor

Create, repair, validate, visually QA, and package Codex-compatible animated pets and pet spritesheets from character art, generated images, company or prospect brand cues, or visual references. Use when a user wants a lightweight-worker Codex pet workflow, a non-pixel custom pet style, a prospect or company mascot pet, or a full 8x9 animated pet atlas with transparent unused cells, QA contact sheets, and pet.json packaging. This skill composes the installed $imagegen system skill for visual generation and uses bundled scripts for deterministic spritesheet assembly.

33k tokens scripts
Image Studio UI Tests
by Automattic

Run comprehensive UI tests for the Image Studio feature. Covers Media Library entry points, Edit Mode, Generate Mode, Block Editor integration, navigation, and delete. Use when running the full UI smoke test or testing any Image Studio surface.

11k tokens
Ios Simulator Test Recording
by firebase

>- Skill to run xcodebuild tests on iOS Simulator while recording a video walkthrough, dynamically selecting the highest available OS and device. Most useful for running XCUITests.

3k tokens scripts
Frontend App Builder
by openai
vendor

Use for new frontend applications, dashboards, games, creative websites, hero sections, and visually driven UI from scratch, or when the user explicitly asks for a redesign/restyle/modernization. Builds from clean, airy, high-taste, readable image-generated concept design with section-specific references, faithful implementation, and browser testing.

13k tokens
Jetson Validate Image
by NVIDIA
vendor

>- Use after jetson-flash-image to run static BSP checks, on-target smoke/regression tests on a flashed DUT, or both. Not for build

18k tokens scripts

How to use it

Copy the folder

Take testdriverai/testdriver:dashcam from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.