@git-stunts/git-warp 10.8.0 → 11.3.3

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.
Files changed (136) hide show
  1. package/README.md +53 -32
  2. package/SECURITY.md +64 -0
  3. package/bin/cli/commands/check.js +168 -0
  4. package/bin/cli/commands/doctor/checks.js +422 -0
  5. package/bin/cli/commands/doctor/codes.js +46 -0
  6. package/bin/cli/commands/doctor/index.js +239 -0
  7. package/bin/cli/commands/doctor/types.js +89 -0
  8. package/bin/cli/commands/history.js +80 -0
  9. package/bin/cli/commands/info.js +139 -0
  10. package/bin/cli/commands/install-hooks.js +128 -0
  11. package/bin/cli/commands/materialize.js +99 -0
  12. package/bin/cli/commands/patch.js +142 -0
  13. package/bin/cli/commands/path.js +88 -0
  14. package/bin/cli/commands/query.js +235 -0
  15. package/bin/cli/commands/registry.js +32 -0
  16. package/bin/cli/commands/seek.js +598 -0
  17. package/bin/cli/commands/tree.js +230 -0
  18. package/bin/cli/commands/trust.js +154 -0
  19. package/bin/cli/commands/verify-audit.js +114 -0
  20. package/bin/cli/commands/view.js +46 -0
  21. package/bin/cli/infrastructure.js +350 -0
  22. package/bin/cli/schemas.js +177 -0
  23. package/bin/cli/shared.js +244 -0
  24. package/bin/cli/types.js +96 -0
  25. package/bin/presenters/index.js +41 -9
  26. package/bin/presenters/json.js +14 -12
  27. package/bin/presenters/text.js +286 -28
  28. package/bin/warp-graph.js +5 -2346
  29. package/index.d.ts +111 -21
  30. package/index.js +2 -0
  31. package/package.json +10 -8
  32. package/src/domain/WarpGraph.js +109 -3252
  33. package/src/domain/crdt/ORSet.js +8 -8
  34. package/src/domain/errors/EmptyMessageError.js +2 -2
  35. package/src/domain/errors/ForkError.js +1 -1
  36. package/src/domain/errors/IndexError.js +1 -1
  37. package/src/domain/errors/OperationAbortedError.js +1 -1
  38. package/src/domain/errors/QueryError.js +3 -3
  39. package/src/domain/errors/SchemaUnsupportedError.js +1 -1
  40. package/src/domain/errors/ShardCorruptionError.js +2 -2
  41. package/src/domain/errors/ShardLoadError.js +2 -2
  42. package/src/domain/errors/ShardValidationError.js +4 -4
  43. package/src/domain/errors/StorageError.js +2 -2
  44. package/src/domain/errors/SyncError.js +1 -1
  45. package/src/domain/errors/TraversalError.js +1 -1
  46. package/src/domain/errors/TrustError.js +29 -0
  47. package/src/domain/errors/WarpError.js +2 -2
  48. package/src/domain/errors/WormholeError.js +1 -1
  49. package/src/domain/errors/index.js +1 -0
  50. package/src/domain/services/AuditMessageCodec.js +137 -0
  51. package/src/domain/services/AuditReceiptService.js +471 -0
  52. package/src/domain/services/AuditVerifierService.js +707 -0
  53. package/src/domain/services/BitmapIndexBuilder.js +3 -3
  54. package/src/domain/services/BitmapIndexReader.js +28 -19
  55. package/src/domain/services/BoundaryTransitionRecord.js +18 -17
  56. package/src/domain/services/CheckpointSerializerV5.js +17 -16
  57. package/src/domain/services/CheckpointService.js +2 -2
  58. package/src/domain/services/CommitDagTraversalService.js +13 -13
  59. package/src/domain/services/DagPathFinding.js +7 -7
  60. package/src/domain/services/DagTopology.js +1 -1
  61. package/src/domain/services/DagTraversal.js +1 -1
  62. package/src/domain/services/HealthCheckService.js +1 -1
  63. package/src/domain/services/HookInstaller.js +1 -1
  64. package/src/domain/services/HttpSyncServer.js +120 -55
  65. package/src/domain/services/IndexRebuildService.js +7 -7
  66. package/src/domain/services/IndexStalenessChecker.js +4 -3
  67. package/src/domain/services/JoinReducer.js +11 -11
  68. package/src/domain/services/LogicalTraversal.js +1 -1
  69. package/src/domain/services/MessageCodecInternal.js +4 -1
  70. package/src/domain/services/MessageSchemaDetector.js +2 -2
  71. package/src/domain/services/MigrationService.js +1 -1
  72. package/src/domain/services/ObserverView.js +8 -8
  73. package/src/domain/services/PatchBuilderV2.js +42 -26
  74. package/src/domain/services/ProvenanceIndex.js +1 -1
  75. package/src/domain/services/ProvenancePayload.js +1 -1
  76. package/src/domain/services/QueryBuilder.js +3 -3
  77. package/src/domain/services/StateDiff.js +14 -11
  78. package/src/domain/services/StateSerializerV5.js +2 -2
  79. package/src/domain/services/StreamingBitmapIndexBuilder.js +26 -24
  80. package/src/domain/services/SyncAuthService.js +71 -4
  81. package/src/domain/services/SyncProtocol.js +25 -11
  82. package/src/domain/services/TemporalQuery.js +9 -6
  83. package/src/domain/services/TranslationCost.js +7 -5
  84. package/src/domain/services/WarpMessageCodec.js +4 -1
  85. package/src/domain/services/WormholeService.js +16 -7
  86. package/src/domain/trust/TrustCanonical.js +42 -0
  87. package/src/domain/trust/TrustCrypto.js +111 -0
  88. package/src/domain/trust/TrustEvaluator.js +195 -0
  89. package/src/domain/trust/TrustRecordService.js +281 -0
  90. package/src/domain/trust/TrustStateBuilder.js +222 -0
  91. package/src/domain/trust/canonical.js +68 -0
  92. package/src/domain/trust/reasonCodes.js +64 -0
  93. package/src/domain/trust/schemas.js +160 -0
  94. package/src/domain/trust/verdict.js +42 -0
  95. package/src/domain/types/TickReceipt.js +1 -1
  96. package/src/domain/types/WarpErrors.js +45 -0
  97. package/src/domain/types/WarpOptions.js +29 -0
  98. package/src/domain/types/WarpPersistence.js +41 -0
  99. package/src/domain/types/WarpTypes.js +2 -2
  100. package/src/domain/types/WarpTypesV2.js +2 -2
  101. package/src/domain/types/git-cas.d.ts +20 -0
  102. package/src/domain/utils/MinHeap.js +6 -5
  103. package/src/domain/utils/RefLayout.js +59 -0
  104. package/src/domain/utils/canonicalStringify.js +5 -4
  105. package/src/domain/utils/roaring.js +31 -5
  106. package/src/domain/warp/PatchSession.js +26 -17
  107. package/src/domain/warp/Writer.js +18 -3
  108. package/src/domain/warp/_internal.js +26 -0
  109. package/src/domain/warp/_wire.js +58 -0
  110. package/src/domain/warp/_wiredMethods.d.ts +254 -0
  111. package/src/domain/warp/checkpoint.methods.js +401 -0
  112. package/src/domain/warp/fork.methods.js +323 -0
  113. package/src/domain/warp/materialize.methods.js +238 -0
  114. package/src/domain/warp/materializeAdvanced.methods.js +350 -0
  115. package/src/domain/warp/patch.methods.js +554 -0
  116. package/src/domain/warp/provenance.methods.js +286 -0
  117. package/src/domain/warp/query.methods.js +280 -0
  118. package/src/domain/warp/subscribe.methods.js +272 -0
  119. package/src/domain/warp/sync.methods.js +554 -0
  120. package/src/globals.d.ts +64 -0
  121. package/src/infrastructure/adapters/BunHttpAdapter.js +14 -9
  122. package/src/infrastructure/adapters/CasSeekCacheAdapter.js +9 -4
  123. package/src/infrastructure/adapters/DenoHttpAdapter.js +5 -6
  124. package/src/infrastructure/adapters/GitGraphAdapter.js +79 -11
  125. package/src/infrastructure/adapters/InMemoryGraphAdapter.js +36 -0
  126. package/src/infrastructure/adapters/NodeHttpAdapter.js +2 -2
  127. package/src/infrastructure/adapters/WebCryptoAdapter.js +2 -2
  128. package/src/ports/CommitPort.js +10 -0
  129. package/src/ports/RefPort.js +17 -0
  130. package/src/visualization/layouts/converters.js +2 -2
  131. package/src/visualization/layouts/elkAdapter.js +1 -1
  132. package/src/visualization/layouts/elkLayout.js +10 -7
  133. package/src/visualization/layouts/index.js +1 -1
  134. package/src/visualization/renderers/ascii/seek.js +16 -6
  135. package/src/visualization/renderers/svg/index.js +1 -1
  136. package/src/hooks/post-merge.sh +0 -60
package/index.d.ts CHANGED
@@ -558,6 +558,25 @@ export interface GitPlumbing {
558
558
  executeStream(options: { args: string[] }): Promise<AsyncIterable<Uint8Array> & { collect(opts?: { asString?: boolean }): Promise<Buffer | string> }>;
559
559
  }
560
560
 
561
+ /**
562
+ * In-memory persistence adapter for fast unit/integration tests.
563
+ *
564
+ * Implements the same GraphPersistencePort contract as GitGraphAdapter
565
+ * but stores all data in Maps — no real Git I/O required.
566
+ */
567
+ export class InMemoryGraphAdapter extends GraphPersistencePort {
568
+ constructor();
569
+
570
+ get emptyTree(): string;
571
+ commitNode(options: CreateNodeOptions): Promise<string>;
572
+ showNode(sha: string): Promise<string>;
573
+ getNodeInfo(sha: string): Promise<NodeInfo>;
574
+ logNodesStream(options: ListNodesOptions & { format: string }): Promise<AsyncIterable<Uint8Array | string>>;
575
+ logNodes(options: ListNodesOptions & { format: string }): Promise<string>;
576
+ ping(): Promise<PingResult>;
577
+ countNodes(ref: string): Promise<number>;
578
+ }
579
+
561
580
  /**
562
581
  * Implementation of GraphPersistencePort and IndexStoragePort using GitPlumbing.
563
582
  */
@@ -1022,7 +1041,7 @@ export class SyncError extends Error {
1022
1041
  * Base error class for bitmap index operations.
1023
1042
  */
1024
1043
  export class IndexError extends Error {
1025
- readonly name: 'IndexError';
1044
+ readonly name: string;
1026
1045
  readonly code: string;
1027
1046
  readonly context: Record<string, unknown>;
1028
1047
 
@@ -1283,12 +1302,65 @@ export interface TemporalQuery {
1283
1302
  ): Promise<boolean>;
1284
1303
  }
1285
1304
 
1305
+ // ============================================================================
1306
+ // PatchV2 & PatchBuilderV2
1307
+ // ============================================================================
1308
+
1309
+ /**
1310
+ * WARP V5 patch object (schema 2 or 3).
1311
+ */
1312
+ export interface PatchV2 {
1313
+ /** Schema version (2 for node/edge ops, 3 if edge properties present) */
1314
+ schema: 2 | 3;
1315
+ /** Writer ID */
1316
+ writer: string;
1317
+ /** Lamport timestamp for ordering */
1318
+ lamport: number;
1319
+ /** Writer's observed frontier (version vector) */
1320
+ context: Record<string, number>;
1321
+ /** Ordered array of operations */
1322
+ ops: unknown[];
1323
+ /** Node/edge IDs read by this patch (provenance tracking) */
1324
+ reads?: string[];
1325
+ /** Node/edge IDs written by this patch (provenance tracking) */
1326
+ writes?: string[];
1327
+ }
1328
+
1329
+ /**
1330
+ * Fluent builder for creating WARP v5 patches with OR-Set semantics.
1331
+ *
1332
+ * Returned by WarpGraph.createPatch(). Chain mutation methods then call
1333
+ * commit() to persist the patch atomically.
1334
+ */
1335
+ export class PatchBuilderV2 {
1336
+ /** Adds a node to the graph. */
1337
+ addNode(nodeId: string): PatchBuilderV2;
1338
+ /** Removes a node from the graph. */
1339
+ removeNode(nodeId: string): PatchBuilderV2;
1340
+ /** Adds an edge between two nodes. */
1341
+ addEdge(from: string, to: string, label: string): PatchBuilderV2;
1342
+ /** Removes an edge between two nodes. */
1343
+ removeEdge(from: string, to: string, label: string): PatchBuilderV2;
1344
+ /** Sets a property on a node. */
1345
+ setProperty(nodeId: string, key: string, value: unknown): PatchBuilderV2;
1346
+ /** Sets a property on an edge. */
1347
+ setEdgeProperty(from: string, to: string, label: string, key: string, value: unknown): PatchBuilderV2;
1348
+ /** Builds the PatchV2 object without committing. */
1349
+ build(): PatchV2;
1350
+ /** Commits the patch to the graph and returns the commit SHA. */
1351
+ commit(): Promise<string>;
1352
+ /** Number of operations in this patch. */
1353
+ readonly opCount: number;
1354
+ }
1355
+
1286
1356
  // ============================================================================
1287
1357
  // Writer & PatchSession
1288
1358
  // ============================================================================
1289
1359
 
1290
1360
  /**
1291
1361
  * Fluent patch session for building and committing graph mutations.
1362
+ *
1363
+ * Created by Writer.beginPatch(). Wraps a PatchBuilderV2 with CAS protection.
1292
1364
  */
1293
1365
  export class PatchSession {
1294
1366
  /** Adds a node to the graph. */
@@ -1301,8 +1373,10 @@ export class PatchSession {
1301
1373
  removeEdge(from: string, to: string, label: string): this;
1302
1374
  /** Sets a property on a node. */
1303
1375
  setProperty(nodeId: string, key: string, value: unknown): this;
1304
- /** Builds the patch object without committing. */
1305
- build(): unknown;
1376
+ /** Sets a property on an edge. */
1377
+ setEdgeProperty(from: string, to: string, label: string, key: string, value: unknown): this;
1378
+ /** Builds the PatchV2 object without committing. */
1379
+ build(): PatchV2;
1306
1380
  /** Commits the patch with CAS protection. */
1307
1381
  commit(): Promise<string>;
1308
1382
  /** Number of operations in this patch. */
@@ -1321,7 +1395,10 @@ export class Writer {
1321
1395
  head(): Promise<string | null>;
1322
1396
  /** Begins a new patch session. */
1323
1397
  beginPatch(): Promise<PatchSession>;
1324
- /** Builds and commits a patch in one call. */
1398
+ /**
1399
+ * Builds and commits a patch in one call.
1400
+ * @throws {WriterError} COMMIT_IN_PROGRESS if called while another commitPatch() is in progress (not reentrant)
1401
+ */
1325
1402
  commitPatch(build: (p: PatchSession) => void | Promise<void>): Promise<string>;
1326
1403
  }
1327
1404
 
@@ -1419,6 +1496,7 @@ export interface ApplySyncResult {
1419
1496
  export interface SyncAuthServerOptions {
1420
1497
  keys: Record<string, string>;
1421
1498
  mode?: 'enforce' | 'log-only';
1499
+ allowedWriters?: string[];
1422
1500
  }
1423
1501
 
1424
1502
  /**
@@ -1485,6 +1563,7 @@ export default class WarpGraph {
1485
1563
  compactOnCheckpoint?: boolean;
1486
1564
  };
1487
1565
  checkpointPolicy?: { every: number };
1566
+ /** If true (default), query methods auto-materialize when no cached state exists. */
1488
1567
  autoMaterialize?: boolean;
1489
1568
  onDeleteWithData?: 'reject' | 'cascade' | 'warn';
1490
1569
  clock?: ClockPort;
@@ -1510,9 +1589,21 @@ export default class WarpGraph {
1510
1589
  setSeekCache(cache: SeekCachePort | null): void;
1511
1590
 
1512
1591
  /**
1513
- * Creates a new patch for adding operations.
1592
+ * Creates a new PatchBuilderV2 for adding operations.
1593
+ */
1594
+ createPatch(): Promise<PatchBuilderV2>;
1595
+
1596
+ /**
1597
+ * Convenience wrapper: creates a patch, runs the callback, and commits.
1598
+ *
1599
+ * The callback receives a PatchBuilderV2 and may be synchronous or
1600
+ * asynchronous. The commit happens only after the callback resolves.
1601
+ * If the callback throws or rejects, no commit is attempted.
1602
+ *
1603
+ * Not reentrant: calling `graph.patch()` inside a callback throws.
1604
+ * Use `createPatch()` directly for nested or concurrent patches.
1514
1605
  */
1515
- createPatch(): Promise<unknown>;
1606
+ patch(build: (patch: PatchBuilderV2) => void | Promise<void>): Promise<string>;
1516
1607
 
1517
1608
  /**
1518
1609
  * Returns patches from a writer's ref chain.
@@ -1520,7 +1611,7 @@ export default class WarpGraph {
1520
1611
  getWriterPatches(
1521
1612
  writerId: string,
1522
1613
  stopAtSha?: string | null
1523
- ): Promise<Array<{ patch: unknown; sha: string }>>;
1614
+ ): Promise<Array<{ patch: PatchV2; sha: string }>>;
1524
1615
 
1525
1616
  /**
1526
1617
  * Gets all visible nodes in the materialized state.
@@ -1592,7 +1683,7 @@ export default class WarpGraph {
1592
1683
  /**
1593
1684
  * Materializes graph state from a checkpoint, applying incremental patches.
1594
1685
  */
1595
- materializeAt(checkpointSha: string): Promise<unknown>;
1686
+ materializeAt(checkpointSha: string): Promise<WarpStateV5>;
1596
1687
 
1597
1688
  /**
1598
1689
  * Logical graph traversal helpers.
@@ -1625,8 +1716,12 @@ export default class WarpGraph {
1625
1716
 
1626
1717
  /**
1627
1718
  * Materializes the current graph state from all patches.
1719
+ *
1720
+ * When `options.receipts` is true, returns `{ state, receipts }`.
1721
+ * Otherwise returns the WarpStateV5 directly.
1628
1722
  */
1629
- materialize(): Promise<unknown>;
1723
+ materialize(options: { receipts: true; ceiling?: number | null }): Promise<{ state: WarpStateV5; receipts: TickReceipt[] }>;
1724
+ materialize(options?: { receipts?: false; ceiling?: number | null }): Promise<WarpStateV5>;
1630
1725
 
1631
1726
  /**
1632
1727
  * Starts a built-in sync server for this graph.
@@ -1638,10 +1733,13 @@ export default class WarpGraph {
1638
1733
  maxRequestBytes?: number;
1639
1734
  httpPort: HttpServerPort;
1640
1735
  auth?: SyncAuthServerOptions;
1736
+ allowedWriters?: string[];
1641
1737
  }): Promise<{ close(): Promise<void>; url: string }>;
1642
1738
 
1643
1739
  /**
1644
1740
  * Syncs with a remote peer (HTTP URL or another WarpGraph instance).
1741
+ *
1742
+ * When `options.materialize` is true, the returned object also contains a `state` property.
1645
1743
  */
1646
1744
  syncWith(remote: string | WarpGraph, options?: {
1647
1745
  path?: string;
@@ -1658,7 +1756,9 @@ export default class WarpGraph {
1658
1756
  error?: Error;
1659
1757
  }) => void;
1660
1758
  auth?: SyncAuthClientOptions;
1661
- }): Promise<{ applied: number; attempts: number }>;
1759
+ /** Auto-materialize after sync; when true, result includes `state` */
1760
+ materialize?: boolean;
1761
+ }): Promise<{ applied: number; attempts: number; state?: WarpStateV5 }>;
1662
1762
 
1663
1763
  /**
1664
1764
  * Creates a fork of this graph at a specific point in a writer's history.
@@ -2083,17 +2183,7 @@ export function migrateV4toV5(v4State: {
2083
2183
  */
2084
2184
  export interface PatchEntry {
2085
2185
  /** The decoded patch object */
2086
- patch: {
2087
- schema: 2 | 3;
2088
- writer: string;
2089
- lamport: number;
2090
- context: Record<string, number> | Map<string, number>;
2091
- ops: unknown[];
2092
- /** Node/edge IDs read by this patch (V2 provenance) */
2093
- reads?: string[];
2094
- /** Node/edge IDs written by this patch (V2 provenance) */
2095
- writes?: string[];
2096
- };
2186
+ patch: PatchV2;
2097
2187
  /** The Git SHA of the patch commit */
2098
2188
  sha: string;
2099
2189
  }
package/index.js CHANGED
@@ -33,6 +33,7 @@ import IndexStoragePort from './src/ports/IndexStoragePort.js';
33
33
  import LoggerPort from './src/ports/LoggerPort.js';
34
34
  import ClockPort from './src/ports/ClockPort.js';
35
35
  import SeekCachePort from './src/ports/SeekCachePort.js';
36
+ import InMemoryGraphAdapter from './src/infrastructure/adapters/InMemoryGraphAdapter.js';
36
37
  import NoOpLogger from './src/infrastructure/adapters/NoOpLogger.js';
37
38
  import ConsoleLogger, { LogLevel } from './src/infrastructure/adapters/ConsoleLogger.js';
38
39
  import ClockAdapter from './src/infrastructure/adapters/ClockAdapter.js';
@@ -107,6 +108,7 @@ const TraversalService = CommitDagTraversalService;
107
108
 
108
109
  export {
109
110
  GitGraphAdapter,
111
+ InMemoryGraphAdapter,
110
112
  GraphNode,
111
113
  BitmapIndexBuilder,
112
114
  BitmapIndexReader,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@git-stunts/git-warp",
3
- "version": "10.8.0",
3
+ "version": "11.3.3",
4
4
  "description": "Deterministic WARP graph over Git: graph-native storage, traversal, and tooling.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -43,6 +43,7 @@
43
43
  "files": [
44
44
  "bin/warp-graph.js",
45
45
  "bin/presenters",
46
+ "bin/cli",
46
47
  "bin/git-warp",
47
48
  "src",
48
49
  "index.js",
@@ -68,16 +69,16 @@
68
69
  "benchmark": "sh -c 'if [ \"$GIT_STUNTS_DOCKER\" = \"1\" ]; then vitest bench --run test/benchmark \"$@\"; else docker compose run --build --rm test npm run benchmark:local -- \"$@\"; fi' --",
69
70
  "benchmark:local": "vitest bench --run test/benchmark",
70
71
  "demo": "cd examples && docker compose up -d && docker compose exec demo bash",
71
- "demo:setup": "cd examples && docker compose up -d && docker compose exec demo sh -c 'cd /app && npm install --silent && cd /demo && node /app/examples/setup.js'",
72
- "demo:explore": "cd examples && docker compose exec demo node /app/examples/explore.js",
73
- "demo:inspect": "cd examples && docker compose exec demo node /app/examples/inspect-index.js",
74
- "demo:lagrangian": "cd examples && docker compose exec demo node /app/examples/lagrangian-path.js",
75
- "demo:bench-streaming": "cd examples && docker compose up -d && docker compose exec demo node /app/examples/streaming-benchmark.js",
76
- "demo:bench-traversal": "cd examples && docker compose up -d && docker compose exec demo node /app/examples/traversal-benchmark.js",
72
+ "demo:setup": "cd examples && docker compose up -d && docker compose exec demo sh -c 'cd /app && npm install --silent && cd /demo && node /app/examples/scripts/setup.js'",
73
+ "demo:explore": "cd examples && docker compose exec demo node /app/examples/scripts/explore.js",
74
+ "demo:inspect": "cd examples && docker compose exec demo node /app/examples/scripts/inspect-index.js",
75
+ "demo:lagrangian": "cd examples && docker compose exec demo node /app/examples/scripts/lagrangian-path.js",
76
+ "demo:bench-streaming": "cd examples && docker compose up -d && docker compose exec demo node /app/examples/scripts/streaming-benchmark.js",
77
+ "demo:bench-traversal": "cd examples && docker compose up -d && docker compose exec demo node /app/examples/scripts/traversal-benchmark.js",
77
78
  "demo:down": "cd examples && docker compose down -v",
78
79
  "setup:hooks": "node scripts/setup-hooks.js",
79
80
  "prepare": "patch-package && node scripts/setup-hooks.js",
80
- "prepack": "npm run lint && npm run test:local",
81
+ "prepack": "npm run lint && npm run test:local && npm run typecheck:consumer",
81
82
  "install:git-warp": "bash scripts/install-git-warp.sh",
82
83
  "uninstall:git-warp": "bash scripts/uninstall-git-warp.sh",
83
84
  "test:node20": "docker compose -f docker-compose.test.yml --profile node20 run --build --rm test-node20",
@@ -88,6 +89,7 @@
88
89
  "typecheck": "tsc --noEmit",
89
90
  "typecheck:src": "tsc --noEmit -p tsconfig.src.json",
90
91
  "typecheck:test": "tsc --noEmit -p tsconfig.test.json",
92
+ "typecheck:consumer": "tsc --noEmit -p test/type-check/tsconfig.json",
91
93
  "typecheck:policy": "node scripts/ts-policy-check.js"
92
94
  },
93
95
  "dependencies": {