@bbearai/core 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -186,6 +186,10 @@ interface TestAssignment {
186
186
  track?: QATrack;
187
187
  };
188
188
  status: 'pending' | 'in_progress' | 'passed' | 'failed' | 'blocked';
189
+ /** When the assignment was started (set to in_progress) */
190
+ startedAt?: string;
191
+ /** Duration in seconds (calculated when completed) */
192
+ durationSeconds?: number;
189
193
  }
190
194
  interface TestStep {
191
195
  stepNumber: number;
@@ -213,6 +217,37 @@ interface TestResult {
213
217
  /** Overall notes */
214
218
  notes?: string;
215
219
  }
220
+ /**
221
+ * Feedback from testers about a test case
222
+ * Helps improve test quality over time
223
+ */
224
+ interface TestFeedback {
225
+ /** Overall rating (1-5 stars) */
226
+ rating: 1 | 2 | 3 | 4 | 5;
227
+ /** Optional detailed ratings */
228
+ clarityRating?: 1 | 2 | 3 | 4 | 5;
229
+ stepsRating?: 1 | 2 | 3 | 4 | 5;
230
+ relevanceRating?: 1 | 2 | 3 | 4 | 5;
231
+ /** Free-form feedback note */
232
+ feedbackNote?: string;
233
+ /** Specific improvement suggestion */
234
+ suggestedImprovement?: string;
235
+ /** Quick feedback flags */
236
+ isOutdated?: boolean;
237
+ needsMoreDetail?: boolean;
238
+ stepsUnclear?: boolean;
239
+ expectedResultUnclear?: boolean;
240
+ }
241
+ /**
242
+ * Options for submitting test feedback
243
+ */
244
+ interface SubmitFeedbackOptions {
245
+ testCaseId: string;
246
+ assignmentId?: string;
247
+ feedback: TestFeedback;
248
+ /** Time taken to complete in seconds */
249
+ timeToCompleteSeconds?: number;
250
+ }
216
251
  interface TesterInfo {
217
252
  id: string;
218
253
  name: string;
@@ -442,6 +477,92 @@ interface CoverageMatrixRow {
442
477
  lastTestedAt: string | null;
443
478
  tracks: Record<string, CoverageMatrixCell>;
444
479
  }
480
+ /** Session status */
481
+ type QASessionStatus = 'active' | 'paused' | 'completed' | 'abandoned';
482
+ /** Finding type - lighter than a bug report */
483
+ type FindingType = 'bug' | 'concern' | 'suggestion' | 'question';
484
+ /** Finding severity - includes observation for non-issues */
485
+ type FindingSeverity = 'critical' | 'high' | 'medium' | 'low' | 'observation';
486
+ /** QA Session - exploratory testing session */
487
+ interface QASession {
488
+ id: string;
489
+ projectId: string;
490
+ testerId: string;
491
+ /** Area being explored */
492
+ focusArea?: string;
493
+ /** QA track focus */
494
+ track?: string;
495
+ /** Platform being tested */
496
+ platform?: string;
497
+ /** Timing */
498
+ startedAt: string;
499
+ endedAt?: string;
500
+ /** Session notes */
501
+ notes?: string;
502
+ /** Routes visited during session */
503
+ routesCovered: string[];
504
+ /** Status */
505
+ status: QASessionStatus;
506
+ /** Metrics */
507
+ durationMinutes?: number;
508
+ findingsCount: number;
509
+ bugsFiled: number;
510
+ createdAt: string;
511
+ updatedAt: string;
512
+ }
513
+ /** QA Finding - quick observation during a session */
514
+ interface QAFinding {
515
+ id: string;
516
+ sessionId: string;
517
+ projectId: string;
518
+ /** Type of finding */
519
+ type: FindingType;
520
+ /** Severity level */
521
+ severity: FindingSeverity;
522
+ /** Content */
523
+ title: string;
524
+ description?: string;
525
+ /** Context (auto-captured) */
526
+ route?: string;
527
+ screenshotUrl?: string;
528
+ consoleLogs?: ConsoleLogEntry[];
529
+ networkSnapshot?: NetworkRequest[];
530
+ deviceInfo?: DeviceInfo;
531
+ appContext?: AppContext;
532
+ /** Conversion tracking */
533
+ convertedToBugId?: string;
534
+ convertedToTestId?: string;
535
+ /** Dismissal */
536
+ dismissed: boolean;
537
+ dismissedReason?: string;
538
+ dismissedAt?: string;
539
+ createdAt: string;
540
+ updatedAt: string;
541
+ }
542
+ /** Options for starting a QA session */
543
+ interface StartSessionOptions {
544
+ focusArea?: string;
545
+ track?: string;
546
+ platform?: string;
547
+ }
548
+ /** Options for ending a QA session */
549
+ interface EndSessionOptions {
550
+ notes?: string;
551
+ routesCovered?: string[];
552
+ }
553
+ /** Options for adding a finding */
554
+ interface AddFindingOptions {
555
+ type: FindingType;
556
+ title: string;
557
+ description?: string;
558
+ severity?: FindingSeverity;
559
+ route?: string;
560
+ screenshotUrl?: string;
561
+ consoleLogs?: ConsoleLogEntry[];
562
+ networkSnapshot?: NetworkRequest[];
563
+ deviceInfo?: DeviceInfo;
564
+ appContext?: AppContext;
565
+ }
445
566
 
446
567
  /**
447
568
  * BugBear Client
@@ -480,6 +601,43 @@ declare class BugBearClient {
480
601
  * First looks up the tester by email, then fetches their assignments
481
602
  */
482
603
  getAssignedTests(): Promise<TestAssignment[]>;
604
+ /**
605
+ * Get assignment by ID with time tracking fields
606
+ */
607
+ getAssignment(assignmentId: string): Promise<(TestAssignment & {
608
+ startedAt?: string;
609
+ durationSeconds?: number;
610
+ }) | null>;
611
+ /**
612
+ * Update assignment status with automatic time tracking
613
+ * - Sets started_at when status changes to 'in_progress'
614
+ * - Calculates duration_seconds when status changes to 'passed'/'failed'/'blocked'
615
+ * - Optionally include feedback when completing a test
616
+ */
617
+ updateAssignmentStatus(assignmentId: string, status: TestAssignment['status'], options?: {
618
+ notes?: string;
619
+ testResult?: TestResult;
620
+ /** Include feedback when completing the test */
621
+ feedback?: TestFeedback;
622
+ }): Promise<{
623
+ success: boolean;
624
+ error?: string;
625
+ durationSeconds?: number;
626
+ }>;
627
+ /**
628
+ * Submit feedback on a test case to help improve test quality
629
+ * This empowers testers to shape better tests over time
630
+ */
631
+ submitTestFeedback(options: SubmitFeedbackOptions): Promise<{
632
+ success: boolean;
633
+ error?: string;
634
+ }>;
635
+ /**
636
+ * Get the currently active (in_progress) assignment for the tester
637
+ */
638
+ getActiveAssignment(): Promise<(TestAssignment & {
639
+ startedAt?: string;
640
+ }) | null>;
483
641
  /**
484
642
  * Get current tester info
485
643
  * Looks up tester by email from the host app's authenticated user
@@ -606,6 +764,69 @@ declare class BugBearClient {
606
764
  threadId?: string;
607
765
  error?: string;
608
766
  }>;
767
+ /**
768
+ * Start a new QA session for exploratory testing
769
+ */
770
+ startSession(options?: StartSessionOptions): Promise<{
771
+ success: boolean;
772
+ session?: QASession;
773
+ error?: string;
774
+ }>;
775
+ /**
776
+ * End the current QA session
777
+ */
778
+ endSession(sessionId: string, options?: EndSessionOptions): Promise<{
779
+ success: boolean;
780
+ session?: QASession;
781
+ error?: string;
782
+ }>;
783
+ /**
784
+ * Get the current active session for the tester
785
+ */
786
+ getActiveSession(): Promise<QASession | null>;
787
+ /**
788
+ * Get a session by ID
789
+ */
790
+ getSession(sessionId: string): Promise<QASession | null>;
791
+ /**
792
+ * Get session history for the tester
793
+ */
794
+ getSessionHistory(limit?: number): Promise<QASession[]>;
795
+ /**
796
+ * Add a finding during a session
797
+ */
798
+ addFinding(sessionId: string, options: AddFindingOptions): Promise<{
799
+ success: boolean;
800
+ finding?: QAFinding;
801
+ error?: string;
802
+ }>;
803
+ /**
804
+ * Get findings for a session
805
+ */
806
+ getSessionFindings(sessionId: string): Promise<QAFinding[]>;
807
+ /**
808
+ * Convert a finding to a bug report
809
+ */
810
+ convertFindingToBug(findingId: string): Promise<{
811
+ success: boolean;
812
+ bugId?: string;
813
+ error?: string;
814
+ }>;
815
+ /**
816
+ * Dismiss a finding
817
+ */
818
+ dismissFinding(findingId: string, reason?: string): Promise<{
819
+ success: boolean;
820
+ error?: string;
821
+ }>;
822
+ /**
823
+ * Transform database session to QASession type
824
+ */
825
+ private transformSession;
826
+ /**
827
+ * Transform database finding to QAFinding type
828
+ */
829
+ private transformFinding;
609
830
  }
610
831
  /**
611
832
  * Create a BugBear client instance
@@ -667,4 +888,4 @@ declare function captureError(error: Error, errorInfo?: {
667
888
  componentStack?: string;
668
889
  };
669
890
 
670
- export { type AppContext, BugBearClient, type BugBearConfig, type BugBearReport, type BugBearTheme, type ChecklistItem, type ChecklistResult, type ConsoleLogEntry, type CoverageGap, type CoverageMatrixCell, type CoverageMatrixRow, type DeployChecklist, type DeviceInfo, type EnhancedBugContext, type HostUserInfo, type MessageSenderType, type NetworkRequest, type PriorityFactors, type QAHealthMetrics, type QAHealthScore, type QATrack, type RegressionEvent, type ReportStatus, type ReportType, type RoutePriority, type RouteTestStats, type RubricMode, type RubricResult, type Severity, type TestAssignment, type TestResult, type TestStep, type TestTemplate, type TesterInfo, type TesterMessage, type TesterProfileUpdate, type TesterThread, type ThreadPriority, type ThreadType, captureError, contextCapture, createBugBear };
891
+ export { type AddFindingOptions, type AppContext, BugBearClient, type BugBearConfig, type BugBearReport, type BugBearTheme, type ChecklistItem, type ChecklistResult, type ConsoleLogEntry, type CoverageGap, type CoverageMatrixCell, type CoverageMatrixRow, type DeployChecklist, type DeviceInfo, type EndSessionOptions, type EnhancedBugContext, type FindingSeverity, type FindingType, type HostUserInfo, type MessageSenderType, type NetworkRequest, type PriorityFactors, type QAFinding, type QAHealthMetrics, type QAHealthScore, type QASession, type QASessionStatus, type QATrack, type RegressionEvent, type ReportStatus, type ReportType, type RoutePriority, type RouteTestStats, type RubricMode, type RubricResult, type Severity, type StartSessionOptions, type SubmitFeedbackOptions, type TestAssignment, type TestFeedback, type TestResult, type TestStep, type TestTemplate, type TesterInfo, type TesterMessage, type TesterProfileUpdate, type TesterThread, type ThreadPriority, type ThreadType, captureError, contextCapture, createBugBear };
package/dist/index.d.ts CHANGED
@@ -186,6 +186,10 @@ interface TestAssignment {
186
186
  track?: QATrack;
187
187
  };
188
188
  status: 'pending' | 'in_progress' | 'passed' | 'failed' | 'blocked';
189
+ /** When the assignment was started (set to in_progress) */
190
+ startedAt?: string;
191
+ /** Duration in seconds (calculated when completed) */
192
+ durationSeconds?: number;
189
193
  }
190
194
  interface TestStep {
191
195
  stepNumber: number;
@@ -213,6 +217,37 @@ interface TestResult {
213
217
  /** Overall notes */
214
218
  notes?: string;
215
219
  }
220
+ /**
221
+ * Feedback from testers about a test case
222
+ * Helps improve test quality over time
223
+ */
224
+ interface TestFeedback {
225
+ /** Overall rating (1-5 stars) */
226
+ rating: 1 | 2 | 3 | 4 | 5;
227
+ /** Optional detailed ratings */
228
+ clarityRating?: 1 | 2 | 3 | 4 | 5;
229
+ stepsRating?: 1 | 2 | 3 | 4 | 5;
230
+ relevanceRating?: 1 | 2 | 3 | 4 | 5;
231
+ /** Free-form feedback note */
232
+ feedbackNote?: string;
233
+ /** Specific improvement suggestion */
234
+ suggestedImprovement?: string;
235
+ /** Quick feedback flags */
236
+ isOutdated?: boolean;
237
+ needsMoreDetail?: boolean;
238
+ stepsUnclear?: boolean;
239
+ expectedResultUnclear?: boolean;
240
+ }
241
+ /**
242
+ * Options for submitting test feedback
243
+ */
244
+ interface SubmitFeedbackOptions {
245
+ testCaseId: string;
246
+ assignmentId?: string;
247
+ feedback: TestFeedback;
248
+ /** Time taken to complete in seconds */
249
+ timeToCompleteSeconds?: number;
250
+ }
216
251
  interface TesterInfo {
217
252
  id: string;
218
253
  name: string;
@@ -442,6 +477,92 @@ interface CoverageMatrixRow {
442
477
  lastTestedAt: string | null;
443
478
  tracks: Record<string, CoverageMatrixCell>;
444
479
  }
480
+ /** Session status */
481
+ type QASessionStatus = 'active' | 'paused' | 'completed' | 'abandoned';
482
+ /** Finding type - lighter than a bug report */
483
+ type FindingType = 'bug' | 'concern' | 'suggestion' | 'question';
484
+ /** Finding severity - includes observation for non-issues */
485
+ type FindingSeverity = 'critical' | 'high' | 'medium' | 'low' | 'observation';
486
+ /** QA Session - exploratory testing session */
487
+ interface QASession {
488
+ id: string;
489
+ projectId: string;
490
+ testerId: string;
491
+ /** Area being explored */
492
+ focusArea?: string;
493
+ /** QA track focus */
494
+ track?: string;
495
+ /** Platform being tested */
496
+ platform?: string;
497
+ /** Timing */
498
+ startedAt: string;
499
+ endedAt?: string;
500
+ /** Session notes */
501
+ notes?: string;
502
+ /** Routes visited during session */
503
+ routesCovered: string[];
504
+ /** Status */
505
+ status: QASessionStatus;
506
+ /** Metrics */
507
+ durationMinutes?: number;
508
+ findingsCount: number;
509
+ bugsFiled: number;
510
+ createdAt: string;
511
+ updatedAt: string;
512
+ }
513
+ /** QA Finding - quick observation during a session */
514
+ interface QAFinding {
515
+ id: string;
516
+ sessionId: string;
517
+ projectId: string;
518
+ /** Type of finding */
519
+ type: FindingType;
520
+ /** Severity level */
521
+ severity: FindingSeverity;
522
+ /** Content */
523
+ title: string;
524
+ description?: string;
525
+ /** Context (auto-captured) */
526
+ route?: string;
527
+ screenshotUrl?: string;
528
+ consoleLogs?: ConsoleLogEntry[];
529
+ networkSnapshot?: NetworkRequest[];
530
+ deviceInfo?: DeviceInfo;
531
+ appContext?: AppContext;
532
+ /** Conversion tracking */
533
+ convertedToBugId?: string;
534
+ convertedToTestId?: string;
535
+ /** Dismissal */
536
+ dismissed: boolean;
537
+ dismissedReason?: string;
538
+ dismissedAt?: string;
539
+ createdAt: string;
540
+ updatedAt: string;
541
+ }
542
+ /** Options for starting a QA session */
543
+ interface StartSessionOptions {
544
+ focusArea?: string;
545
+ track?: string;
546
+ platform?: string;
547
+ }
548
+ /** Options for ending a QA session */
549
+ interface EndSessionOptions {
550
+ notes?: string;
551
+ routesCovered?: string[];
552
+ }
553
+ /** Options for adding a finding */
554
+ interface AddFindingOptions {
555
+ type: FindingType;
556
+ title: string;
557
+ description?: string;
558
+ severity?: FindingSeverity;
559
+ route?: string;
560
+ screenshotUrl?: string;
561
+ consoleLogs?: ConsoleLogEntry[];
562
+ networkSnapshot?: NetworkRequest[];
563
+ deviceInfo?: DeviceInfo;
564
+ appContext?: AppContext;
565
+ }
445
566
 
446
567
  /**
447
568
  * BugBear Client
@@ -480,6 +601,43 @@ declare class BugBearClient {
480
601
  * First looks up the tester by email, then fetches their assignments
481
602
  */
482
603
  getAssignedTests(): Promise<TestAssignment[]>;
604
+ /**
605
+ * Get assignment by ID with time tracking fields
606
+ */
607
+ getAssignment(assignmentId: string): Promise<(TestAssignment & {
608
+ startedAt?: string;
609
+ durationSeconds?: number;
610
+ }) | null>;
611
+ /**
612
+ * Update assignment status with automatic time tracking
613
+ * - Sets started_at when status changes to 'in_progress'
614
+ * - Calculates duration_seconds when status changes to 'passed'/'failed'/'blocked'
615
+ * - Optionally include feedback when completing a test
616
+ */
617
+ updateAssignmentStatus(assignmentId: string, status: TestAssignment['status'], options?: {
618
+ notes?: string;
619
+ testResult?: TestResult;
620
+ /** Include feedback when completing the test */
621
+ feedback?: TestFeedback;
622
+ }): Promise<{
623
+ success: boolean;
624
+ error?: string;
625
+ durationSeconds?: number;
626
+ }>;
627
+ /**
628
+ * Submit feedback on a test case to help improve test quality
629
+ * This empowers testers to shape better tests over time
630
+ */
631
+ submitTestFeedback(options: SubmitFeedbackOptions): Promise<{
632
+ success: boolean;
633
+ error?: string;
634
+ }>;
635
+ /**
636
+ * Get the currently active (in_progress) assignment for the tester
637
+ */
638
+ getActiveAssignment(): Promise<(TestAssignment & {
639
+ startedAt?: string;
640
+ }) | null>;
483
641
  /**
484
642
  * Get current tester info
485
643
  * Looks up tester by email from the host app's authenticated user
@@ -606,6 +764,69 @@ declare class BugBearClient {
606
764
  threadId?: string;
607
765
  error?: string;
608
766
  }>;
767
+ /**
768
+ * Start a new QA session for exploratory testing
769
+ */
770
+ startSession(options?: StartSessionOptions): Promise<{
771
+ success: boolean;
772
+ session?: QASession;
773
+ error?: string;
774
+ }>;
775
+ /**
776
+ * End the current QA session
777
+ */
778
+ endSession(sessionId: string, options?: EndSessionOptions): Promise<{
779
+ success: boolean;
780
+ session?: QASession;
781
+ error?: string;
782
+ }>;
783
+ /**
784
+ * Get the current active session for the tester
785
+ */
786
+ getActiveSession(): Promise<QASession | null>;
787
+ /**
788
+ * Get a session by ID
789
+ */
790
+ getSession(sessionId: string): Promise<QASession | null>;
791
+ /**
792
+ * Get session history for the tester
793
+ */
794
+ getSessionHistory(limit?: number): Promise<QASession[]>;
795
+ /**
796
+ * Add a finding during a session
797
+ */
798
+ addFinding(sessionId: string, options: AddFindingOptions): Promise<{
799
+ success: boolean;
800
+ finding?: QAFinding;
801
+ error?: string;
802
+ }>;
803
+ /**
804
+ * Get findings for a session
805
+ */
806
+ getSessionFindings(sessionId: string): Promise<QAFinding[]>;
807
+ /**
808
+ * Convert a finding to a bug report
809
+ */
810
+ convertFindingToBug(findingId: string): Promise<{
811
+ success: boolean;
812
+ bugId?: string;
813
+ error?: string;
814
+ }>;
815
+ /**
816
+ * Dismiss a finding
817
+ */
818
+ dismissFinding(findingId: string, reason?: string): Promise<{
819
+ success: boolean;
820
+ error?: string;
821
+ }>;
822
+ /**
823
+ * Transform database session to QASession type
824
+ */
825
+ private transformSession;
826
+ /**
827
+ * Transform database finding to QAFinding type
828
+ */
829
+ private transformFinding;
609
830
  }
610
831
  /**
611
832
  * Create a BugBear client instance
@@ -667,4 +888,4 @@ declare function captureError(error: Error, errorInfo?: {
667
888
  componentStack?: string;
668
889
  };
669
890
 
670
- export { type AppContext, BugBearClient, type BugBearConfig, type BugBearReport, type BugBearTheme, type ChecklistItem, type ChecklistResult, type ConsoleLogEntry, type CoverageGap, type CoverageMatrixCell, type CoverageMatrixRow, type DeployChecklist, type DeviceInfo, type EnhancedBugContext, type HostUserInfo, type MessageSenderType, type NetworkRequest, type PriorityFactors, type QAHealthMetrics, type QAHealthScore, type QATrack, type RegressionEvent, type ReportStatus, type ReportType, type RoutePriority, type RouteTestStats, type RubricMode, type RubricResult, type Severity, type TestAssignment, type TestResult, type TestStep, type TestTemplate, type TesterInfo, type TesterMessage, type TesterProfileUpdate, type TesterThread, type ThreadPriority, type ThreadType, captureError, contextCapture, createBugBear };
891
+ export { type AddFindingOptions, type AppContext, BugBearClient, type BugBearConfig, type BugBearReport, type BugBearTheme, type ChecklistItem, type ChecklistResult, type ConsoleLogEntry, type CoverageGap, type CoverageMatrixCell, type CoverageMatrixRow, type DeployChecklist, type DeviceInfo, type EndSessionOptions, type EnhancedBugContext, type FindingSeverity, type FindingType, type HostUserInfo, type MessageSenderType, type NetworkRequest, type PriorityFactors, type QAFinding, type QAHealthMetrics, type QAHealthScore, type QASession, type QASessionStatus, type QATrack, type RegressionEvent, type ReportStatus, type ReportType, type RoutePriority, type RouteTestStats, type RubricMode, type RubricResult, type Severity, type StartSessionOptions, type SubmitFeedbackOptions, type TestAssignment, type TestFeedback, type TestResult, type TestStep, type TestTemplate, type TesterInfo, type TesterMessage, type TesterProfileUpdate, type TesterThread, type ThreadPriority, type ThreadType, captureError, contextCapture, createBugBear };