From 346199ebbdd26689ad54826ac5b9a62b84c28029 Mon Sep 17 00:00:00 2001 From: Jonathan Flatt Date: Tue, 3 Jun 2025 22:43:20 +0000 Subject: [PATCH] feat: Implement combined test coverage for main project and CLI - Add combined coverage script to merge lcov reports - Update GitHub workflows to generate and upload combined coverage - Install missing CLI dependencies (ora, yaml, cli-table3, mock-fs) - Add initial tests for SessionManager and IssueHandler - Exclude type-only files from coverage metrics - Update jest config to exclude type files from coverage This ensures Codecov receives coverage data from both the main project and CLI subdirectory, providing accurate overall project coverage metrics. --- .github/workflows/main.yml | 8 +- .github/workflows/pull-request.yml | 8 +- analyze-combined-coverage.js | 83 + analyze-coverage.js | 83 + calculate-codecov-match.js | 99 + cli/package-lock.json | 439 +- cli/package.json | 11 +- coverage-combined/lcov.info | 3819 +++++++++++++++++ jest.config.js | 1 + package.json | 1 + scripts/combine-coverage.js | 88 + .../claude/services/SessionManager.test.ts | 323 ++ .../github/handlers/IssueHandler.test.ts | 131 + 13 files changed, 4901 insertions(+), 193 deletions(-) create mode 100755 analyze-combined-coverage.js create mode 100644 analyze-coverage.js create mode 100644 calculate-codecov-match.js create mode 100644 coverage-combined/lcov.info create mode 100755 scripts/combine-coverage.js create mode 100644 test/unit/providers/claude/services/SessionManager.test.ts create mode 100644 test/unit/providers/github/handlers/IssueHandler.test.ts diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d397ed6..e17c734 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -22,12 +22,18 @@ jobs: cache: npm - run: npm ci - run: npm run lint:check - - run: npm run test:ci + - name: Install CLI dependencies + working-directory: ./cli + run: npm ci + - name: Generate combined coverage + run: ./scripts/combine-coverage.js env: NODE_ENV: test - uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} + directory: ./coverage-combined + fail_ci_if_error: true security: runs-on: ubuntu-latest diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 2f2f986..5bceb93 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -20,12 +20,18 @@ jobs: - run: npm run format:check - run: npm run lint:check - run: npm run typecheck - - run: npm run test:ci + - name: Install CLI dependencies + working-directory: ./cli + run: npm ci + - name: Generate combined coverage + run: ./scripts/combine-coverage.js env: NODE_ENV: test - uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} + directory: ./coverage-combined + fail_ci_if_error: true security: runs-on: ubuntu-latest diff --git a/analyze-combined-coverage.js b/analyze-combined-coverage.js new file mode 100755 index 0000000..c20c7fc --- /dev/null +++ b/analyze-combined-coverage.js @@ -0,0 +1,83 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const path = require('path'); + +// Read combined lcov.info +const lcovPath = path.join(__dirname, 'coverage-combined', 'lcov.info'); +if (!fs.existsSync(lcovPath)) { + console.error('No coverage-combined/lcov.info file found. Run npm run test:combined-coverage first.'); + process.exit(1); +} + +const lcovContent = fs.readFileSync(lcovPath, 'utf8'); +const lines = lcovContent.split('\n'); + +let currentFile = null; +const fileStats = {}; +let totalLines = 0; +let coveredLines = 0; + +for (const line of lines) { + if (line.startsWith('SF:')) { + currentFile = line.substring(3); + if (!fileStats[currentFile]) { + fileStats[currentFile] = { lines: 0, covered: 0, functions: 0, functionsHit: 0 }; + } + } else if (line.startsWith('DA:')) { + const [lineNum, hits] = line.substring(3).split(',').map(Number); + if (currentFile) { + fileStats[currentFile].lines++; + totalLines++; + if (hits > 0) { + fileStats[currentFile].covered++; + coveredLines++; + } + } + } +} + +const overallCoverage = (coveredLines / totalLines) * 100; + +console.log('\n=== Combined Coverage Analysis ===\n'); +console.log(`Total Lines: ${totalLines}`); +console.log(`Covered Lines: ${coveredLines}`); +console.log(`Overall Coverage: ${overallCoverage.toFixed(2)}%`); +console.log(`Target: 80%`); +console.log(`Status: ${overallCoverage >= 80 ? '✅ PASSED' : '❌ FAILED'}\n`); + +// Break down by directory +const srcFiles = Object.entries(fileStats).filter(([file]) => file.startsWith('src/')); +const cliFiles = Object.entries(fileStats).filter(([file]) => file.startsWith('cli/')); + +const srcStats = srcFiles.reduce((acc, [, stats]) => ({ + lines: acc.lines + stats.lines, + covered: acc.covered + stats.covered +}), { lines: 0, covered: 0 }); + +const cliStats = cliFiles.reduce((acc, [, stats]) => ({ + lines: acc.lines + stats.lines, + covered: acc.covered + stats.covered +}), { lines: 0, covered: 0 }); + +console.log('=== Coverage by Component ==='); +console.log(`Main src/: ${((srcStats.covered / srcStats.lines) * 100).toFixed(2)}% (${srcStats.covered}/${srcStats.lines} lines)`); +console.log(`CLI: ${((cliStats.covered / cliStats.lines) * 100).toFixed(2)}% (${cliStats.covered}/${cliStats.lines} lines)`); + +// Show files with lowest coverage +console.log('\n=== Files with Lowest Coverage ==='); +const sorted = Object.entries(fileStats) + .map(([file, stats]) => ({ + file, + coverage: (stats.covered / stats.lines) * 100, + lines: stats.lines, + covered: stats.covered + })) + .sort((a, b) => a.coverage - b.coverage) + .slice(0, 10); + +sorted.forEach(({ file, coverage, covered, lines }) => { + console.log(`${file.padEnd(60)} ${coverage.toFixed(2).padStart(6)}% (${covered}/${lines})`); +}); + +process.exit(overallCoverage >= 80 ? 0 : 1); \ No newline at end of file diff --git a/analyze-coverage.js b/analyze-coverage.js new file mode 100644 index 0000000..a5ab4d8 --- /dev/null +++ b/analyze-coverage.js @@ -0,0 +1,83 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const path = require('path'); + +// Read lcov.info +const lcovPath = path.join(__dirname, 'coverage', 'lcov.info'); +if (!fs.existsSync(lcovPath)) { + console.error('No coverage/lcov.info file found. Run npm test:coverage first.'); + process.exit(1); +} + +const lcovContent = fs.readFileSync(lcovPath, 'utf8'); +const lines = lcovContent.split('\n'); + +let currentFile = null; +const fileStats = {}; +let totalLines = 0; +let coveredLines = 0; + +for (const line of lines) { + if (line.startsWith('SF:')) { + currentFile = line.substring(3); + if (!fileStats[currentFile]) { + fileStats[currentFile] = { lines: 0, covered: 0, functions: 0, functionsHit: 0 }; + } + } else if (line.startsWith('DA:')) { + const [lineNum, hits] = line.substring(3).split(',').map(Number); + if (currentFile) { + fileStats[currentFile].lines++; + totalLines++; + if (hits > 0) { + fileStats[currentFile].covered++; + coveredLines++; + } + } + } else if (line.startsWith('FNF:')) { + if (currentFile) { + fileStats[currentFile].functions = parseInt(line.substring(4)); + } + } else if (line.startsWith('FNH:')) { + if (currentFile) { + fileStats[currentFile].functionsHit = parseInt(line.substring(4)); + } + } +} + +console.log('\n=== Coverage Analysis ===\n'); +console.log(`Total Lines: ${totalLines}`); +console.log(`Covered Lines: ${coveredLines}`); +console.log(`Overall Coverage: ${((coveredLines / totalLines) * 100).toFixed(2)}%\n`); + +console.log('=== File Breakdown ===\n'); +const sortedFiles = Object.entries(fileStats).sort((a, b) => { + const coverageA = (a[1].covered / a[1].lines) * 100; + const coverageB = (b[1].covered / b[1].lines) * 100; + return coverageA - coverageB; +}); + +for (const [file, stats] of sortedFiles) { + const coverage = ((stats.covered / stats.lines) * 100).toFixed(2); + console.log(`${file.padEnd(60)} ${coverage.padStart(6)}% (${stats.covered}/${stats.lines} lines)`); +} + +// Check if CLI coverage is included +console.log('\n=== Coverage Scope Analysis ===\n'); +const cliFiles = sortedFiles.filter(([file]) => file.includes('cli/')); +const srcFiles = sortedFiles.filter(([file]) => file.startsWith('src/')); + +console.log(`Main src/ files: ${srcFiles.length}`); +console.log(`CLI files: ${cliFiles.length}`); + +if (cliFiles.length > 0) { + console.log('\nCLI files found in coverage:'); + cliFiles.forEach(([file]) => console.log(` - ${file}`)); +} + +// Check for any unexpected files +const otherFiles = sortedFiles.filter(([file]) => !file.startsWith('src/') && !file.includes('cli/')); +if (otherFiles.length > 0) { + console.log('\nOther files in coverage:'); + otherFiles.forEach(([file]) => console.log(` - ${file}`)); +} \ No newline at end of file diff --git a/calculate-codecov-match.js b/calculate-codecov-match.js new file mode 100644 index 0000000..0da4239 --- /dev/null +++ b/calculate-codecov-match.js @@ -0,0 +1,99 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const path = require('path'); + +// Coverage data from the test output +const coverageData = { + 'src/index.ts': { statements: 92.64, branches: 78.94, functions: 85.71, lines: 92.64 }, + 'src/controllers/githubController.ts': { statements: 69.65, branches: 64.47, functions: 84.61, lines: 69.2 }, + 'src/core/webhook/WebhookProcessor.ts': { statements: 100, branches: 92.3, functions: 100, lines: 100 }, + 'src/core/webhook/WebhookRegistry.ts': { statements: 97.77, branches: 100, functions: 100, lines: 97.67 }, + 'src/core/webhook/constants.ts': { statements: 100, branches: 100, functions: 100, lines: 100 }, + 'src/core/webhook/index.ts': { statements: 0, branches: 100, functions: 0, lines: 0 }, + 'src/providers/claude/ClaudeWebhookProvider.ts': { statements: 77.41, branches: 46.66, functions: 100, lines: 77.41 }, + 'src/providers/claude/index.ts': { statements: 100, branches: 100, functions: 0, lines: 100 }, + 'src/providers/claude/handlers/OrchestrationHandler.ts': { statements: 95.65, branches: 75, functions: 100, lines: 95.65 }, + 'src/providers/claude/handlers/SessionHandler.ts': { statements: 96.66, branches: 89.28, functions: 100, lines: 96.66 }, + 'src/providers/claude/services/SessionManager.ts': { statements: 6.06, branches: 0, functions: 0, lines: 6.06 }, + 'src/providers/claude/services/TaskDecomposer.ts': { statements: 96.87, branches: 93.75, functions: 100, lines: 96.66 }, + 'src/providers/github/GitHubWebhookProvider.ts': { statements: 95.45, branches: 90.62, functions: 100, lines: 95.45 }, + 'src/providers/github/index.ts': { statements: 100, branches: 100, functions: 100, lines: 100 }, + 'src/providers/github/handlers/IssueHandler.ts': { statements: 30.43, branches: 0, functions: 0, lines: 30.43 }, + 'src/routes/github.ts': { statements: 100, branches: 100, functions: 100, lines: 100 }, + 'src/routes/webhooks.ts': { statements: 92.1, branches: 100, functions: 57.14, lines: 91.66 }, + 'src/services/claudeService.ts': { statements: 85.62, branches: 66.17, functions: 100, lines: 86.66 }, + 'src/services/githubService.ts': { statements: 72.22, branches: 78.57, functions: 75, lines: 71.93 }, + 'src/types/claude.ts': { statements: 0, branches: 100, functions: 100, lines: 0 }, + 'src/types/environment.ts': { statements: 0, branches: 0, functions: 0, lines: 0 }, + 'src/types/index.ts': { statements: 0, branches: 0, functions: 0, lines: 0 }, + 'src/utils/awsCredentialProvider.ts': { statements: 65.68, branches: 59.25, functions: 54.54, lines: 65.68 }, + 'src/utils/logger.ts': { statements: 51.61, branches: 47.36, functions: 100, lines: 51.72 }, + 'src/utils/sanitize.ts': { statements: 100, branches: 100, functions: 100, lines: 100 }, + 'src/utils/secureCredentials.ts': { statements: 54.28, branches: 70.58, functions: 33.33, lines: 54.28 }, + 'src/utils/startup-metrics.ts': { statements: 100, branches: 100, functions: 100, lines: 100 } +}; + +// Calculate different scenarios +console.log('\n=== Coverage Analysis - Matching Codecov ===\n'); + +// Scenario 1: Exclude type definition files +const withoutTypes = Object.entries(coverageData) + .filter(([file]) => !file.includes('/types/')) + .reduce((acc, [file, data]) => { + acc[file] = data; + return acc; + }, {}); + +const avgWithoutTypes = calculateAverage(withoutTypes); +console.log(`1. Without type files: ${avgWithoutTypes.toFixed(2)}%`); + +// Scenario 2: Exclude files with 0% coverage +const withoutZeroCoverage = Object.entries(coverageData) + .filter(([file, data]) => data.lines > 0) + .reduce((acc, [file, data]) => { + acc[file] = data; + return acc; + }, {}); + +const avgWithoutZero = calculateAverage(withoutZeroCoverage); +console.log(`2. Without 0% coverage files: ${avgWithoutZero.toFixed(2)}%`); + +// Scenario 3: Exclude specific low coverage files +const excludeLowCoverage = Object.entries(coverageData) + .filter(([file]) => { + return !file.includes('/types/') && + !file.includes('SessionManager.ts') && + !file.includes('IssueHandler.ts'); + }) + .reduce((acc, [file, data]) => { + acc[file] = data; + return acc; + }, {}); + +const avgExcludeLow = calculateAverage(excludeLowCoverage); +console.log(`3. Without types, SessionManager, IssueHandler: ${avgExcludeLow.toFixed(2)}%`); + +// Scenario 4: Statement coverage only (what codecov might be reporting) +const statementOnly = calculateStatementAverage(coverageData); +console.log(`4. Statement coverage only: ${statementOnly.toFixed(2)}%`); + +// Show which files have the biggest impact +console.log('\n=== Files with lowest coverage ==='); +const sorted = Object.entries(coverageData) + .sort((a, b) => a[1].lines - b[1].lines) + .slice(0, 10); + +sorted.forEach(([file, data]) => { + console.log(`${file.padEnd(60)} ${data.lines.toFixed(2)}%`); +}); + +function calculateAverage(data) { + const values = Object.values(data).map(d => d.lines); + return values.reduce((sum, val) => sum + val, 0) / values.length; +} + +function calculateStatementAverage(data) { + const values = Object.values(data).map(d => d.statements); + return values.reduce((sum, val) => sum + val, 0) / values.length; +} \ No newline at end of file diff --git a/cli/package-lock.json b/cli/package-lock.json index d41dfbc..331ae2c 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -10,12 +10,9 @@ "dependencies": { "axios": "^1.6.2", "chalk": "^4.1.2", - "cli-table3": "^0.6.3", "commander": "^14.0.0", "dotenv": "^16.3.1", - "ora": "^5.4.1", - "uuid": "^9.0.0", - "yaml": "^2.3.4" + "uuid": "^9.0.0" }, "bin": { "claude-hub": "claude-hub" @@ -24,12 +21,16 @@ "@types/jest": "^29.5.0", "@types/mock-fs": "^4.13.4", "@types/node": "^20.10.0", + "@types/ora": "^3.1.0", "@types/uuid": "^9.0.8", + "cli-table3": "^0.6.5", "jest": "^29.5.0", "mock-fs": "^5.5.0", + "ora": "^8.2.0", "ts-jest": "^29.1.0", "ts-node": "^10.9.2", - "typescript": "^5.3.2" + "typescript": "^5.3.2", + "yaml": "^2.8.0" } }, "node_modules/@ampproject/remapping": { @@ -501,6 +502,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, "optional": true, "engines": { "node": ">=0.1.90" @@ -1016,6 +1018,7 @@ "resolved": "https://registry.npmjs.org/@types/mock-fs/-/mock-fs-4.13.4.tgz", "integrity": "sha512-mXmM0o6lULPI8z3XNnQCpL0BGxPwx1Ul1wXYEPBGl4efShyxW2Rln0JOPEWGyZaYZMM6OVXM/15zUuFMY52ljg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -1029,6 +1032,16 @@ "undici-types": "~6.19.2" } }, + "node_modules/@types/ora": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/ora/-/ora-3.1.0.tgz", + "integrity": "sha512-4e15N42qhHRlxyP5SpX9fK3q4tXvEkdmGdof2DZ0mqPu7glrNT8cs9bbI73NhwEGApq1TSXhs2aFmn19VCTwCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -1099,6 +1112,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -1282,35 +1296,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1386,29 +1371,6 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -1511,20 +1473,26 @@ "dev": true }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-spinners": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, "engines": { "node": ">=6" }, @@ -1536,6 +1504,8 @@ "version": "0.6.5", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "license": "MIT", "dependencies": { "string-width": "^4.2.0" }, @@ -1560,14 +1530,6 @@ "node": ">=12" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -1712,17 +1674,6 @@ "node": ">=0.10.0" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1818,7 +1769,8 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/error-ex": { "version": "1.3.2", @@ -2098,6 +2050,19 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -2260,25 +2225,6 @@ "node": ">=10.17.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", @@ -2321,7 +2267,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/is-arrayish": { "version": "0.2.1", @@ -2348,6 +2295,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { "node": ">=8" } @@ -2362,11 +2310,16 @@ } }, "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-number": { @@ -2391,11 +2344,13 @@ } }, "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3162,15 +3117,43 @@ "dev": true }, "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3277,10 +3260,24 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, "engines": { "node": ">=6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3298,6 +3295,7 @@ "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-5.5.0.tgz", "integrity": "sha512-d/P1M/RacgM3dB0sJ8rjeRNXxtapkPCUnMGmIN0ixJ16F/E4GUZCvWcSGfWGz8eaXYvn1s9baUwNjI4LOPEjiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0.0" } @@ -3360,6 +3358,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -3371,27 +3370,96 @@ } }, "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -3599,19 +3667,6 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3672,35 +3727,50 @@ } }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/semver": { "version": "6.3.1", @@ -3735,7 +3805,8 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/sisteransi": { "version": "1.0.5", @@ -3789,12 +3860,17 @@ "node": ">=10" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-length": { @@ -3814,6 +3890,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3827,6 +3904,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4105,11 +4183,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, "node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -4151,14 +4224,6 @@ "makeerror": "1.0.12" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dependencies": { - "defaults": "^1.0.3" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4229,6 +4294,8 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "dev": true, + "license": "ISC", "bin": { "yaml": "bin.mjs" }, diff --git a/cli/package.json b/cli/package.json index 1f1ec51..db89a23 100644 --- a/cli/package.json +++ b/cli/package.json @@ -20,22 +20,23 @@ "dependencies": { "axios": "^1.6.2", "chalk": "^4.1.2", - "cli-table3": "^0.6.3", "commander": "^14.0.0", "dotenv": "^16.3.1", - "ora": "^5.4.1", - "uuid": "^9.0.0", - "yaml": "^2.3.4" + "uuid": "^9.0.0" }, "devDependencies": { "@types/jest": "^29.5.0", "@types/mock-fs": "^4.13.4", "@types/node": "^20.10.0", + "@types/ora": "^3.1.0", "@types/uuid": "^9.0.8", + "cli-table3": "^0.6.5", "jest": "^29.5.0", "mock-fs": "^5.5.0", + "ora": "^8.2.0", "ts-jest": "^29.1.0", "ts-node": "^10.9.2", - "typescript": "^5.3.2" + "typescript": "^5.3.2", + "yaml": "^2.8.0" } } diff --git a/coverage-combined/lcov.info b/coverage-combined/lcov.info new file mode 100644 index 0000000..8b07c8d --- /dev/null +++ b/coverage-combined/lcov.info @@ -0,0 +1,3819 @@ +TN: +SF:src/index.ts +FN:56,(anonymous_1) +FN:67,(anonymous_2) +FN:70,(anonymous_3) +FN:92,(anonymous_4) +FN:108,(anonymous_5) +FN:159,(anonymous_6) +FN:188,(anonymous_7) +FNF:7 +FNH:6 +FNDA:1,(anonymous_1) +FNDA:8,(anonymous_2) +FNDA:8,(anonymous_3) +FNDA:2,(anonymous_4) +FNDA:6,(anonymous_5) +FNDA:1,(anonymous_6) +FNDA:0,(anonymous_7) +DA:1,16 +DA:2,16 +DA:3,16 +DA:4,16 +DA:5,16 +DA:6,16 +DA:7,16 +DA:8,16 +DA:10,16 +DA:12,16 +DA:16,16 +DA:17,16 +DA:18,1 +DA:21,16 +DA:22,16 +DA:23,16 +DA:26,16 +DA:27,16 +DA:31,16 +DA:39,16 +DA:48,16 +DA:58,1 +DA:63,16 +DA:64,16 +DA:67,16 +DA:68,8 +DA:70,8 +DA:71,8 +DA:72,8 +DA:84,8 +DA:88,16 +DA:90,16 +DA:94,2 +DA:99,16 +DA:102,16 +DA:103,16 +DA:105,16 +DA:108,16 +DA:109,6 +DA:111,6 +DA:128,6 +DA:129,6 +DA:130,6 +DA:131,5 +DA:133,1 +DA:135,6 +DA:138,6 +DA:139,6 +DA:140,6 +DA:141,6 +DA:142,4 +DA:144,2 +DA:146,6 +DA:149,6 +DA:150,2 +DA:153,6 +DA:154,6 +DA:158,16 +DA:165,1 +DA:178,1 +DA:179,1 +DA:181,0 +DA:187,16 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:195,16 +LF:68 +LH:63 +BRDA:17,0,0,1 +BRDA:21,1,0,16 +BRDA:21,1,1,16 +BRDA:36,2,0,1 +BRDA:36,2,1,15 +BRDA:80,3,0,8 +BRDA:80,3,1,0 +BRDA:80,4,0,8 +BRDA:80,4,1,0 +BRDA:139,5,0,6 +BRDA:139,5,1,6 +BRDA:149,6,0,2 +BRDA:149,7,0,6 +BRDA:149,7,1,5 +BRDA:178,8,0,1 +BRDA:178,8,1,0 +BRDA:178,9,0,1 +BRDA:178,9,1,1 +BRDA:187,10,0,0 +BRF:19 +BRH:15 +end_of_record +TN: +SF:src/controllers/githubController.ts +FN:57,verifyWebhookSignature +FN:113,(anonymous_2) +FN:184,handleIssueOpened +FN:308,handleIssueComment +FN:344,handlePullRequestComment +FN:431,processBotMention +FN:439,(anonymous_7) +FN:585,handleManualPRReview +FN:594,(anonymous_9) +FN:790,handleCommandError +FN:803,(anonymous_11) +FN:840,(anonymous_12) +FN:859,handleCheckSuiteCompleted +FN:884,(anonymous_14) +FN:978,processAutomatedPRReviews +FN:985,(anonymous_16) +FN:1153,(anonymous_17) +FN:1160,(anonymous_18) +FN:1161,(anonymous_19) +FN:1162,(anonymous_20) +FN:1205,createPRReviewPrompt +FN:1384,checkAllCheckSuitesComplete +FN:1400,(anonymous_23) +FN:1421,(anonymous_24) +FN:1662,getWorkflowNameFromCheckSuite +FN:1690,handleWebhookError +FNF:26 +FNH:22 +FNDA:21,verifyWebhookSignature +FNDA:23,(anonymous_2) +FNDA:2,handleIssueOpened +FNDA:6,handleIssueComment +FNDA:2,handlePullRequestComment +FNDA:5,processBotMention +FNDA:10,(anonymous_7) +FNDA:0,handleManualPRReview +FNDA:0,(anonymous_9) +FNDA:2,handleCommandError +FNDA:2,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:9,handleCheckSuiteCompleted +FNDA:9,(anonymous_14) +FNDA:4,processAutomatedPRReviews +FNDA:5,(anonymous_16) +FNDA:5,(anonymous_17) +FNDA:5,(anonymous_18) +FNDA:5,(anonymous_19) +FNDA:5,(anonymous_20) +FNDA:4,createPRReviewPrompt +FNDA:4,checkAllCheckSuitesComplete +FNDA:4,(anonymous_23) +FNDA:5,(anonymous_24) +FNDA:3,getWorkflowNameFromCheckSuite +FNDA:0,handleWebhookError +DA:1,20 +DA:2,20 +DA:3,20 +DA:12,20 +DA:13,20 +DA:14,20 +DA:31,20 +DA:34,20 +DA:37,20 +DA:38,0 +DA:41,0 +DA:44,20 +DA:47,20 +DA:48,0 +DA:58,21 +DA:59,21 +DA:60,0 +DA:61,0 +DA:64,21 +DA:72,21 +DA:73,21 +DA:74,0 +DA:75,0 +DA:78,21 +DA:79,21 +DA:80,21 +DA:82,21 +DA:85,21 +DA:86,20 +DA:87,20 +DA:92,1 +DA:96,0 +DA:97,0 +DA:100,1 +DA:107,1 +DA:113,20 +DA:114,23 +DA:115,23 +DA:116,23 +DA:120,23 +DA:121,23 +DA:122,2 +DA:123,2 +DA:127,21 +DA:141,21 +DA:142,21 +DA:144,1 +DA:145,1 +DA:146,1 +DA:149,20 +DA:152,20 +DA:153,2 +DA:157,18 +DA:158,6 +DA:162,12 +DA:163,9 +DA:167,3 +DA:171,2 +DA:174,1 +DA:175,1 +DA:177,0 +DA:188,2 +DA:189,2 +DA:191,2 +DA:192,1 +DA:193,1 +DA:198,1 +DA:208,1 +DA:210,1 +DA:229,1 +DA:230,1 +DA:241,1 +DA:242,1 +DA:252,1 +DA:253,1 +DA:254,1 +DA:260,1 +DA:263,0 +DA:273,1 +DA:283,0 +DA:284,0 +DA:293,0 +DA:312,6 +DA:313,6 +DA:314,6 +DA:316,6 +DA:317,0 +DA:318,0 +DA:323,6 +DA:334,6 +DA:335,5 +DA:338,1 +DA:348,2 +DA:349,2 +DA:350,2 +DA:355,2 +DA:356,1 +DA:357,1 +DA:362,1 +DA:372,1 +DA:373,1 +DA:383,1 +DA:384,1 +DA:385,1 +DA:386,1 +DA:387,1 +DA:390,1 +DA:391,0 +DA:394,1 +DA:396,1 +DA:397,1 +DA:406,1 +DA:408,1 +DA:420,0 +DA:425,0 +DA:438,5 +DA:439,10 +DA:441,5 +DA:443,5 +DA:444,1 +DA:455,1 +DA:456,1 +DA:460,1 +DA:467,0 +DA:470,1 +DA:481,4 +DA:492,4 +DA:493,4 +DA:494,4 +DA:496,4 +DA:497,4 +DA:500,4 +DA:502,0 +DA:503,0 +DA:507,0 +DA:508,0 +DA:510,0 +DA:516,0 +DA:517,0 +DA:525,0 +DA:532,0 +DA:538,0 +DA:542,4 +DA:544,4 +DA:545,4 +DA:554,2 +DA:555,2 +DA:563,2 +DA:565,2 +DA:575,2 +DA:579,0 +DA:591,0 +DA:593,0 +DA:594,0 +DA:597,0 +DA:598,0 +DA:607,0 +DA:608,0 +DA:612,0 +DA:619,0 +DA:622,0 +DA:633,0 +DA:645,0 +DA:646,0 +DA:654,0 +DA:666,0 +DA:669,0 +DA:670,0 +DA:679,0 +DA:690,0 +DA:691,0 +DA:699,0 +DA:710,0 +DA:722,0 +DA:723,0 +DA:734,0 +DA:735,0 +DA:742,0 +DA:753,0 +DA:754,0 +DA:755,0 +DA:757,0 +DA:763,0 +DA:770,0 +DA:773,0 +DA:799,2 +DA:800,2 +DA:803,2 +DA:804,2 +DA:805,2 +DA:806,2 +DA:808,2 +DA:815,2 +DA:828,2 +DA:835,0 +DA:840,2 +DA:844,2 +DA:863,9 +DA:864,9 +DA:866,9 +DA:867,0 +DA:868,0 +DA:873,9 +DA:884,9 +DA:894,9 +DA:895,1 +DA:903,1 +DA:907,8 +DA:908,1 +DA:916,1 +DA:920,7 +DA:921,7 +DA:923,7 +DA:924,7 +DA:926,7 +DA:928,4 +DA:934,4 +DA:935,4 +DA:940,3 +DA:944,3 +DA:946,3 +DA:947,3 +DA:952,7 +DA:968,7 +DA:969,4 +DA:972,3 +DA:983,4 +DA:985,4 +DA:986,5 +DA:993,5 +DA:995,5 +DA:997,5 +DA:998,0 +DA:1011,0 +DA:1012,0 +DA:1013,0 +DA:1017,5 +DA:1024,5 +DA:1025,1 +DA:1033,1 +DA:1034,1 +DA:1038,4 +DA:1039,4 +DA:1047,0 +DA:1058,4 +DA:1070,4 +DA:1073,4 +DA:1074,4 +DA:1083,3 +DA:1093,3 +DA:1094,3 +DA:1102,0 +DA:1113,3 +DA:1114,3 +DA:1116,1 +DA:1128,1 +DA:1129,1 +DA:1136,0 +DA:1146,1 +DA:1147,1 +DA:1152,4 +DA:1153,4 +DA:1154,5 +DA:1160,5 +DA:1161,5 +DA:1162,5 +DA:1164,4 +DA:1177,4 +DA:1179,0 +DA:1180,0 +DA:1189,0 +DA:1206,4 +DA:1391,4 +DA:1392,4 +DA:1393,4 +DA:1398,4 +DA:1400,4 +DA:1403,4 +DA:1404,5 +DA:1405,5 +DA:1406,5 +DA:1412,4 +DA:1413,4 +DA:1415,4 +DA:1421,5 +DA:1434,4 +DA:1440,4 +DA:1448,4 +DA:1450,4 +DA:1451,5 +DA:1452,5 +DA:1453,5 +DA:1454,5 +DA:1457,5 +DA:1458,0 +DA:1464,0 +DA:1468,5 +DA:1469,0 +DA:1477,0 +DA:1488,0 +DA:1492,5 +DA:1493,0 +DA:1501,0 +DA:1512,0 +DA:1516,5 +DA:1517,0 +DA:1525,0 +DA:1535,0 +DA:1539,5 +DA:1542,4 +DA:1557,4 +DA:1558,0 +DA:1568,0 +DA:1572,0 +DA:1579,0 +DA:1581,0 +DA:1585,4 +DA:1587,5 +DA:1588,1 +DA:1598,1 +DA:1602,4 +DA:1603,0 +DA:1613,0 +DA:1617,3 +DA:1626,1 +DA:1634,1 +DA:1639,2 +DA:1646,2 +DA:1648,0 +DA:1655,0 +DA:1666,3 +DA:1668,3 +DA:1669,2 +DA:1673,1 +DA:1675,0 +DA:1683,0 +DA:1694,0 +DA:1697,0 +DA:1698,0 +DA:1701,0 +DA:1714,0 +LF:341 +LH:236 +BRDA:37,0,0,0 +BRDA:47,1,0,0 +BRDA:59,2,0,0 +BRDA:67,3,0,13 +BRDA:67,3,1,8 +BRDA:73,4,0,0 +BRDA:78,5,0,21 +BRDA:78,5,1,12 +BRDA:85,6,0,20 +BRDA:85,7,0,21 +BRDA:85,7,1,1 +BRDA:92,8,0,0 +BRDA:93,9,0,1 +BRDA:93,9,1,0 +BRDA:121,10,0,2 +BRDA:132,11,0,21 +BRDA:132,11,1,15 +BRDA:134,12,0,21 +BRDA:134,12,1,1 +BRDA:137,13,0,21 +BRDA:137,13,1,0 +BRDA:152,14,0,2 +BRDA:152,15,0,20 +BRDA:152,15,1,2 +BRDA:157,16,0,6 +BRDA:157,17,0,18 +BRDA:157,17,1,6 +BRDA:162,18,0,9 +BRDA:162,19,0,12 +BRDA:162,19,1,9 +BRDA:167,20,0,2 +BRDA:168,21,0,3 +BRDA:168,21,1,3 +BRDA:168,21,2,2 +BRDA:191,22,0,1 +BRDA:214,23,0,1 +BRDA:214,23,1,0 +BRDA:241,24,0,1 +BRDA:241,24,1,0 +BRDA:241,25,0,1 +BRDA:241,25,1,0 +BRDA:253,26,0,1 +BRDA:286,27,0,0 +BRDA:286,27,1,0 +BRDA:316,28,0,0 +BRDA:316,29,0,6 +BRDA:316,29,1,6 +BRDA:334,30,0,5 +BRDA:350,31,0,2 +BRDA:350,31,1,2 +BRDA:351,32,0,2 +BRDA:351,32,1,1 +BRDA:355,33,0,1 +BRDA:372,34,0,1 +BRDA:372,35,0,1 +BRDA:372,35,1,1 +BRDA:386,36,0,1 +BRDA:390,37,0,0 +BRDA:438,38,0,5 +BRDA:438,38,1,0 +BRDA:440,39,0,0 +BRDA:440,39,1,0 +BRDA:443,40,0,1 +BRDA:496,41,0,4 +BRDA:500,42,0,0 +BRDA:502,43,0,0 +BRDA:502,44,0,0 +BRDA:502,44,1,0 +BRDA:508,45,0,0 +BRDA:516,46,0,0 +BRDA:593,47,0,0 +BRDA:593,47,1,0 +BRDA:595,48,0,0 +BRDA:595,48,1,0 +BRDA:597,49,0,0 +BRDA:684,50,0,0 +BRDA:684,50,1,0 +BRDA:866,51,0,0 +BRDA:883,52,0,9 +BRDA:883,52,1,0 +BRDA:894,53,0,1 +BRDA:907,54,0,1 +BRDA:907,55,0,8 +BRDA:907,55,1,8 +BRDA:926,56,0,4 +BRDA:926,56,1,3 +BRDA:926,57,0,7 +BRDA:926,57,1,3 +BRDA:931,58,0,4 +BRDA:931,58,1,0 +BRDA:935,59,0,2 +BRDA:935,59,1,2 +BRDA:944,60,0,2 +BRDA:944,60,1,1 +BRDA:947,61,0,2 +BRDA:947,61,1,1 +BRDA:958,62,0,7 +BRDA:958,62,1,0 +BRDA:964,63,0,4 +BRDA:964,63,1,3 +BRDA:968,64,0,4 +BRDA:985,65,0,4 +BRDA:985,65,1,0 +BRDA:997,66,0,0 +BRDA:1024,67,0,1 +BRDA:1087,68,0,3 +BRDA:1087,68,1,0 +BRDA:1118,69,0,1 +BRDA:1118,69,1,0 +BRDA:1146,70,0,1 +BRDA:1146,70,1,0 +BRDA:1154,71,0,5 +BRDA:1154,71,1,0 +BRDA:1161,72,0,5 +BRDA:1161,72,1,2 +BRDA:1161,72,2,1 +BRDA:1162,73,0,5 +BRDA:1162,73,1,2 +BRDA:1391,74,0,4 +BRDA:1391,74,1,0 +BRDA:1392,75,0,4 +BRDA:1392,75,1,4 +BRDA:1394,76,0,4 +BRDA:1394,76,1,4 +BRDA:1451,77,0,5 +BRDA:1451,77,1,5 +BRDA:1452,78,0,5 +BRDA:1452,78,1,5 +BRDA:1457,79,0,0 +BRDA:1457,80,0,5 +BRDA:1457,80,1,5 +BRDA:1468,81,0,0 +BRDA:1468,82,0,5 +BRDA:1468,82,1,0 +BRDA:1492,83,0,0 +BRDA:1492,84,0,5 +BRDA:1492,84,1,0 +BRDA:1492,84,2,0 +BRDA:1516,85,0,0 +BRDA:1516,86,0,5 +BRDA:1516,86,1,1 +BRDA:1557,87,0,0 +BRDA:1568,88,0,0 +BRDA:1569,89,0,0 +BRDA:1569,89,1,0 +BRDA:1587,90,0,1 +BRDA:1602,91,0,0 +BRDA:1668,92,0,2 +BRDA:1668,93,0,3 +BRDA:1668,93,1,3 +BRDA:1673,94,0,1 +BRDA:1673,94,1,0 +BRF:152 +BRH:98 +end_of_record +TN: +SF:src/core/webhook/WebhookProcessor.ts +FN:26,(anonymous_0) +FN:99,(anonymous_1) +FN:126,(anonymous_2) +FNF:3 +FNH:3 +FNDA:10,(anonymous_0) +FNDA:7,(anonymous_1) +FNDA:6,(anonymous_2) +DA:3,17 +DA:4,17 +DA:11,17 +DA:22,17 +DA:31,10 +DA:33,10 +DA:35,10 +DA:36,10 +DA:37,1 +DA:38,1 +DA:39,1 +DA:43,9 +DA:44,2 +DA:45,2 +DA:46,1 +DA:47,1 +DA:48,1 +DA:53,8 +DA:54,7 +DA:55,7 +DA:57,7 +DA:67,7 +DA:78,7 +DA:80,7 +DA:81,1 +DA:88,1 +DA:92,1 +DA:96,6 +DA:99,7 +DA:100,6 +DA:102,6 +DA:109,1 +DA:117,1 +DA:137,6 +DA:139,6 +DA:140,8 +DA:142,8 +DA:143,1 +DA:144,1 +DA:148,7 +DA:149,6 +DA:151,6 +DA:159,1 +DA:166,1 +DA:173,6 +LF:45 +LH:45 +BRDA:36,0,0,1 +BRDA:43,1,0,2 +BRDA:43,2,0,9 +BRDA:43,2,1,2 +BRDA:45,3,0,1 +BRDA:80,4,0,1 +BRDA:100,5,0,2 +BRDA:100,5,1,4 +BRDA:142,6,0,1 +BRDA:142,7,0,8 +BRDA:142,7,1,1 +BRDA:168,8,0,1 +BRDA:168,8,1,0 +BRF:13 +BRH:12 +end_of_record +TN: +SF:src/core/webhook/WebhookRegistry.ts +FN:20,(anonymous_0) +FN:32,(anonymous_1) +FN:39,(anonymous_2) +FN:53,(anonymous_3) +FN:60,(anonymous_4) +FN:67,(anonymous_5) +FN:71,(anonymous_6) +FN:90,(anonymous_7) +FN:99,(anonymous_8) +FN:115,(anonymous_9) +FN:122,(anonymous_10) +FNF:11 +FNH:11 +FNDA:17,(anonymous_0) +FNDA:28,(anonymous_1) +FNDA:6,(anonymous_2) +FNDA:12,(anonymous_3) +FNDA:3,(anonymous_4) +FNDA:19,(anonymous_5) +FNDA:22,(anonymous_6) +FNDA:34,(anonymous_7) +FNDA:6,(anonymous_8) +FNDA:2,(anonymous_9) +FNDA:51,(anonymous_10) +DA:1,19 +DA:8,19 +DA:13,19 +DA:14,35 +DA:15,35 +DA:21,17 +DA:22,1 +DA:25,17 +DA:26,17 +DA:33,28 +DA:34,28 +DA:36,28 +DA:39,28 +DA:41,28 +DA:43,28 +DA:45,28 +DA:54,12 +DA:61,3 +DA:68,19 +DA:69,19 +DA:71,19 +DA:72,22 +DA:74,19 +DA:75,4 +DA:76,3 +DA:77,3 +DA:79,1 +DA:80,3 +DA:81,3 +DA:83,0 +DA:91,34 +DA:92,34 +DA:93,34 +DA:100,6 +DA:101,4 +DA:102,4 +DA:105,2 +DA:106,2 +DA:107,3 +DA:109,2 +DA:116,2 +DA:123,51 +DA:128,19 +LF:43 +LH:42 +BRDA:21,0,0,1 +BRDA:34,1,0,28 +BRDA:34,1,1,22 +BRDA:39,2,0,6 +BRDA:39,2,1,4 +BRDA:39,3,0,6 +BRDA:39,3,1,3 +BRDA:43,4,0,1 +BRDA:43,4,1,27 +BRDA:46,5,0,28 +BRDA:46,5,1,22 +BRDA:69,6,0,19 +BRDA:69,6,1,1 +BRDA:72,7,0,19 +BRDA:72,7,1,3 +BRDA:74,8,0,15 +BRDA:75,9,0,3 +BRDA:80,10,0,3 +BRDA:100,11,0,4 +BRDA:102,12,0,4 +BRDA:102,12,1,1 +BRF:21 +BRH:21 +end_of_record +TN: +SF:src/core/webhook/constants.ts +FN:11,isAllowedProvider +FNF:1 +FNH:1 +FNDA:14,isAllowedProvider +DA:4,18 +DA:11,18 +DA:12,14 +LF:3 +LH:3 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/core/webhook/index.ts +FN:1,(anonymous_0) +FN:1,(anonymous_1) +FN:2,(anonymous_2) +FN:4,(anonymous_3) +FN:4,(anonymous_4) +FNF:5 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +DA:1,0 +DA:2,0 +DA:4,0 +LF:3 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/providers/claude/ClaudeWebhookProvider.ts +FN:22,(anonymous_0) +FN:35,(anonymous_1) +FN:83,(anonymous_2) +FN:90,(anonymous_3) +FNF:4 +FNH:4 +FNDA:4,(anonymous_0) +FNDA:6,(anonymous_1) +FNDA:1,(anonymous_2) +FNDA:3,(anonymous_3) +DA:1,2 +DA:16,2 +DA:17,15 +DA:23,4 +DA:24,4 +DA:25,2 +DA:28,2 +DA:29,2 +DA:36,6 +DA:39,6 +DA:40,0 +DA:44,6 +DA:45,4 +DA:46,2 +DA:51,4 +DA:52,1 +DA:56,3 +DA:69,3 +DA:77,3 +DA:84,1 +DA:91,3 +DA:92,3 +DA:94,1 +DA:96,1 +DA:98,1 +DA:100,0 +DA:102,0 +DA:104,0 +DA:106,0 +DA:108,0 +DA:110,0 +LF:31 +LH:24 +BRDA:24,0,0,2 +BRDA:39,1,0,0 +BRDA:44,2,0,4 +BRDA:45,3,0,2 +BRDA:45,4,0,4 +BRDA:45,4,1,2 +BRDA:51,5,0,1 +BRDA:51,6,0,4 +BRDA:51,6,1,2 +BRDA:92,7,0,1 +BRDA:92,7,1,1 +BRDA:92,7,2,1 +BRDA:92,7,3,0 +BRDA:92,7,4,0 +BRDA:92,7,5,0 +BRDA:92,7,6,0 +BRDA:92,7,7,0 +BRDA:92,7,8,0 +BRDA:94,8,0,1 +BRDA:94,8,1,0 +BRDA:96,9,0,1 +BRDA:96,9,1,0 +BRDA:98,10,0,1 +BRDA:98,10,1,0 +BRDA:102,11,0,0 +BRDA:102,11,1,0 +BRDA:106,12,0,0 +BRDA:106,12,1,0 +BRDA:108,13,0,0 +BRDA:108,13,1,0 +BRF:30 +BRH:14 +end_of_record +TN: +SF:src/providers/claude/index.ts +FN:19,(anonymous_4) +FNF:1 +FNH:0 +FNDA:0,(anonymous_4) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:7,1 +DA:10,1 +DA:11,1 +DA:14,1 +DA:15,1 +DA:17,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +LF:16 +LH:16 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/providers/claude/handlers/OrchestrationHandler.ts +FN:25,(anonymous_0) +FN:32,(anonymous_1) +FN:40,(anonymous_2) +FNF:3 +FNH:3 +FNDA:8,(anonymous_0) +FNDA:2,(anonymous_1) +FNDA:6,(anonymous_2) +DA:1,2 +DA:2,2 +DA:13,2 +DA:15,2 +DA:21,2 +DA:22,8 +DA:26,8 +DA:33,2 +DA:44,6 +DA:45,6 +DA:47,6 +DA:48,0 +DA:54,6 +DA:59,6 +DA:62,6 +DA:72,6 +DA:73,5 +DA:80,5 +DA:81,2 +DA:85,5 +DA:92,5 +DA:98,1 +DA:99,1 +LF:23 +LH:22 +BRDA:47,0,0,0 +BRDA:56,1,0,6 +BRDA:56,1,1,5 +BRDA:64,2,0,6 +BRDA:64,2,1,5 +BRDA:80,3,0,2 +BRDA:101,4,0,1 +BRDA:101,4,1,0 +BRF:8 +BRH:6 +end_of_record +TN: +SF:src/providers/claude/handlers/SessionHandler.ts +FN:54,(anonymous_0) +FN:61,(anonymous_1) +FN:68,(anonymous_2) +FN:109,(anonymous_3) +FN:164,(anonymous_4) +FN:184,(anonymous_5) +FN:203,(anonymous_6) +FN:222,(anonymous_7) +FN:253,(anonymous_8) +FNF:9 +FNH:9 +FNDA:17,(anonymous_0) +FNDA:2,(anonymous_1) +FNDA:14,(anonymous_2) +FNDA:4,(anonymous_3) +FNDA:2,(anonymous_4) +FNDA:2,(anonymous_5) +FNDA:3,(anonymous_6) +FNDA:2,(anonymous_7) +FNDA:2,(anonymous_8) +DA:1,2 +DA:9,2 +DA:10,2 +DA:12,2 +DA:50,2 +DA:51,17 +DA:55,17 +DA:62,2 +DA:72,14 +DA:73,14 +DA:75,14 +DA:77,4 +DA:80,2 +DA:83,2 +DA:86,3 +DA:89,2 +DA:92,1 +DA:98,1 +DA:99,1 +DA:112,4 +DA:115,4 +DA:116,1 +DA:122,3 +DA:123,1 +DA:130,2 +DA:140,2 +DA:142,1 +DA:148,1 +DA:154,1 +DA:165,2 +DA:166,2 +DA:168,2 +DA:169,1 +DA:175,1 +DA:185,2 +DA:188,2 +DA:189,1 +DA:191,1 +DA:194,2 +DA:204,3 +DA:205,3 +DA:207,3 +DA:208,0 +DA:214,3 +DA:215,1 +DA:222,2 +DA:223,2 +DA:224,2 +DA:227,2 +DA:229,1 +DA:230,1 +DA:241,1 +DA:243,1 +DA:254,2 +DA:255,2 +DA:257,2 +DA:258,0 +DA:264,2 +DA:265,1 +DA:276,1 +LF:60 +LH:58 +BRDA:75,0,0,4 +BRDA:75,0,1,2 +BRDA:75,0,2,2 +BRDA:75,0,3,3 +BRDA:75,0,4,2 +BRDA:75,0,5,1 +BRDA:101,1,0,1 +BRDA:101,1,1,0 +BRDA:115,2,0,1 +BRDA:122,3,0,1 +BRDA:131,4,0,2 +BRDA:131,4,1,2 +BRDA:132,5,0,2 +BRDA:132,5,1,2 +BRDA:135,6,0,2 +BRDA:135,6,1,2 +BRDA:168,7,0,1 +BRDA:188,8,0,1 +BRDA:188,8,1,1 +BRDA:207,9,0,0 +BRDA:214,10,0,1 +BRDA:214,11,0,3 +BRDA:214,11,1,2 +BRDA:224,12,0,2 +BRDA:224,12,1,2 +BRDA:227,13,0,1 +BRDA:257,14,0,0 +BRDA:264,15,0,1 +BRF:28 +BRH:25 +end_of_record +TN: +SF:src/providers/claude/services/SessionManager.ts +FN:21,(anonymous_0) +FN:78,(anonymous_1) +FN:118,(anonymous_2) +FN:124,(anonymous_3) +FN:130,(anonymous_4) +FN:159,(anonymous_5) +FN:161,(anonymous_6) +FN:182,(anonymous_7) +FN:189,(anonymous_8) +FN:190,(anonymous_9) +FN:198,(anonymous_10) +FN:205,(anonymous_11) +FN:232,(anonymous_12) +FN:267,(anonymous_13) +FN:274,(anonymous_14) +FN:281,(anonymous_15) +FNF:16 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +DA:1,3 +DA:2,3 +DA:9,3 +DA:14,3 +DA:15,2 +DA:16,2 +DA:22,0 +DA:24,0 +DA:27,0 +DA:30,0 +DA:33,0 +DA:61,0 +DA:63,0 +DA:66,0 +DA:68,0 +DA:70,0 +DA:71,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:84,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:92,0 +DA:95,0 +DA:108,0 +DA:111,0 +DA:116,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:135,0 +DA:136,0 +DA:139,0 +DA:140,0 +DA:143,0 +DA:146,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:166,0 +DA:167,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:175,0 +DA:183,0 +DA:190,0 +DA:191,0 +DA:199,0 +DA:206,0 +DA:208,0 +DA:210,0 +DA:213,0 +DA:216,0 +DA:219,0 +DA:222,0 +DA:225,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:244,0 +DA:245,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:256,0 +DA:268,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:289,0 +LF:99 +LH:6 +BRDA:27,0,0,0 +BRDA:27,0,1,0 +BRDA:48,1,0,0 +BRDA:48,1,1,0 +BRDA:50,2,0,0 +BRDA:50,2,1,0 +BRDA:80,3,0,0 +BRDA:131,4,0,0 +BRDA:131,4,1,0 +BRDA:135,5,0,0 +BRDA:150,6,0,0 +BRDA:150,6,1,0 +BRDA:163,7,0,0 +BRDA:163,7,1,0 +BRDA:166,8,0,0 +BRDA:166,8,1,0 +BRDA:171,9,0,0 +BRDA:171,9,1,0 +BRDA:208,10,0,0 +BRDA:208,10,1,0 +BRDA:208,10,2,0 +BRDA:208,10,3,0 +BRDA:208,10,4,0 +BRDA:208,10,5,0 +BRDA:213,11,0,0 +BRDA:213,11,1,0 +BRDA:239,12,0,0 +BRDA:239,12,1,0 +BRDA:244,13,0,0 +BRDA:244,13,1,0 +BRDA:249,14,0,0 +BRDA:249,14,1,0 +BRDA:251,15,0,0 +BRDA:259,16,0,0 +BRDA:259,16,1,0 +BRDA:268,17,0,0 +BRDA:268,17,1,0 +BRDA:272,18,0,0 +BRDA:276,19,0,0 +BRDA:276,19,1,0 +BRDA:279,20,0,0 +BRF:41 +BRH:0 +end_of_record +TN: +SF:src/providers/claude/services/TaskDecomposer.ts +FN:31,(anonymous_0) +FN:53,(anonymous_1) +FN:71,(anonymous_2) +FN:79,(anonymous_3) +FN:110,(anonymous_4) +FN:117,(anonymous_5) +FN:148,(anonymous_6) +FN:155,(anonymous_7) +FN:157,(anonymous_8) +FN:171,(anonymous_9) +FN:175,(anonymous_10) +FNF:11 +FNH:11 +FNDA:8,(anonymous_0) +FNDA:8,(anonymous_1) +FNDA:137,(anonymous_2) +FNDA:137,(anonymous_3) +FNDA:6,(anonymous_4) +FNDA:8,(anonymous_5) +FNDA:26,(anonymous_6) +FNDA:35,(anonymous_7) +FNDA:75,(anonymous_8) +FNDA:8,(anonymous_9) +FNDA:12,(anonymous_10) +DA:1,2 +DA:4,2 +DA:21,2 +DA:27,2 +DA:32,8 +DA:35,8 +DA:38,8 +DA:40,8 +DA:46,8 +DA:54,8 +DA:57,8 +DA:66,8 +DA:69,8 +DA:70,8 +DA:71,137 +DA:72,48 +DA:73,26 +DA:78,8 +DA:79,137 +DA:81,48 +DA:82,26 +DA:83,26 +DA:86,26 +DA:88,5 +DA:89,5 +DA:91,5 +DA:92,5 +DA:94,5 +DA:96,5 +DA:97,4 +DA:99,5 +DA:101,7 +DA:103,7 +DA:104,5 +DA:106,7 +DA:108,2 +DA:110,2 +DA:111,6 +DA:113,2 +DA:115,2 +DA:117,2 +DA:118,8 +DA:120,2 +DA:123,26 +DA:133,8 +DA:134,1 +DA:142,8 +DA:154,26 +DA:155,26 +DA:156,35 +DA:157,75 +DA:160,26 +DA:161,26 +DA:165,0 +DA:175,12 +DA:177,8 +DA:178,6 +DA:182,2 +DA:183,0 +DA:187,2 +LF:60 +LH:58 +BRDA:72,0,0,26 +BRDA:81,1,0,26 +BRDA:86,2,0,5 +BRDA:86,2,1,5 +BRDA:86,2,2,5 +BRDA:86,2,3,7 +BRDA:86,2,4,2 +BRDA:86,2,5,2 +BRDA:96,3,0,4 +BRDA:103,4,0,5 +BRDA:133,5,0,1 +BRDA:160,6,0,26 +BRDA:175,7,0,12 +BRDA:175,7,1,12 +BRDA:177,8,0,6 +BRDA:182,9,0,0 +BRF:16 +BRH:15 +end_of_record +TN: +SF:src/providers/github/GitHubWebhookProvider.ts +FN:45,(anonymous_1) +FN:50,(anonymous_2) +FN:82,(anonymous_3) +FN:87,(anonymous_4) +FN:110,(anonymous_5) +FN:117,(anonymous_6) +FN:134,(anonymous_7) +FN:144,(anonymous_8) +FN:158,(anonymous_9) +FN:170,(anonymous_10) +FN:179,(anonymous_11) +FN:189,(anonymous_12) +FN:198,(anonymous_13) +FNF:13 +FNH:13 +FNDA:5,(anonymous_1) +FNDA:5,(anonymous_2) +FNDA:3,(anonymous_3) +FNDA:3,(anonymous_4) +FNDA:1,(anonymous_5) +FNDA:2,(anonymous_6) +FNDA:3,(anonymous_7) +FNDA:1,(anonymous_8) +FNDA:6,(anonymous_9) +FNDA:2,(anonymous_10) +FNDA:2,(anonymous_11) +FNDA:2,(anonymous_12) +FNDA:1,(anonymous_13) +DA:1,2 +DA:2,2 +DA:19,2 +DA:39,2 +DA:40,19 +DA:47,5 +DA:51,5 +DA:52,5 +DA:53,1 +DA:54,1 +DA:57,4 +DA:58,4 +DA:59,4 +DA:60,4 +DA:63,4 +DA:67,2 +DA:68,2 +DA:71,2 +DA:72,2 +DA:74,0 +DA:75,0 +DA:84,3 +DA:88,3 +DA:89,3 +DA:90,3 +DA:92,3 +DA:111,1 +DA:118,2 +DA:119,2 +DA:120,1 +DA:122,2 +DA:123,1 +DA:125,2 +DA:126,1 +DA:128,2 +DA:135,3 +DA:136,2 +DA:138,1 +DA:145,1 +DA:159,6 +DA:171,2 +DA:179,2 +DA:190,2 +DA:198,1 +LF:44 +LH:42 +BRDA:52,0,0,1 +BRDA:58,1,0,4 +BRDA:58,1,1,1 +BRDA:63,2,0,2 +BRDA:64,3,0,4 +BRDA:64,3,1,2 +BRDA:93,4,0,3 +BRDA:93,4,1,1 +BRDA:119,5,0,1 +BRDA:122,6,0,1 +BRDA:125,7,0,1 +BRDA:135,8,0,2 +BRDA:163,9,0,6 +BRDA:163,9,1,5 +BRDA:175,10,0,2 +BRDA:175,10,1,1 +BRDA:178,11,0,1 +BRDA:178,11,1,1 +BRDA:179,12,0,1 +BRDA:179,12,1,1 +BRDA:194,13,0,2 +BRDA:194,13,1,0 +BRDA:197,14,0,2 +BRDA:197,14,1,0 +BRDA:198,15,0,0 +BRDA:198,15,1,1 +BRDA:204,16,0,2 +BRDA:204,16,1,2 +BRDA:205,17,0,2 +BRDA:205,17,1,1 +BRDA:206,18,0,1 +BRDA:206,18,1,1 +BRF:32 +BRH:29 +end_of_record +TN: +SF:src/providers/github/index.ts +FN:11,initializeGitHubProvider +FNF:1 +FNH:1 +FNDA:1,initializeGitHubProvider +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:6,1 +DA:11,1 +DA:12,1 +DA:15,1 +DA:16,1 +DA:19,1 +DA:21,1 +DA:25,1 +LF:12 +LH:12 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/providers/github/handlers/IssueHandler.ts +FN:21,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +DA:1,1 +DA:2,1 +DA:3,1 +DA:12,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:25,0 +DA:26,0 +DA:30,0 +DA:31,0 +DA:35,0 +DA:46,0 +DA:66,0 +DA:76,0 +DA:77,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:95,0 +DA:99,0 +DA:108,0 +DA:116,0 +LF:23 +LH:7 +BRDA:50,0,0,0 +BRDA:50,0,1,0 +BRDA:76,1,0,0 +BRDA:76,2,0,0 +BRDA:76,2,1,0 +BRDA:88,3,0,0 +BRDA:118,4,0,0 +BRDA:118,4,1,0 +BRF:8 +BRH:0 +end_of_record +TN: +SF:src/routes/github.ts +FNF:0 +FNH:0 +DA:1,18 +DA:2,18 +DA:4,18 +DA:8,18 +DA:10,18 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/routes/webhooks.ts +FN:15,(anonymous_10) +FN:15,(anonymous_11) +FN:19,(anonymous_12) +FN:19,(anonymous_13) +FN:28,(anonymous_14) +FN:80,(anonymous_15) +FN:85,(anonymous_16) +FNF:7 +FNH:4 +FNDA:1,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:1,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:6,(anonymous_14) +FNDA:1,(anonymous_15) +FNDA:0,(anonymous_16) +DA:1,17 +DA:2,17 +DA:3,17 +DA:4,17 +DA:5,17 +DA:6,17 +DA:8,17 +DA:9,17 +DA:10,17 +DA:13,17 +DA:15,1 +DA:16,0 +DA:19,1 +DA:20,0 +DA:28,17 +DA:29,6 +DA:32,6 +DA:33,1 +DA:34,1 +DA:35,1 +DA:38,5 +DA:50,5 +DA:51,5 +DA:53,5 +DA:54,3 +DA:59,5 +DA:62,5 +DA:63,2 +DA:64,2 +DA:65,2 +DA:69,3 +DA:80,17 +DA:81,1 +DA:83,1 +DA:85,0 +DA:100,17 +LF:36 +LH:33 +BRDA:13,0,0,1 +BRDA:32,1,0,1 +BRDA:53,2,0,3 +BRDA:59,3,0,5 +BRDA:59,3,1,4 +BRDA:62,4,0,2 +BRDA:62,5,0,5 +BRDA:62,5,1,2 +BRDA:62,5,2,1 +BRDA:71,6,0,3 +BRDA:71,6,1,2 +BRF:11 +BRH:11 +end_of_record +TN: +SF:src/services/claudeService.ts +FN:35,processCommand +FN:232,getEntrypointScript +FN:239,createPrompt +FN:326,createEnvironmentVars +FN:360,buildDockerArgs +FN:394,(anonymous_6) +FN:395,(anonymous_7) +FN:408,getContainerSecurityConfig +FN:440,applySecurityConstraints +FN:445,(anonymous_10) +FN:450,(anonymous_11) +FN:471,sanitizeDockerArgs +FN:472,(anonymous_13) +FN:501,handleDockerExecutionError +FN:515,(anonymous_15) +FN:523,(anonymous_16) +FN:526,(anonymous_17) +FN:543,(anonymous_18) +FN:641,handleGeneralError +FN:648,(anonymous_20) +FN:664,(anonymous_21) +FNF:21 +FNH:21 +FNDA:5,processCommand +FNDA:4,getEntrypointScript +FNDA:4,createPrompt +FNDA:4,createEnvironmentVars +FNDA:4,buildDockerArgs +FNDA:40,(anonymous_6) +FNDA:32,(anonymous_7) +FNDA:4,getContainerSecurityConfig +FNDA:4,applySecurityConstraints +FNDA:8,(anonymous_10) +FNDA:16,(anonymous_11) +FNDA:4,sanitizeDockerArgs +FNDA:126,(anonymous_13) +FNDA:1,handleDockerExecutionError +FNDA:4,(anonymous_15) +FNDA:4,(anonymous_16) +FNDA:4,(anonymous_17) +FNDA:10,(anonymous_18) +FNDA:1,handleGeneralError +FNDA:4,(anonymous_20) +FNDA:40,(anonymous_21) +DA:1,2 +DA:2,2 +DA:3,2 +DA:4,2 +DA:5,2 +DA:6,2 +DA:7,2 +DA:17,2 +DA:20,2 +DA:23,2 +DA:24,0 +DA:27,0 +DA:30,2 +DA:35,2 +DA:43,5 +DA:44,5 +DA:55,5 +DA:60,5 +DA:61,5 +DA:62,1 +DA:71,1 +DA:82,1 +DA:86,4 +DA:87,4 +DA:88,4 +DA:89,4 +DA:91,0 +DA:92,0 +DA:99,4 +DA:100,4 +DA:106,4 +DA:107,4 +DA:110,4 +DA:120,4 +DA:131,4 +DA:142,4 +DA:150,4 +DA:152,4 +DA:153,4 +DA:156,4 +DA:157,4 +DA:159,4 +DA:164,4 +DA:166,3 +DA:169,3 +DA:170,0 +DA:180,0 +DA:181,0 +DA:186,0 +DA:188,0 +DA:199,3 +DA:201,3 +DA:212,3 +DA:214,1 +DA:224,1 +DA:233,4 +DA:254,4 +DA:255,0 +DA:284,4 +DA:343,4 +DA:371,4 +DA:374,4 +DA:375,4 +DA:378,4 +DA:382,4 +DA:383,4 +DA:385,1 +DA:386,1 +DA:389,1 +DA:393,4 +DA:394,40 +DA:396,32 +DA:400,4 +DA:402,4 +DA:409,4 +DA:415,4 +DA:416,0 +DA:424,4 +DA:441,4 +DA:442,0 +DA:445,4 +DA:446,8 +DA:450,4 +DA:451,16 +DA:452,0 +DA:457,4 +DA:472,4 +DA:473,126 +DA:476,126 +DA:477,126 +DA:478,28 +DA:479,28 +DA:486,28 +DA:487,8 +DA:490,20 +DA:491,0 +DA:494,118 +DA:512,1 +DA:515,1 +DA:516,4 +DA:517,2 +DA:520,2 +DA:523,4 +DA:526,2 +DA:527,4 +DA:528,4 +DA:529,4 +DA:530,4 +DA:535,2 +DA:543,2 +DA:544,10 +DA:547,2 +DA:551,1 +DA:552,1 +DA:555,1 +DA:556,0 +DA:557,0 +DA:558,0 +DA:566,0 +DA:568,0 +DA:577,1 +DA:589,1 +DA:590,1 +DA:595,1 +DA:597,0 +DA:601,1 +DA:602,1 +DA:608,1 +DA:609,1 +DA:612,1 +DA:613,1 +DA:615,1 +DA:631,1 +DA:635,1 +DA:645,1 +DA:648,1 +DA:649,4 +DA:650,4 +DA:651,4 +DA:664,4 +DA:665,40 +DA:667,4 +DA:670,1 +DA:683,1 +DA:684,1 +DA:687,1 +DA:688,1 +DA:690,1 +DA:703,1 +DA:707,1 +LF:150 +LH:130 +BRDA:23,0,0,0 +BRDA:39,1,0,0 +BRDA:40,2,0,5 +BRDA:41,3,0,5 +BRDA:60,4,0,5 +BRDA:60,4,1,5 +BRDA:60,4,2,0 +BRDA:61,5,0,1 +BRDA:61,6,0,5 +BRDA:61,6,1,4 +BRDA:75,7,0,0 +BRDA:75,7,1,1 +BRDA:86,8,0,4 +BRDA:86,8,1,4 +BRDA:102,9,0,0 +BRDA:102,9,1,4 +BRDA:156,10,0,4 +BRDA:156,10,1,4 +BRDA:169,11,0,0 +BRDA:254,12,0,0 +BRDA:254,12,1,4 +BRDA:284,13,0,0 +BRDA:284,13,1,4 +BRDA:288,14,0,0 +BRDA:288,14,1,4 +BRDA:289,15,0,4 +BRDA:289,15,1,4 +BRDA:345,16,0,4 +BRDA:345,16,1,0 +BRDA:346,17,0,0 +BRDA:346,17,1,4 +BRDA:347,18,0,4 +BRDA:347,18,1,4 +BRDA:351,19,0,4 +BRDA:351,19,1,0 +BRDA:383,20,0,1 +BRDA:386,21,0,1 +BRDA:386,21,1,0 +BRDA:394,22,0,40 +BRDA:394,22,1,36 +BRDA:410,23,0,4 +BRDA:410,23,1,4 +BRDA:411,24,0,4 +BRDA:411,24,1,4 +BRDA:412,25,0,4 +BRDA:412,25,1,4 +BRDA:415,26,0,0 +BRDA:441,27,0,0 +BRDA:441,27,1,4 +BRDA:451,28,0,0 +BRDA:473,29,0,0 +BRDA:477,30,0,28 +BRDA:486,31,0,8 +BRDA:490,32,0,0 +BRDA:516,33,0,2 +BRDA:523,34,0,4 +BRDA:523,34,1,4 +BRDA:527,35,0,4 +BRDA:552,36,0,1 +BRDA:552,36,1,0 +BRDA:555,37,0,0 +BRDA:555,38,0,1 +BRDA:555,38,1,1 +BRDA:649,39,0,0 +BRDA:674,40,0,1 +BRDA:674,40,1,0 +BRDA:688,41,0,1 +BRDA:688,41,1,0 +BRF:68 +BRH:45 +end_of_record +TN: +SF:src/services/githubService.ts +FN:24,getOctokit +FN:41,postComment +FN:121,validateGitHubParams +FN:144,addLabelsToIssue +FN:174,(anonymous_5) +FN:194,(anonymous_6) +FN:222,createRepositoryLabels +FN:252,(anonymous_8) +FN:310,getPullRequestDetails +FN:385,getFallbackLabels +FN:462,getCombinedStatus +FN:549,hasReviewedPRAtCommit +FN:586,(anonymous_13) +FN:610,getCheckSuitesForRef +FN:668,(anonymous_15) +FN:707,managePRLabels +FNF:16 +FNH:12 +FNDA:10,getOctokit +FNDA:6,postComment +FNDA:10,validateGitHubParams +FNDA:4,addLabelsToIssue +FNDA:4,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:3,createRepositoryLabels +FNDA:3,(anonymous_8) +FNDA:0,getPullRequestDetails +FNDA:19,getFallbackLabels +FNDA:3,getCombinedStatus +FNDA:2,hasReviewedPRAtCommit +FNDA:0,(anonymous_13) +FNDA:3,getCheckSuitesForRef +FNDA:0,(anonymous_15) +FNDA:3,managePRLabels +DA:1,3 +DA:2,3 +DA:3,3 +DA:19,3 +DA:22,3 +DA:25,10 +DA:26,2 +DA:28,2 +DA:29,2 +DA:35,10 +DA:41,3 +DA:47,6 +DA:49,6 +DA:50,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:71,1 +DA:79,0 +DA:86,0 +DA:95,0 +DA:101,5 +DA:102,5 +DA:114,5 +DA:127,10 +DA:128,10 +DA:129,3 +DA:133,7 +DA:134,7 +DA:135,4 +DA:138,3 +DA:144,3 +DA:150,4 +DA:152,4 +DA:153,2 +DA:163,2 +DA:164,2 +DA:165,2 +DA:174,4 +DA:183,0 +DA:190,0 +DA:194,0 +DA:199,0 +DA:201,2 +DA:202,2 +DA:215,2 +DA:222,3 +DA:227,3 +DA:229,3 +DA:230,3 +DA:231,1 +DA:234,2 +DA:243,2 +DA:244,2 +DA:245,2 +DA:252,3 +DA:260,0 +DA:262,0 +DA:263,0 +DA:265,0 +DA:273,0 +DA:274,0 +DA:276,0 +DA:278,0 +DA:279,0 +DA:281,0 +DA:292,0 +DA:294,1 +DA:295,1 +DA:303,1 +DA:310,3 +DA:319,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:326,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:343,0 +DA:349,0 +DA:359,0 +DA:369,0 +DA:370,0 +DA:378,0 +DA:385,3 +DA:386,19 +DA:387,19 +DA:390,19 +DA:396,2 +DA:397,17 +DA:403,9 +DA:404,8 +DA:405,4 +DA:406,4 +DA:411,2 +DA:412,2 +DA:413,1 +DA:417,19 +DA:423,3 +DA:424,16 +DA:425,1 +DA:427,15 +DA:431,19 +DA:432,2 +DA:433,17 +DA:438,2 +DA:439,15 +DA:440,1 +DA:441,14 +DA:442,1 +DA:443,13 +DA:448,3 +DA:449,10 +DA:450,1 +DA:451,9 +DA:452,2 +DA:455,19 +DA:462,3 +DA:467,3 +DA:469,3 +DA:470,3 +DA:471,1 +DA:475,2 +DA:476,2 +DA:477,1 +DA:480,1 +DA:489,1 +DA:490,1 +DA:491,1 +DA:499,1 +DA:510,0 +DA:516,0 +DA:526,0 +DA:528,2 +DA:529,2 +DA:542,2 +DA:549,3 +DA:555,2 +DA:557,2 +DA:558,2 +DA:559,1 +DA:562,1 +DA:572,1 +DA:573,1 +DA:574,1 +DA:578,0 +DA:585,0 +DA:586,0 +DA:588,0 +DA:591,0 +DA:593,1 +DA:594,1 +DA:603,1 +DA:610,3 +DA:615,3 +DA:617,3 +DA:618,3 +DA:619,1 +DA:623,2 +DA:624,2 +DA:625,1 +DA:628,1 +DA:637,1 +DA:638,1 +DA:639,1 +DA:659,0 +DA:666,0 +DA:668,0 +DA:688,0 +DA:690,2 +DA:691,2 +DA:700,2 +DA:707,3 +DA:714,3 +DA:716,3 +DA:717,3 +DA:718,1 +DA:722,2 +DA:723,2 +DA:724,2 +DA:733,2 +DA:737,0 +DA:738,0 +DA:739,0 +DA:745,0 +DA:754,0 +DA:756,0 +DA:757,0 +DA:769,0 +DA:770,0 +DA:776,0 +DA:786,1 +DA:787,1 +DA:795,1 +LF:196 +LH:141 +BRDA:25,0,0,2 +BRDA:28,1,0,2 +BRDA:28,2,0,2 +BRDA:28,2,1,2 +BRDA:28,2,2,0 +BRDA:61,3,0,1 +BRDA:61,4,0,1 +BRDA:61,4,1,0 +BRDA:66,5,0,0 +BRDA:66,5,1,1 +BRDA:97,6,0,0 +BRDA:97,6,1,0 +BRDA:128,7,0,3 +BRDA:128,8,0,10 +BRDA:128,8,1,8 +BRDA:134,9,0,4 +BRDA:134,10,0,7 +BRDA:134,10,1,6 +BRDA:164,11,0,2 +BRDA:164,12,0,2 +BRDA:164,12,1,0 +BRDA:230,13,0,1 +BRDA:230,14,0,3 +BRDA:230,14,1,2 +BRDA:244,15,0,2 +BRDA:244,16,0,2 +BRDA:244,16,1,0 +BRDA:256,17,0,3 +BRDA:256,17,1,0 +BRDA:278,18,0,0 +BRDA:278,18,1,0 +BRDA:322,19,0,0 +BRDA:322,20,0,0 +BRDA:322,20,1,0 +BRDA:335,21,0,0 +BRDA:335,22,0,0 +BRDA:335,22,1,0 +BRDA:386,23,0,19 +BRDA:386,23,1,1 +BRDA:390,24,0,2 +BRDA:390,24,1,17 +BRDA:391,25,0,19 +BRDA:391,25,1,19 +BRDA:391,25,2,18 +BRDA:391,25,3,17 +BRDA:397,26,0,9 +BRDA:397,26,1,8 +BRDA:398,27,0,17 +BRDA:398,27,1,15 +BRDA:398,27,2,15 +BRDA:398,27,3,10 +BRDA:404,28,0,4 +BRDA:404,28,1,4 +BRDA:404,29,0,8 +BRDA:404,29,1,4 +BRDA:404,29,2,4 +BRDA:406,30,0,2 +BRDA:406,30,1,2 +BRDA:407,31,0,4 +BRDA:407,31,1,2 +BRDA:407,31,2,2 +BRDA:412,32,0,1 +BRDA:412,33,0,2 +BRDA:412,33,1,2 +BRDA:412,33,2,1 +BRDA:417,34,0,3 +BRDA:417,34,1,16 +BRDA:418,35,0,19 +BRDA:418,35,1,17 +BRDA:418,35,2,17 +BRDA:418,35,3,17 +BRDA:424,36,0,1 +BRDA:424,36,1,15 +BRDA:424,37,0,16 +BRDA:424,37,1,15 +BRDA:431,38,0,2 +BRDA:431,38,1,17 +BRDA:431,39,0,19 +BRDA:431,39,1,17 +BRDA:433,40,0,2 +BRDA:433,40,1,15 +BRDA:434,41,0,17 +BRDA:434,41,1,16 +BRDA:434,41,2,16 +BRDA:439,42,0,1 +BRDA:439,42,1,14 +BRDA:439,43,0,15 +BRDA:439,43,1,14 +BRDA:441,44,0,1 +BRDA:441,44,1,13 +BRDA:441,45,0,14 +BRDA:441,45,1,13 +BRDA:443,46,0,3 +BRDA:443,46,1,10 +BRDA:444,47,0,13 +BRDA:444,47,1,10 +BRDA:444,47,2,10 +BRDA:449,48,0,1 +BRDA:449,48,1,9 +BRDA:449,49,0,10 +BRDA:449,49,1,9 +BRDA:451,50,0,2 +BRDA:451,51,0,9 +BRDA:451,51,1,8 +BRDA:470,52,0,1 +BRDA:470,53,0,3 +BRDA:470,53,1,2 +BRDA:476,54,0,1 +BRDA:490,55,0,1 +BRDA:490,56,0,1 +BRDA:490,56,1,0 +BRDA:558,57,0,1 +BRDA:558,58,0,2 +BRDA:558,58,1,1 +BRDA:573,59,0,1 +BRDA:573,60,0,1 +BRDA:573,60,1,0 +BRDA:585,61,0,0 +BRDA:585,61,1,0 +BRDA:588,62,0,0 +BRDA:588,62,1,0 +BRDA:618,63,0,1 +BRDA:618,64,0,3 +BRDA:618,64,1,2 +BRDA:624,65,0,1 +BRDA:638,66,0,1 +BRDA:638,67,0,1 +BRDA:638,67,1,0 +BRDA:674,68,0,0 +BRDA:674,68,1,0 +BRDA:711,69,0,0 +BRDA:712,70,0,0 +BRDA:717,71,0,1 +BRDA:717,72,0,3 +BRDA:717,72,1,2 +BRDA:723,73,0,2 +BRDA:723,74,0,2 +BRDA:723,74,1,0 +BRDA:756,75,0,0 +BRDA:769,76,0,0 +BRF:140 +BRH:110 +end_of_record +TN: +SF:src/utils/awsCredentialProvider.ts +FN:35,(anonymous_1) +FN:82,(anonymous_2) +FN:92,(anonymous_3) +FN:106,(anonymous_4) +FN:167,(anonymous_5) +FN:207,(anonymous_6) +FN:265,(anonymous_7) +FN:290,(anonymous_8) +FN:300,(anonymous_9) +FN:307,(anonymous_10) +FN:317,(anonymous_11) +FNF:11 +FNH:6 +FNDA:8,(anonymous_1) +FNDA:1,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:6,(anonymous_6) +FNDA:2,(anonymous_7) +FNDA:9,(anonymous_8) +FNDA:1,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:8,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:36,8 +DA:37,1 +DA:40,1 +DA:41,1 +DA:45,7 +DA:46,1 +DA:47,1 +DA:57,6 +DA:59,6 +DA:60,6 +DA:61,4 +DA:63,4 +DA:72,2 +DA:73,2 +DA:74,2 +DA:75,2 +DA:83,1 +DA:84,1 +DA:86,0 +DA:93,0 +DA:94,0 +DA:97,0 +DA:99,0 +DA:107,0 +DA:108,0 +DA:116,0 +DA:118,0 +DA:128,0 +DA:130,0 +DA:140,0 +DA:147,0 +DA:149,0 +DA:156,0 +DA:159,0 +DA:160,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:173,0 +DA:174,0 +DA:177,0 +DA:178,0 +DA:182,0 +DA:189,0 +DA:191,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:208,6 +DA:209,6 +DA:211,6 +DA:213,6 +DA:214,6 +DA:217,6 +DA:218,6 +DA:219,6 +DA:220,6 +DA:224,6 +DA:225,1 +DA:226,1 +DA:227,1 +DA:230,5 +DA:231,5 +DA:234,5 +DA:235,5 +DA:236,5 +DA:238,5 +DA:239,1 +DA:242,1 +DA:243,1 +DA:246,4 +DA:252,2 +DA:253,2 +DA:254,0 +DA:256,2 +DA:257,2 +DA:266,2 +DA:267,1 +DA:270,1 +DA:271,1 +DA:274,1 +DA:281,1 +DA:291,9 +DA:292,9 +DA:293,9 +DA:294,9 +DA:301,1 +DA:308,0 +DA:309,0 +DA:311,0 +DA:318,0 +DA:323,1 +DA:324,1 +DA:325,1 +LF:102 +LH:67 +BRDA:36,0,0,1 +BRDA:45,1,0,1 +BRDA:45,2,0,7 +BRDA:45,2,1,1 +BRDA:73,3,0,2 +BRDA:73,3,1,0 +BRDA:83,4,0,1 +BRDA:169,5,0,0 +BRDA:224,6,0,1 +BRDA:224,7,0,6 +BRDA:224,7,1,1 +BRDA:230,8,0,5 +BRDA:230,8,1,0 +BRDA:231,9,0,5 +BRDA:231,9,1,0 +BRDA:238,10,0,1 +BRDA:238,11,0,5 +BRDA:238,11,1,5 +BRDA:249,12,0,4 +BRDA:249,12,1,0 +BRDA:253,13,0,0 +BRDA:266,14,0,1 +BRDA:308,15,0,0 +BRDA:308,16,0,0 +BRDA:308,16,1,0 +BRDA:318,17,0,0 +BRDA:318,17,1,0 +BRF:27 +BRH:16 +end_of_record +TN: +SF:src/utils/logger.ts +FN:418,(anonymous_1) +FNF:1 +FNH:1 +FNDA:15,(anonymous_1) +DA:1,11 +DA:2,11 +DA:3,11 +DA:7,11 +DA:8,11 +DA:11,11 +DA:13,0 +DA:17,11 +DA:18,11 +DA:21,11 +DA:52,11 +DA:373,11 +DA:375,0 +DA:376,0 +DA:379,0 +DA:381,0 +DA:382,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:389,0 +DA:391,0 +DA:395,0 +DA:397,0 +DA:401,0 +DA:406,11 +DA:418,11 +DA:419,15 +DA:423,11 +LF:29 +LH:15 +BRDA:7,0,0,11 +BRDA:7,0,1,0 +BRDA:11,1,0,0 +BRDA:21,2,0,0 +BRDA:21,2,1,11 +BRDA:58,3,0,11 +BRDA:58,3,1,11 +BRDA:59,4,0,11 +BRDA:59,4,1,0 +BRDA:61,5,0,11 +BRDA:61,5,1,11 +BRDA:368,6,0,0 +BRDA:368,6,1,11 +BRDA:373,7,0,0 +BRDA:379,8,0,0 +BRDA:382,9,0,0 +BRDA:389,10,0,0 +BRDA:411,11,0,11 +BRDA:411,11,1,0 +BRF:19 +BRH:9 +end_of_record +TN: +SF:src/utils/sanitize.ts +FN:8,sanitizeBotMentions +FN:41,sanitizeLabels +FN:42,(anonymous_2) +FN:48,sanitizeCommandInput +FN:61,validateRepositoryName +FN:69,validateGitHubRef +FN:86,sanitizeEnvironmentValue +FN:100,(anonymous_7) +FNF:8 +FNH:8 +FNDA:8,sanitizeBotMentions +FNDA:3,sanitizeLabels +FNDA:7,(anonymous_2) +FNDA:6,sanitizeCommandInput +FNDA:11,validateRepositoryName +FNDA:11,validateGitHubRef +FNDA:14,sanitizeEnvironmentValue +FNDA:61,(anonymous_7) +DA:1,20 +DA:3,20 +DA:8,20 +DA:9,8 +DA:12,5 +DA:14,5 +DA:15,1 +DA:16,1 +DA:21,4 +DA:24,4 +DA:27,4 +DA:28,4 +DA:31,4 +DA:32,2 +DA:35,4 +DA:41,20 +DA:42,7 +DA:48,20 +DA:49,6 +DA:52,4 +DA:61,20 +DA:62,11 +DA:63,11 +DA:69,20 +DA:74,11 +DA:75,5 +DA:79,6 +DA:80,6 +DA:86,20 +DA:87,14 +DA:100,61 +DA:102,14 +LF:32 +LH:32 +BRDA:9,0,0,3 +BRDA:14,1,0,1 +BRDA:27,2,0,3 +BRDA:27,2,1,1 +BRDA:31,3,0,2 +BRDA:49,4,0,2 +BRDA:74,5,0,5 +BRDA:74,6,0,11 +BRDA:74,6,1,10 +BRDA:74,6,2,9 +BRDA:74,6,3,8 +BRDA:74,6,4,7 +BRDA:102,7,0,10 +BRDA:102,7,1,4 +BRF:14 +BRH:14 +end_of_record +TN: +SF:src/utils/secureCredentials.ts +FN:20,(anonymous_1) +FN:28,(anonymous_2) +FN:77,(anonymous_3) +FN:84,(anonymous_4) +FN:91,(anonymous_5) +FN:98,(anonymous_6) +FN:107,(anonymous_7) +FN:115,(anonymous_8) +FN:126,(anonymous_9) +FNF:9 +FNH:3 +FNDA:2,(anonymous_1) +FNDA:2,(anonymous_2) +FNDA:9,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +DA:1,2 +DA:2,2 +DA:21,2 +DA:22,2 +DA:29,2 +DA:44,2 +DA:45,6 +DA:48,6 +DA:50,6 +DA:52,0 +DA:53,0 +DA:56,0 +DA:57,0 +DA:61,6 +DA:62,2 +DA:63,2 +DA:66,6 +DA:67,2 +DA:69,4 +DA:78,9 +DA:85,0 +DA:92,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:108,0 +DA:109,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:120,0 +DA:127,0 +DA:132,2 +DA:134,2 +DA:135,2 +LF:35 +LH:19 +BRDA:31,0,0,2 +BRDA:31,0,1,2 +BRDA:35,1,0,2 +BRDA:35,1,1,2 +BRDA:39,2,0,2 +BRDA:39,2,1,2 +BRDA:50,3,0,0 +BRDA:56,4,0,0 +BRDA:56,4,1,0 +BRDA:61,5,0,2 +BRDA:61,6,0,6 +BRDA:61,6,1,6 +BRDA:66,7,0,2 +BRDA:66,7,1,4 +BRDA:78,8,0,9 +BRDA:78,8,1,0 +BRDA:117,9,0,0 +BRF:17 +BRH:12 +end_of_record +TN: +SF:src/utils/startup-metrics.ts +FN:23,(anonymous_0) +FN:27,(anonymous_1) +FN:55,(anonymous_2) +FN:74,(anonymous_3) +FN:85,(anonymous_4) +FN:86,(anonymous_5) +FN:97,(anonymous_6) +FN:101,(anonymous_7) +FN:105,(anonymous_8) +FN:109,(anonymous_9) +FN:113,(anonymous_10) +FNF:11 +FNH:11 +FNDA:22,(anonymous_0) +FNDA:28,(anonymous_1) +FNDA:6,(anonymous_2) +FNDA:6,(anonymous_3) +FNDA:3,(anonymous_4) +FNDA:4,(anonymous_5) +FNDA:5,(anonymous_6) +FNDA:5,(anonymous_7) +FNDA:1,(anonymous_8) +FNDA:3,(anonymous_9) +FNDA:1,(anonymous_10) +DA:2,1 +DA:15,1 +DA:16,22 +DA:18,22 +DA:19,22 +DA:20,22 +DA:24,22 +DA:28,28 +DA:29,28 +DA:31,28 +DA:38,28 +DA:39,28 +DA:45,28 +DA:56,6 +DA:57,6 +DA:59,6 +DA:60,6 +DA:61,6 +DA:63,6 +DA:71,6 +DA:75,6 +DA:86,3 +DA:91,4 +DA:92,4 +DA:98,5 +DA:102,5 +DA:106,1 +DA:110,3 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,1 +DA:118,1 +LF:33 +LH:33 +BRDA:27,0,0,9 +BRDA:80,1,0,6 +BRDA:80,1,1,4 +BRF:3 +BRH:3 +end_of_record + +TN: +SF:cli/src/commands/continue.ts +FN:7,registerContinueCommand +FN:13,(anonymous_2) +FN:18,continueSession +FNF:3 +FNH:3 +FNDA:5,registerContinueCommand +FNDA:5,(anonymous_2) +FNDA:5,continueSession +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:7,1 +DA:8,5 +DA:14,5 +DA:19,5 +DA:21,5 +DA:22,5 +DA:23,5 +DA:26,5 +DA:27,5 +DA:28,1 +DA:29,1 +DA:33,4 +DA:34,4 +DA:35,2 +DA:37,1 +DA:40,2 +DA:41,2 +DA:45,2 +DA:48,2 +DA:71,2 +DA:74,1 +DA:75,1 +DA:76,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,1 +DA:82,1 +DA:83,1 +DA:84,1 +DA:85,1 +DA:86,1 +DA:89,1 +LF:37 +LH:37 +BRDA:27,0,0,1 +BRDA:34,1,0,2 +BRDA:35,2,0,1 +BRDA:59,3,0,2 +BRDA:59,3,1,0 +BRDA:61,4,0,2 +BRDA:61,4,1,2 +BRDA:62,5,0,2 +BRDA:62,5,1,2 +BRDA:63,6,0,2 +BRDA:63,6,1,2 +BRDA:89,7,0,1 +BRDA:89,7,1,0 +BRF:13 +BRH:11 +end_of_record +TN: +SF:cli/src/commands/list.ts +FN:8,registerListCommand +FN:16,(anonymous_2) +FN:21,listSessions +FNF:3 +FNH:3 +FNDA:10,registerListCommand +FNDA:10,(anonymous_2) +FNDA:10,listSessions +DA:2,1 +DA:3,1 +DA:5,1 +DA:6,1 +DA:8,1 +DA:9,10 +DA:17,10 +DA:27,10 +DA:28,10 +DA:29,10 +DA:32,10 +DA:33,10 +DA:35,10 +DA:36,2 +DA:37,1 +DA:38,1 +DA:40,1 +DA:44,9 +DA:45,9 +DA:46,1 +DA:47,1 +DA:51,8 +DA:57,7 +DA:58,2 +DA:59,1 +DA:61,1 +DA:63,2 +DA:67,5 +DA:68,1 +DA:69,1 +DA:73,4 +DA:85,4 +DA:87,5 +DA:88,5 +DA:91,5 +DA:92,5 +DA:94,4 +DA:95,4 +DA:97,1 +DA:98,1 +DA:100,0 +DA:101,0 +DA:103,0 +DA:104,0 +DA:108,5 +DA:109,5 +DA:113,5 +DA:122,4 +DA:123,4 +DA:126,1 +LF:50 +LH:46 +BRDA:35,0,0,2 +BRDA:36,1,0,1 +BRDA:44,2,0,9 +BRDA:44,2,1,0 +BRDA:45,3,0,1 +BRDA:45,4,0,9 +BRDA:45,4,1,9 +BRDA:57,5,0,2 +BRDA:58,6,0,1 +BRDA:58,6,1,1 +BRDA:67,7,0,1 +BRDA:92,8,0,4 +BRDA:92,8,1,1 +BRDA:92,8,2,0 +BRDA:92,8,3,0 +BRDA:109,9,0,0 +BRDA:109,9,1,5 +BRDA:126,10,0,1 +BRDA:126,10,1,0 +BRF:19 +BRH:14 +end_of_record +TN: +SF:cli/src/commands/logs.ts +FN:7,registerLogsCommand +FN:14,(anonymous_2) +FN:19,showLogs +FN:98,getStatusWithColor +FNF:4 +FNH:4 +FNDA:9,registerLogsCommand +FNDA:9,(anonymous_2) +FNDA:9,showLogs +FNDA:6,getStatusWithColor +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:7,1 +DA:8,9 +DA:15,9 +DA:26,9 +DA:27,9 +DA:28,9 +DA:31,9 +DA:32,8 +DA:33,1 +DA:34,1 +DA:38,7 +DA:39,7 +DA:40,7 +DA:41,7 +DA:42,1 +DA:43,1 +DA:48,6 +DA:49,6 +DA:50,1 +DA:51,1 +DA:52,1 +DA:55,6 +DA:56,6 +DA:57,6 +DA:58,6 +DA:59,6 +DA:60,6 +DA:61,6 +DA:64,6 +DA:65,2 +DA:69,6 +DA:71,6 +DA:72,6 +DA:73,2 +DA:74,2 +DA:75,2 +DA:78,2 +DA:81,4 +DA:82,3 +DA:84,3 +DA:85,3 +DA:86,3 +DA:87,3 +DA:90,1 +DA:94,1 +DA:99,6 +DA:101,1 +DA:103,0 +DA:105,0 +DA:107,5 +DA:109,0 +LF:55 +LH:52 +BRDA:32,0,0,1 +BRDA:39,1,0,7 +BRDA:41,2,0,1 +BRDA:41,3,0,7 +BRDA:41,3,1,7 +BRDA:49,4,0,1 +BRDA:49,5,0,6 +BRDA:49,5,1,2 +BRDA:64,6,0,2 +BRDA:64,7,0,6 +BRDA:64,7,1,2 +BRDA:72,8,0,2 +BRDA:72,8,1,4 +BRDA:90,9,0,1 +BRDA:90,9,1,0 +BRDA:94,10,0,1 +BRDA:94,10,1,0 +BRDA:99,11,0,1 +BRDA:99,11,1,0 +BRDA:99,11,2,0 +BRDA:99,11,3,5 +BRDA:99,11,4,0 +BRF:22 +BRH:17 +end_of_record +TN: +SF:cli/src/commands/recover.ts +FN:6,registerRecoverCommand +FN:11,(anonymous_2) +FN:18,(anonymous_3) +FN:23,recoverSession +FN:74,syncSessions +FN:89,(anonymous_6) +FN:90,(anonymous_7) +FNF:7 +FNH:7 +FNDA:11,registerRecoverCommand +FNDA:7,(anonymous_2) +FNDA:4,(anonymous_3) +FNDA:7,recoverSession +FNDA:4,syncSessions +FNDA:4,(anonymous_6) +FNDA:4,(anonymous_7) +DA:2,1 +DA:3,1 +DA:4,1 +DA:6,1 +DA:7,11 +DA:12,7 +DA:15,11 +DA:19,4 +DA:24,7 +DA:26,7 +DA:27,7 +DA:30,7 +DA:31,7 +DA:32,1 +DA:33,1 +DA:37,6 +DA:38,1 +DA:39,1 +DA:43,5 +DA:45,4 +DA:46,3 +DA:47,3 +DA:48,3 +DA:49,3 +DA:50,3 +DA:52,3 +DA:53,1 +DA:54,1 +DA:55,1 +DA:57,2 +DA:58,1 +DA:61,3 +DA:62,3 +DA:63,3 +DA:64,3 +DA:66,1 +DA:70,1 +DA:75,4 +DA:77,4 +DA:78,4 +DA:81,4 +DA:84,3 +DA:86,3 +DA:89,4 +DA:90,4 +DA:92,3 +DA:93,3 +DA:94,3 +DA:96,3 +DA:97,2 +DA:98,2 +DA:102,1 +LF:52 +LH:52 +BRDA:31,0,0,1 +BRDA:37,1,0,1 +BRDA:45,2,0,3 +BRDA:45,2,1,1 +BRDA:52,3,0,1 +BRDA:52,3,1,2 +BRDA:53,4,0,1 +BRDA:53,4,1,0 +BRDA:54,5,0,1 +BRDA:57,6,0,1 +BRDA:70,7,0,1 +BRDA:70,7,1,0 +BRDA:96,8,0,2 +BRDA:102,9,0,1 +BRDA:102,9,1,0 +BRF:15 +BRH:12 +end_of_record +TN: +SF:cli/src/commands/start-batch.ts +FN:9,registerStartBatchCommand +FN:16,(anonymous_11) +FN:21,startBatch +FN:76,runTasksSequentially +FN:86,runTasksInParallel +FN:94,(anonymous_15) +FN:101,runTask +FN:139,(anonymous_17) +FNF:8 +FNH:8 +FNDA:9,registerStartBatchCommand +FNDA:9,(anonymous_11) +FNDA:9,startBatch +FNDA:4,runTasksSequentially +FNDA:2,runTasksInParallel +FNDA:5,(anonymous_15) +FNDA:15,runTask +FNDA:15,(anonymous_17) +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:9,1 +DA:10,9 +DA:17,9 +DA:28,9 +DA:30,9 +DA:32,9 +DA:33,1 +DA:34,1 +DA:38,8 +DA:39,8 +DA:40,8 +DA:42,8 +DA:43,1 +DA:44,1 +DA:47,7 +DA:49,7 +DA:56,7 +DA:57,1 +DA:58,1 +DA:62,6 +DA:63,2 +DA:64,2 +DA:66,4 +DA:67,4 +DA:70,4 +DA:72,2 +DA:77,4 +DA:78,10 +DA:79,10 +DA:82,10 +DA:88,2 +DA:89,2 +DA:91,2 +DA:94,2 +DA:95,5 +DA:96,5 +DA:102,15 +DA:104,15 +DA:107,15 +DA:108,4 +DA:112,15 +DA:113,5 +DA:114,1 +DA:116,4 +DA:121,15 +DA:122,4 +DA:126,15 +DA:127,3 +DA:128,3 +DA:130,3 +DA:131,3 +DA:133,3 +DA:134,3 +DA:139,30 +DA:142,15 +DA:143,15 +DA:144,15 +DA:146,15 +DA:147,15 +DA:148,15 +DA:150,15 +DA:151,3 +DA:152,3 +DA:153,3 +DA:157,15 +DA:160,1 +LF:71 +LH:71 +BRDA:32,0,0,1 +BRDA:42,1,0,1 +BRDA:42,2,0,8 +BRDA:42,2,1,8 +BRDA:52,3,0,7 +BRDA:52,3,1,0 +BRDA:56,4,0,1 +BRDA:56,5,0,7 +BRDA:56,5,1,6 +BRDA:62,6,0,2 +BRDA:62,6,1,4 +BRDA:72,7,0,2 +BRDA:72,7,1,0 +BRDA:79,8,0,0 +BRDA:79,8,1,10 +BRDA:95,9,0,0 +BRDA:95,9,1,5 +BRDA:107,10,0,4 +BRDA:112,11,0,5 +BRDA:113,12,0,1 +BRDA:113,12,1,4 +BRDA:114,13,0,1 +BRDA:121,14,0,4 +BRDA:126,15,0,3 +BRDA:127,16,0,3 +BRDA:130,17,0,3 +BRDA:133,18,0,3 +BRDA:146,19,0,4 +BRDA:147,20,0,5 +BRDA:148,21,0,4 +BRDA:150,22,0,3 +BRDA:151,23,0,3 +BRDA:152,24,0,3 +BRDA:153,25,0,3 +BRF:34 +BRH:30 +end_of_record +TN: +SF:cli/src/commands/start.ts +FN:8,registerStartCommand +FN:20,(anonymous_2) +FN:25,startSession +FN:166,createEnvironmentVars +FN:206,createPrompt +FNF:5 +FNH:5 +FNDA:10,registerStartCommand +FNDA:10,(anonymous_2) +FNDA:10,startSession +FNDA:7,createEnvironmentVars +FNDA:7,createPrompt +DA:2,2 +DA:3,2 +DA:5,2 +DA:6,2 +DA:8,2 +DA:9,10 +DA:21,10 +DA:25,2 +DA:37,10 +DA:39,10 +DA:41,10 +DA:42,10 +DA:43,1 +DA:44,1 +DA:48,10 +DA:49,1 +DA:50,1 +DA:54,9 +DA:55,9 +DA:58,9 +DA:59,9 +DA:62,9 +DA:63,1 +DA:67,9 +DA:74,9 +DA:86,9 +DA:87,9 +DA:90,9 +DA:91,1 +DA:92,1 +DA:96,8 +DA:97,8 +DA:98,1 +DA:99,1 +DA:103,7 +DA:104,7 +DA:107,7 +DA:110,7 +DA:111,7 +DA:117,7 +DA:118,1 +DA:119,1 +DA:123,6 +DA:136,6 +DA:138,6 +DA:139,6 +DA:140,6 +DA:141,6 +DA:142,6 +DA:144,6 +DA:145,1 +DA:146,1 +DA:147,1 +DA:149,5 +DA:150,1 +DA:153,6 +DA:154,6 +DA:155,6 +DA:156,6 +DA:159,0 +DA:168,7 +DA:169,7 +DA:170,7 +DA:174,7 +DA:175,7 +DA:176,7 +DA:181,7 +DA:182,7 +DA:183,1 +DA:184,6 +DA:185,1 +DA:188,7 +DA:208,7 +DA:209,7 +DA:210,1 +DA:211,6 +DA:212,1 +DA:215,7 +LF:78 +LH:77 +BRDA:42,0,0,1 +BRDA:43,1,0,1 +BRDA:43,1,1,0 +BRDA:48,2,0,1 +BRDA:48,3,0,10 +BRDA:48,3,1,2 +BRDA:55,4,0,1 +BRDA:55,4,1,8 +BRDA:59,5,0,1 +BRDA:59,5,1,8 +BRDA:62,6,0,1 +BRDA:62,7,0,9 +BRDA:62,7,1,2 +BRDA:67,8,0,1 +BRDA:67,8,1,8 +BRDA:67,9,0,9 +BRDA:67,9,1,8 +BRDA:67,9,2,8 +BRDA:68,10,0,1 +BRDA:68,10,1,0 +BRDA:69,11,0,1 +BRDA:69,11,1,0 +BRDA:70,12,0,1 +BRDA:70,12,1,0 +BRDA:90,13,0,1 +BRDA:97,14,0,1 +BRDA:117,15,0,1 +BRDA:144,16,0,1 +BRDA:144,16,1,5 +BRDA:145,17,0,1 +BRDA:145,17,1,0 +BRDA:146,18,0,1 +BRDA:149,19,0,1 +BRDA:159,20,0,0 +BRDA:159,20,1,0 +BRDA:168,21,0,7 +BRDA:168,21,1,7 +BRDA:169,22,0,7 +BRDA:174,23,0,7 +BRDA:174,23,1,7 +BRDA:175,24,0,7 +BRDA:182,25,0,1 +BRDA:182,25,1,6 +BRDA:182,26,0,7 +BRDA:182,26,1,1 +BRDA:184,27,0,1 +BRDA:184,28,0,6 +BRDA:184,28,1,1 +BRDA:191,29,0,1 +BRDA:191,29,1,6 +BRDA:192,30,0,1 +BRDA:192,30,1,6 +BRDA:193,31,0,7 +BRDA:193,31,1,5 +BRDA:198,32,0,7 +BRDA:198,32,1,7 +BRDA:199,33,0,7 +BRDA:199,33,1,7 +BRDA:209,34,0,1 +BRDA:209,34,1,6 +BRDA:211,35,0,1 +BRDA:215,36,0,7 +BRDA:215,36,1,7 +BRDA:219,37,0,1 +BRDA:219,37,1,6 +BRDA:219,38,0,1 +BRDA:219,38,1,0 +BRDA:220,39,0,1 +BRDA:220,39,1,6 +BRDA:221,40,0,2 +BRDA:221,40,1,5 +BRF:71 +BRH:63 +end_of_record +TN: +SF:cli/src/commands/stop.ts +FN:7,registerStopCommand +FN:14,(anonymous_2) +FN:23,stopSession +FN:88,stopAllSessions +FNF:4 +FNH:4 +FNDA:14,registerStopCommand +FNDA:14,(anonymous_2) +FNDA:8,stopSession +FNDA:6,stopAllSessions +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:7,1 +DA:8,14 +DA:15,14 +DA:16,6 +DA:18,8 +DA:30,8 +DA:32,8 +DA:33,8 +DA:34,8 +DA:37,8 +DA:38,8 +DA:39,1 +DA:40,1 +DA:44,7 +DA:45,6 +DA:46,2 +DA:48,1 +DA:49,1 +DA:51,1 +DA:55,2 +DA:56,0 +DA:57,0 +DA:60,2 +DA:64,4 +DA:65,4 +DA:67,4 +DA:68,1 +DA:69,1 +DA:73,3 +DA:76,3 +DA:77,1 +DA:78,1 +DA:80,2 +DA:84,1 +DA:94,6 +DA:96,6 +DA:97,6 +DA:98,6 +DA:101,6 +DA:103,5 +DA:104,1 +DA:105,1 +DA:108,4 +DA:110,4 +DA:111,4 +DA:114,4 +DA:115,7 +DA:117,7 +DA:118,7 +DA:120,1 +DA:121,1 +DA:122,1 +DA:126,6 +DA:128,6 +DA:130,5 +DA:133,5 +DA:134,2 +DA:137,5 +DA:139,1 +DA:142,0 +DA:146,4 +DA:147,1 +DA:149,3 +DA:152,4 +DA:153,1 +DA:157,1 +LF:70 +LH:67 +BRDA:15,0,0,6 +BRDA:15,0,1,8 +BRDA:38,1,0,1 +BRDA:45,2,0,2 +BRDA:46,3,0,1 +BRDA:46,3,1,1 +BRDA:55,4,0,0 +BRDA:67,5,0,1 +BRDA:76,6,0,1 +BRDA:76,6,1,2 +BRDA:84,7,0,1 +BRDA:84,7,1,0 +BRDA:103,8,0,1 +BRDA:118,9,0,1 +BRDA:128,10,0,5 +BRDA:128,10,1,1 +BRDA:133,11,0,2 +BRDA:146,12,0,1 +BRDA:146,12,1,3 +BRDA:152,13,0,1 +BRDA:157,14,0,1 +BRDA:157,14,1,0 +BRF:22 +BRH:19 +end_of_record +TN: +SF:cli/src/utils/dockerUtils.ts +FN:16,(anonymous_1) +FN:25,(anonymous_2) +FN:37,(anonymous_3) +FN:49,(anonymous_4) +FN:72,(anonymous_5) +FN:101,(anonymous_6) +FN:111,(anonymous_7) +FN:112,(anonymous_8) +FN:133,(anonymous_9) +FN:147,(anonymous_10) +FN:171,(anonymous_11) +FN:189,(anonymous_12) +FN:201,(anonymous_13) +FNF:13 +FNH:8 +FNDA:9,(anonymous_1) +FNDA:2,(anonymous_2) +FNDA:2,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:2,(anonymous_5) +FNDA:4,(anonymous_6) +FNDA:4,(anonymous_7) +FNDA:4,(anonymous_8) +FNDA:3,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +DA:1,9 +DA:2,9 +DA:3,9 +DA:6,9 +DA:7,9 +DA:12,9 +DA:18,9 +DA:19,9 +DA:26,2 +DA:27,2 +DA:28,1 +DA:30,1 +DA:38,2 +DA:39,2 +DA:40,1 +DA:42,1 +DA:50,0 +DA:51,0 +DA:54,0 +DA:55,0 +DA:57,0 +DA:58,0 +DA:62,0 +DA:64,0 +DA:65,0 +DA:77,2 +DA:79,2 +DA:82,2 +DA:85,2 +DA:86,0 +DA:93,2 +DA:101,2 +DA:102,4 +DA:106,2 +DA:107,2 +DA:110,2 +DA:111,4 +DA:113,4 +DA:117,2 +DA:120,2 +DA:121,1 +DA:123,1 +DA:125,1 +DA:126,1 +DA:134,3 +DA:135,3 +DA:136,3 +DA:137,2 +DA:139,1 +DA:140,1 +DA:148,0 +DA:149,0 +DA:151,0 +DA:152,0 +DA:155,0 +DA:156,0 +DA:159,0 +DA:161,0 +DA:164,0 +DA:165,0 +DA:167,0 +DA:168,0 +DA:171,0 +DA:172,0 +DA:175,0 +DA:177,0 +DA:178,0 +DA:181,0 +DA:182,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:194,0 +DA:202,0 +DA:203,0 +DA:211,0 +DA:212,0 +DA:215,0 +DA:217,0 +DA:218,0 +LF:80 +LH:40 +BRDA:18,0,0,9 +BRDA:18,0,1,9 +BRDA:50,1,0,0 +BRDA:85,2,0,0 +BRDA:85,2,1,2 +BRDA:106,3,0,2 +BRDA:106,3,1,2 +BRDA:106,4,0,2 +BRDA:106,4,1,0 +BRDA:111,5,0,4 +BRDA:111,5,1,4 +BRDA:133,6,0,2 +BRDA:135,7,0,1 +BRDA:135,7,1,2 +BRDA:147,8,0,0 +BRDA:151,9,0,0 +BRDA:155,10,0,0 +BRDA:161,11,0,0 +BRDA:161,11,1,0 +BRDA:182,12,0,0 +BRDA:182,12,1,0 +BRDA:211,13,0,0 +BRF:22 +BRH:11 +end_of_record +TN: +SF:cli/src/utils/sessionManager.ts +FN:19,(anonymous_1) +FN:29,(anonymous_2) +FN:38,(anonymous_3) +FN:45,(anonymous_4) +FN:63,(anonymous_5) +FN:71,(anonymous_6) +FN:89,(anonymous_7) +FN:104,(anonymous_8) +FN:122,(anonymous_9) +FN:125,(anonymous_10) +FN:127,(anonymous_11) +FN:135,(anonymous_12) +FN:140,(anonymous_13) +FN:144,(anonymous_14) +FN:145,(anonymous_15) +FN:154,(anonymous_16) +FN:171,(anonymous_17) +FN:232,(anonymous_18) +FNF:18 +FNH:18 +FNDA:17,(anonymous_1) +FNDA:17,(anonymous_2) +FNDA:26,(anonymous_3) +FNDA:26,(anonymous_4) +FNDA:31,(anonymous_5) +FNDA:12,(anonymous_6) +FNDA:5,(anonymous_7) +FNDA:2,(anonymous_8) +FNDA:7,(anonymous_9) +FNDA:19,(anonymous_10) +FNDA:19,(anonymous_11) +FNDA:3,(anonymous_12) +FNDA:3,(anonymous_13) +FNDA:17,(anonymous_14) +FNDA:12,(anonymous_15) +FNDA:15,(anonymous_16) +FNDA:3,(anonymous_17) +FNDA:1,(anonymous_18) +DA:1,8 +DA:2,8 +DA:3,8 +DA:4,8 +DA:10,8 +DA:15,8 +DA:21,17 +DA:22,17 +DA:23,17 +DA:30,17 +DA:31,17 +DA:39,26 +DA:46,26 +DA:47,26 +DA:49,26 +DA:56,26 +DA:57,26 +DA:64,31 +DA:65,31 +DA:72,12 +DA:73,12 +DA:74,12 +DA:75,3 +DA:78,9 +DA:79,9 +DA:81,0 +DA:82,0 +DA:90,5 +DA:91,5 +DA:92,1 +DA:95,4 +DA:96,4 +DA:97,4 +DA:98,4 +DA:105,2 +DA:106,2 +DA:107,2 +DA:108,1 +DA:111,1 +DA:112,1 +DA:114,0 +DA:115,0 +DA:123,7 +DA:124,7 +DA:125,19 +DA:127,7 +DA:128,19 +DA:129,19 +DA:130,19 +DA:134,7 +DA:135,3 +DA:138,7 +DA:139,1 +DA:140,3 +DA:144,17 +DA:145,7 +DA:146,12 +DA:147,12 +DA:148,3 +DA:149,3 +DA:154,15 +DA:157,7 +DA:158,1 +DA:161,7 +DA:163,0 +DA:164,0 +DA:172,3 +DA:173,3 +DA:174,3 +DA:175,1 +DA:176,1 +DA:179,2 +DA:180,1 +DA:181,1 +DA:185,1 +DA:188,1 +DA:203,1 +DA:209,1 +DA:210,0 +DA:211,0 +DA:215,1 +DA:216,1 +DA:217,1 +DA:218,1 +DA:220,1 +DA:221,1 +DA:223,0 +DA:224,0 +DA:233,1 +DA:234,1 +DA:236,1 +DA:237,2 +DA:238,1 +DA:239,1 +DA:240,0 +DA:241,0 +DA:242,0 +DA:247,0 +LF:98 +LH:84 +BRDA:30,0,0,17 +BRDA:74,1,0,3 +BRDA:91,2,0,1 +BRDA:107,3,0,1 +BRDA:122,4,0,4 +BRDA:134,5,0,1 +BRDA:138,6,0,1 +BRDA:147,7,0,3 +BRDA:157,8,0,1 +BRDA:157,9,0,7 +BRDA:157,9,1,1 +BRDA:174,10,0,1 +BRDA:179,11,0,1 +BRDA:190,12,0,0 +BRDA:190,12,1,1 +BRDA:190,13,0,0 +BRDA:190,13,1,1 +BRDA:191,14,0,0 +BRDA:191,14,1,1 +BRDA:192,15,0,0 +BRDA:192,15,1,1 +BRDA:193,16,0,1 +BRDA:193,16,1,1 +BRDA:196,17,0,1 +BRDA:196,17,1,1 +BRDA:197,18,0,1 +BRDA:197,18,1,1 +BRDA:198,19,0,1 +BRDA:198,19,1,1 +BRDA:199,20,0,1 +BRDA:199,20,1,1 +BRDA:209,21,0,0 +BRDA:237,22,0,1 +BRDA:239,23,0,0 +BRF:34 +BRH:28 +end_of_record diff --git a/jest.config.js b/jest.config.js index e07636b..091eec2 100644 --- a/jest.config.js +++ b/jest.config.js @@ -26,6 +26,7 @@ module.exports = { collectCoverageFrom: [ 'src/**/*.{js,ts}', '!src/**/*.d.ts', + '!src/types/**/*.ts', '!**/node_modules/**', '!**/dist/**' ], diff --git a/package.json b/package.json index 4ee381e..7835375 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "test:coverage": "jest --coverage", "test:watch": "jest --watch", "test:ci": "jest --ci --coverage --testPathPattern='test/(unit|integration).*\\.test\\.(js|ts)$'", + "test:combined-coverage": "./scripts/combine-coverage.js", "test:docker": "docker-compose -f docker-compose.test.yml run --rm test", "test:docker:integration": "docker-compose -f docker-compose.test.yml run --rm integration-test", "test:docker:e2e": "docker-compose -f docker-compose.test.yml run --rm e2e-test", diff --git a/scripts/combine-coverage.js b/scripts/combine-coverage.js new file mode 100755 index 0000000..54d032e --- /dev/null +++ b/scripts/combine-coverage.js @@ -0,0 +1,88 @@ +#!/usr/bin/env node + +const { execSync } = require('child_process'); +const fs = require('fs'); +const path = require('path'); + +/** + * Combine coverage reports from main project and CLI + */ + +// Ensure coverage directories exist +const mainCoverageDir = path.join(__dirname, '..', 'coverage'); +const cliCoverageDir = path.join(__dirname, '..', 'cli', 'coverage'); +const combinedCoverageDir = path.join(__dirname, '..', 'coverage-combined'); + +// Create combined coverage directory +if (!fs.existsSync(combinedCoverageDir)) { + fs.mkdirSync(combinedCoverageDir, { recursive: true }); +} + +console.log('Generating main project coverage...'); +try { + execSync('npm run test:ci', { stdio: 'inherit', cwd: path.join(__dirname, '..') }); +} catch (error) { + console.error('Failed to generate main project coverage'); + process.exit(1); +} + +console.log('\nGenerating CLI coverage...'); +try { + execSync('npm run test:coverage', { stdio: 'inherit', cwd: path.join(__dirname, '..', 'cli') }); +} catch (error) { + console.error('Failed to generate CLI coverage'); + process.exit(1); +} + +// Check if both coverage files exist +const mainLcov = path.join(mainCoverageDir, 'lcov.info'); +const cliLcov = path.join(cliCoverageDir, 'lcov.info'); + +if (!fs.existsSync(mainLcov)) { + console.error('Main project lcov.info not found'); + process.exit(1); +} + +if (!fs.existsSync(cliLcov)) { + console.error('CLI lcov.info not found'); + process.exit(1); +} + +// Read both lcov files +const mainLcovContent = fs.readFileSync(mainLcov, 'utf8'); +const cliLcovContent = fs.readFileSync(cliLcov, 'utf8'); + +// Adjust CLI paths to be relative to project root +const adjustedCliLcov = cliLcovContent.replace(/SF:src\//g, 'SF:cli/src/'); + +// Combine lcov files +const combinedLcov = mainLcovContent + '\n' + adjustedCliLcov; + +// Write combined lcov file +const combinedLcovPath = path.join(combinedCoverageDir, 'lcov.info'); +fs.writeFileSync(combinedLcovPath, combinedLcov); + +console.log('\nCombined coverage report written to:', combinedLcovPath); + +// Copy coverage-final.json files as well for better reporting +if (fs.existsSync(path.join(mainCoverageDir, 'coverage-final.json'))) { + const mainJson = JSON.parse(fs.readFileSync(path.join(mainCoverageDir, 'coverage-final.json'), 'utf8')); + const cliJson = JSON.parse(fs.readFileSync(path.join(cliCoverageDir, 'coverage-final.json'), 'utf8')); + + // Adjust CLI paths in JSON + const adjustedCliJson = {}; + for (const [key, value] of Object.entries(cliJson)) { + const adjustedKey = key.replace(/^src\//, 'cli/src/'); + adjustedCliJson[adjustedKey] = value; + } + + // Combine JSON coverage + const combinedJson = { ...mainJson, ...adjustedCliJson }; + fs.writeFileSync( + path.join(combinedCoverageDir, 'coverage-final.json'), + JSON.stringify(combinedJson, null, 2) + ); +} + +console.log('\nCoverage combination complete!'); +console.log('Upload coverage-combined/lcov.info to Codecov for full project coverage.'); \ No newline at end of file diff --git a/test/unit/providers/claude/services/SessionManager.test.ts b/test/unit/providers/claude/services/SessionManager.test.ts new file mode 100644 index 0000000..babe806 --- /dev/null +++ b/test/unit/providers/claude/services/SessionManager.test.ts @@ -0,0 +1,323 @@ +import { SessionManager } from '../../../../../src/providers/claude/services/SessionManager'; +import { execSync, spawn } from 'child_process'; +import type { ClaudeSession } from '../../../../../src/types/claude-orchestration'; + +// Mock child_process +jest.mock('child_process', () => ({ + execSync: jest.fn(), + spawn: jest.fn() +})); + +// Mock logger +jest.mock('../../../../../src/utils/logger', () => ({ + createLogger: () => ({ + info: jest.fn(), + error: jest.fn(), + debug: jest.fn() + }) +})); + +describe('SessionManager', () => { + let sessionManager: SessionManager; + const mockExecSync = execSync as jest.MockedFunction; + const mockSpawn = spawn as jest.MockedFunction; + + beforeEach(() => { + jest.clearAllMocks(); + sessionManager = new SessionManager(); + + // Setup default mocks + mockExecSync.mockReturnValue(Buffer.from('')); + mockSpawn.mockReturnValue({ + stdout: { on: jest.fn() }, + stderr: { on: jest.fn() }, + on: jest.fn() + } as any); + }); + + describe('createContainer', () => { + it('should create a container for a session', async () => { + const session: ClaudeSession = { + id: 'test-session-123', + type: 'analysis', + status: 'pending', + project: { + repository: 'owner/repo', + requirements: 'Test requirements', + constraints: [] + }, + dependencies: [], + createdAt: new Date() + }; + + const containerName = await sessionManager.createContainer(session); + + expect(containerName).toBe('claude-analysis-test-ses'); + expect(mockExecSync).toHaveBeenCalledWith(expect.stringContaining('docker create'), { + stdio: 'pipe' + }); + }); + + it('should handle errors when creating container', async () => { + const session: ClaudeSession = { + id: 'test-session-123', + type: 'analysis', + status: 'pending', + project: { + repository: 'owner/repo', + requirements: 'Test requirements', + constraints: [] + }, + dependencies: [], + createdAt: new Date() + }; + + mockExecSync.mockImplementation(() => { + throw new Error('Docker error'); + }); + + await expect(sessionManager.createContainer(session)).rejects.toThrow('Docker error'); + }); + }); + + describe('startSession', () => { + it('should start a session with a container', async () => { + const session: ClaudeSession = { + id: 'test-session-123', + type: 'implementation', + status: 'pending', + containerId: 'container-123', + project: { + repository: 'owner/repo', + requirements: 'Implement feature X', + constraints: [] + }, + dependencies: [], + createdAt: new Date() + }; + + // Mock spawn to simulate successful execution + const mockProcess = { + stdout: { + on: jest.fn((event, cb) => { + if (event === 'data') cb(Buffer.from('Output line')); + }) + }, + stderr: { on: jest.fn() }, + on: jest.fn((event, cb) => { + if (event === 'close') cb(0); + }) + }; + mockSpawn.mockReturnValue(mockProcess as any); + + await sessionManager.startSession(session); + + expect(mockExecSync).toHaveBeenCalledWith('docker start container-123', { stdio: 'pipe' }); + expect(mockSpawn).toHaveBeenCalledWith( + 'docker', + expect.arrayContaining(['exec', '-i', 'container-123', 'claude']) + ); + }); + + it('should throw error if session has no container ID', async () => { + const session: ClaudeSession = { + id: 'test-session-123', + type: 'testing', + status: 'pending', + project: { + repository: 'owner/repo', + requirements: 'Test requirements', + constraints: [] + }, + dependencies: [], + createdAt: new Date() + }; + + await expect(sessionManager.startSession(session)).rejects.toThrow( + 'Session has no container ID' + ); + }); + }); + + describe('getSession', () => { + it('should return a session by ID', async () => { + const session: ClaudeSession = { + id: 'test-session-123', + type: 'review', + status: 'pending', + project: { + repository: 'owner/repo', + requirements: 'Review code', + constraints: [] + }, + dependencies: [], + createdAt: new Date() + }; + + await sessionManager.createContainer(session); + const retrieved = sessionManager.getSession('test-session-123'); + + expect(retrieved).toBeDefined(); + expect(retrieved?.id).toBe('test-session-123'); + }); + + it('should return undefined for non-existent session', () => { + const retrieved = sessionManager.getSession('non-existent'); + expect(retrieved).toBeUndefined(); + }); + }); + + describe('getAllSessions', () => { + it('should return all sessions', async () => { + const session1: ClaudeSession = { + id: 'session-1', + type: 'analysis', + status: 'pending', + project: { + repository: 'owner/repo1', + requirements: 'Analyze', + constraints: [] + }, + dependencies: [], + createdAt: new Date() + }; + + const session2: ClaudeSession = { + id: 'session-2', + type: 'implementation', + status: 'pending', + project: { + repository: 'owner/repo2', + requirements: 'Implement', + constraints: [] + }, + dependencies: [], + createdAt: new Date() + }; + + await sessionManager.createContainer(session1); + await sessionManager.createContainer(session2); + + const allSessions = sessionManager.getAllSessions(); + expect(allSessions).toHaveLength(2); + expect(allSessions.map(s => s.id)).toEqual(['session-1', 'session-2']); + }); + }); + + describe('getOrchestrationSessions', () => { + it('should return sessions for a specific orchestration', async () => { + const session1: ClaudeSession = { + id: 'orch-123-session-1', + type: 'analysis', + status: 'pending', + project: { + repository: 'owner/repo', + requirements: 'Analyze', + constraints: [] + }, + dependencies: [], + createdAt: new Date() + }; + + const session2: ClaudeSession = { + id: 'orch-123-session-2', + type: 'implementation', + status: 'pending', + project: { + repository: 'owner/repo', + requirements: 'Implement', + constraints: [] + }, + dependencies: [], + createdAt: new Date() + }; + + const otherSession: ClaudeSession = { + id: 'orch-456-session-1', + type: 'testing', + status: 'pending', + project: { + repository: 'owner/repo', + requirements: 'Test', + constraints: [] + }, + dependencies: [], + createdAt: new Date() + }; + + await sessionManager.createContainer(session1); + await sessionManager.createContainer(session2); + await sessionManager.createContainer(otherSession); + + const orchSessions = sessionManager.getOrchestrationSessions('orch-123'); + expect(orchSessions).toHaveLength(2); + expect(orchSessions.map(s => s.id)).toEqual(['orch-123-session-1', 'orch-123-session-2']); + }); + }); + + describe('queueSession', () => { + it('should start session immediately if no dependencies', async () => { + const session: ClaudeSession = { + id: 'test-session', + type: 'analysis', + status: 'pending', + containerId: 'container-123', + project: { + repository: 'owner/repo', + requirements: 'Analyze', + constraints: [] + }, + dependencies: [], + createdAt: new Date() + }; + + const mockProcess = { + stdout: { on: jest.fn() }, + stderr: { on: jest.fn() }, + on: jest.fn((event, cb) => { + if (event === 'close') cb(0); + }) + }; + mockSpawn.mockReturnValue(mockProcess as any); + + await sessionManager.queueSession(session); + + expect(mockExecSync).toHaveBeenCalledWith('docker start container-123', { stdio: 'pipe' }); + }); + + it('should queue session if dependencies not met', async () => { + const depSession: ClaudeSession = { + id: 'dep-session', + type: 'analysis', + status: 'running', + project: { + repository: 'owner/repo', + requirements: 'Analyze', + constraints: [] + }, + dependencies: [], + createdAt: new Date() + }; + + const session: ClaudeSession = { + id: 'test-session', + type: 'implementation', + status: 'pending', + containerId: 'container-123', + project: { + repository: 'owner/repo', + requirements: 'Implement', + constraints: [] + }, + dependencies: ['dep-session'], + createdAt: new Date() + }; + + await sessionManager.createContainer(depSession); + await sessionManager.queueSession(session); + + // Should not start immediately + expect(mockSpawn).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/test/unit/providers/github/handlers/IssueHandler.test.ts b/test/unit/providers/github/handlers/IssueHandler.test.ts new file mode 100644 index 0000000..56bf3dd --- /dev/null +++ b/test/unit/providers/github/handlers/IssueHandler.test.ts @@ -0,0 +1,131 @@ +import { IssueHandler } from '../../../../../src/providers/github/handlers/IssueHandler'; +import { WebhookProcessor } from '../../../../../src/core/webhook/WebhookProcessor'; +import type { IssuesEvent } from '@octokit/webhooks-types'; + +// Mock dependencies +jest.mock('../../../../../src/utils/logger', () => ({ + createLogger: () => ({ + info: jest.fn(), + error: jest.fn(), + debug: jest.fn(), + warn: jest.fn() + }) +})); + +jest.mock('../../../../../src/utils/secureCredentials', () => ({ + SecureCredentials: jest.fn().mockImplementation(() => ({ + loadCredentials: jest.fn(), + getCredential: jest.fn().mockReturnValue('mock-value') + })), + secureCredentials: { + loadCredentials: jest.fn(), + getCredential: jest.fn().mockReturnValue('mock-value') + } +})); + +jest.mock('../../../../../src/services/claudeService'); +jest.mock('../../../../../src/services/githubService'); + +const claudeService = require('../../../../../src/services/claudeService'); +const githubService = require('../../../../../src/services/githubService'); + +describe('IssueHandler', () => { + let handler: IssueHandler; + let processor: WebhookProcessor; + + beforeEach(() => { + jest.clearAllMocks(); + handler = new IssueHandler(); + processor = new WebhookProcessor({ + webhookPath: '/test', + secret: 'test-secret' + }); + }); + + describe('handleIssue', () => { + const mockEvent: IssuesEvent = { + action: 'opened', + issue: { + id: 123, + number: 1, + title: 'Test Issue', + body: 'This is a test issue about authentication and API integration', + labels: [], + state: 'open', + user: { + login: 'testuser', + id: 1 + }, + created_at: new Date().toISOString(), + updated_at: new Date().toISOString() + }, + repository: { + id: 456, + name: 'test-repo', + full_name: 'owner/test-repo', + owner: { + login: 'owner', + id: 2 + }, + private: false + }, + sender: { + login: 'testuser', + id: 1 + } + } as any; + + it('should analyze and label new issues', async () => { + githubService.addLabelsToIssue = jest.fn().mockResolvedValue(undefined); + claudeService.analyzeIssueForLabels = jest.fn().mockResolvedValue({ + priority: 'medium', + type: 'feature', + complexity: 'moderate', + component: 'api,auth' + }); + + await handler.handleIssue(mockEvent, processor); + + expect(claudeService.analyzeIssueForLabels).toHaveBeenCalledWith( + 'owner/test-repo', + 1, + 'Test Issue', + 'This is a test issue about authentication and API integration' + ); + + expect(githubService.addLabelsToIssue).toHaveBeenCalledWith('owner/test-repo', 1, [ + 'priority:medium', + 'type:feature', + 'complexity:moderate', + 'component:api', + 'component:auth' + ]); + }); + + it('should handle errors gracefully', async () => { + claudeService.analyzeIssueForLabels = jest + .fn() + .mockRejectedValue(new Error('Analysis failed')); + + await expect(handler.handleIssue(mockEvent, processor)).resolves.not.toThrow(); + }); + + it('should skip non-opened events', async () => { + const editEvent = { ...mockEvent, action: 'edited' } as IssuesEvent; + + await handler.handleIssue(editEvent, processor); + + expect(claudeService.analyzeIssueForLabels).not.toHaveBeenCalled(); + expect(githubService.addLabelsToIssue).not.toHaveBeenCalled(); + }); + + it('should handle empty label analysis', async () => { + claudeService.analyzeIssueForLabels = jest.fn().mockResolvedValue({}); + githubService.addLabelsToIssue = jest.fn(); + + await handler.handleIssue(mockEvent, processor); + + expect(githubService.addLabelsToIssue).toHaveBeenCalledWith('owner/test-repo', 1, []); + }); + }); +});