sofia-cli 0.1.2 → 0.1.4

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 +42 -20
  2. package/dist/infra/deploy.sh +193 -0
  3. package/dist/infra/gather-env.sh +211 -0
  4. package/dist/infra/infra/deploy.sh +193 -0
  5. package/dist/infra/infra/gather-env.sh +211 -0
  6. package/dist/infra/infra/main.bicep +90 -0
  7. package/dist/infra/infra/main.bicepparam +18 -0
  8. package/dist/infra/infra/resources.bicep +134 -0
  9. package/dist/infra/infra/teardown.sh +114 -0
  10. package/dist/infra/main.bicep +90 -0
  11. package/dist/infra/main.bicepparam +18 -0
  12. package/dist/infra/resources.bicep +134 -0
  13. package/dist/infra/teardown.sh +114 -0
  14. package/dist/src/cli/developCommand.js +0 -2
  15. package/dist/src/cli/index.js +8 -1
  16. package/dist/src/cli/workshopCommand.js +1 -1
  17. package/dist/src/develop/index.js +1 -1
  18. package/dist/src/develop/pocUtils.js +228 -0
  19. package/dist/src/develop/ralphLoop.js +8 -27
  20. package/dist/src/shared/data/cards.json +655 -670
  21. package/docs/architecture.md +2 -1
  22. package/package.json +5 -3
  23. package/src/cli/developCommand.ts +1 -3
  24. package/src/cli/index.ts +11 -1
  25. package/src/cli/workshopCommand.ts +21 -17
  26. package/src/develop/dynamicScaffolder.ts +36 -30
  27. package/src/develop/index.ts +13 -2
  28. package/src/develop/pocUtils.ts +296 -0
  29. package/src/develop/ralphLoop.ts +8 -28
  30. package/src/develop/templateRegistry.ts +19 -18
  31. package/src/shared/data/cards.json +655 -670
  32. package/tests/e2e/developE2e.spec.ts +3 -61
  33. package/tests/e2e/developFailureE2e.spec.ts +34 -38
  34. package/tests/integration/pocGithubMcp.spec.ts +29 -39
  35. package/tests/integration/pocLocalFallback.spec.ts +29 -39
  36. package/tests/integration/ralphLoopFlow.spec.ts +46 -66
  37. package/tests/integration/ralphLoopPartial.spec.ts +30 -37
  38. package/tests/unit/develop/githubMcpAdapter.spec.ts +0 -134
  39. package/tests/unit/develop/outputValidator.spec.ts +45 -21
  40. package/tests/unit/develop/ralphLoop.spec.ts +58 -94
  41. package/tsconfig.json +2 -1
  42. package/vitest.workspace.ts +5 -0
  43. package/dist/src/develop/pocScaffolder.js +0 -542
  44. package/dist/tests/e2e/developE2e.spec.js +0 -126
  45. package/dist/tests/e2e/developFailureE2e.spec.js +0 -247
  46. package/dist/tests/e2e/developPty.spec.js +0 -75
  47. package/dist/tests/e2e/discoveryWebSearchRelevance.spec.js +0 -84
  48. package/dist/tests/e2e/harness.spec.js +0 -83
  49. package/dist/tests/e2e/mcpLive.spec.js +0 -120
  50. package/dist/tests/e2e/newSession.e2e.spec.js +0 -177
  51. package/dist/tests/e2e/ralphLoopEnrichmentComparison.spec.js +0 -62
  52. package/dist/tests/e2e/workiqEnrichment.spec.js +0 -56
  53. package/dist/tests/e2e/zavaSimulation.spec.js +0 -452
  54. package/dist/tests/fixtures/test-fixture-project/src/add.js +0 -3
  55. package/dist/tests/fixtures/test-fixture-project/tests/failing.test.js +0 -6
  56. package/dist/tests/fixtures/test-fixture-project/tests/hanging.test.js +0 -8
  57. package/dist/tests/fixtures/test-fixture-project/tests/passing.test.js +0 -10
  58. package/dist/tests/fixtures/test-fixture-project/vitest.config.js +0 -6
  59. package/dist/tests/integration/autoStartConversation.spec.js +0 -138
  60. package/dist/tests/integration/defaultCommand.spec.js +0 -147
  61. package/dist/tests/integration/directCommandNonTty.spec.js +0 -224
  62. package/dist/tests/integration/directCommandTty.spec.js +0 -151
  63. package/dist/tests/integration/discoveryEnrichmentFlow.spec.js +0 -175
  64. package/dist/tests/integration/exportArtifacts.spec.js +0 -202
  65. package/dist/tests/integration/exportFallbackFlow.spec.js +0 -99
  66. package/dist/tests/integration/mcpDegradationFlow.spec.js +0 -190
  67. package/dist/tests/integration/mcpTransportFlow.spec.js +0 -139
  68. package/dist/tests/integration/newSessionFlow.spec.js +0 -343
  69. package/dist/tests/integration/pocGithubMcp.spec.js +0 -186
  70. package/dist/tests/integration/pocLocalFallback.spec.js +0 -171
  71. package/dist/tests/integration/pocScaffold.spec.js +0 -163
  72. package/dist/tests/integration/ralphLoopFlow.spec.js +0 -359
  73. package/dist/tests/integration/ralphLoopPartial.spec.js +0 -368
  74. package/dist/tests/integration/resumeAndBacktrack.spec.js +0 -247
  75. package/dist/tests/integration/spinnerLifecycle.spec.js +0 -220
  76. package/dist/tests/integration/summarizationFlow.spec.js +0 -115
  77. package/dist/tests/integration/testRunnerReal.spec.js +0 -52
  78. package/dist/tests/integration/webSearchAgent.spec.js +0 -128
  79. package/dist/tests/live/copilotSdkLive.spec.js +0 -107
  80. package/dist/tests/live/zavaFullWorkshop.spec.js +0 -392
  81. package/dist/tests/setup/loadEnv.js +0 -3
  82. package/dist/tests/unit/cli/developCommand.spec.js +0 -567
  83. package/dist/tests/unit/cli/directCommands.spec.js +0 -279
  84. package/dist/tests/unit/cli/envLoader.spec.js +0 -58
  85. package/dist/tests/unit/cli/ioContext.spec.js +0 -119
  86. package/dist/tests/unit/cli/preflight.spec.js +0 -108
  87. package/dist/tests/unit/cli/statusCommand.spec.js +0 -111
  88. package/dist/tests/unit/cli/workshopClientFallback.spec.js +0 -80
  89. package/dist/tests/unit/cli/workshopCommand.spec.js +0 -328
  90. package/dist/tests/unit/config/vitestEnvSetup.spec.js +0 -13
  91. package/dist/tests/unit/develop/checkpointState.spec.js +0 -315
  92. package/dist/tests/unit/develop/codeGenerator.spec.js +0 -355
  93. package/dist/tests/unit/develop/githubMcpAdapter.spec.js +0 -231
  94. package/dist/tests/unit/develop/mcpContextEnricher.spec.js +0 -433
  95. package/dist/tests/unit/develop/outputValidator.spec.js +0 -119
  96. package/dist/tests/unit/develop/pocScaffolder.spec.js +0 -353
  97. package/dist/tests/unit/develop/ralphLoop.spec.js +0 -1248
  98. package/dist/tests/unit/develop/templateRegistry.spec.js +0 -85
  99. package/dist/tests/unit/develop/testRunner.spec.js +0 -249
  100. package/dist/tests/unit/infraBicep.spec.js +0 -92
  101. package/dist/tests/unit/infraDeploy.spec.js +0 -82
  102. package/dist/tests/unit/infraTeardown.spec.js +0 -63
  103. package/dist/tests/unit/logging/logger.spec.js +0 -43
  104. package/dist/tests/unit/loop/conversationLoop.spec.js +0 -592
  105. package/dist/tests/unit/loop/phaseSummarizer.spec.js +0 -141
  106. package/dist/tests/unit/loop/streamingMarkdown.spec.js +0 -147
  107. package/dist/tests/unit/mcp/mcpManager.spec.js +0 -279
  108. package/dist/tests/unit/mcp/mcpTransport.spec.js +0 -529
  109. package/dist/tests/unit/mcp/retryPolicy.spec.js +0 -218
  110. package/dist/tests/unit/mcp/timeoutValidation.spec.js +0 -46
  111. package/dist/tests/unit/mcp/webSearch.spec.js +0 -567
  112. package/dist/tests/unit/phases/contextSummarizer.spec.js +0 -140
  113. package/dist/tests/unit/phases/discoveryEnricher.repeatCalls.spec.js +0 -93
  114. package/dist/tests/unit/phases/discoveryEnricher.spec.js +0 -411
  115. package/dist/tests/unit/phases/phaseExtractors.spec.js +0 -352
  116. package/dist/tests/unit/phases/phaseHandlers.spec.js +0 -425
  117. package/dist/tests/unit/prompts/promptLoader.spec.js +0 -118
  118. package/dist/tests/unit/schemas/pocSchemas.spec.js +0 -412
  119. package/dist/tests/unit/schemas/session.spec.js +0 -257
  120. package/dist/tests/unit/sessions/exportPaths.spec.js +0 -31
  121. package/dist/tests/unit/sessions/exportWriter.spec.js +0 -655
  122. package/dist/tests/unit/sessions/sessionManager.spec.js +0 -151
  123. package/dist/tests/unit/sessions/sessionStore.spec.js +0 -116
  124. package/dist/tests/unit/shared/activitySpinner.spec.js +0 -175
  125. package/dist/tests/unit/shared/cardsLoader.spec.js +0 -76
  126. package/dist/tests/unit/shared/copilotClient.spec.js +0 -155
  127. package/dist/tests/unit/shared/errorClassifier.spec.js +0 -131
  128. package/dist/tests/unit/shared/events.spec.js +0 -55
  129. package/dist/tests/unit/shared/markdownRenderer.spec.js +0 -35
  130. package/dist/tests/unit/shared/markdownRendererChunks.spec.js +0 -70
  131. package/dist/tests/unit/shared/tableRenderer.spec.js +0 -34
  132. package/dist/vitest.config.js +0 -14
  133. package/dist/vitest.live.config.js +0 -18
  134. package/src/develop/pocScaffolder.ts +0 -646
  135. package/tests/integration/pocScaffold.spec.ts +0 -220
  136. package/tests/unit/develop/pocScaffolder.spec.ts +0 -451
@@ -1,131 +0,0 @@
1
- /**
2
- * Error classifier tests (T055).
3
- *
4
- * Validates centralized error classification and user-facing messages:
5
- * - Maps known error codes to categories
6
- * - Provides actionable messages
7
- * - Handles unknown errors gracefully
8
- * - Supports MCP, network, auth, and session errors
9
- */
10
- import { describe, it, expect } from 'vitest';
11
- import { classifyError, toUserMessage, } from '../../../src/shared/errorClassifier.js';
12
- describe('errorClassifier', () => {
13
- describe('classifyError', () => {
14
- it('classifies ECONNREFUSED as connection error', () => {
15
- const err = Object.assign(new Error('connect ECONNREFUSED'), { code: 'ECONNREFUSED' });
16
- const result = classifyError(err);
17
- expect(result.category).toBe('connection');
18
- expect(result.recoverable).toBe(true);
19
- });
20
- it('classifies ENOTFOUND as dns error', () => {
21
- const err = Object.assign(new Error('getaddrinfo ENOTFOUND'), { code: 'ENOTFOUND' });
22
- const result = classifyError(err);
23
- expect(result.category).toBe('dns');
24
- expect(result.recoverable).toBe(true);
25
- });
26
- it('classifies ETIMEDOUT as timeout error', () => {
27
- const err = Object.assign(new Error('connect ETIMEDOUT'), { code: 'ETIMEDOUT' });
28
- const result = classifyError(err);
29
- expect(result.category).toBe('timeout');
30
- expect(result.recoverable).toBe(true);
31
- });
32
- it('classifies 401 as auth error', () => {
33
- const err = Object.assign(new Error('Unauthorized'), { statusCode: 401 });
34
- const result = classifyError(err);
35
- expect(result.category).toBe('auth');
36
- expect(result.recoverable).toBe(false);
37
- });
38
- it('classifies 403 as auth error', () => {
39
- const err = Object.assign(new Error('Forbidden'), { statusCode: 403 });
40
- const result = classifyError(err);
41
- expect(result.category).toBe('auth');
42
- });
43
- it('classifies 429 as rate-limit error', () => {
44
- const err = Object.assign(new Error('Too Many Requests'), { statusCode: 429 });
45
- const result = classifyError(err);
46
- expect(result.category).toBe('rate-limit');
47
- expect(result.recoverable).toBe(true);
48
- });
49
- it('classifies ENOENT as not-found error', () => {
50
- const err = Object.assign(new Error('ENOENT: no such file'), { code: 'ENOENT' });
51
- const result = classifyError(err);
52
- expect(result.category).toBe('not-found');
53
- });
54
- it('classifies session validation errors', () => {
55
- const err = new Error('Invalid session: missing required field');
56
- err.name = 'ZodError';
57
- const result = classifyError(err);
58
- expect(result.category).toBe('validation');
59
- });
60
- it('classifies unknown errors as internal', () => {
61
- const err = new Error('Something unexpected happened');
62
- const result = classifyError(err);
63
- expect(result.category).toBe('internal');
64
- expect(result.recoverable).toBe(false);
65
- });
66
- it('classifies MCP-related errors', () => {
67
- const err = new Error('MCP server workiq failed to start');
68
- const result = classifyError(err);
69
- expect(result.category).toBe('mcp');
70
- });
71
- it('handles non-Error objects', () => {
72
- const result = classifyError('string error');
73
- expect(result.category).toBe('internal');
74
- expect(result.originalError).toBe('string error');
75
- });
76
- });
77
- describe('toUserMessage', () => {
78
- it('returns actionable message for connection errors', () => {
79
- const classification = {
80
- category: 'connection',
81
- recoverable: true,
82
- message: 'Connection refused',
83
- originalError: new Error('ECONNREFUSED'),
84
- };
85
- const msg = toUserMessage(classification);
86
- expect(msg).toContain('connection');
87
- });
88
- it('returns actionable message for auth errors', () => {
89
- const classification = {
90
- category: 'auth',
91
- recoverable: false,
92
- message: 'Unauthorized',
93
- originalError: new Error('401'),
94
- };
95
- const msg = toUserMessage(classification);
96
- expect(msg).toContain('auth');
97
- });
98
- it('returns actionable message for timeout errors', () => {
99
- const classification = {
100
- category: 'timeout',
101
- recoverable: true,
102
- message: 'Request timed out',
103
- originalError: new Error('ETIMEDOUT'),
104
- };
105
- const msg = toUserMessage(classification);
106
- expect(msg).toContain('timed out');
107
- });
108
- it('returns generic message for internal errors', () => {
109
- const classification = {
110
- category: 'internal',
111
- recoverable: false,
112
- message: 'Unexpected error',
113
- originalError: new Error('kaboom'),
114
- };
115
- const msg = toUserMessage(classification);
116
- expect(msg.length).toBeGreaterThan(0);
117
- });
118
- it('does not include stack traces', () => {
119
- const err = new Error('test');
120
- err.stack = 'Error: test\n at something.js:1:2';
121
- const classification = {
122
- category: 'internal',
123
- recoverable: false,
124
- message: 'test',
125
- originalError: err,
126
- };
127
- const msg = toUserMessage(classification);
128
- expect(msg).not.toContain('at something');
129
- });
130
- });
131
- });
@@ -1,55 +0,0 @@
1
- /**
2
- * Unit tests for event model.
3
- */
4
- import { describe, it, expect } from 'vitest';
5
- import { createTextDeltaEvent, createActivityEvent, createToolCallEvent, createToolResultEvent, createPhaseChangedEvent, createErrorEvent, } from '../../../src/shared/events.js';
6
- describe('event model', () => {
7
- it('createTextDeltaEvent creates a valid event', () => {
8
- const event = createTextDeltaEvent('Hello ');
9
- expect(event.type).toBe('TextDelta');
10
- expect(event.text).toBe('Hello ');
11
- expect(event.timestamp).toBeTruthy();
12
- });
13
- it('createActivityEvent creates a valid event', () => {
14
- const event = createActivityEvent('Connecting to MCP...');
15
- expect(event.type).toBe('Activity');
16
- expect(event.message).toBe('Connecting to MCP...');
17
- });
18
- it('createToolCallEvent includes tool name and args', () => {
19
- const event = createToolCallEvent('web.search', { query: 'AI trends' });
20
- expect(event.type).toBe('ToolCall');
21
- expect(event.toolName).toBe('web.search');
22
- expect(event.args).toEqual({ query: 'AI trends' });
23
- });
24
- it('createToolResultEvent includes tool name and result', () => {
25
- const event = createToolResultEvent('web.search', { results: [] });
26
- expect(event.type).toBe('ToolResult');
27
- expect(event.toolName).toBe('web.search');
28
- });
29
- it('createPhaseChangedEvent includes old and new phase', () => {
30
- const event = createPhaseChangedEvent('Discover', 'Ideate');
31
- expect(event.type).toBe('PhaseChanged');
32
- expect(event.fromPhase).toBe('Discover');
33
- expect(event.toPhase).toBe('Ideate');
34
- });
35
- it('createErrorEvent includes code and message', () => {
36
- const event = createErrorEvent('MCP_TIMEOUT', 'WorkIQ timed out');
37
- expect(event.type).toBe('Error');
38
- expect(event.code).toBe('MCP_TIMEOUT');
39
- expect(event.message).toBe('WorkIQ timed out');
40
- });
41
- it('all events have a timestamp', () => {
42
- const events = [
43
- createTextDeltaEvent('x'),
44
- createActivityEvent('y'),
45
- createToolCallEvent('t', {}),
46
- createToolResultEvent('t', {}),
47
- createPhaseChangedEvent('Discover', 'Ideate'),
48
- createErrorEvent('E', 'msg'),
49
- ];
50
- for (const e of events) {
51
- expect(e.timestamp).toBeTruthy();
52
- expect(typeof e.timestamp).toBe('string');
53
- }
54
- });
55
- });
@@ -1,35 +0,0 @@
1
- /**
2
- * Unit tests for markdown renderer.
3
- */
4
- import { describe, it, expect } from 'vitest';
5
- import { renderMarkdown } from '../../../src/shared/markdownRenderer.js';
6
- describe('renderMarkdown', () => {
7
- it('renders a heading', () => {
8
- const output = renderMarkdown('# Hello World');
9
- expect(output).toBeTruthy();
10
- expect(output.length).toBeGreaterThan(0);
11
- });
12
- it('renders a list', () => {
13
- const output = renderMarkdown('- One\n- Two\n- Three');
14
- expect(output).toContain('One');
15
- expect(output).toContain('Two');
16
- });
17
- it('renders a code block', () => {
18
- const output = renderMarkdown('```json\n{"key": "value"}\n```');
19
- expect(output).toContain('key');
20
- });
21
- it('returns plain text in non-TTY mode', () => {
22
- const output = renderMarkdown('# Hello World', { isTTY: false });
23
- // Should not contain ANSI codes in non-TTY mode
24
- expect(output).toContain('Hello World');
25
- });
26
- it('handles empty string', () => {
27
- const output = renderMarkdown('');
28
- expect(output).toBe('');
29
- });
30
- it('handles raw Markdown preservation in non-TTY json mode', () => {
31
- const output = renderMarkdown('# Title\n\nBody text', { isTTY: false, jsonMode: true });
32
- // In json mode, return raw markdown
33
- expect(output).toContain('# Title');
34
- });
35
- });
@@ -1,70 +0,0 @@
1
- /**
2
- * Tests for markdownRenderer handling of partial/incremental chunks (T081).
3
- *
4
- * Verifies that renderMarkdown doesn't crash on partial markdown input
5
- * (split headings, incomplete bold, partial tables).
6
- */
7
- import { describe, it, expect } from 'vitest';
8
- import { renderMarkdown } from '../../../src/shared/markdownRenderer.js';
9
- describe('renderMarkdown incremental chunk handling (T081)', () => {
10
- it('handles a partial heading (no newline)', () => {
11
- // During streaming, a heading might arrive without a trailing newline
12
- const result = renderMarkdown('## Start of head', { isTTY: true });
13
- expect(result).toBeTruthy();
14
- expect(result).toContain('Start of head');
15
- });
16
- it('handles incomplete bold syntax', () => {
17
- // Bold started but not closed
18
- const result = renderMarkdown('Some **bold text without', { isTTY: true });
19
- expect(result).toBeTruthy();
20
- expect(result).toContain('bold text without');
21
- });
22
- it('handles incomplete code block', () => {
23
- // Code block opened but not closed
24
- const result = renderMarkdown('```typescript\nconst x = 1;\n', { isTTY: true });
25
- expect(result).toBeTruthy();
26
- expect(result).toContain('const x = 1');
27
- });
28
- it('handles partial table row', () => {
29
- const result = renderMarkdown('| Column 1 | Column 2 |\n| ----', { isTTY: true });
30
- expect(result).toBeTruthy();
31
- });
32
- it('handles empty chunk', () => {
33
- const result = renderMarkdown('', { isTTY: true });
34
- expect(result).toBe('');
35
- });
36
- it('handles single character chunk', () => {
37
- const result = renderMarkdown('H', { isTTY: true });
38
- expect(result).toBeTruthy();
39
- });
40
- it('handles newline-only chunk without throwing', () => {
41
- const result = renderMarkdown('\n', { isTTY: true });
42
- // A newline-only chunk may produce empty string; it must not throw
43
- expect(typeof result).toBe('string');
44
- });
45
- it('handles incomplete link syntax', () => {
46
- const result = renderMarkdown('Click [here](http://example', { isTTY: true });
47
- expect(result).toBeTruthy();
48
- });
49
- it('handles partial list item', () => {
50
- const result = renderMarkdown('- Item one\n- Item tw', { isTTY: true });
51
- expect(result).toBeTruthy();
52
- expect(result).toContain('Item one');
53
- });
54
- it('renders complete markdown correctly in TTY mode', () => {
55
- const md = '## Title\n\n- **Bold item**\n- Regular item\n\n```js\nconst x = 1;\n```\n';
56
- const result = renderMarkdown(md, { isTTY: true });
57
- expect(result).toContain('Title');
58
- expect(result).toContain('Bold item');
59
- expect(result).toContain('Regular item');
60
- });
61
- it('returns raw markdown in JSON mode regardless of content', () => {
62
- const md = '## Partial **heading';
63
- const result = renderMarkdown(md, { isTTY: true, jsonMode: true });
64
- expect(result).toBe(md);
65
- });
66
- it('handles non-TTY mode with partial markdown', () => {
67
- const result = renderMarkdown('**incomplete bold', { isTTY: false });
68
- expect(result).toBeTruthy();
69
- });
70
- });
@@ -1,34 +0,0 @@
1
- /**
2
- * Unit tests for table renderer.
3
- */
4
- import { describe, it, expect } from 'vitest';
5
- import { renderTable } from '../../../src/shared/tableRenderer.js';
6
- describe('renderTable', () => {
7
- it('renders a simple table', () => {
8
- const output = renderTable({
9
- head: ['Name', 'Score'],
10
- rows: [
11
- ['Idea A', '85'],
12
- ['Idea B', '72'],
13
- ],
14
- });
15
- expect(output).toContain('Name');
16
- expect(output).toContain('Score');
17
- expect(output).toContain('Idea A');
18
- expect(output).toContain('85');
19
- });
20
- it('handles empty rows', () => {
21
- const output = renderTable({
22
- head: ['Col1'],
23
- rows: [],
24
- });
25
- expect(output).toContain('Col1');
26
- });
27
- it('renders without headers', () => {
28
- const output = renderTable({
29
- rows: [['a', 'b'], ['c', 'd']],
30
- });
31
- expect(output).toContain('a');
32
- expect(output).toContain('d');
33
- });
34
- });
@@ -1,14 +0,0 @@
1
- import { defineConfig } from 'vitest/config';
2
- export default defineConfig({
3
- test: {
4
- globals: true,
5
- setupFiles: ['tests/setup/loadEnv.ts'],
6
- include: ['tests/**/*.{test,spec}.ts'],
7
- exclude: ['tests/live/**', 'tests/fixtures/**'],
8
- coverage: {
9
- enabled: true,
10
- provider: 'v8',
11
- },
12
- testTimeout: 10_000, // Default timeout for tests (can be overridden per test)
13
- },
14
- });
@@ -1,18 +0,0 @@
1
- /**
2
- * Vitest config for live (slow) tests that hit the real Copilot SDK.
3
- * Run with: npm run test:live
4
- */
5
- import { defineConfig } from 'vitest/config';
6
- export default defineConfig({
7
- test: {
8
- globals: true,
9
- setupFiles: ['tests/setup/loadEnv.ts'],
10
- include: ['tests/live/**/*.{test,spec}.ts'],
11
- testTimeout: 120_000,
12
- hookTimeout: 60_000,
13
- coverage: {
14
- enabled: true,
15
- provider: 'v8',
16
- },
17
- },
18
- });