Skip to main content
Deck follows Semantic Versioning. Subscribe to the RSS feed to be notified of new releases, or browse the full history on GitHub.
FixedChanged
4 August 2026
Tracking now defaults to off. If you published config/deck.php you are unaffected. If you did not and you rely on tracking, set DECK_TRACKING_ENABLED=true. If you use tracking, re-publish and run the migrations.If you organised prompts into subdirectories such as support/reply, those names no longer load — flatten them to support-reply. Nested prompts never worked properly: prompt:list scans only the top level and showed them as a broken entry. See the upgrade guide.
Fixed
  • Tracking no longer breaks prompt rendering. Tracking defaulted to on whenever APP_DEBUG was false, but its tables are published in a separate opt-in step — so the natural production install (composer require, publish config, deploy) threw no such table: prompt_versions on the very first Deck::get(). Caching gave no protection, because the active version is resolved before the cache is consulted. Tracking now defaults to off, and every database interaction degrades to metadata.json with a single logged warning instead of throwing. Deck::track() never throws under any circumstances: it runs after a completed, paid-for AI call, and no analytics failure is worth discarding that response.
  • Deck::activate() now records the version it activated. It only ever issued an UPDATE, which matched no rows because nothing ever inserted them — so prompt_versions stayed empty and the lookup that read it could fail but never succeed. Activation is now an upsert, making runtime version switching work as documented.
  • Prompt names are validated. A name was interpolated straight into a filesystem path, so one containing .. or a directory separator could read files outside your prompts directory. Names now throw InvalidPromptNameException unless they contain only letters, numbers, dots, dashes, and underscores.
  • Version directories are matched precisely. The pattern was unanchored and applied to the full path, so rev2, dev3, and archive-v9 registered as versions 2, 3, and 9 — advertised by prompt:list --all, then failing to load.
  • make:prompt can no longer create a prompt that will not load. Kebab-casing passed path separators through, so make:prompt Support/Reply scaffolded a nested support/reply that the manager refuses to resolve and prompt:list displays as a broken support entry. The generator and the loader now share one definition of a valid name, so they cannot drift apart.
  • Deck::track() no longer throws on an invalid name, which contradicted its own documented promise. It builds no path — the name is only a column value — so the guard protected nothing.
  • getActiveVersion() no longer picks arbitrarily between multiple active rows, and casts the version it reads.
  • The name pattern no longer accepts a trailing newline, since $ matches before one.
Changed
  • prompt_versions.user_prompt is nullable, so activation can be recorded without prompt content. Deck is file-based; content lives on disk.
  • Once a version has been activated with tracking enabled, the database takes precedence over metadata.json. Editing active_version in the file and deploying no longer changes what is served — activation is environment state, the file is the bootstrap default. See Tracking — Activation precedence.
ChangedFixedAdded
3 August 2026
Added
  • A quality CI workflow now checks formatting with Pint on every push and pull request, and asserts that every release in the repository CHANGELOG.md has a matching entry on this page. Formatting was never checked in CI before, and the two changelogs could drift apart unnoticed.
  • The test workflow now runs composer test rather than calling Pest directly, so CI and the documented contributor command cannot diverge.
Changed
  • Deck::activate() now accepts string versions. 'v2', '2', and 2 are all valid, matching what Deck::get() has accepted since v0.4.2. Only get() was widened at the time, so Deck::activate('order-summary', 'v2') raised a TypeError despite the release notes describing both. Passing an integer continues to work unchanged.
Fixed
  • Unparseable versions now name the offending value. Both Deck::get() and Deck::activate() threw a message with the version missing entirely — Version for prompt [order-summary] does not exist. They now throw InvalidVersionException reading Invalid version [banana] for prompt [order-summary]. Use a positive number like [1] or [v1].
  • Corrected the prompt structure diagrams throughout the documentation and README. They omitted the version-level metadata.json introduced in v0.4.4, and the README showed a user.md that make:prompt does not create without --user alongside a second version that a single run does not create.
  • Corrected the README describing new versions as becoming active automatically. Creating a version has not changed the active version since v0.4.4.
  • Corrected the documented Deck::get() signature, which read ?int rather than string|int|null.
FixedAdded
3 August 2026
Fixed
  • Migrations now publish on case-sensitive filesystems. vendor:publish --tag=deck-migrations reported success without copying anything on Linux and case-sensitive macOS volumes. If your database/migrations directory came up empty after installing Deck, publish again after upgrading.
  • Creating a version no longer changes which version is live. make:prompt rewrote the prompt’s root metadata.json from scratch, discarding the active_version key, so scaffolding a draft silently promoted it to active. The file is now merged: active_version, your description, the original created_at, a populated variables list, and any keys you added by hand all survive.
  • Prompt metadata is now readable. make:prompt recorded the name, description, and roles in the prompt’s root metadata.json, but Deck only ever read the version-level v{n}/metadata.json. PromptTemplate::metadata() was always empty and the prompt:list description column was always blank. make:prompt now writes version-level metadata too, and reads merge the two files with version keys winning. See Metadata.
  • prompt:test --ver=v2 renders the version you asked for. The v prefix was discarded during parsing, so the command quietly rendered the active version while reporting the wrong number in its header. Both 2 and v2 now work, and an unparseable value fails with a clear message.
  • Corrected the PromptPHP\Deck\Database\Factories\ PSR-4 mapping, which pointed at a directory that does not exist.
  • Corrected the README downloads badge, which reported the deprecated veeqtoh/prompt-deck package, and the stale repository and licence links.
Added
  • make:prompt now tells you how to promote a new version when a different one is active:
Removed
  • Removed the PromptPHP\Deck\Database\Seeders\ autoload mapping, which pointed at a directory that does not exist.
Fixed
29 July 2026
Fixed
  • Widened the sebastian/diff constraint to allow v8 and v9, so Deck can be installed alongside Pest 5. #12
Fixed
27 May 2026
Fixed
  • Deck::get() and Deck::activate() now accept mixed version types, resolving versions through the shared ResolvesVersion trait.
Fixed
17 May 2026
Fixed
  • prompt:activate now accepts both 1 and v1 version formats.
BreakingChanged
17 May 2026
This release renamed the package and its namespace. See the upgrade guide before upgrading from v0.3.x.
Changed
  • Renamed the package from veeqtoh/prompt-deck to promptphp/deck.
  • Renamed the PHP namespace from Veeqtoh\PromptDeck to PromptPHP\Deck.
  • Renamed the public package identity from Prompt Deck to Deck by PromptPHP.
  • Updated installation, usage, README, badges, documentation links, and package metadata for the new PromptPHP organisation. #7
Removed
  • Removed the old Veeqtoh\PromptDeck public namespace.
  • Removed old Prompt Deck naming from the main public API.
AddedChangedFixed
17 May 2026
Added
  • Published this documentation site, built on Mintlify. #5
  • Added dedicated pages for installation, configuration, commands, prompt management, Laravel AI SDK integration, tracking, testing, and the API reference.
Changed
  • Reworked the documentation from flat markdown files into organised MDX pages. #6
Fixed
  • Fixed stale documentation links and navigation paths.
AddedChanged
28 March 2026
Added
  • Added a CHANGELOG to the repository.
  • Added a GitHub Actions workflow for automated testing.
  • Added a .gitattributes file to manage text handling and export-ignore rules.
Changed
  • Refined the Composer package keywords for discoverability.
Added
27 March 2026
Added
  • Added support for Laravel 13. #3
  • Added the scaffold_on_make_agent option to toggle auto-scaffolding of prompts when you run make:agent. See Configuration.
Added
4 March 2026
The first release. #1Added
  • Versioned prompt management with file-based storage in structured prompt directories.
  • Variable interpolation for prompt templates.
  • Artisan commands for creating, listing, testing, diffing, and activating prompts. See Commands.
  • Prompt execution tracking. See Tracking.
  • A/B testing through versioned prompt activation and tracking.
  • Optional Laravel AI SDK integration. See Laravel AI SDK.