-
-
Notifications
You must be signed in to change notification settings - Fork 273
Expand file tree
/
Copy path.fallowrc.json
More file actions
550 lines (550 loc) · 29.3 KB
/
Copy path.fallowrc.json
File metadata and controls
550 lines (550 loc) · 29.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
{
"$schema": "https://raw.githubusercontent.com/fallow-rs/fallow/main/schema.json",
"entry": [
"tsdown.config.ts",
"vitest.mutation.config.ts",
"src/sdk/index.ts",
"src/sdk/io.ts",
"src/sdk/artifacts.ts",
"src/sdk/metro.ts",
"src/sdk/remote-config.ts",
"src/sdk/install-source.ts",
"src/sdk/android-adb.ts",
"src/sdk/contracts.ts",
"src/sdk/selectors.ts",
"src/sdk/finders.ts",
"src/ai-sdk/index.ts",
"src/bin.ts",
"src/client/companion-tunnel.ts",
"src/daemon.ts",
"packages/capture-kit/src/png-worker.ts",
"scripts/patch-xcuitest-runner-icon.ts",
"scripts/runner-request-count/run.ts",
"packages/capture-kit/src/ios-snapshot-engine/replay.ts",
// #1596 regression fixture: runs as a real `node --experimental-strip-types`
// subprocess (test/integration/daemon-replace-exit-flush.test.ts), so
// dependency analysis cannot follow the runCmdSync string path to it.
"test/integration/support/exit-after-flush.ts",
"src/cli/update-check-entry.ts",
"examples/sdk/client-session.ts",
"examples/sdk/metro-runtime.ts",
"examples/sdk/contracts-result.ts",
"examples/sdk/batch-orchestration.ts",
"examples/sdk/ai-sdk-tools.ts",
"test/scripts/metro-prepare-packaged-smoke.mjs",
"test/integration/*.test.ts",
"website/docs/404.mdx",
"website/rspress.config.ts"
],
"ignorePatterns": [
"examples/test-app/**",
"scripts/perf/**",
"scripts/layering/**",
"scripts/di-seams/**",
"scripts/maestro-conformance/corpus/**",
"apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan",
"scripts/write-xcuitest-cache-metadata.mjs",
"scripts/help-conformance-sample-outputs.d.mts",
"scripts/help-conformance-runner-output.d.mts"
],
"dynamicallyLoaded": ["src/daemon/interaction/index.ts"],
"ignoreDependencies": [
"@theme",
// @agent-device/maestro owns the source import, while the published root
// build externalizes yaml and retains runtime imports in packed chunks.
"yaml",
// @agent-device/provider-limrun owns the source import, while the published
// root build externalizes @limrun/api and retains runtime imports in packed chunks.
"@limrun/api",
// Oxlint resolves the shared config's JS plugins dynamically from their package names.
"@nkzw/eslint-plugin",
"eslint-plugin-no-only-tests",
"eslint-plugin-perfectionist",
// Packaging linters with no importable API surface here: scripts/check-package.ts runs their
// `node_modules/.bin` shims as subprocesses, which dependency analysis cannot follow to an import.
"publint",
"@arethetypeswrong/cli"
],
"ignoreExports": [
{
"comment": "Android perf mechanics are selected through the lazy platform host so importing agent-device does not eagerly load adb mechanics. Fallow cannot follow the dynamic property read in src/platform-runtime-perf-host.ts.",
"file": "packages/platform-android/src/perf.ts",
"exports": ["sampleAndroidMemoryPerf"]
},
{
"comment": "Apple perf sampling metadata is selected through the same lazy platform host; Fallow cannot follow the dynamic property read in src/platform-runtime-perf-host.ts.",
"file": "packages/platform-apple/src/core/perf.ts",
"exports": ["buildAppleFrameSamplingMetadata", "buildAppleMemorySamplingMetadata"]
},
{
"comment": "These host-process helpers are consumed only by integration leak-oracle support and host-process unit tests; Fallow's production graph intentionally excludes both consumers.",
"file": "packages/host-kit/src/process.ts",
"exports": ["uniquePositivePids", "readOwnedProcessRecordFile"]
},
{
"comment": "Apple app-resolution helpers are reached through the named lazy façade in packages/platform-apple/src/app-resolution-facade.ts. Fallow cannot connect dynamic import member reads to these source exports; keep this list limited to the facade's re-exports.",
"file": "packages/platform-apple/src/core/app-resolution.ts",
"exports": ["buildAppNotInstalledError", "resolveIosAppAlias"]
},
{
"comment": "The app-resolution package facade is consumed through workspace package exports. Fallow does not follow that package boundary, so keep only its externally consumed helper that has no visible production edge here.",
"file": "packages/platform-apple/src/app-resolution-facade.ts",
"exports": ["buildAppNotInstalledError"]
},
{
"comment": "Apple install mechanics are reached through the named install-artifact façade. Fallow cannot connect workspace package exports to these source exports; keep this list limited to the actual facade re-exports.",
"file": "packages/platform-apple/src/core/install-artifact.ts",
"exports": ["prepareIosInstallArtifact", "readIosBundleInfo"]
},
{
"comment": "Apple perf mechanics are reached through the named lazy perf façade. Fallow cannot connect dynamic import member reads to these source exports; keep this list limited to the facade's re-exports.",
"file": "packages/platform-apple/src/perf-facade.ts",
"exports": [
"buildAppleFrameSamplingMetadata",
"buildAppleMemorySamplingMetadata",
"buildAppleMemorySnapshotSupport",
"isRetryableIosDeviceTraceRecordFailure",
"resolveIosDevicePerfHint",
"captureAppleMemorySnapshot",
"readAppleProcessSamples",
"resolveAppleExecutable",
"resolveIosDevicePerfTarget",
"sampleAppleFramePerf",
"sampleAppleMemoryPerf",
"cleanupAppleXctracePerfCapture",
"startAppleXctracePerfCapture",
"stopAppleXctracePerfCapture",
"writeAppleXctracePerfReport",
"AppleXctraceCpuProfileReport",
"AppleXctracePerfMode",
"AppleXctracePerfResult"
]
},
{
"comment": "Apple tool-provider mechanics are reached through the named lazy tool-provider façade. Fallow cannot connect dynamic import member reads to these source exports; keep this list limited to the facade's re-exports.",
"file": "packages/platform-apple/src/tool-provider-facade.ts",
"exports": [
"hasScopedAppleToolProvider",
"resolveAppleToolProvider",
"createLocalAppleToolProvider",
"readApplePlistJson",
"runAppleToolCommand",
"runXcrun"
]
},
{
"comment": "The device-aware simctl argument builder is reached through the named lazy simctl façade. Fallow cannot connect the dynamic member read to this source export; keep the suppression limited to that re-export.",
"file": "packages/platform-apple/src/core/simctl.ts",
"exports": ["buildSimctlArgsForDevice"]
},
{
"comment": "The device-aware simctl argument builder is a named package entrypoint reached through dynamic platform-runtime imports. Fallow cannot connect those member reads to the re-export; keep the suppression limited to this one facade symbol.",
"file": "packages/platform-apple/src/simctl-facade.ts",
"exports": ["buildSimctlArgsForDevice"]
},
{
"comment": "Apple runner mechanics are reached through the named runner operations façade. Fallow cannot connect workspace package exports to these source exports; keep this list limited to the façade and its cleanup composition.",
"file": "packages/platform-apple/src/core/runner-client.ts",
"exports": [
"notifyIosRunnerAppRelaunched",
"prewarmIosRunnerSession",
"prepareIosRunner",
"resolveRunnerAppBundleId",
"detachIosSimulatorRunnerSessionsForShutdown",
"getRunnerSessionSnapshot",
"scheduleIosRunnerIdleStop",
"stopIosRunnerSession",
"stopAllIosRunnerSessions",
"readStaleRunnerLease",
"verifyLeaseRunnerPidIdentity",
"applyXctestRunnerAppIconFromDerivedPath"
]
},
{
"comment": "The named runner-owner façade owns this mutator; Fallow cannot connect the workspace package export to the moved source export.",
"file": "packages/platform-apple/src/core/runner-owner-state.ts",
"exports": ["setRunnerLeaseOwnerStateDir"]
},
{
"comment": "Apple diagnostics are reached through the named doctor façade. Fallow cannot connect workspace package exports to these source exports.",
"file": "packages/platform-apple/src/doctor.ts",
"exports": ["appleToolchainCheck", "appleRunnerWarmupCheck"]
},
{
"comment": "macOS helper mechanics are reached through the named macOS façade. Fallow cannot connect workspace package exports to these source exports.",
"file": "packages/platform-apple/src/os/macos/helper.ts",
"exports": ["startMacOsAudioProbeProcess", "resolveFrontmostMacOsApp"]
},
{
"comment": "The legacy Maestro fallback wording remains contracts vocabulary for wire/fixture compatibility, but has no in-repo production consumer. The Apple migration changes this file's documentation path, so keep the existing declaration explicit without treating it as a new W4 export leak.",
"file": "packages/contracts/src/interactor-types.ts",
"exports": ["MAESTRO_NON_HITTABLE_FALLBACK_MESSAGE"]
},
{
"comment": "Daemon route handlers are reached only through the dynamic `import()` table in request-handler-chain.ts, which --production analysis cannot follow to a consumer.",
"file": "src/daemon/handlers/{human-control,lease,session,snapshot,react-native,record-trace}.ts",
"exports": [
"handleHumanControlCommand",
"handleLeaseCommands",
"handleSessionCommands",
"handleSnapshotCommands",
"handleReactNativeCommands",
"handleRecordTraceCommands"
]
},
{
"comment": "The interaction facade exposes #2178's named route inputs and deferred handlers, plus the existing ref mutation response consumed by help conformance. Fallow's production graph cannot follow the request-handler-chain dynamic imports, so this exact list is the facade contract.",
"file": "src/daemon/interaction/index.ts",
"exports": [
"FindRouteInput",
"refMutationAdmissionResponse",
"handleFindCommands",
"handleInteractionCommands"
]
},
{
"comment": "The #2178 route implementations are reached only through the interaction facade's deferred delegates; Fallow's production graph cannot follow those dynamic imports. Keep this exemption limited to the two route entrypoints.",
"file": "src/daemon/interaction/internal/{find,interaction}.ts",
"exports": ["handleFindCommands", "handleInteractionCommands"]
},
{
"comment": "Dedicated CLI command handlers are reached only through the dynamic `import()` table `dedicatedCliCommandHandlerLoaders` in src/cli/commands/router.ts, which --production analysis cannot follow to a consumer. Same shape as the daemon route-handler entry above; that table is what enumerates this list, so add/remove here whenever a loader is added/removed.",
"file": "src/cli/commands/{auth,connection,daemon,device,proxy,replay,screenshot,takeover}.ts",
"exports": [
"authCommand",
"connectCommand",
"disconnectCommand",
"connectionCommand",
"daemonCommand",
"deviceCommand",
"proxyCommand",
"replayCommand",
"screenshotCommand",
"diffCommand",
"takeoverCommand"
]
},
{
"comment": "Test fixtures: every *.fixtures.ts builds doubles for co-located *.test.ts files (several import `vi` directly) and none is imported by production source, so --production analysis sees no consumer for any of them. Scoped to unused-exports rather than ignorePatterns so fixtures stay inside every other Fallow rule (health, dead-code, cycles); `*` rather than today's three symbols because the property being asserted is per-file, not per-symbol.",
"file": "**/*.fixtures.ts",
"exports": ["*"]
},
{
"comment": "Published package surface (see package.json#exports); consumed by SDK users, not internally.",
"file": "{src/sdk/*.ts,src/ai-sdk/index.ts}",
"exports": ["*"]
},
{
"comment": "#1642: its three consumers (src/__tests__/cli-device-status.test.ts, src/daemon/__tests__/device-claims.test.ts, src/daemon/__tests__/device-claim-prune.test.ts) all reach it the only way a Vitest module mock can — `vi.mock(path, async (importOriginal) => (await import('...host-process-mock.ts')).pinOwnProcessStartTime(importOriginal))`. Dependency analysis cannot follow that dynamic import to a consumer, the same limitation the daemon route-handler entry above records.",
"file": "src/__tests__/test-utils/host-process-mock.ts",
"exports": ["pinOwnProcessStartTime"]
},
{
"comment": "Tool config default exports, loaded by the tool rather than imported.",
"file": "{oxlint.config.ts,tsdown.config.ts,vitest.mutation.config.ts,website/rspress.config.ts}",
"exports": ["default"]
},
{
"comment": "Type-level `AssertTrue<...>` registry-totality guards. Exported only so `noUnusedLocals` keeps them alive; a consumer would defeat the point.",
"file": "{src/core/command-descriptor/registry.ts,src/core/interactors/register-builtins.ts,src/core/platform-descriptor/registry.ts,src/daemon/request-platform-providers.ts}",
"exports": [
"CommandOwnerFileClaimsAreComplete",
"BuiltinPluginsCoverAllPlatforms",
"PlatformDescriptorsAreTotal",
"GatedKeysAreResolverKeys"
]
},
{
"comment": "resolveVitestMaxWorkers is consumed by vitest.config.ts \u2014 a tool config outside --production analysis.",
"file": "scripts/lib/vitest-concurrency.ts",
"exports": ["resolveVitestMaxWorkers"]
},
{
"comment": "Mutation-lane seam: readTestScope is consumed by vitest.mutation.config.ts, a tool config outside --production analysis.",
"file": "scripts/mutation/test-scope.ts",
"exports": ["readTestScope"]
},
{
"comment": "Mutation-lane completeness gate: ownedTestFiles enumerates the whole derived ownership map, which only the assertion in ownership.test.ts consumes — a production consumer would defeat the point.",
"file": "scripts/mutation/ownership.ts",
"exports": ["ownedTestFiles"]
},
{
"comment": "ADR 0010 shared-hint pin: the facade re-export's only consumer is src/__tests__/is-argument-surface-parity.test.ts, which asserts the daemon and CLI `is` surfaces raise the SAME hint text. The constant is live inside the package (predicates.ts raises it); a production consumer of the re-export would defeat the point, since it exists so neither surface copies the string.",
"file": "packages/selectors/src/index.ts",
"exports": ["IS_PREDICATE_USAGE_HINT"]
},
{
"comment": "Help-benchmark conformance seams: helpTopicIds feeds the topic-coverage gate, and the *_SAMPLE constants feed the bench sample producers (scripts/__tests__/help-conformance-sample-producers.ts); every consumer is a test-tree file outside --production analysis.",
"file": "{src/cli/parser/cli-help.ts,scripts/help-conformance-sample-outputs.mjs}",
"exports": ["helpTopicIds", "PRIVATE_AX_RECOVERY_SAMPLE", "DEVICE_CLAIM_IN_USE_SAMPLE"]
},
{
"comment": "#1458: getSessionCommandKind's former production consumer (the session.ts if-chain) was replaced by SESSION_COMMAND_HANDLER_IMPLS, which encodes command-kind groupings directly via shared handler references instead of a kind lookup. The accessor and its SessionCommandKind classification remain covered by daemon-command-registry.test.ts, a test-tree file outside --production analysis.",
"file": "src/daemon/daemon-command-registry.ts",
"exports": ["getSessionCommandKind"]
},
{
"comment": "Workspace-package symbols whose only consumers are test-tree files, which --production analysis does not see. Each import is the package specifier, so the façade entry is load-bearing: parseTargetAnnotationV1Payload/TARGET_ANNOTATION_MAX_FIELD_BYTES from src/daemon/__tests__/session-target-evidence.test.ts, MAESTRO_COMPAT_* from src/cli/parser/__tests__/maestro-support-matrix.test.ts, createAppLogLiveHandle from src/__tests__/test-utils/app-log-live-handle.ts (its production sibling createAppLogLiveHandleFromFinish wraps it, and scripts/layering/platform-package-policy.test.ts pins the specifier form).",
"file": "packages/{ad-script,maestro,capture-kit}/src/index.ts",
"exports": [
"parseTargetAnnotationV1Payload",
"TARGET_ANNOTATION_MAX_FIELD_BYTES",
"MAESTRO_COMPAT_LIMITATIONS",
"MAESTRO_COMPAT_SUPPORTED_CAPABILITIES",
"createAppLogLiveHandle"
]
},
{
"comment": "Android mechanics facet: the package exports the complete named implementation seam for root/core/SDK consumers and package-owned tests; Fallow's production graph does not follow workspace subpath imports through the package exports map.",
"file": "packages/platform-android/src/mechanics.ts",
"exports": ["*"]
},
{
"comment": "Apple Simulator snapshot acquisition is a private package facet consumed by downstream runtime work; Fallow cannot see external consumers through the workspace exports map. Keep only the deliberately narrow public factory, source interface, and request/outcome types here; host injection, cache metadata, and preparation internals stay private.",
"file": "packages/platform-apple/src/snapshot-source-facade.ts",
"exports": [
"createSimulatorSnapshotSource",
"SimulatorSnapshotSource",
"SnapshotSourceFailure",
"SnapshotSourceFailureKind",
"SnapshotSourceLimits",
"SnapshotSourceOutcome",
"SnapshotSourceRequest",
"SnapshotSourceTarget"
]
},
{
"comment": "The native wire vocabulary is exported only so the parity test can pin the Objective-C literals; it is not part of the snapshot-source package facet.",
"file": "packages/platform-apple/src/snapshot-source/protocol.ts",
"exports": [
"SNAPSHOT_SOURCE_ATTRIBUTE_KEYS",
"SNAPSHOT_SOURCE_RESPONSE_KEYS",
"SNAPSHOT_SOURCE_WIRE_KEYS"
]
},
{
"comment": "Deliberately kept off the @agent-device/maestro façade (index.test.ts asserts its absence) and consumed only by the conformance harness under packages/maestro/test/.",
"file": "packages/maestro/src/internal/program-ir-command-parser.ts",
"exports": ["SUPPORTED_MAESTRO_COMMAND_NAMES"]
},
{
"comment": "Published type surface: re-exported by src/sdk/limrun.ts to agent-device/limrun, where test/integration/limrun-public-types.test.ts pins that consumers can import it. Its only importer compiles in a temp checkout, so no static in-repo edge reaches it — the same reason src/sdk/*.ts is exempt above.",
"file": "packages/provider-limrun/src/index.ts",
"exports": ["LimrunIosCommandExecution"]
},
{
"comment": "Converting the contracts façades from `export *` to explicit named re-exports (the pin-table retirement) made these individually visible to --production analysis for the first time; a bare star previously hid them from this exact check. isRecord/IOS_SAFARI_BUNDLE_ID/REPLAY_DIVERGENCE_* have no production consumer. Kept rather than narrowed here so the façade's re-export surface stays byte-identical to the symbol set the retired pin table asserted — narrowing the surface is a follow-up with its own review, not a side effect of this mechanical conversion.",
"file": "packages/contracts/src/facades/{client,command,divergence,recording}.ts",
"exports": [
"isRecord",
"IOS_SAFARI_BUNDLE_ID",
"REPLAY_DIVERGENCE_DEFAULT_REF_LIMIT",
"REPLAY_DIVERGENCE_DIGEST_REF_LIMIT",
"REPLAY_DIVERGENCE_LEVEL_BYTE_LIMITS",
"applyReplayDivergenceLevelCaps",
"measureReplayDivergenceBytes",
"sanitizeReplayDivergenceField",
"truncateUtf8Field",
"isRecordingExportQuality"
]
},
{
"comment": "HarmonyOS package façade loaders are named external seams. Their dynamic property reads are not visible to --production analysis, so keep the façade and its selected host route explicit here.",
"file": "packages/platform-harmonyos/src/hdc.ts",
"exports": ["ensureHarmonyToolchainPathConfigured"]
},
{
"comment": "HarmonyOS package façade loaders are named external seams. Their dynamic property reads are not visible to --production analysis, so keep the façade and its selected lifecycle route explicit here.",
"file": "packages/platform-harmonyos/src/app-lifecycle.ts",
"exports": ["listHarmonyApps", "openHarmonyApp", "closeHarmonyApp"]
},
{
"comment": "HarmonyOS archive metadata parsing is exercised by package-owned tests but has no production caller; keep the direct test seam explicit while the implementation remains colocated with app lifecycle mechanics.",
"file": "packages/platform-harmonyos/src/app-lifecycle.ts",
"exports": ["resolveHarmonyArchiveBundleName"]
},
{
"comment": "HarmonyOS package façade loaders are named external seams. Their dynamic property reads are not visible to --production analysis, so keep the façade and its selected diagnostics route explicit here.",
"file": "packages/platform-harmonyos/src/doctor.ts",
"exports": ["harmonyToolchainCheck"]
},
{
"comment": "HarmonyOS package façade loaders are named external seams. Their dynamic property reads are not visible to --production analysis, so keep the façade and its selected interaction route explicit here.",
"file": "packages/platform-harmonyos/src/input-actions.ts",
"exports": [
"pressHarmony",
"doubleClickHarmony",
"longPressHarmony",
"typeHarmony",
"fillHarmony",
"scrollHarmony",
"performHarmonyGesture",
"homeHarmony",
"appSwitcherHarmony",
"pressHarmonyKeyboardKey",
"setHarmonyOrientation"
]
},
{
"comment": "HarmonyOS package façade loader is a named external seam. Its dynamic property read is not visible to --production analysis.",
"file": "packages/platform-harmonyos/src/perf.ts",
"exports": ["sampleHarmonyMemoryPerf"]
},
{
"comment": "HarmonyOS package façade loader is a named external seam. Its dynamic property read is not visible to --production analysis.",
"file": "packages/platform-harmonyos/src/screenshot.ts",
"exports": ["screenshotHarmony"]
},
{
"comment": "HarmonyOS package façade loader is a named external seam. Its dynamic property read is not visible to --production analysis.",
"file": "packages/platform-harmonyos/src/settings.ts",
"exports": ["setHarmonySetting"]
},
{
"comment": "HarmonyOS package façade loaders are named external seams. Their dynamic property reads are not visible to --production analysis, so keep the façade and its selected host route explicit here.",
"file": "packages/platform-harmonyos/src/index.ts",
"exports": ["sampleHarmonyMemoryPerf"]
},
{
"comment": "Linux package façade loaders are named external seams. Their dynamic property reads are not visible to --production analysis, so keep the façade and its selected interactor/snapshot routes explicit here.",
"file": "packages/platform-linux/src/app-lifecycle.ts",
"exports": ["openLinuxApp", "closeLinuxApp", "backLinux", "homeLinux"]
},
{
"comment": "Linux package façade loaders are named external seams. Their dynamic property reads are not visible to --production analysis, so keep the façade and its selected interactor route explicit here.",
"file": "packages/platform-linux/src/input-actions.ts",
"exports": [
"rightClickLinux",
"middleClickLinux",
"doubleClickLinux",
"longPressLinux",
"focusLinux",
"swipeLinux"
]
},
{
"comment": "Linux package façade loader is a named external seam. Its dynamic property read is not visible to --production analysis.",
"file": "packages/platform-linux/src/screenshot.ts",
"exports": ["screenshotLinux"]
},
{
"comment": "Linux package façade loader is a named external seam. Its dynamic property read is not visible to --production analysis.",
"file": "packages/platform-linux/src/snapshot.ts",
"exports": ["readLinuxTextAtPoint"]
},
{
"comment": "Linux package façade loaders are named external seams. Their dynamic property reads are not visible to --production analysis.",
"file": "packages/platform-linux/src/clipboard.ts",
"exports": ["readLinuxClipboard", "writeLinuxClipboard"]
},
{
"comment": "Linux package façade loaders are named external seams. Their dynamic property reads are not visible to --production analysis.",
"file": "packages/platform-linux/src/input-actions.ts",
"exports": ["scrollLinux", "fillLinux"]
},
{
"comment": "Linux package façade loader is a named external seam. Its dynamic property read is not visible to --production analysis.",
"file": "packages/platform-linux/src/surface-snapshot.ts",
"exports": ["captureLinuxSurfaceSnapshot"]
},
{
"comment": "Linux package façade loader is a named external seam. Its dynamic property read is not visible to --production analysis.",
"file": "packages/platform-linux/src/index.ts",
"exports": ["createLocalLinuxToolProvider"]
},
{
"comment": "Vega package façade loader is a named external seam. Its dynamic property read is not visible to --production analysis.",
"file": "packages/platform-vega/src/doctor.ts",
"exports": ["vegaToolchainCheck"]
},
{
"comment": "Web package façade loaders are named external seams. Their dynamic property reads are not visible to --production analysis, so keep the façade and its managed-backend/provider routes explicit here.",
"file": "packages/platform-web/src/agent-browser-tool.ts",
"exports": ["doctorManagedAgentBrowser"]
},
{
"comment": "Web package façade loader is a named external seam. Its dynamic property read is not visible to --production analysis.",
"file": "packages/platform-web/src/agent-browser-tool.ts",
"exports": ["setupManagedAgentBrowser"]
},
{
"comment": "Web package façade loader is a named external seam. Its dynamic property read is not visible to --production analysis.",
"file": "packages/platform-web/src/doctor.ts",
"exports": ["webBrowserLifecycleCheck"]
},
{
"comment": "Web package façade loaders are named external seams. Their dynamic property reads are not visible to --production analysis, so keep the façade and its request-scoped provider routes explicit here.",
"file": "packages/platform-web/src/provider.ts",
"exports": ["resolveWebProvider", "hasScopedWebProvider"]
},
{
"comment": "Web package façade loaders are named external seams. Their dynamic property reads are not visible to --production analysis, and the timeout is pinned by the daemon teardown test.",
"file": "packages/platform-web/src/index.ts",
"exports": [
"AGENT_BROWSER_TIMEOUT_MS",
"inspectManagedAgentBrowserProcesses",
"summarizeAgentBrowserProcesses"
]
},
{
"comment": "Web process matching helpers are retained for package-owned lifecycle tests; production export analysis does not traverse those test consumers.",
"file": "packages/platform-web/src/agent-browser-lifecycle.ts",
"exports": [
"agentBrowserChromeLaunchMarker",
"matchAgentBrowserChromeProcess",
"summarizeAgentBrowserProcesses",
"summarizeManagedAgentBrowserProcesses"
]
}
],
"usedClassMembers": [
"name",
"listActiveLeases",
"delete",
"values",
"elapsedMs",
"isExpired",
"findByDevice"
],
"rules": {
"unused-types": "error",
"duplicate-exports": "off"
},
"overrides": [
{
"comment": "unused-types counts importers, not signature reachability. A façade names every type its re-exported functions/values put in a public signature, and callers use those types structurally without ever importing the name — the same false-positive shape already fixed for other workspace-package façades. unused-exports (a VALUE check) stays on for this glob; that is what would catch a real leak.",
"files": ["packages/contracts/src/facades/*.ts"],
"rules": {
"unused-types": "off"
}
},
{
"comment": "Host-kit seam façades: same false-positive shape as the contracts façades above — each seam names every type its re-exported functions put in a public signature, and callers use those types structurally without importing the name. unused-exports (the VALUE check) stays on.",
"files": ["packages/host-kit/src/*.ts"],
"rules": {
"unused-types": "off"
}
},
{
"comment": "Android mechanics facet types are named explicitly for the same package-subpath public seam; unused-exports remains governed by the facet entry above.",
"files": ["packages/platform-android/src/mechanics.ts"],
"rules": {
"unused-types": "off"
}
}
],
"production": {
"dupes": true
},
"publicPackages": ["agent-device"],
"audit": {
"deadCodeBaseline": "fallow-baselines/dead-code.json",
"healthBaseline": "fallow-baselines/health.json"
},
"includeEntryExports": true,
"ignoreExportsUsedInFile": {
"type": true,
"interface": true
}
}