@tech-leads-club/harness-toolkit 0.2.1 → 0.3.0

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 (142) hide show
  1. package/README.md +22 -26
  2. package/bin/tlc-build.mjs +93 -0
  3. package/bin/tlc-cli.ts +117 -58
  4. package/bin/tlc-exec.mjs +16 -13
  5. package/dist/compact-before.mjs +151 -15
  6. package/dist/doctor.mjs +288 -45
  7. package/dist/help-topic.mjs +0 -0
  8. package/dist/init-project.mjs +15 -14
  9. package/dist/install-runtime.mjs +100 -17
  10. package/dist/lessons-cli.mjs +152 -8
  11. package/dist/obs-cli.mjs +149 -8
  12. package/dist/price-lookup.mjs +45 -23
  13. package/dist/prompt-submit.mjs +151 -15
  14. package/dist/refresh-model-prices.mjs +7190 -46
  15. package/dist/response-after.mjs +151 -15
  16. package/dist/run.mjs +151 -15
  17. package/dist/session-end.mjs +151 -15
  18. package/dist/session-start.mjs +151 -15
  19. package/dist/shim.mjs +7040 -16
  20. package/dist/stop.mjs +151 -15
  21. package/dist/subagent-start.mjs +151 -15
  22. package/dist/subagent-stop.mjs +151 -15
  23. package/dist/support.mjs +149 -8
  24. package/dist/tlc-cli.mjs +289 -89
  25. package/dist/tool-after.mjs +196 -38
  26. package/dist/tool-before.mjs +151 -15
  27. package/dist/tool-failure.mjs +151 -15
  28. package/dist/uninstall-runtime.mjs +9 -10
  29. package/docs/log.md +7 -0
  30. package/docs/measure.md +35 -31
  31. package/package.json +6 -5
  32. package/src/core/core.facade.ts +18 -0
  33. package/src/core/index.ts +3 -0
  34. package/src/core/pricing/pricing.freshness.ts +118 -0
  35. package/src/core/release/release.version.ts +147 -0
  36. package/src/core/shim/shim.precedence.ts +72 -0
  37. package/src/core/skill/skill.link.ts +92 -0
  38. package/src/entrypoints/shim.ts +49 -11
  39. package/src/platform/fs-atomic.ts +61 -23
  40. package/src/platform/links.ts +73 -0
  41. package/src/platform/paths.ts +27 -0
  42. package/src/platform/pricing.ts +139 -31
  43. package/src/providers/cursor/cursor.wiring.ts +11 -8
  44. package/tools/doctor.ts +127 -10
  45. package/tools/init-project.ts +34 -14
  46. package/tools/install-runtime.ts +89 -6
  47. package/tools/refresh-model-prices.ts +242 -75
  48. package/tools/uninstall-runtime.ts +23 -19
  49. package/CHANGELOG.md +0 -95
  50. package/bin/tlc-build +0 -80
  51. package/bin/tlc-exec +0 -10
  52. package/bin/tlc-exec.cmd +0 -4
  53. package/docs/decisions/ad-001.md +0 -32
  54. package/docs/decisions/ad-002.md +0 -51
  55. package/docs/decisions/ad-003.md +0 -30
  56. package/docs/decisions/ad-004.md +0 -37
  57. package/docs/decisions/ad-005.md +0 -36
  58. package/docs/decisions/ad-006.md +0 -49
  59. package/docs/decisions/ad-007.md +0 -36
  60. package/docs/decisions/ad-008.md +0 -54
  61. package/docs/decisions/ad-009.md +0 -61
  62. package/docs/decisions/ad-010.md +0 -45
  63. package/docs/decisions/ad-011.md +0 -59
  64. package/docs/decisions/ad-012.md +0 -71
  65. package/docs/decisions/ad-013.md +0 -87
  66. package/docs/decisions/ad-014.md +0 -56
  67. package/docs/decisions/ad-015.md +0 -33
  68. package/docs/decisions/ad-016.md +0 -98
  69. package/docs/decisions/ad-017.md +0 -65
  70. package/docs/decisions/ad-018.md +0 -77
  71. package/docs/decisions/ad-019.md +0 -75
  72. package/docs/decisions/ad-020.md +0 -88
  73. package/docs/decisions/ad-021.md +0 -57
  74. package/docs/decisions/ad-022.md +0 -120
  75. package/docs/decisions/ad-023.md +0 -87
  76. package/docs/decisions/ad-024.md +0 -85
  77. package/docs/decisions/ad-025.md +0 -92
  78. package/docs/decisions/ad-026.md +0 -131
  79. package/docs/decisions/ad-027.md +0 -90
  80. package/docs/decisions/ad-028.md +0 -90
  81. package/docs/decisions/ad-029.md +0 -73
  82. package/docs/decisions/ad-030.md +0 -97
  83. package/docs/decisions/ad-031.md +0 -94
  84. package/docs/decisions/ad-032.md +0 -83
  85. package/docs/decisions/ad-033.md +0 -89
  86. package/docs/decisions/ad-034.md +0 -86
  87. package/docs/decisions/ad-035.md +0 -86
  88. package/docs/decisions/ad-036.md +0 -68
  89. package/docs/decisions/ad-037.md +0 -47
  90. package/docs/decisions/ad-038.md +0 -52
  91. package/docs/decisions/ad-039.md +0 -69
  92. package/docs/decisions/ad-040.md +0 -89
  93. package/docs/decisions/ad-041.md +0 -98
  94. package/docs/decisions/ad-042.md +0 -82
  95. package/docs/decisions/ad-043.md +0 -79
  96. package/docs/decisions/ad-044.md +0 -61
  97. package/docs/decisions/ad-045.md +0 -94
  98. package/docs/decisions/ad-046.md +0 -111
  99. package/docs/decisions/ad-047.md +0 -96
  100. package/docs/decisions/ad-048.md +0 -85
  101. package/docs/decisions/ad-049.md +0 -66
  102. package/docs/decisions/ad-050.md +0 -94
  103. package/docs/decisions/ad-051.md +0 -69
  104. package/docs/decisions/ad-052.md +0 -69
  105. package/docs/decisions/ad-053.md +0 -78
  106. package/docs/decisions/ad-054.md +0 -98
  107. package/docs/decisions/ad-055.md +0 -74
  108. package/docs/decisions/ad-056.md +0 -85
  109. package/docs/decisions/ad-057.md +0 -68
  110. package/docs/decisions/ad-058.md +0 -97
  111. package/docs/decisions/ad-059.md +0 -82
  112. package/docs/decisions/ad-060.md +0 -75
  113. package/docs/decisions/ad-061.md +0 -68
  114. package/docs/decisions/ad-062.md +0 -72
  115. package/docs/decisions/ad-063.md +0 -84
  116. package/docs/decisions/ad-064.md +0 -79
  117. package/docs/decisions/ad-065.md +0 -81
  118. package/docs/decisions/ad-066.md +0 -111
  119. package/docs/decisions/ad-067.md +0 -64
  120. package/docs/decisions/ad-068.md +0 -79
  121. package/docs/decisions/ad-069.md +0 -74
  122. package/docs/decisions/ad-070.md +0 -86
  123. package/docs/decisions/ad-071.md +0 -93
  124. package/docs/decisions/ad-072.md +0 -82
  125. package/docs/decisions/ad-073.md +0 -102
  126. package/docs/decisions/ad-074.md +0 -91
  127. package/docs/decisions/ad-075.md +0 -79
  128. package/docs/decisions/ad-076.md +0 -102
  129. package/docs/decisions/ad-077.md +0 -94
  130. package/docs/decisions/ad-078.md +0 -84
  131. package/docs/decisions/ad-079.md +0 -73
  132. package/docs/decisions/ad-080.md +0 -86
  133. package/docs/decisions/ad-081.md +0 -70
  134. package/docs/decisions/ad-082.md +0 -79
  135. package/docs/decisions/ad-083.md +0 -88
  136. package/docs/decisions/index.md +0 -111
  137. package/model-aliases.json +0 -12
  138. package/model-prices.cursor.json +0 -410
  139. package/model-prices.json +0 -1
  140. package/tools/test-env.mjs +0 -28
  141. package/tools/test-env.names.d.mts +0 -1
  142. package/tools/test-env.names.mjs +0 -14
@@ -1,410 +0,0 @@
1
- {
2
- "_meta": {
3
- "source": "https://cursor.com/docs/models-and-pricing.md",
4
- "refreshedAt": "2026-07-27T14:51:17.065Z"
5
- },
6
- "auto-cost": {
7
- "displayName": "Auto Cost",
8
- "provider": "Cursor",
9
- "promptPer1M": 1.25,
10
- "completionPer1M": 6,
11
- "cacheWritePer1M": 1.25,
12
- "cacheReadPer1M": 0.25,
13
- "pool": "auto",
14
- "billing": "metered"
15
- },
16
- "claude-4-sonnet": {
17
- "displayName": "Claude 4 Sonnet",
18
- "provider": "Anthropic",
19
- "promptPer1M": 3,
20
- "completionPer1M": 15,
21
- "cacheWritePer1M": 3.75,
22
- "cacheReadPer1M": 0.3,
23
- "pool": "other_models",
24
- "billing": "metered"
25
- },
26
- "claude-4-sonnet-1m": {
27
- "displayName": "Claude 4 Sonnet 1M",
28
- "provider": "Anthropic",
29
- "promptPer1M": 6,
30
- "completionPer1M": 22.5,
31
- "cacheWritePer1M": 7.5,
32
- "cacheReadPer1M": 0.6,
33
- "pool": "other_models",
34
- "billing": "metered"
35
- },
36
- "claude-4.5-haiku": {
37
- "displayName": "Claude 4.5 Haiku",
38
- "provider": "Anthropic",
39
- "promptPer1M": 1,
40
- "completionPer1M": 5,
41
- "cacheWritePer1M": 1.25,
42
- "cacheReadPer1M": 0.1,
43
- "pool": "other_models",
44
- "billing": "metered"
45
- },
46
- "claude-4.5-opus": {
47
- "displayName": "Claude 4.5 Opus",
48
- "provider": "Anthropic",
49
- "promptPer1M": 5,
50
- "completionPer1M": 25,
51
- "cacheWritePer1M": 6.25,
52
- "cacheReadPer1M": 0.5,
53
- "pool": "other_models",
54
- "billing": "metered"
55
- },
56
- "claude-4.5-sonnet": {
57
- "displayName": "Claude 4.5 Sonnet",
58
- "provider": "Anthropic",
59
- "promptPer1M": 3,
60
- "completionPer1M": 15,
61
- "cacheWritePer1M": 3.75,
62
- "cacheReadPer1M": 0.3,
63
- "pool": "other_models",
64
- "billing": "metered"
65
- },
66
- "claude-4.6-opus": {
67
- "displayName": "Claude 4.6 Opus",
68
- "provider": "Anthropic",
69
- "promptPer1M": 5,
70
- "completionPer1M": 25,
71
- "cacheWritePer1M": 6.25,
72
- "cacheReadPer1M": 0.5,
73
- "pool": "other_models",
74
- "billing": "metered"
75
- },
76
- "claude-4.6-sonnet": {
77
- "displayName": "Claude 4.6 Sonnet",
78
- "provider": "Anthropic",
79
- "promptPer1M": 3,
80
- "completionPer1M": 15,
81
- "cacheWritePer1M": 3.75,
82
- "cacheReadPer1M": 0.3,
83
- "pool": "other_models",
84
- "billing": "metered"
85
- },
86
- "claude-4.7-opus": {
87
- "displayName": "Claude 4.7 Opus",
88
- "provider": "Anthropic",
89
- "promptPer1M": 5,
90
- "completionPer1M": 25,
91
- "cacheWritePer1M": 6.25,
92
- "cacheReadPer1M": 0.5,
93
- "pool": "other_models",
94
- "billing": "metered"
95
- },
96
- "claude-fable-5": {
97
- "displayName": "Claude Fable 5",
98
- "provider": "Anthropic",
99
- "promptPer1M": 10,
100
- "completionPer1M": 50,
101
- "cacheWritePer1M": 12.5,
102
- "cacheReadPer1M": 1,
103
- "pool": "other_models",
104
- "billing": "metered"
105
- },
106
- "claude-opus-4.7": {
107
- "displayName": "Claude Opus 4.7 (fast mode)",
108
- "provider": "Anthropic",
109
- "promptPer1M": 30,
110
- "completionPer1M": 150,
111
- "cacheWritePer1M": 37.5,
112
- "cacheReadPer1M": 3,
113
- "pool": "other_models",
114
- "billing": "metered"
115
- },
116
- "claude-opus-4.8": {
117
- "displayName": "Claude Opus 4.8",
118
- "provider": "Anthropic",
119
- "promptPer1M": 5,
120
- "completionPer1M": 25,
121
- "cacheWritePer1M": 6.25,
122
- "cacheReadPer1M": 0.5,
123
- "pool": "other_models",
124
- "billing": "metered"
125
- },
126
- "claude-opus-5": {
127
- "displayName": "Claude Opus 5",
128
- "provider": "Anthropic",
129
- "promptPer1M": 5,
130
- "completionPer1M": 25,
131
- "cacheWritePer1M": 6.25,
132
- "cacheReadPer1M": 0.5,
133
- "pool": "other_models",
134
- "billing": "metered"
135
- },
136
- "claude-sonnet-5": {
137
- "displayName": "Claude Sonnet 5",
138
- "provider": "Anthropic",
139
- "promptPer1M": 3,
140
- "completionPer1M": 15,
141
- "cacheWritePer1M": 3.75,
142
- "cacheReadPer1M": 0.3,
143
- "pool": "other_models",
144
- "billing": "metered"
145
- },
146
- "composer-1": {
147
- "displayName": "Composer 1",
148
- "provider": "Cursor",
149
- "promptPer1M": 1.25,
150
- "completionPer1M": 10,
151
- "cacheReadPer1M": 0.125,
152
- "pool": "cursor_models",
153
- "billing": "metered"
154
- },
155
- "composer-2.5": {
156
- "displayName": "Composer 2.5",
157
- "provider": "Cursor",
158
- "promptPer1M": 0.5,
159
- "completionPer1M": 2.5,
160
- "cacheReadPer1M": 0.2,
161
- "pool": "cursor_models",
162
- "billing": "metered"
163
- },
164
- "gemini-2.5-flash": {
165
- "displayName": "Gemini 2.5 Flash",
166
- "provider": "Google",
167
- "promptPer1M": 0.3,
168
- "completionPer1M": 2.5,
169
- "cacheReadPer1M": 0.03,
170
- "pool": "other_models",
171
- "billing": "metered"
172
- },
173
- "gemini-3-flash": {
174
- "displayName": "Gemini 3 Flash",
175
- "provider": "Google",
176
- "promptPer1M": 0.5,
177
- "completionPer1M": 3,
178
- "cacheReadPer1M": 0.05,
179
- "pool": "other_models",
180
- "billing": "metered"
181
- },
182
- "gemini-3-pro": {
183
- "displayName": "Gemini 3 Pro",
184
- "provider": "Google",
185
- "promptPer1M": 2,
186
- "completionPer1M": 12,
187
- "cacheReadPer1M": 0.2,
188
- "pool": "other_models",
189
- "billing": "metered"
190
- },
191
- "gemini-3-pro-image-preview": {
192
- "displayName": "Gemini 3 Pro Image Preview",
193
- "provider": "Google",
194
- "promptPer1M": 2,
195
- "completionPer1M": 12,
196
- "cacheReadPer1M": 0.2,
197
- "pool": "other_models",
198
- "billing": "metered"
199
- },
200
- "gemini-3.1-pro": {
201
- "displayName": "Gemini 3.1 Pro",
202
- "provider": "Google",
203
- "promptPer1M": 2,
204
- "completionPer1M": 12,
205
- "cacheReadPer1M": 0.2,
206
- "pool": "other_models",
207
- "billing": "metered"
208
- },
209
- "gemini-3.5-flash": {
210
- "displayName": "Gemini 3.5 Flash",
211
- "provider": "Google",
212
- "promptPer1M": 1.5,
213
- "completionPer1M": 9,
214
- "cacheReadPer1M": 0.15,
215
- "pool": "other_models",
216
- "billing": "metered"
217
- },
218
- "gemini-3.6-flash": {
219
- "displayName": "Gemini 3.6 Flash",
220
- "provider": "Google",
221
- "promptPer1M": 1.5,
222
- "completionPer1M": 7.5,
223
- "cacheReadPer1M": 0.15,
224
- "pool": "other_models",
225
- "billing": "metered"
226
- },
227
- "glm-5.2": {
228
- "displayName": "GLM 5.2",
229
- "provider": "Z.ai",
230
- "promptPer1M": 1.4,
231
- "completionPer1M": 4.4,
232
- "cacheReadPer1M": 0.26,
233
- "pool": "other_models",
234
- "billing": "metered"
235
- },
236
- "gpt-5": {
237
- "displayName": "GPT-5",
238
- "provider": "OpenAI",
239
- "promptPer1M": 1.25,
240
- "completionPer1M": 10,
241
- "cacheReadPer1M": 0.125,
242
- "pool": "other_models",
243
- "billing": "metered"
244
- },
245
- "gpt-5-fast": {
246
- "displayName": "GPT-5 Fast",
247
- "provider": "OpenAI",
248
- "promptPer1M": 2.5,
249
- "completionPer1M": 20,
250
- "cacheReadPer1M": 0.25,
251
- "pool": "other_models",
252
- "billing": "metered"
253
- },
254
- "gpt-5-mini": {
255
- "displayName": "GPT-5 Mini",
256
- "provider": "OpenAI",
257
- "promptPer1M": 0.25,
258
- "completionPer1M": 2,
259
- "cacheReadPer1M": 0.025,
260
- "pool": "other_models",
261
- "billing": "metered"
262
- },
263
- "gpt-5-codex": {
264
- "displayName": "GPT-5-Codex",
265
- "provider": "OpenAI",
266
- "promptPer1M": 1.25,
267
- "completionPer1M": 10,
268
- "cacheReadPer1M": 0.125,
269
- "pool": "other_models",
270
- "billing": "metered"
271
- },
272
- "gpt-5.1-codex": {
273
- "displayName": "GPT-5.1 Codex",
274
- "provider": "OpenAI",
275
- "promptPer1M": 1.25,
276
- "completionPer1M": 10,
277
- "cacheReadPer1M": 0.125,
278
- "pool": "other_models",
279
- "billing": "metered"
280
- },
281
- "gpt-5.1-codex-max": {
282
- "displayName": "GPT-5.1 Codex Max",
283
- "provider": "OpenAI",
284
- "promptPer1M": 1.25,
285
- "completionPer1M": 10,
286
- "cacheReadPer1M": 0.125,
287
- "pool": "other_models",
288
- "billing": "metered"
289
- },
290
- "gpt-5.1-codex-mini": {
291
- "displayName": "GPT-5.1 Codex Mini",
292
- "provider": "OpenAI",
293
- "promptPer1M": 0.25,
294
- "completionPer1M": 2,
295
- "cacheReadPer1M": 0.025,
296
- "pool": "other_models",
297
- "billing": "metered"
298
- },
299
- "gpt-5.2": {
300
- "displayName": "GPT-5.2",
301
- "provider": "OpenAI",
302
- "promptPer1M": 1.75,
303
- "completionPer1M": 14,
304
- "cacheReadPer1M": 0.175,
305
- "pool": "other_models",
306
- "billing": "metered"
307
- },
308
- "gpt-5.2-codex": {
309
- "displayName": "GPT-5.2 Codex",
310
- "provider": "OpenAI",
311
- "promptPer1M": 1.75,
312
- "completionPer1M": 14,
313
- "cacheReadPer1M": 0.175,
314
- "pool": "other_models",
315
- "billing": "metered"
316
- },
317
- "gpt-5.3-codex": {
318
- "displayName": "GPT-5.3 Codex",
319
- "provider": "OpenAI",
320
- "promptPer1M": 1.75,
321
- "completionPer1M": 14,
322
- "cacheReadPer1M": 0.175,
323
- "pool": "other_models",
324
- "billing": "metered"
325
- },
326
- "gpt-5.4": {
327
- "displayName": "GPT-5.4",
328
- "provider": "OpenAI",
329
- "promptPer1M": 2.5,
330
- "completionPer1M": 15,
331
- "cacheReadPer1M": 0.25,
332
- "pool": "other_models",
333
- "billing": "metered"
334
- },
335
- "gpt-5.4-mini": {
336
- "displayName": "GPT-5.4 Mini",
337
- "provider": "OpenAI",
338
- "promptPer1M": 0.75,
339
- "completionPer1M": 4.5,
340
- "cacheReadPer1M": 0.075,
341
- "pool": "other_models",
342
- "billing": "metered"
343
- },
344
- "gpt-5.4-nano": {
345
- "displayName": "GPT-5.4 Nano",
346
- "provider": "OpenAI",
347
- "promptPer1M": 0.2,
348
- "completionPer1M": 1.25,
349
- "cacheReadPer1M": 0.02,
350
- "pool": "other_models",
351
- "billing": "metered"
352
- },
353
- "gpt-5.5": {
354
- "displayName": "GPT-5.5",
355
- "provider": "OpenAI",
356
- "promptPer1M": 5,
357
- "completionPer1M": 30,
358
- "cacheReadPer1M": 0.5,
359
- "pool": "other_models",
360
- "billing": "metered"
361
- },
362
- "gpt-5.6-luna": {
363
- "displayName": "GPT-5.6 Luna",
364
- "provider": "OpenAI",
365
- "promptPer1M": 1,
366
- "completionPer1M": 6,
367
- "cacheWritePer1M": 1.25,
368
- "cacheReadPer1M": 0.1,
369
- "pool": "other_models",
370
- "billing": "metered"
371
- },
372
- "gpt-5.6-sol": {
373
- "displayName": "GPT-5.6 Sol",
374
- "provider": "OpenAI",
375
- "promptPer1M": 5,
376
- "completionPer1M": 30,
377
- "cacheWritePer1M": 6.25,
378
- "cacheReadPer1M": 0.5,
379
- "pool": "other_models",
380
- "billing": "metered"
381
- },
382
- "gpt-5.6-terra": {
383
- "displayName": "GPT-5.6 Terra",
384
- "provider": "OpenAI",
385
- "promptPer1M": 2.5,
386
- "completionPer1M": 15,
387
- "cacheWritePer1M": 3.125,
388
- "cacheReadPer1M": 0.25,
389
- "pool": "other_models",
390
- "billing": "metered"
391
- },
392
- "grok-4.5": {
393
- "displayName": "Grok 4.5",
394
- "provider": "Cursor",
395
- "promptPer1M": 2,
396
- "completionPer1M": 6,
397
- "cacheReadPer1M": 0.5,
398
- "pool": "cursor_models",
399
- "billing": "metered"
400
- },
401
- "kimi-k2.7-code": {
402
- "displayName": "Kimi K2.7 Code",
403
- "provider": "Moonshot",
404
- "promptPer1M": 0.95,
405
- "completionPer1M": 4,
406
- "cacheReadPer1M": 0.19,
407
- "pool": "other_models",
408
- "billing": "metered"
409
- }
410
- }
package/model-prices.json DELETED
@@ -1 +0,0 @@
1
- {}
@@ -1,28 +0,0 @@
1
- /**
2
- * Loaded with `node --import` before every test file, so the suite answers from its own fixtures instead of
3
- * from the shell that happened to start it.
4
- *
5
- * hazard: `projectDirFor` prefers `CLAUDE_PROJECT_DIR` over the payload's `cwd`, which is correct in
6
- * production — the env var is the project root and `cwd` can be a subdirectory. Inside a Claude Code hook that
7
- * variable is always set, so 22 tests that build a fixture in a temp directory silently read policy and state
8
- * from the real repository instead. The suite passed from a shell and failed from inside a hook.
9
- */
10
- import { mkdtempSync } from "node:fs";
11
- import { tmpdir } from "node:os";
12
- import { join } from "node:path";
13
- import { PROJECT_SCOPED_ENV } from "./test-env.names.mjs";
14
-
15
- for (const name of PROJECT_SCOPED_ENV) {
16
- delete process.env[name];
17
- }
18
-
19
- /**
20
- * hazard: `TLC_HOME` was left alone on the reasoning that it names which runtime and CI sets it deliberately. That
21
- * held only while nothing machine-wide lived under it. The global lesson tier does, so a test calling `allLessons`
22
- * without pinning the home read whichever lessons the developer happened to have promoted — green on a fresh
23
- * machine, green in CI, red on mine the moment I promoted five ([/decisions/ad-042.md](/decisions/ad-042.md)).
24
- *
25
- * invariant: hermetic by default, opt in by assignment. A test that wants a runtime home sets one; a test that
26
- * forgets gets an empty directory rather than a person's machine.
27
- */
28
- process.env.TLC_HOME = mkdtempSync(join(tmpdir(), "tlc-test-home-"));
@@ -1 +0,0 @@
1
- export const PROJECT_SCOPED_ENV: string[];
@@ -1,14 +0,0 @@
1
- /**
2
- * The names only, with no side effect, so a test can read them without performing the cleanup it is checking.
3
- *
4
- * hazard: this list lived in `test-env.mjs` next to the `delete` loop, and the guard test imported it from
5
- * there. Importing that module runs the loop, so the guard cleaned the very environment it was asserting about
6
- * and could never fail. Data and effect are separate for that reason.
7
- *
8
- * invariant: only variables that name WHICH project. `TLC_HOME` names which runtime, is set deliberately by
9
- * CI, and is part of what the suite exercises.
10
- */
11
- // hazard: `CURSOR_PROJECT_DIR` was absent while `cursor.inbound.ts` prefers it over the payload's workspace
12
- // root — the same hole this list exists to close, for the other provider. A suite launched from inside a Cursor
13
- // hook would have read the real repository exactly as the Claude case did.
14
- export const PROJECT_SCOPED_ENV = ["CLAUDE_PROJECT_DIR", "CURSOR_PROJECT_DIR", "TLC_PROJECT_DIR"];