@playstack/feedback
Durable intake contract for product feedback and failed-command reports sent by the CLI.
Paid. Covered by the Playstack Pro License; access and tier assignment are not yet announced. See package access.
@playstack/feedback defines the schema-version-1 report that playstack feedback sends, a framework-neutral intake policy with validation, per-address limiting and address hashing, the FeedbackStore port with memory and Prisma implementations, and the feedback.report.received event. It is not ticketing and not telemetry: nothing is sent without an explicit client action, the intake never reads reports back, and it never sends mail.
Install
After confirming preview access, install the package at your application's shared Playstack version:
npm install --save-exact @playstack/feedback@0.1.0-beta.1Check the peer requirements below before choosing a runtime or provider.
Compose the intake
import { createFeedbackIntake } from '@playstack/feedback'
import { PrismaFeedbackStore } from '@playstack/feedback/prisma'
import { PrismaEventOutboxWriter } from '@playstack/events-prisma'
const intake = createFeedbackIntake({
store: new PrismaFeedbackStore(prisma, { outbox: new PrismaEventOutboxWriter() }),
limiter: { consume: ({ ip }) => limiter.consume('feedback.ip', { subjects: { ip } }) },
hashAddress: (ip) => keyedHash(ip),
})
const decision = await intake.limit(ip) // before reading any body
const { id, acceptance } = await intake.accept(body, { ip }) // 'created' | 'duplicate'accept throws FeedbackError('invalid_report') with path detail for schema failures and never echoes the submitted message. Duplicate ids are acknowledged without a second row or event, so client retries are safe. The report carries a category (bug, idea, question, other), the message, optional contact, CLI build identity, runtime facts, and the redacted failure record playstack feedback --last attaches.
Persistence and events
publish/playstack-feedback.prisma is the managed database artifact, materialized by playstack database sync. PrismaFeedbackStore is structurally typed against a generated client and takes the application's outbox writer, so the store and the feedback.report.received event commit together. Notification and triage workers consume that event; the intake itself stays write-only.
Boundary
HTTP lives in @playstack/nest-feedback. Reading reports back, replying, and closing them are application workflows outside this package.
API entry points and requirements
Reference snapshot: @playstack/feedback@0.1.0-beta.1. Import only the entry point your runtime needs. Paths below are relative to the installed package; use Go to Definition in your editor to inspect exact parameters, return types and overloads. Do not import the declaration-file paths directly.
| Public entry point | Declaration file |
|---|---|
@playstack/feedback | ./dist/index.d.ts |
@playstack/feedback/errors | ./dist/errors.d.ts |
@playstack/feedback/prisma | ./dist/prisma.d.ts |
@playstack/feedback/testing | ./dist/testing.d.ts |
@playstack/feedback/playstack.artifacts.json | No TypeScript declaration (asset or metadata export). |
@playstack/feedback/package.json | No TypeScript declaration (asset or metadata export). |
Node.js engine requirement: >=20. This is not a claim that every entry point works in browsers or Workers.
Peer dependencies
This package declares no peer dependencies. Its ordinary dependencies are resolved by the package manager.
For a complete first program, start with Getting started. For API lookup and partial-example conventions, see Reading the reference. Provider failures, lifecycle requirements and application responsibilities remain described in the guide above; types alone do not establish production safety.