memory-journal-mcp 6.1.2 → 6.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -28
- package/dist/{chunk-X4SWFATC.js → chunk-BI4ZNSKA.js} +38 -24
- package/dist/{chunk-HCEWINSB.js → chunk-N6EBIDN7.js} +99 -102
- package/dist/cli.js +2 -2
- package/dist/index.js +2 -2
- package/dist/tools-WPRY5MJ6.js +2 -0
- package/package.json +10 -1
- package/skills/github-commander/SKILL.md +151 -0
- package/skills/github-commander/config/project-config.example.md +125 -0
- package/skills/github-commander/workflows/code-quality-audit.md +80 -0
- package/skills/github-commander/workflows/full-audit.md +134 -0
- package/skills/github-commander/workflows/issue-triage.md +239 -0
- package/skills/github-commander/workflows/milestone-sprint.md +81 -0
- package/skills/github-commander/workflows/perf-audit.md +142 -0
- package/skills/github-commander/workflows/pr-review.md +123 -0
- package/skills/github-commander/workflows/security-audit.md +170 -0
- package/skills/github-commander/workflows/update-deps.md +109 -0
- package/.dockerignore +0 -139
- package/.gitattributes +0 -20
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -95
- package/.github/ISSUE_TEMPLATE/config.yml +0 -11
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -110
- package/.github/ISSUE_TEMPLATE/question.md +0 -78
- package/.github/aw/actions-lock.json +0 -14
- package/.github/copilot-instructions.md +0 -122
- package/.github/dependabot.yml +0 -93
- package/.github/pull_request_template.md +0 -135
- package/.github/workflows/README.md +0 -133
- package/.github/workflows/agentics-maintenance.yml +0 -141
- package/.github/workflows/auto-release.yml +0 -68
- package/.github/workflows/ci-health-monitor.lock.yml +0 -1121
- package/.github/workflows/ci-health-monitor.md +0 -87
- package/.github/workflows/codeql.yml +0 -41
- package/.github/workflows/dependabot-auto-merge.yml +0 -42
- package/.github/workflows/dependency-maintenance.lock.yml +0 -1182
- package/.github/workflows/dependency-maintenance.md +0 -147
- package/.github/workflows/docker-publish.yml +0 -254
- package/.github/workflows/docs-drift-detector.lock.yml +0 -1142
- package/.github/workflows/docs-drift-detector.md +0 -115
- package/.github/workflows/lint-and-test.yml +0 -60
- package/.github/workflows/publish-npm.yml +0 -85
- package/.github/workflows/secrets-scanning.yml +0 -32
- package/.github/workflows/security-update.yml +0 -127
- package/.gitleaks.toml +0 -9
- package/.prettierignore +0 -21
- package/.prettierrc +0 -33
- package/.scout-ignore +0 -12
- package/.trivyignore +0 -21
- package/CHANGELOG.md +0 -1814
- package/CODE_OF_CONDUCT.md +0 -133
- package/CONTRIBUTING.md +0 -263
- package/DOCKER_README.md +0 -331
- package/Dockerfile +0 -128
- package/SECURITY.md +0 -227
- package/UNRELEASED.md +0 -1
- package/dist/tools-T4U5A3X4.js +0 -2
- package/docker-compose.yml +0 -71
- package/docs/README.md +0 -18
- package/docs/agentic-journal-synergy.md +0 -175
- package/docs/copilot-setup.md +0 -72
- package/eslint.config.js +0 -110
- package/mcp-config-example.json +0 -21
- package/playwright.config.ts +0 -35
- package/releases/v2.1.0.md +0 -220
- package/releases/v2.2.0.md +0 -168
- package/releases/v3.0.0.md +0 -237
- package/releases/v3.1.0.md +0 -104
- package/releases/v3.1.1.md +0 -42
- package/releases/v3.1.2.md +0 -40
- package/releases/v3.1.3.md +0 -64
- package/releases/v3.1.4.md +0 -32
- package/releases/v3.1.5.md +0 -44
- package/releases/v4.0.0.md +0 -71
- package/releases/v4.1.0.md +0 -88
- package/releases/v4.2.0.md +0 -90
- package/releases/v4.3.0.md +0 -92
- package/releases/v4.3.1.md +0 -69
- package/releases/v4.4.0.md +0 -120
- package/releases/v4.4.1.md +0 -33
- package/releases/v4.4.2.md +0 -31
- package/releases/v4.5.0.md +0 -116
- package/releases/v5.0.0.md +0 -105
- package/releases/v5.0.1.md +0 -25
- package/releases/v5.1.0.md +0 -83
- package/releases/v5.1.1.md +0 -10
- package/releases/v6.0.0.md +0 -48
- package/releases/v6.0.1.md +0 -36
- package/releases/v6.1.0.md +0 -68
- package/releases/v6.1.1.md +0 -30
- package/releases/v6.1.2.md +0 -23
- package/scripts/generate-server-instructions.ts +0 -306
- package/scripts/server-instructions-function-body.ts +0 -107
- package/scripts/server-instructions-gotchas.ts +0 -45
- package/server.json +0 -42
- package/social-preview.png +0 -0
- package/src/auth/auth-context.ts +0 -78
- package/src/auth/authorization-server-discovery.ts +0 -263
- package/src/auth/errors.ts +0 -215
- package/src/auth/index.ts +0 -58
- package/src/auth/middleware.ts +0 -392
- package/src/auth/oauth-resource-server.ts +0 -170
- package/src/auth/scope-map.ts +0 -46
- package/src/auth/scopes.ts +0 -256
- package/src/auth/token-validator.ts +0 -293
- package/src/auth/transport-agnostic.ts +0 -164
- package/src/auth/types.ts +0 -372
- package/src/cli.ts +0 -279
- package/src/codemode/api-constants.ts +0 -263
- package/src/codemode/api.ts +0 -302
- package/src/codemode/auto-return.ts +0 -65
- package/src/codemode/index.ts +0 -47
- package/src/codemode/sandbox-factory.ts +0 -144
- package/src/codemode/sandbox.ts +0 -220
- package/src/codemode/security.ts +0 -155
- package/src/codemode/types.ts +0 -228
- package/src/codemode/worker-sandbox.ts +0 -277
- package/src/codemode/worker-script.ts +0 -239
- package/src/constants/icons.ts +0 -183
- package/src/constants/server-instructions.md +0 -166
- package/src/constants/server-instructions.ts +0 -514
- package/src/database/adapter-factory.ts +0 -16
- package/src/database/core/entry-columns.ts +0 -10
- package/src/database/core/interfaces.ts +0 -188
- package/src/database/core/schema.ts +0 -152
- package/src/database/sqlite-adapter/backup.ts +0 -167
- package/src/database/sqlite-adapter/entries/crud.ts +0 -233
- package/src/database/sqlite-adapter/entries/importance.ts +0 -76
- package/src/database/sqlite-adapter/entries/index.ts +0 -142
- package/src/database/sqlite-adapter/entries/search.ts +0 -294
- package/src/database/sqlite-adapter/entries/shared.ts +0 -102
- package/src/database/sqlite-adapter/entries/statistics.ts +0 -162
- package/src/database/sqlite-adapter/index.ts +0 -265
- package/src/database/sqlite-adapter/native-connection.ts +0 -301
- package/src/database/sqlite-adapter/relationships.ts +0 -70
- package/src/database/sqlite-adapter/tags.ts +0 -182
- package/src/filtering/tool-filter.ts +0 -312
- package/src/github/github-integration/client.ts +0 -114
- package/src/github/github-integration/index.ts +0 -297
- package/src/github/github-integration/insights.ts +0 -155
- package/src/github/github-integration/issues.ts +0 -213
- package/src/github/github-integration/milestones.ts +0 -262
- package/src/github/github-integration/projects.ts +0 -414
- package/src/github/github-integration/pull-requests.ts +0 -235
- package/src/github/github-integration/repository.ts +0 -110
- package/src/github/github-integration/types.ts +0 -43
- package/src/handlers/prompts/github.ts +0 -210
- package/src/handlers/prompts/index.ts +0 -97
- package/src/handlers/prompts/workflow.ts +0 -361
- package/src/handlers/resources/core/briefing/context-section.ts +0 -182
- package/src/handlers/resources/core/briefing/github-section.ts +0 -354
- package/src/handlers/resources/core/briefing/index.ts +0 -106
- package/src/handlers/resources/core/briefing/user-message.ts +0 -114
- package/src/handlers/resources/core/health.ts +0 -75
- package/src/handlers/resources/core/index.ts +0 -31
- package/src/handlers/resources/core/instructions.ts +0 -45
- package/src/handlers/resources/core/utilities.ts +0 -310
- package/src/handlers/resources/github.ts +0 -340
- package/src/handlers/resources/graph.ts +0 -218
- package/src/handlers/resources/help.ts +0 -410
- package/src/handlers/resources/index.ts +0 -143
- package/src/handlers/resources/shared.ts +0 -219
- package/src/handlers/resources/team.ts +0 -134
- package/src/handlers/resources/templates.ts +0 -334
- package/src/handlers/tools/admin.ts +0 -351
- package/src/handlers/tools/analytics.ts +0 -346
- package/src/handlers/tools/backup.ts +0 -272
- package/src/handlers/tools/codemode.ts +0 -188
- package/src/handlers/tools/core.ts +0 -359
- package/src/handlers/tools/error-fields-mixin.ts +0 -10
- package/src/handlers/tools/export.ts +0 -150
- package/src/handlers/tools/github/copilot-tools.ts +0 -72
- package/src/handlers/tools/github/helpers.ts +0 -125
- package/src/handlers/tools/github/insights-tools.ts +0 -112
- package/src/handlers/tools/github/issue-tools.ts +0 -442
- package/src/handlers/tools/github/kanban-tools.ts +0 -153
- package/src/handlers/tools/github/milestone-tools.ts +0 -371
- package/src/handlers/tools/github/mutation-tools.ts +0 -17
- package/src/handlers/tools/github/read-tools.ts +0 -302
- package/src/handlers/tools/github/schemas.ts +0 -435
- package/src/handlers/tools/github.ts +0 -39
- package/src/handlers/tools/index.ts +0 -255
- package/src/handlers/tools/relationships.ts +0 -390
- package/src/handlers/tools/schemas.ts +0 -165
- package/src/handlers/tools/search.ts +0 -448
- package/src/handlers/tools/team/admin-tools.ts +0 -164
- package/src/handlers/tools/team/analytics-tools.ts +0 -233
- package/src/handlers/tools/team/backup-tools.ts +0 -83
- package/src/handlers/tools/team/core-tools.ts +0 -197
- package/src/handlers/tools/team/export-tools.ts +0 -130
- package/src/handlers/tools/team/helpers.ts +0 -66
- package/src/handlers/tools/team/index.ts +0 -45
- package/src/handlers/tools/team/relationship-tools.ts +0 -219
- package/src/handlers/tools/team/schemas.ts +0 -558
- package/src/handlers/tools/team/search-tools.ts +0 -145
- package/src/handlers/tools/team/vector-tools.ts +0 -261
- package/src/index.ts +0 -57
- package/src/server/mcp-server.ts +0 -446
- package/src/server/registration.ts +0 -141
- package/src/server/scheduler.ts +0 -283
- package/src/transports/http/handlers.ts +0 -78
- package/src/transports/http/index.ts +0 -8
- package/src/transports/http/security.ts +0 -147
- package/src/transports/http/server/index.ts +0 -397
- package/src/transports/http/server/legacy-sse.ts +0 -87
- package/src/transports/http/server/stateful.ts +0 -222
- package/src/transports/http/server/stateless.ts +0 -42
- package/src/transports/http/types.ts +0 -132
- package/src/types/entities.ts +0 -145
- package/src/types/error-types.ts +0 -92
- package/src/types/errors.ts +0 -200
- package/src/types/filtering.ts +0 -55
- package/src/types/github.ts +0 -216
- package/src/types/index.ts +0 -348
- package/src/utils/error-helpers.ts +0 -78
- package/src/utils/errors/error-response-fields.ts +0 -29
- package/src/utils/errors/suggestions.ts +0 -94
- package/src/utils/github-helpers.ts +0 -33
- package/src/utils/logger.ts +0 -107
- package/src/utils/mcp-logger.ts +0 -155
- package/src/utils/progress-utils.ts +0 -100
- package/src/utils/query-helpers.ts +0 -78
- package/src/utils/resource-annotations.ts +0 -75
- package/src/utils/security-utils.ts +0 -198
- package/src/utils/vector-index-helpers.ts +0 -24
- package/src/vector/vector-search-manager.ts +0 -409
- package/src/version.ts +0 -15
- package/test-server/README.md +0 -193
- package/test-server/code-map.md +0 -399
- package/test-server/test-agent-experience.md +0 -213
- package/test-server/test-filter-instructions.mjs +0 -295
- package/test-server/test-instruction-levels.mjs +0 -102
- package/test-server/test-preflight.md +0 -55
- package/test-server/test-prompts.mjs +0 -185
- package/test-server/test-scheduler.mjs +0 -174
- package/test-server/test-tool-annotations.mjs +0 -115
- package/test-server/test-tools-codemode.md +0 -632
- package/test-server/test-tools-codemode2.md +0 -1218
- package/test-server/test-tools-team.md +0 -215
- package/test-server/test-tools.md +0 -429
- package/test-server/test-tools2.md +0 -361
- package/test-server/test-tools3.md +0 -396
- package/test-server/tool-reference.md +0 -231
- package/tests/README.md +0 -54
- package/tests/auth/auth-context.test.ts +0 -162
- package/tests/auth/authorization-server-discovery.test.ts +0 -265
- package/tests/auth/errors.test.ts +0 -170
- package/tests/auth/middleware.test.ts +0 -585
- package/tests/auth/oauth-resource-server.test.ts +0 -173
- package/tests/auth/scope-map.test.ts +0 -66
- package/tests/auth/scopes.test.ts +0 -347
- package/tests/auth/token-validator.test.ts +0 -271
- package/tests/codemode/api.test.ts +0 -396
- package/tests/codemode/auto-return.test.ts +0 -167
- package/tests/codemode/codemode-tool-handlers.test.ts +0 -197
- package/tests/codemode/sandbox-factory.test.ts +0 -152
- package/tests/codemode/sandbox.test.ts +0 -190
- package/tests/codemode/security.test.ts +0 -242
- package/tests/codemode/worker-sandbox.test.ts +0 -106
- package/tests/constants/icons.test.ts +0 -101
- package/tests/constants/server-instructions.test.ts +0 -514
- package/tests/database/crud-workflow-branches.test.ts +0 -418
- package/tests/database/database-branches.test.ts +0 -132
- package/tests/database/entries-auth-branches.test.ts +0 -390
- package/tests/database/native-connection.test.ts +0 -249
- package/tests/database/shared-helpers.test.ts +0 -103
- package/tests/database/sqlite-adapter.bench.ts +0 -63
- package/tests/database/sqlite-adapter.test.ts +0 -690
- package/tests/database/tags.test.ts +0 -134
- package/tests/e2e/README.md +0 -39
- package/tests/e2e/auth.spec.ts +0 -106
- package/tests/e2e/codemode-abuse.spec.ts +0 -75
- package/tests/e2e/health.spec.ts +0 -63
- package/tests/e2e/helpers.ts +0 -139
- package/tests/e2e/oauth-discovery.spec.ts +0 -102
- package/tests/e2e/oauth-scopes.spec.ts +0 -222
- package/tests/e2e/payloads-admin.spec.ts +0 -76
- package/tests/e2e/payloads-analytics.spec.ts +0 -37
- package/tests/e2e/payloads-backup-restore.spec.ts +0 -102
- package/tests/e2e/payloads-backup.spec.ts +0 -44
- package/tests/e2e/payloads-codemode-api.spec.ts +0 -131
- package/tests/e2e/payloads-codemode-readonly.spec.ts +0 -116
- package/tests/e2e/payloads-codemode.spec.ts +0 -116
- package/tests/e2e/payloads-core.spec.ts +0 -82
- package/tests/e2e/payloads-error-contracts.spec.ts +0 -159
- package/tests/e2e/payloads-export.spec.ts +0 -46
- package/tests/e2e/payloads-github-degradation.spec.ts +0 -73
- package/tests/e2e/payloads-github.spec.ts +0 -176
- package/tests/e2e/payloads-relationships.spec.ts +0 -56
- package/tests/e2e/payloads-search.spec.ts +0 -64
- package/tests/e2e/payloads-team-happy.spec.ts +0 -231
- package/tests/e2e/payloads-team.spec.ts +0 -174
- package/tests/e2e/prompts-expanded.spec.ts +0 -137
- package/tests/e2e/prompts.spec.ts +0 -62
- package/tests/e2e/protocols.spec.ts +0 -134
- package/tests/e2e/rate-limiting.spec.ts +0 -291
- package/tests/e2e/resources-briefing-env.spec.ts +0 -106
- package/tests/e2e/resources-complete.spec.ts +0 -180
- package/tests/e2e/resources-expanded.spec.ts +0 -83
- package/tests/e2e/resources-instructions-levels.spec.ts +0 -145
- package/tests/e2e/resources-templates.spec.ts +0 -123
- package/tests/e2e/resources.spec.ts +0 -103
- package/tests/e2e/scheduler.spec.ts +0 -79
- package/tests/e2e/security.spec.ts +0 -112
- package/tests/e2e/session-advanced.spec.ts +0 -152
- package/tests/e2e/sessions.spec.ts +0 -95
- package/tests/e2e/stateless.spec.ts +0 -79
- package/tests/e2e/streaming.spec.ts +0 -176
- package/tests/e2e/tool-filtering-presets.spec.ts +0 -192
- package/tests/e2e/tool-filtering.spec.ts +0 -77
- package/tests/e2e/tools.spec.ts +0 -111
- package/tests/filtering/tool-filter.test.ts +0 -314
- package/tests/github/client-issues-errors.test.ts +0 -433
- package/tests/github/github-integration-branches.test.ts +0 -490
- package/tests/github/github-integration.test.ts +0 -1015
- package/tests/github/github-managers-branches.test.ts +0 -907
- package/tests/github/pull-requests.test.ts +0 -334
- package/tests/handlers/analytics-branches.test.ts +0 -222
- package/tests/handlers/backup-branches.test.ts +0 -270
- package/tests/handlers/briefing-context-section.test.ts +0 -388
- package/tests/handlers/briefing-github-section.test.ts +0 -392
- package/tests/handlers/briefing-user-message.test.ts +0 -405
- package/tests/handlers/codemode-tools.test.ts +0 -85
- package/tests/handlers/copilot-tools.test.ts +0 -126
- package/tests/handlers/error-path-coverage.test.ts +0 -324
- package/tests/handlers/export-tools.test.ts +0 -203
- package/tests/handlers/github-resource-handlers.test.ts +0 -929
- package/tests/handlers/github-tool-handlers.test.ts +0 -1452
- package/tests/handlers/handler-error-branches.test.ts +0 -346
- package/tests/handlers/help-resource.test.ts +0 -92
- package/tests/handlers/prompt-handler-coverage.test.ts +0 -108
- package/tests/handlers/prompt-handlers.test.ts +0 -131
- package/tests/handlers/resource-handler-coverage.test.ts +0 -281
- package/tests/handlers/resource-handlers.test.ts +0 -357
- package/tests/handlers/resource-prompt-branches.test.ts +0 -495
- package/tests/handlers/search-tool-handlers.test.ts +0 -379
- package/tests/handlers/targeted-gap-closure.test.ts +0 -387
- package/tests/handlers/team-admin.test.ts +0 -291
- package/tests/handlers/team-analytics.test.ts +0 -220
- package/tests/handlers/team-core.test.ts +0 -148
- package/tests/handlers/team-data.test.ts +0 -198
- package/tests/handlers/team-relationships.test.ts +0 -271
- package/tests/handlers/team-resource-handlers.test.ts +0 -161
- package/tests/handlers/team-search.test.ts +0 -134
- package/tests/handlers/team-tool-handlers.test.ts +0 -301
- package/tests/handlers/team-vector.test.ts +0 -213
- package/tests/handlers/template-github-branches.test.ts +0 -676
- package/tests/handlers/tool-annotations.test.ts +0 -90
- package/tests/handlers/tool-handler-coverage.test.ts +0 -514
- package/tests/handlers/tool-handlers.test.ts +0 -510
- package/tests/handlers/tool-output-schemas.test.ts +0 -116
- package/tests/handlers/vector-tool-handlers.test.ts +0 -238
- package/tests/security/sql-injection.test.ts +0 -284
- package/tests/server/mcp-server.bench.ts +0 -55
- package/tests/server/mcp-server.test.ts +0 -1326
- package/tests/server/scheduler.test.ts +0 -400
- package/tests/transports/http-legacy-sse.test.ts +0 -275
- package/tests/transports/http-security.test.ts +0 -322
- package/tests/transports/http-stateful.test.ts +0 -487
- package/tests/transports/http-transport-server.test.ts +0 -301
- package/tests/transports/http-transport.test.ts +0 -771
- package/tests/utils/github-helpers.test.ts +0 -58
- package/tests/utils/logger.test.ts +0 -180
- package/tests/utils/mcp-logger.test.ts +0 -211
- package/tests/utils/progress-utils.test.ts +0 -156
- package/tests/utils/query-helpers.test.ts +0 -80
- package/tests/utils/security-utils.test.ts +0 -82
- package/tests/vector/vector-search-branches.test.ts +0 -111
- package/tests/vector/vector-search-manager.test.ts +0 -375
- package/tests/vector/vector-search.bench.ts +0 -48
- package/tsconfig.json +0 -42
- package/tsup.config.ts +0 -19
- package/vitest.config.ts +0 -25
|
@@ -1,490 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* memory-journal-mcp — GitHub Integration Branch Coverage Tests
|
|
3
|
-
*
|
|
4
|
-
* Targets uncovered branches in milestones.ts, repository.ts,
|
|
5
|
-
* insights.ts, pull-requests.ts, and projects.ts:
|
|
6
|
-
* error/catch paths, cache hit paths, null guards, ?? operators.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
10
|
-
|
|
11
|
-
vi.mock('../../src/utils/logger.js', () => ({
|
|
12
|
-
logger: { info: vi.fn(), warning: vi.fn(), error: vi.fn(), debug: vi.fn() },
|
|
13
|
-
}))
|
|
14
|
-
|
|
15
|
-
import { MilestonesManager } from '../../src/github/github-integration/milestones.js'
|
|
16
|
-
import { RepositoryManager } from '../../src/github/github-integration/repository.js'
|
|
17
|
-
import { InsightsManager } from '../../src/github/github-integration/insights.js'
|
|
18
|
-
import { PullRequestsManager } from '../../src/github/github-integration/pull-requests.js'
|
|
19
|
-
|
|
20
|
-
// ============================================================================
|
|
21
|
-
// Helpers
|
|
22
|
-
// ============================================================================
|
|
23
|
-
|
|
24
|
-
function createMockClient(overrides: Partial<Record<string, unknown>> = {}) {
|
|
25
|
-
const cache = new Map<string, { data: unknown; timestamp: number }>()
|
|
26
|
-
return {
|
|
27
|
-
octokit: {
|
|
28
|
-
issues: {
|
|
29
|
-
listMilestones: vi.fn(),
|
|
30
|
-
getMilestone: vi.fn(),
|
|
31
|
-
createMilestone: vi.fn(),
|
|
32
|
-
updateMilestone: vi.fn(),
|
|
33
|
-
deleteMilestone: vi.fn(),
|
|
34
|
-
},
|
|
35
|
-
repos: {
|
|
36
|
-
get: vi.fn(),
|
|
37
|
-
getClones: vi.fn(),
|
|
38
|
-
getViews: vi.fn(),
|
|
39
|
-
getTopReferrers: vi.fn(),
|
|
40
|
-
getTopPaths: vi.fn(),
|
|
41
|
-
},
|
|
42
|
-
rest: {
|
|
43
|
-
repos: {
|
|
44
|
-
getClones: vi.fn(),
|
|
45
|
-
getViews: vi.fn(),
|
|
46
|
-
getTopReferrers: vi.fn(),
|
|
47
|
-
getTopPaths: vi.fn(),
|
|
48
|
-
},
|
|
49
|
-
actions: {
|
|
50
|
-
listWorkflowRunsForRepo: vi.fn(),
|
|
51
|
-
},
|
|
52
|
-
pulls: {
|
|
53
|
-
listReviews: vi.fn(),
|
|
54
|
-
listReviewComments: vi.fn(),
|
|
55
|
-
},
|
|
56
|
-
},
|
|
57
|
-
pulls: {
|
|
58
|
-
list: vi.fn(),
|
|
59
|
-
get: vi.fn(),
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
git: {
|
|
63
|
-
branch: vi.fn().mockResolvedValue({ current: 'main' }),
|
|
64
|
-
getRemotes: vi
|
|
65
|
-
.fn()
|
|
66
|
-
.mockResolvedValue([
|
|
67
|
-
{ name: 'origin', refs: { fetch: 'git@github.com:neverinfamous/test.git' } },
|
|
68
|
-
]),
|
|
69
|
-
},
|
|
70
|
-
cachedRepoInfo: null as Record<string, unknown> | null,
|
|
71
|
-
getCached: vi.fn().mockImplementation((key: string) => cache.get(key)?.data),
|
|
72
|
-
getCachedWithTtl: vi.fn().mockImplementation((key: string) => cache.get(key)?.data),
|
|
73
|
-
setCache: vi.fn().mockImplementation((key: string, data: unknown) => {
|
|
74
|
-
cache.set(key, { data, timestamp: Date.now() })
|
|
75
|
-
}),
|
|
76
|
-
invalidateCache: vi.fn(),
|
|
77
|
-
...overrides,
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function makeMilestoneData(overrides: Partial<Record<string, unknown>> = {}) {
|
|
82
|
-
return {
|
|
83
|
-
number: 1,
|
|
84
|
-
title: 'v1.0',
|
|
85
|
-
description: null,
|
|
86
|
-
state: 'open',
|
|
87
|
-
html_url: 'https://github.com/o/r/milestone/1',
|
|
88
|
-
due_on: null,
|
|
89
|
-
open_issues: 5,
|
|
90
|
-
closed_issues: 3,
|
|
91
|
-
created_at: '2025-01-01T00:00:00Z',
|
|
92
|
-
updated_at: '2025-01-02T00:00:00Z',
|
|
93
|
-
creator: null,
|
|
94
|
-
...overrides,
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// ============================================================================
|
|
99
|
-
// Milestones Manager
|
|
100
|
-
// ============================================================================
|
|
101
|
-
|
|
102
|
-
describe('MilestonesManager — branch coverage', () => {
|
|
103
|
-
let client: ReturnType<typeof createMockClient>
|
|
104
|
-
let manager: MilestonesManager
|
|
105
|
-
|
|
106
|
-
beforeEach(() => {
|
|
107
|
-
vi.clearAllMocks()
|
|
108
|
-
client = createMockClient()
|
|
109
|
-
manager = new MilestonesManager(client as never)
|
|
110
|
-
})
|
|
111
|
-
|
|
112
|
-
it('should return empty array when no octokit (getMilestones)', async () => {
|
|
113
|
-
client.octokit = null as never
|
|
114
|
-
const result = await manager.getMilestones('o', 'r')
|
|
115
|
-
expect(result).toEqual([])
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
it('should return cached milestones', async () => {
|
|
119
|
-
const cached = [{ number: 1, title: 'cached' }]
|
|
120
|
-
client.getCached = vi.fn().mockReturnValue(cached)
|
|
121
|
-
const result = await manager.getMilestones('o', 'r')
|
|
122
|
-
expect(result).toBe(cached)
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
it('should handle API error in getMilestones', async () => {
|
|
126
|
-
client.octokit.issues.listMilestones.mockRejectedValue(new Error('API error'))
|
|
127
|
-
const result = await manager.getMilestones('o', 'r')
|
|
128
|
-
expect(result).toEqual([])
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
it('should map milestone with creator', async () => {
|
|
132
|
-
client.octokit.issues.listMilestones.mockResolvedValue({
|
|
133
|
-
data: [
|
|
134
|
-
makeMilestoneData({
|
|
135
|
-
creator: { login: 'user1' },
|
|
136
|
-
description: 'A desc',
|
|
137
|
-
due_on: '2025-06-01',
|
|
138
|
-
}),
|
|
139
|
-
],
|
|
140
|
-
})
|
|
141
|
-
const result = await manager.getMilestones('o', 'r')
|
|
142
|
-
expect(result[0]!.creator).toBe('user1')
|
|
143
|
-
expect(result[0]!.description).toBe('A desc')
|
|
144
|
-
expect(result[0]!.dueOn).toBe('2025-06-01')
|
|
145
|
-
})
|
|
146
|
-
|
|
147
|
-
it('should return null when no octokit (getMilestone)', async () => {
|
|
148
|
-
client.octokit = null as never
|
|
149
|
-
const result = await manager.getMilestone('o', 'r', 1)
|
|
150
|
-
expect(result).toBeNull()
|
|
151
|
-
})
|
|
152
|
-
|
|
153
|
-
it('should return cached milestone', async () => {
|
|
154
|
-
const cached = { number: 1, title: 'cached' }
|
|
155
|
-
client.getCached = vi.fn().mockReturnValue(cached)
|
|
156
|
-
const result = await manager.getMilestone('o', 'r', 1)
|
|
157
|
-
expect(result).toBe(cached)
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
it('should handle API error in getMilestone', async () => {
|
|
161
|
-
client.octokit.issues.getMilestone.mockRejectedValue(new Error('not found'))
|
|
162
|
-
const result = await manager.getMilestone('o', 'r', 99)
|
|
163
|
-
expect(result).toBeNull()
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
it('should handle API error in createMilestone', async () => {
|
|
167
|
-
client.octokit.issues.createMilestone.mockRejectedValue(new Error('create failed'))
|
|
168
|
-
const result = await manager.createMilestone('o', 'r', 'test')
|
|
169
|
-
expect(result).toBeNull()
|
|
170
|
-
})
|
|
171
|
-
|
|
172
|
-
it('should return null when no octokit (createMilestone)', async () => {
|
|
173
|
-
client.octokit = null as never
|
|
174
|
-
const result = await manager.createMilestone('o', 'r', 'test')
|
|
175
|
-
expect(result).toBeNull()
|
|
176
|
-
})
|
|
177
|
-
|
|
178
|
-
it('should handle API error in updateMilestone', async () => {
|
|
179
|
-
client.octokit.issues.updateMilestone.mockRejectedValue(new Error('update failed'))
|
|
180
|
-
const result = await manager.updateMilestone('o', 'r', 1, { title: 'new' })
|
|
181
|
-
expect(result).toBeNull()
|
|
182
|
-
})
|
|
183
|
-
|
|
184
|
-
it('should return null when no octokit (updateMilestone)', async () => {
|
|
185
|
-
client.octokit = null as never
|
|
186
|
-
const result = await manager.updateMilestone('o', 'r', 1, { title: 'x' })
|
|
187
|
-
expect(result).toBeNull()
|
|
188
|
-
})
|
|
189
|
-
|
|
190
|
-
it('should successfully update milestone with dueOn null', async () => {
|
|
191
|
-
client.octokit.issues.updateMilestone.mockResolvedValue({
|
|
192
|
-
data: makeMilestoneData({ state: 'closed' }),
|
|
193
|
-
})
|
|
194
|
-
const result = await manager.updateMilestone('o', 'r', 1, { dueOn: null })
|
|
195
|
-
expect(result).not.toBeNull()
|
|
196
|
-
expect(result!.state).toBe('closed')
|
|
197
|
-
})
|
|
198
|
-
|
|
199
|
-
it('should handle API error in deleteMilestone', async () => {
|
|
200
|
-
client.octokit.issues.deleteMilestone.mockRejectedValue(new Error('delete failed'))
|
|
201
|
-
const result = await manager.deleteMilestone('o', 'r', 1)
|
|
202
|
-
expect(result.success).toBe(false)
|
|
203
|
-
expect(result.error).toBe('delete failed')
|
|
204
|
-
})
|
|
205
|
-
|
|
206
|
-
it('should return success false when no octokit (deleteMilestone)', async () => {
|
|
207
|
-
client.octokit = null as never
|
|
208
|
-
const result = await manager.deleteMilestone('o', 'r', 1)
|
|
209
|
-
expect(result.success).toBe(false)
|
|
210
|
-
})
|
|
211
|
-
})
|
|
212
|
-
|
|
213
|
-
// ============================================================================
|
|
214
|
-
// Repository Manager
|
|
215
|
-
// ============================================================================
|
|
216
|
-
|
|
217
|
-
describe('RepositoryManager — branch coverage', () => {
|
|
218
|
-
let client: ReturnType<typeof createMockClient>
|
|
219
|
-
let manager: RepositoryManager
|
|
220
|
-
|
|
221
|
-
beforeEach(() => {
|
|
222
|
-
vi.clearAllMocks()
|
|
223
|
-
client = createMockClient()
|
|
224
|
-
manager = new RepositoryManager(client as never)
|
|
225
|
-
})
|
|
226
|
-
|
|
227
|
-
it('should parse HTTPS github URLs', async () => {
|
|
228
|
-
client.git.getRemotes.mockResolvedValue([
|
|
229
|
-
{ name: 'origin', refs: { fetch: 'https://github.com/owner/repo.git' } },
|
|
230
|
-
])
|
|
231
|
-
const result = await manager.getRepoInfo()
|
|
232
|
-
expect(result.owner).toBe('owner')
|
|
233
|
-
expect(result.repo).toBe('repo')
|
|
234
|
-
})
|
|
235
|
-
|
|
236
|
-
it('should return nulls when remote URL is not a github URL', async () => {
|
|
237
|
-
client.git.getRemotes.mockResolvedValue([
|
|
238
|
-
{ name: 'origin', refs: { fetch: 'https://gitlab.com/owner/repo.git' } },
|
|
239
|
-
])
|
|
240
|
-
const result = await manager.getRepoInfo()
|
|
241
|
-
expect(result.owner).toBeNull()
|
|
242
|
-
expect(result.repo).toBeNull()
|
|
243
|
-
})
|
|
244
|
-
|
|
245
|
-
it('should return nulls when no remotes', async () => {
|
|
246
|
-
client.git.getRemotes.mockResolvedValue([])
|
|
247
|
-
const result = await manager.getRepoInfo()
|
|
248
|
-
expect(result.owner).toBeNull()
|
|
249
|
-
})
|
|
250
|
-
|
|
251
|
-
it('should handle error in getRepoInfo', async () => {
|
|
252
|
-
client.git.branch.mockRejectedValue(new Error('not a git repo'))
|
|
253
|
-
const result = await manager.getRepoInfo()
|
|
254
|
-
expect(result.owner).toBeNull()
|
|
255
|
-
expect(result.branch).toBeNull()
|
|
256
|
-
})
|
|
257
|
-
|
|
258
|
-
it('should return empty array when no octokit for getWorkflowRuns', async () => {
|
|
259
|
-
client.octokit = null as never
|
|
260
|
-
const result = await manager.getWorkflowRuns('o', 'r')
|
|
261
|
-
expect(result).toEqual([])
|
|
262
|
-
})
|
|
263
|
-
|
|
264
|
-
it('should return cached workflow runs', async () => {
|
|
265
|
-
const cached = [{ id: 1, name: 'CI' }]
|
|
266
|
-
client.getCached = vi.fn().mockReturnValue(cached)
|
|
267
|
-
const result = await manager.getWorkflowRuns('o', 'r')
|
|
268
|
-
expect(result).toBe(cached)
|
|
269
|
-
})
|
|
270
|
-
|
|
271
|
-
it('should handle API error in getWorkflowRuns', async () => {
|
|
272
|
-
client.rest = client.octokit.rest
|
|
273
|
-
client.octokit.rest.actions.listWorkflowRunsForRepo.mockRejectedValue(new Error('fail'))
|
|
274
|
-
const result = await manager.getWorkflowRuns('o', 'r')
|
|
275
|
-
expect(result).toEqual([])
|
|
276
|
-
})
|
|
277
|
-
|
|
278
|
-
it('should map workflow run with null name', async () => {
|
|
279
|
-
client.octokit.rest.actions.listWorkflowRunsForRepo.mockResolvedValue({
|
|
280
|
-
data: {
|
|
281
|
-
workflow_runs: [
|
|
282
|
-
{
|
|
283
|
-
id: 1,
|
|
284
|
-
name: null,
|
|
285
|
-
status: 'completed',
|
|
286
|
-
conclusion: 'success',
|
|
287
|
-
html_url: 'https://github.com/o/r/actions/runs/1',
|
|
288
|
-
head_branch: null,
|
|
289
|
-
head_sha: 'abc123',
|
|
290
|
-
created_at: '2025-01-01T00:00:00Z',
|
|
291
|
-
updated_at: '2025-01-01T00:00:00Z',
|
|
292
|
-
},
|
|
293
|
-
],
|
|
294
|
-
},
|
|
295
|
-
})
|
|
296
|
-
const result = await manager.getWorkflowRuns('o', 'r')
|
|
297
|
-
expect(result[0]!.name).toBe('Unknown Workflow')
|
|
298
|
-
expect(result[0]!.headBranch).toBe('')
|
|
299
|
-
})
|
|
300
|
-
|
|
301
|
-
it('should return cached repo info', () => {
|
|
302
|
-
const info = { owner: 'o', repo: 'r', branch: 'main', remoteUrl: null }
|
|
303
|
-
client.cachedRepoInfo = info
|
|
304
|
-
const result = manager.getCachedRepoInfo()
|
|
305
|
-
expect(result).toBe(info)
|
|
306
|
-
})
|
|
307
|
-
})
|
|
308
|
-
|
|
309
|
-
// ============================================================================
|
|
310
|
-
// Insights Manager
|
|
311
|
-
// ============================================================================
|
|
312
|
-
|
|
313
|
-
describe('InsightsManager — branch coverage', () => {
|
|
314
|
-
let client: ReturnType<typeof createMockClient>
|
|
315
|
-
let manager: InsightsManager
|
|
316
|
-
|
|
317
|
-
beforeEach(() => {
|
|
318
|
-
vi.clearAllMocks()
|
|
319
|
-
client = createMockClient()
|
|
320
|
-
manager = new InsightsManager(client as never)
|
|
321
|
-
})
|
|
322
|
-
|
|
323
|
-
it('should return null when no octokit (getRepoStats)', async () => {
|
|
324
|
-
client.octokit = null as never
|
|
325
|
-
const result = await manager.getRepoStats('o', 'r')
|
|
326
|
-
expect(result).toBeNull()
|
|
327
|
-
})
|
|
328
|
-
|
|
329
|
-
it('should return cached repo stats', async () => {
|
|
330
|
-
const cached = { stars: 100 }
|
|
331
|
-
client.getCachedWithTtl = vi.fn().mockReturnValue(cached)
|
|
332
|
-
const result = await manager.getRepoStats('o', 'r')
|
|
333
|
-
expect(result).toBe(cached)
|
|
334
|
-
})
|
|
335
|
-
|
|
336
|
-
it('should handle API error in getRepoStats', async () => {
|
|
337
|
-
client.octokit.repos.get.mockRejectedValue(new Error('fail'))
|
|
338
|
-
const result = await manager.getRepoStats('o', 'r')
|
|
339
|
-
expect(result).toBeNull()
|
|
340
|
-
})
|
|
341
|
-
|
|
342
|
-
it('should return null when no octokit (getTrafficData)', async () => {
|
|
343
|
-
client.octokit = null as never
|
|
344
|
-
const result = await manager.getTrafficData('o', 'r')
|
|
345
|
-
expect(result).toBeNull()
|
|
346
|
-
})
|
|
347
|
-
|
|
348
|
-
it('should return cached traffic data', async () => {
|
|
349
|
-
const cached = { clones: { total: 10 } }
|
|
350
|
-
client.getCachedWithTtl = vi.fn().mockReturnValue(cached)
|
|
351
|
-
const result = await manager.getTrafficData('o', 'r')
|
|
352
|
-
expect(result).toBe(cached)
|
|
353
|
-
})
|
|
354
|
-
|
|
355
|
-
it('should handle API error in getTrafficData', async () => {
|
|
356
|
-
client.octokit.rest.repos.getClones.mockRejectedValue(new Error('403'))
|
|
357
|
-
const result = await manager.getTrafficData('o', 'r')
|
|
358
|
-
expect(result).toBeNull()
|
|
359
|
-
})
|
|
360
|
-
|
|
361
|
-
it('should compute zero dailyAvg when no clone/view days', async () => {
|
|
362
|
-
client.octokit.rest.repos.getClones.mockResolvedValue({
|
|
363
|
-
data: { count: 10, uniques: 5, clones: [] },
|
|
364
|
-
})
|
|
365
|
-
client.octokit.rest.repos.getViews.mockResolvedValue({
|
|
366
|
-
data: { count: 20, uniques: 15, views: [] },
|
|
367
|
-
})
|
|
368
|
-
const result = await manager.getTrafficData('o', 'r')
|
|
369
|
-
expect(result!.clones.dailyAvg).toBe(0)
|
|
370
|
-
expect(result!.views.dailyAvg).toBe(0)
|
|
371
|
-
})
|
|
372
|
-
|
|
373
|
-
it('should handle null clones array', async () => {
|
|
374
|
-
client.octokit.rest.repos.getClones.mockResolvedValue({
|
|
375
|
-
data: { count: 5, uniques: 3, clones: null },
|
|
376
|
-
})
|
|
377
|
-
client.octokit.rest.repos.getViews.mockResolvedValue({
|
|
378
|
-
data: { count: 10, uniques: 7, views: null },
|
|
379
|
-
})
|
|
380
|
-
const result = await manager.getTrafficData('o', 'r')
|
|
381
|
-
expect(result!.clones.dailyAvg).toBe(0)
|
|
382
|
-
expect(result!.views.dailyAvg).toBe(0)
|
|
383
|
-
})
|
|
384
|
-
|
|
385
|
-
it('should return empty array when no octokit (getTopReferrers)', async () => {
|
|
386
|
-
client.octokit = null as never
|
|
387
|
-
const result = await manager.getTopReferrers('o', 'r')
|
|
388
|
-
expect(result).toEqual([])
|
|
389
|
-
})
|
|
390
|
-
|
|
391
|
-
it('should return cached referrers', async () => {
|
|
392
|
-
const cached = [{ referrer: 'google.com', count: 10, uniques: 5 }]
|
|
393
|
-
client.getCachedWithTtl = vi.fn().mockReturnValue(cached)
|
|
394
|
-
const result = await manager.getTopReferrers('o', 'r')
|
|
395
|
-
expect(result).toEqual(cached)
|
|
396
|
-
})
|
|
397
|
-
|
|
398
|
-
it('should handle API error in getTopReferrers', async () => {
|
|
399
|
-
client.octokit.rest.repos.getTopReferrers.mockRejectedValue(new Error('fail'))
|
|
400
|
-
const result = await manager.getTopReferrers('o', 'r')
|
|
401
|
-
expect(result).toEqual([])
|
|
402
|
-
})
|
|
403
|
-
|
|
404
|
-
it('should return empty array when no octokit (getPopularPaths)', async () => {
|
|
405
|
-
client.octokit = null as never
|
|
406
|
-
const result = await manager.getPopularPaths('o', 'r')
|
|
407
|
-
expect(result).toEqual([])
|
|
408
|
-
})
|
|
409
|
-
|
|
410
|
-
it('should return cached popular paths', async () => {
|
|
411
|
-
const cached = [{ path: '/readme', count: 10 }]
|
|
412
|
-
client.getCachedWithTtl = vi.fn().mockReturnValue(cached)
|
|
413
|
-
const result = await manager.getPopularPaths('o', 'r')
|
|
414
|
-
expect(result).toEqual(cached)
|
|
415
|
-
})
|
|
416
|
-
|
|
417
|
-
it('should handle API error in getPopularPaths', async () => {
|
|
418
|
-
client.octokit.rest.repos.getTopPaths.mockRejectedValue(new Error('fail'))
|
|
419
|
-
const result = await manager.getPopularPaths('o', 'r')
|
|
420
|
-
expect(result).toEqual([])
|
|
421
|
-
})
|
|
422
|
-
})
|
|
423
|
-
|
|
424
|
-
// ============================================================================
|
|
425
|
-
// Pull Requests Manager
|
|
426
|
-
// ============================================================================
|
|
427
|
-
|
|
428
|
-
describe('PullRequestsManager — branch coverage', () => {
|
|
429
|
-
let client: ReturnType<typeof createMockClient>
|
|
430
|
-
let manager: PullRequestsManager
|
|
431
|
-
|
|
432
|
-
beforeEach(() => {
|
|
433
|
-
vi.clearAllMocks()
|
|
434
|
-
client = createMockClient()
|
|
435
|
-
manager = new PullRequestsManager(client as never)
|
|
436
|
-
})
|
|
437
|
-
|
|
438
|
-
it('should return empty array when no octokit (getReviews)', async () => {
|
|
439
|
-
client.octokit = null as never
|
|
440
|
-
const result = await manager.getReviews('o', 'r', 1)
|
|
441
|
-
expect(result).toEqual([])
|
|
442
|
-
})
|
|
443
|
-
|
|
444
|
-
it('should return cached reviews', async () => {
|
|
445
|
-
const cached = [{ id: 1, state: 'APPROVED' }]
|
|
446
|
-
client.getCached = vi.fn().mockReturnValue(cached)
|
|
447
|
-
const result = await manager.getReviews('o', 'r', 1)
|
|
448
|
-
expect(result).toBe(cached)
|
|
449
|
-
})
|
|
450
|
-
|
|
451
|
-
it('should return empty array when no octokit (getReviewComments)', async () => {
|
|
452
|
-
client.octokit = null as never
|
|
453
|
-
const result = await manager.getReviewComments('o', 'r', 1)
|
|
454
|
-
expect(result).toEqual([])
|
|
455
|
-
})
|
|
456
|
-
|
|
457
|
-
it('should return cached review comments', async () => {
|
|
458
|
-
const cached = [{ id: 1, body: 'fix this' }]
|
|
459
|
-
client.getCached = vi.fn().mockReturnValue(cached)
|
|
460
|
-
const result = await manager.getReviewComments('o', 'r', 1)
|
|
461
|
-
expect(result).toBe(cached)
|
|
462
|
-
})
|
|
463
|
-
|
|
464
|
-
it('should handle API error in getReviewComments', async () => {
|
|
465
|
-
client.octokit.rest.pulls.listReviewComments.mockRejectedValue(new Error('fail'))
|
|
466
|
-
const result = await manager.getReviewComments('o', 'r', 1)
|
|
467
|
-
expect(result).toEqual([])
|
|
468
|
-
})
|
|
469
|
-
|
|
470
|
-
it('should handle review comment with null line and side', async () => {
|
|
471
|
-
client.octokit.rest.pulls.listReviewComments.mockResolvedValue({
|
|
472
|
-
data: [
|
|
473
|
-
{
|
|
474
|
-
id: 1,
|
|
475
|
-
user: { login: 'copilot[bot]' },
|
|
476
|
-
body: 'test',
|
|
477
|
-
path: 'src/foo.ts',
|
|
478
|
-
line: null,
|
|
479
|
-
original_line: null,
|
|
480
|
-
side: null,
|
|
481
|
-
created_at: '2025-01-01T00:00:00Z',
|
|
482
|
-
},
|
|
483
|
-
],
|
|
484
|
-
})
|
|
485
|
-
const result = await manager.getReviewComments('o', 'r', 1)
|
|
486
|
-
expect(result[0]!.line).toBeNull()
|
|
487
|
-
expect(result[0]!.side).toBe('RIGHT')
|
|
488
|
-
expect(result[0]!.isCopilot).toBe(true)
|
|
489
|
-
})
|
|
490
|
-
})
|