Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[1.1.0] - 2026-03-04
Added
promptcanary init --test-runner— scaffold a Vitest or Jest test file alongside the YAML config- Composite GitHub Action —
.github/actions/run/for running prompt tests in CI with minimal config - Comparison page — honest feature comparison between PromptCanary and promptfoo
- Jest getting-started guide — ESM-compatible Jest setup example alongside existing Vitest docs
- Example project —
examples/chatbot-app/with realistic prompt tests demonstrating all features
[1.0.0] - 2026-03-04
Removed
monitorcommand — use CI/CD scheduled workflows (cron) withpromptcanary runinsteadcleanupcommand — no longer needed without continuous monitoring- Scheduler (
startScheduler,executeRun) — removed from public API - Alerting system — Slack, webhook,
dispatchAlerts,createAlertChannelsall removed. Use your existing alerting infrastructure (PagerDuty, Datadog, CI notifications, etc.) - Alert types —
AlertConfig,AlertPayload,AlertChannel,AlertConfigSchemaremoved scheduleconfig field — no longer part of the configuration schemanode-crondependency — no longer needed
Migration from 0.2.0
If you were using promptcanary monitor:
- Replace with a CI/CD scheduled workflow (e.g., GitHub Actions
schedule, GitLab CI schedule, or a system cron job) that runspromptcanary run your-config.yaml
If you were using alerting (Slack/webhook):
- Use your CI/CD pipeline's built-in notification system. PromptCanary exits with code
1on failures, which triggers standard CI alerts automatically.
If you were using the cleanup command:
- No replacement needed. Without continuous monitoring, database growth is minimal.
If you imported startScheduler, executeRun, or alert types:
- Remove these imports. Use
testPrompt(),assertions, andsemanticSimilarity()for programmatic testing instead.
[0.2.0] - 2026-03-04
Added
testPrompt()— standalone function to send prompts to any provider and get typed resultssemanticSimilarity()— compute cosine similarity between two strings using OpenAI embeddingsassertionsnamespace — 7 synchronous assertion helpers (contains,notContains,maxLength,minLength,matchesRegex,isJson,matchesJsonSchema) plusrunAll()for batch execution- New types:
TestPromptOptions,TestPromptResult,ChatMessage,SemanticSimilarityOptions,AssertionDescriptor,RunAllResult - 45 new unit tests for the testing API
Changed
- README repositioned from monitoring tool to testing library
- Getting started guide leads with programmatic API (Vitest/Jest) instead of CLI
- API reference rewritten to lead with
testPrompt(),semanticSimilarity(), andassertions - "What is PromptCanary?" intro page updated for testing library identity
- Docs sidebar reorganized: monitoring and alerting moved to Advanced section
- Configuration renamed to "Configuration (YAML)" in sidebar
- package.json description and keywords updated for npm discoverability
Fixed
- CI workflow now runs Build before Test so CLI integration tests find
dist/output
[0.1.0] - 2026-03-03
Added
- CLI commands:
init,validate,run,monitor,results - OpenAI and Anthropic provider support
- Structural assertions:
must_contain,must_not_contain,min_length,max_length,format,tone - Semantic similarity comparison using OpenAI embeddings with configurable thresholds
- Drift detection against historical semantic scores (2-sigma + 10% drop)
- SQLite storage for results, comparisons, and embedding cache
- Database schema versioning and migration system
- Embedding cache persistence across scheduler runs via SQLite backing
- Cron-based continuous monitoring with
config.schedule - Slack and webhook alert channels with retry and exponential backoff
- Alert deduplication with configurable cooldown
.envfile auto-loading with--dotenv <path>override- YAML config validation with Zod schemas
- GitHub Action composite for CI integration
- CLI integration tests for all commands and flags
- Multi-environment CI matrix (Node 20+22, ubuntu/windows/macos)
- MIT license
Fixed
- Embedding fetcher now has a configurable timeout (default 30s) via
AbortSignal.timeout() - Embedding API failures produce warnings instead of marking tests as failed
- Scheduler preserves
error_typeandretry_after_msin runner error responses - Email alert type removed from schema until implemented (was crashing at runtime)
- Scheduler warns when embedding provider fails to initialize
- Database writes use transactions for atomicity
- Dependency versions pinned to semver ranges
Documentation
- README: full configuration reference, provider setup, alerting, GitHub Action, API keys
- README: troubleshooting section for better-sqlite3 native module
.env.exampletemplate