diff --git a/examples/react/kitchen-sink/src/main.tsx b/examples/react/kitchen-sink/src/main.tsx index dec9ab4263..43a319eafa 100644 --- a/examples/react/kitchen-sink/src/main.tsx +++ b/examples/react/kitchen-sink/src/main.tsx @@ -693,6 +693,7 @@ function App() { }, keepPinnedRows: true, debugTable: true, + autoResetExpanded: false, // keep expanded rows during filtering changes }, (state) => state, // default selector ) diff --git a/packages/table-core/src/core/columns/coreColumnsFeature.utils.ts b/packages/table-core/src/core/columns/coreColumnsFeature.utils.ts index 6803f48a86..5901595f1c 100644 --- a/packages/table-core/src/core/columns/coreColumnsFeature.utils.ts +++ b/packages/table-core/src/core/columns/coreColumnsFeature.utils.ts @@ -218,7 +218,7 @@ export function table_getAllLeafColumns< table, 'getOrderColumns', table_getOrderColumnsFn, - )(leafColumns) + )(leafColumns) as Array> } /** diff --git a/packages/table-core/src/core/headers/buildHeaderGroups.ts b/packages/table-core/src/core/headers/buildHeaderGroups.ts index 386858caee..f0c913a117 100644 --- a/packages/table-core/src/core/headers/buildHeaderGroups.ts +++ b/packages/table-core/src/core/headers/buildHeaderGroups.ts @@ -113,7 +113,9 @@ export function buildHeaderGroups< pendingParentHeaders.push(header) } - headerGroup.headers.push(headerToGroup) + headerGroup.headers.push( + headerToGroup as Header, + ) headerToGroup.headerGroup = headerGroup }) diff --git a/packages/table-core/src/features/column-filtering/columnFilteringFeature.utils.ts b/packages/table-core/src/features/column-filtering/columnFilteringFeature.utils.ts index 8b759affa7..fb09fe8f4a 100644 --- a/packages/table-core/src/features/column-filtering/columnFilteringFeature.utils.ts +++ b/packages/table-core/src/features/column-filtering/columnFilteringFeature.utils.ts @@ -323,7 +323,7 @@ export function shouldAutoRemoveFilter< ) { return ( (filterFn && filterFn.autoRemove - ? filterFn.autoRemove(value, column as Column_Internal) + ? filterFn.autoRemove(value, column as any) : false) || typeof value === 'undefined' || (typeof value === 'string' && !value) diff --git a/packages/table-core/src/features/column-pinning/columnPinningFeature.utils.ts b/packages/table-core/src/features/column-pinning/columnPinningFeature.utils.ts index 069063420d..4bb3f4305f 100644 --- a/packages/table-core/src/features/column-pinning/columnPinningFeature.utils.ts +++ b/packages/table-core/src/features/column-pinning/columnPinningFeature.utils.ts @@ -13,7 +13,7 @@ import type { Row } from '../../types/Row' import type { CellData, RowData, Updater } from '../../types/type-utils' import type { TableFeatures } from '../../types/TableFeatures' import type { Table_Internal } from '../../types/Table' -import type { Column_Internal } from '../../types/Column' +import type { Column, Column_Internal } from '../../types/Column' import type { ColumnPinningPosition, ColumnPinningState, @@ -364,15 +364,11 @@ export function table_getLeftHeaderGroups< TData extends RowData, >(table: Table_Internal) { const allColumns = table.getAllColumns() - const leafColumnsById = table.getAllLeafColumnsById() as Record< - string, - Column_Internal - > + const leafColumnsById = table.getAllLeafColumnsById() const { left } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState() - const orderedLeafColumns: Array> = - [] + const orderedLeafColumns: Array> = [] for (let i = 0; i < left.length; i++) { const column = leafColumnsById[left[i]!] if ( @@ -402,15 +398,11 @@ export function table_getRightHeaderGroups< TData extends RowData, >(table: Table_Internal) { const allColumns = table.getAllColumns() - const leafColumnsById = table.getAllLeafColumnsById() as Record< - string, - Column_Internal - > + const leafColumnsById = table.getAllLeafColumnsById() const { right } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState() - const orderedLeafColumns: Array> = - [] + const orderedLeafColumns: Array> = [] for (let i = 0; i < right.length; i++) { const column = leafColumnsById[right[i]!] if ( @@ -446,7 +438,7 @@ export function table_getCenterHeaderGroups< table, 'getVisibleLeafColumns', table_getVisibleLeafColumns, - ) as unknown as Array> + ) const { left, right } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState() const leftAndRight: Array = [...left, ...right] diff --git a/packages/table-core/src/features/column-resizing/columnResizingFeature.types.ts b/packages/table-core/src/features/column-resizing/columnResizingFeature.types.ts index d8c827ce66..1c03a4e89d 100644 --- a/packages/table-core/src/features/column-resizing/columnResizingFeature.types.ts +++ b/packages/table-core/src/features/column-resizing/columnResizingFeature.types.ts @@ -54,11 +54,8 @@ export interface Table_ColumnResizing { resetHeaderSizeInfo: (defaultState?: boolean) => void /** * Updates transient resize interaction state with a next state or updater function. - * - * The lowercase `c` in this API name matches the current generated v9 table - * API for the `columnResizing` state slice. */ - setcolumnResizing: (updater: Updater) => void + setColumnResizing: (updater: Updater) => void } export interface ColumnDef_ColumnResizing { diff --git a/packages/table-core/src/features/global-filtering/globalFilteringFeature.utils.ts b/packages/table-core/src/features/global-filtering/globalFilteringFeature.utils.ts index 49abdebd19..588475f7f7 100644 --- a/packages/table-core/src/features/global-filtering/globalFilteringFeature.utils.ts +++ b/packages/table-core/src/features/global-filtering/globalFilteringFeature.utils.ts @@ -26,7 +26,7 @@ export function column_getCanGlobalFilter< (column.columnDef.enableGlobalFilter ?? true) && (column.table.options.enableGlobalFilter ?? true) && (column.table.options.enableFilters ?? true) && - (column.table.options.getColumnCanGlobalFilter?.(column) ?? true) && + (column.table.options.getColumnCanGlobalFilter?.(column as any) ?? true) && !!column.accessorFn ) } diff --git a/packages/table-core/src/helpers/columnHelper.ts b/packages/table-core/src/helpers/columnHelper.ts index beaea18690..e5328cda35 100644 --- a/packages/table-core/src/helpers/columnHelper.ts +++ b/packages/table-core/src/helpers/columnHelper.ts @@ -10,10 +10,10 @@ import type { IdentifiedColumnDef, } from '../types/ColumnDef' -export type ColumnHelper< - TFeatures extends TableFeatures, - TData extends RowData, -> = { +export interface ColumnHelper< + in out TFeatures extends TableFeatures, + in out TData extends RowData, +> { /** * Creates a data column definition with an accessor key or function to extract the cell value. * @example diff --git a/packages/table-core/src/types/Column.ts b/packages/table-core/src/types/Column.ts index c98f24cd1d..59d12ad91d 100644 --- a/packages/table-core/src/types/Column.ts +++ b/packages/table-core/src/types/Column.ts @@ -42,10 +42,10 @@ export type Column< > = Column_Core & ExtractFeatureMapTypes> -export type Column_Internal< - TFeatures extends TableFeatures, - TData extends RowData, +export interface Column_Internal< + in out TFeatures extends TableFeatures, + in out TData extends RowData, TValue = unknown, -> = Column & { +> extends Omit, 'columnDef'> { columnDef: ColumnDefBase_All } diff --git a/packages/table-core/src/types/HeaderGroup.ts b/packages/table-core/src/types/HeaderGroup.ts index eb22ce5ea0..748f3d6a74 100644 --- a/packages/table-core/src/types/HeaderGroup.ts +++ b/packages/table-core/src/types/HeaderGroup.ts @@ -7,7 +7,7 @@ export interface HeaderGroup_Core< in out TData extends RowData, > extends HeaderGroup_Header {} -export type HeaderGroup< - TFeatures extends TableFeatures, - TData extends RowData, -> = HeaderGroup_Core +export interface HeaderGroup< + in out TFeatures extends TableFeatures, + in out TData extends RowData, +> extends HeaderGroup_Core {} diff --git a/packages/table-core/src/types/RowModel.ts b/packages/table-core/src/types/RowModel.ts index 217d2fb3af..04a413a3dc 100644 --- a/packages/table-core/src/types/RowModel.ts +++ b/packages/table-core/src/types/RowModel.ts @@ -33,10 +33,10 @@ export type CachedRowModels< CachedRowModels_FeatureMap > -export type CachedRowModel_All< - TFeatures extends TableFeatures, - TData extends RowData = any, -> = Partial< +export interface CachedRowModel_All< + in out TFeatures extends TableFeatures, + in out TData extends RowData = any, +> extends Partial< CachedRowModel_Core & CachedRowModel_Expanded & CachedRowModel_Faceted & @@ -44,4 +44,4 @@ export type CachedRowModel_All< CachedRowModel_Grouped & CachedRowModel_Paginated & CachedRowModel_Sorted -> +> {} diff --git a/packages/table-core/src/types/RowModelFns.ts b/packages/table-core/src/types/RowModelFns.ts index 27d880376f..09faeac541 100644 --- a/packages/table-core/src/types/RowModelFns.ts +++ b/packages/table-core/src/types/RowModelFns.ts @@ -22,11 +22,11 @@ export type RowModelFns< ExtractFeatureMapTypes> > -export type RowModelFns_All< - TFeatures extends TableFeatures, - TData extends RowData, -> = Partial< +export interface RowModelFns_All< + in out TFeatures extends TableFeatures, + in out TData extends RowData, +> extends Partial< RowModelFns_ColumnFiltering & RowModelFns_ColumnGrouping & RowModelFns_RowSorting -> +> {} diff --git a/packages/table-core/src/types/Table.ts b/packages/table-core/src/types/Table.ts index 84c7bfaa7e..829b657344 100644 --- a/packages/table-core/src/types/Table.ts +++ b/packages/table-core/src/types/Table.ts @@ -36,14 +36,16 @@ import type { DebugOptions, TableOptions_All } from './TableOptions' * The core table object that only includes the core table functionality such as column, header, row, and table APIS. * No features are included. */ -export type Table_Core< - TFeatures extends TableFeatures, - TData extends RowData, -> = Table_Table & - Table_Columns & - Table_Rows & - Table_RowModels & - Table_Headers +export interface Table_Core< + in out TFeatures extends TableFeatures, + in out TData extends RowData, +> + extends + Table_Table, + Table_Columns, + Table_Rows, + Table_RowModels, + Table_Headers {} export interface Table_FeatureMap< in out TFeatures extends TableFeatures, @@ -88,15 +90,6 @@ type Table_InternalBroadenedKeys = /** * Internal broad table shape used by feature implementations. - * - * Declared as an interface extending every stock feature's table API (rather - * than the feature-conditional `Table` intersection) so that the compiler can - * relate `Table_Internal` instantiations nominally instead of structurally - * re-expanding the feature-map conditional for every internal call site. - * Mirrors the `*_All` convention used for options, state, and row models. - * Type parameters are annotated `in out` (invariant) so the checker can relate - * instantiations by their type arguments without measuring variance or falling - * back to member-by-member structural comparison. */ export interface Table_Internal< in out TFeatures extends TableFeatures, @@ -107,21 +100,7 @@ export interface Table_Internal< Table_Columns, Table_Rows, Table_RowModels, - Table_Headers, - Table_ColumnFiltering, - Table_ColumnGrouping, - Table_ColumnOrdering, - Table_ColumnPinning, - Table_ColumnResizing, - Table_ColumnSizing, - Table_ColumnVisibility, - Table_ColumnFaceting, - Table_GlobalFiltering, - Table_RowExpanding, - Table_RowPagination, - Table_RowPinning, - Table_RowSelection, - Table_RowSorting { + Table_Headers { _rowModels: CachedRowModel_All _rowModelFns: RowModelFns_All options: DebugOptions & diff --git a/packages/table-core/src/types/TableState.ts b/packages/table-core/src/types/TableState.ts index d8459df545..e3f0b1eaf0 100644 --- a/packages/table-core/src/types/TableState.ts +++ b/packages/table-core/src/types/TableState.ts @@ -44,4 +44,18 @@ export type TableState = * Feature internals use this when they may need to inspect optional slices owned * by other features. */ -export type TableState_All = Partial> +export interface TableState_All extends Partial< + TableState_ColumnFiltering & + TableState_ColumnGrouping & + TableState_ColumnOrdering & + TableState_ColumnPinning & + TableState_ColumnResizing & + TableState_ColumnSizing & + TableState_ColumnVisibility & + TableState_GlobalFiltering & + TableState_RowExpanding & + TableState_RowPagination & + TableState_RowPinning & + TableState_RowSelection & + TableState_RowSorting +> {} diff --git a/packages/table-core/tests/helpers/rowPinningHelpers.ts b/packages/table-core/tests/helpers/rowPinningHelpers.ts index 8b1ea4891d..401c57beab 100644 --- a/packages/table-core/tests/helpers/rowPinningHelpers.ts +++ b/packages/table-core/tests/helpers/rowPinningHelpers.ts @@ -1,5 +1,9 @@ +import { table } from 'node:console' import { vi } from 'vitest' -import { getDefaultRowPinningState } from '../../src/features/row-pinning/rowPinningFeature.utils' +import { + getDefaultRowPinningState, + table_setRowPinning, +} from '../../src/features/row-pinning/rowPinningFeature.utils' import { constructTable, coreFeatures, @@ -9,7 +13,14 @@ import { import { generateTestData } from '../fixtures/data/generateTestData' import { storeReactivityBindings } from '../../src/store-reactivity-bindings' import { generateTestTableWithData } from './generateTestTable' -import type { ColumnDef, RowPinningState, TableOptions } from '../../src' +import type { + ColumnDef, + RowPinningState, + StockFeatures, + TableOptions, + Table_Internal, + Table_RowPinning, +} from '../../src' import type { Person } from '../fixtures/data/types' // Define feature set with proper typing @@ -52,7 +63,8 @@ export function createTableWithPinningState( } export function createTableWithMockOnPinningChange(rowCount = 10): { - table: ReturnType + table: Table_Internal & + Table_RowPinning onRowPinningChangeMock: ReturnType } { const onRowPinningChangeMock = vi.fn() @@ -60,7 +72,8 @@ export function createTableWithMockOnPinningChange(rowCount = 10): { features: { rowPinning: rowPinningFeature, }, - } as any) + } as any) as Table_Internal & + Table_RowPinning table.options.onRowPinningChange = onRowPinningChangeMock return { table, onRowPinningChangeMock } } diff --git a/packages/table-core/tests/implementation/features/row-pinning/rowPinningFeature.test.ts b/packages/table-core/tests/implementation/features/row-pinning/rowPinningFeature.test.ts index 9a21154b1b..6a86570470 100644 --- a/packages/table-core/tests/implementation/features/row-pinning/rowPinningFeature.test.ts +++ b/packages/table-core/tests/implementation/features/row-pinning/rowPinningFeature.test.ts @@ -332,7 +332,7 @@ describe('row methods', () => { const { table, onRowPinningChangeMock } = createTableWithMockOnPinningChange() // Set up initial state with a pinned row - table.baseAtoms.rowPinning!.set({ + table.baseAtoms.rowPinning.set({ top: [ROW[0]], bottom: [], }) diff --git a/packages/table-core/tests/unit/core/tableAtoms.test.ts b/packages/table-core/tests/unit/core/tableAtoms.test.ts index 0670bf8226..d0f2eb4d23 100644 --- a/packages/table-core/tests/unit/core/tableAtoms.test.ts +++ b/packages/table-core/tests/unit/core/tableAtoms.test.ts @@ -11,7 +11,10 @@ import { storeReactivityBindings } from '../../../src/store-reactivity-bindings' import type { PaginationState, SortingState, + TableFeatures, Table_Internal, + Table_RowPagination, + Table_RowSorting, } from '../../../src' const features = { @@ -20,7 +23,11 @@ const features = { rowSortingFeature, } -function makeTable(options: any = {}) { +function makeTable( + options: any = {}, +): Table_Internal & + Table_RowSorting & + Table_RowPagination { return constructTable({ features: { ...coreFeatures, @@ -30,7 +37,9 @@ function makeTable(options: any = {}) { columns: [], data: [], ...options, - }) as unknown as Table_Internal + }) as unknown as Table_Internal & + Table_RowSorting & + Table_RowPagination } describe('three-layer atom architecture', () => { diff --git a/packages/table-core/tests/unit/features/column-pinning/columnPinningFeature.utils.test.ts b/packages/table-core/tests/unit/features/column-pinning/columnPinningFeature.utils.test.ts index db294ea042..e50fd05ebd 100644 --- a/packages/table-core/tests/unit/features/column-pinning/columnPinningFeature.utils.test.ts +++ b/packages/table-core/tests/unit/features/column-pinning/columnPinningFeature.utils.test.ts @@ -33,7 +33,14 @@ import { generateTestTableWithDataAndState, } from '../../../helpers/generateTestTable' import { getUpdaterResult } from '../../../helpers/testUtils' -import type { Header } from '../../../../src' +import type { Person } from '../../../fixtures/data/types' +import type { + Header, + StockFeatures, + Table_ColumnOrdering, + Table_ColumnPinning, + Table_Internal, +} from '../../../../src' describe('getDefaultColumnPinningState', () => { it('should return default column pinning state', () => { @@ -550,7 +557,8 @@ describe('table_getPinnedLeafColumns', () => { right: [], }, }, - }) + }) as Table_Internal & + Table_ColumnPinning const leafColumns = table_getPinnedLeafColumns(table, 'left') @@ -644,7 +652,8 @@ describe('column pinning table instance APIs', () => { age: false, }, }, - }) + }) as Table_Internal & + Table_ColumnPinning expect( table.getPinnedLeafColumns('left').map((col: { id: string }) => col.id), @@ -673,7 +682,9 @@ describe('column pinning table instance APIs', () => { it('should update center visible columns when column order changes', () => { const table = generateTestTableWithDataAndState(1, { features: stockFeatures, - }) + }) as Table_Internal & + Table_ColumnPinning & + Table_ColumnOrdering expect( table.getCenterVisibleLeafColumns().map((col: { id: string }) => col.id), diff --git a/packages/table-core/tests/unit/features/row-pinning/rowPinningFeature.utils.test.ts b/packages/table-core/tests/unit/features/row-pinning/rowPinningFeature.utils.test.ts index bd1f3e039f..11d538c3cd 100644 --- a/packages/table-core/tests/unit/features/row-pinning/rowPinningFeature.utils.test.ts +++ b/packages/table-core/tests/unit/features/row-pinning/rowPinningFeature.utils.test.ts @@ -486,7 +486,7 @@ describe('row_pin', () => { it('should unpin a row when position is false', () => { const { table, onRowPinningChangeMock } = createTableWithMockOnPinningChange() - table.baseAtoms.rowPinning!.set({ + table.baseAtoms.rowPinning.set({ top: [ROW[0]], bottom: [], }) @@ -508,9 +508,7 @@ describe('row_pin', () => { createTableWithMockOnPinningChange() const row = table.getRow('0') const leafRows = [{ id: LEAF[1] }, { id: LEAF[2] }] - vi.spyOn(row, 'getLeafRows').mockReturnValue( - leafRows as unknown as Array>, - ) + vi.spyOn(row, 'getLeafRows').mockReturnValue(leafRows as any) row_pin(row, 'top', true) @@ -528,9 +526,7 @@ describe('row_pin', () => { createTableWithMockOnPinningChange() const row = table.getRow('0') const parentRows = [{ id: PARENT[1] }, { id: PARENT[2] }] - vi.spyOn(row, 'getParentRows').mockReturnValue( - parentRows as unknown as Array>, - ) + vi.spyOn(row, 'getParentRows').mockReturnValue(parentRows as any) row_pin(row, 'top', false, true) @@ -546,7 +542,7 @@ describe('row_pin', () => { it('should maintain existing pinned rows when pinning additional rows', () => { const { table, onRowPinningChangeMock } = createTableWithMockOnPinningChange() - table.baseAtoms.rowPinning!.set({ + table.baseAtoms.rowPinning.set({ top: [ROW[1]], bottom: [ROW[2]], }) @@ -569,7 +565,7 @@ describe('row_pin', () => { it('should remove row from other position when moving between top and bottom', () => { const { table, onRowPinningChangeMock } = createTableWithMockOnPinningChange() - table.baseAtoms.rowPinning!.set({ + table.baseAtoms.rowPinning.set({ top: [ROW[0]], bottom: [], }) diff --git a/skills/github-issue-repro-and-fix/SKILL.md b/skills/github-issue-repro-and-fix/SKILL.md new file mode 100644 index 0000000000..00d6829125 --- /dev/null +++ b/skills/github-issue-repro-and-fix/SKILL.md @@ -0,0 +1,90 @@ +--- +name: github-issue-repro-and-fix +description: > + Investigate a GitHub issue, determine whether it is a real bug, reproduce it + with the smallest practical test or example, and apply a focused fix only + after the failing behavior is confirmed. Use this when asked to look at, + verify, triage, reproduce, or fix a GitHub issue in this repository. +--- + +# GitHub Issue Repro And Fix + +Use this skill when the user provides a GitHub issue URL, issue number, copied +issue body, or asks whether reported behavior is truly a bug before fixing it. + +## Workflow + +1. Gather the issue context. + - If given a URL or issue number, prefer `gh issue view --json title,body,comments,labels,author,state,url`. + - If `gh` is unavailable or unauthenticated, use the GitHub web page or ask the user only when the issue content cannot be accessed. + - Read the issue comments, not just the opening report. Comments often contain maintainer guidance, reproductions, workarounds, duplicate links, and notes that the issue was fixed elsewhere. + - Capture the exact reported behavior, expected behavior, environment, reproduction steps, linked repro repository or sandbox, maintainer comments, and any user-confirmed workarounds. + +2. Look for related upstream context. + - Search repository issues, pull requests, and discussions for the issue number, mentioned APIs, error text, and reproduction keywords. + - Prefer GitHub search or `gh search issues`/`gh search prs` when available. + - Note related PRs, discussions, duplicate issues, regression reports, and changelog entries before deciding whether to patch. + - If a related PR already fixed the issue, verify whether the local workspace contains that change before editing. + +3. Map the report to the codebase. + - Identify the package, adapter, example, docs page, or shared core module involved. + - Search with `rg` for mentioned APIs, options, error text, test names, and related implementation files. + - Read the nearest tests before editing so the existing behavior contract is clear. + +4. Verify whether the reported behavior is real. + - Reproduce the bug locally before changing implementation when feasible. + - Prefer the smallest focused failing test over a full example app. + - If a UI or framework issue cannot be captured by a unit test, use the smallest existing example or fixture that exercises the behavior. + - Record the failing command and failure mode. + - If the issue cannot be reproduced, inspect whether it is already fixed, invalid usage, version-specific, or missing information. + +5. Decide whether a fix is the correct library direction. + - Separate "the reported behavior happens" from "the library should change." + - Check whether the request conflicts with documented concepts, API semantics, type contracts, backwards compatibility, or maintainer comments. + - Consider whether the better outcome is a code fix, documentation clarification, warning/error improvement, example update, or closing as intended behavior. + - When the issue raises a product/API semantics tradeoff, ask the user for a decision before implementing. Present concise pros and cons for each viable path. + +6. Apply a focused fix only when the direction is confirmed. + - Change the narrowest implementation surface that explains the confirmed failure. + - Preserve public APIs unless the issue explicitly concerns an intended API change. + - Follow existing local patterns for feature registration, state handling, adapter behavior, and test style. + - Avoid broad refactors, unrelated formatting churn, or opportunistic cleanup. + +7. Prove the fix. + - Run the previously failing test or reproduction first. + - Run the nearest relevant package test, typecheck, or lint command if available and proportionate. + - If a regression test was possible, commit the failing scenario as part of the change. + - If no automated test was practical, document the manual verification steps and remaining risk. + +8. Report the outcome. + - State whether the GitHub report is a confirmed bug, duplicate/already fixed, unsupported usage, documentation gap, or inconclusive. + - If the behavior is real but not a bug, say that explicitly and explain the library contract that makes it intended behavior. + - Summarize the root cause and fix in concrete terms. + - Include the exact verification commands and results. + - Call out any test gaps or conditions that could not be reproduced. + +## Decision Rules + +- Do not patch first and infer the bug later. Establish a failing observation before editing whenever the repo makes that practical. +- Do not assume a confirmed reproduction means the requested change is desirable. Validate the request against the library's design model before fixing. +- Treat linked reproductions as evidence, not as proof. Reduce them to a local test or minimal local reproduction before changing shared code. +- If the issue is caused by misuse but the API makes the misuse easy, consider a docs update, runtime warning, or clearer type error only if it fits existing project conventions. +- If the report depends on old package versions, compare against the current workspace behavior and say clearly which version was tested. +- If the issue spans multiple framework adapters, fix shared core behavior first when the root cause is framework-agnostic; otherwise keep adapter-specific changes isolated. +- Do not run `git` commands, create commits, push branches, or open pull requests. Leave all git and PR operations to the user. + +## Useful Commands + +```sh +gh issue view --json title,body,comments,labels,author,state,url +gh search issues "" --repo TanStack/table +gh search prs "" --repo TanStack/table +rg "" +pnpm test +pnpm typecheck +pnpm lint +``` + +Prefer package-specific commands from `package.json` when they exist. Use the +smallest command that validates the touched behavior before running broader +checks.