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,235 +0,0 @@
|
|
|
1
|
-
import { logger } from '../../utils/logger.js'
|
|
2
|
-
import type { GitHubClient } from './client.js'
|
|
3
|
-
import type {
|
|
4
|
-
GitHubPullRequest,
|
|
5
|
-
GitHubReview,
|
|
6
|
-
GitHubReviewComment,
|
|
7
|
-
CopilotReviewSummary,
|
|
8
|
-
} from '../../types/index.js'
|
|
9
|
-
import type { PullRequestDetails } from './types.js'
|
|
10
|
-
|
|
11
|
-
export class PullRequestsManager {
|
|
12
|
-
/** Known Copilot bot login patterns */
|
|
13
|
-
private static readonly COPILOT_BOT_PATTERNS = [
|
|
14
|
-
'copilot-pull-request-reviewer[bot]',
|
|
15
|
-
'github-copilot[bot]',
|
|
16
|
-
'copilot[bot]',
|
|
17
|
-
]
|
|
18
|
-
|
|
19
|
-
constructor(private client: GitHubClient) {}
|
|
20
|
-
|
|
21
|
-
async getPullRequests(
|
|
22
|
-
owner: string,
|
|
23
|
-
repo: string,
|
|
24
|
-
state: 'open' | 'closed' | 'all' = 'open',
|
|
25
|
-
limit = 20
|
|
26
|
-
): Promise<GitHubPullRequest[]> {
|
|
27
|
-
if (!this.client.octokit) {
|
|
28
|
-
return []
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const cacheKey = `prs:${owner}:${repo}:${state}:${String(limit)}`
|
|
32
|
-
const cached = this.client.getCached(cacheKey) as GitHubPullRequest[] | undefined
|
|
33
|
-
if (cached) return cached
|
|
34
|
-
|
|
35
|
-
try {
|
|
36
|
-
const response = await this.client.octokit.pulls.list({
|
|
37
|
-
owner,
|
|
38
|
-
repo,
|
|
39
|
-
state,
|
|
40
|
-
per_page: limit,
|
|
41
|
-
sort: 'updated',
|
|
42
|
-
direction: 'desc',
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
const result = response.data.map((pr) => ({
|
|
46
|
-
number: pr.number,
|
|
47
|
-
title: pr.title,
|
|
48
|
-
url: pr.html_url,
|
|
49
|
-
state: pr.merged_at
|
|
50
|
-
? ('MERGED' as const)
|
|
51
|
-
: pr.state === 'open'
|
|
52
|
-
? ('OPEN' as const)
|
|
53
|
-
: ('CLOSED' as const),
|
|
54
|
-
}))
|
|
55
|
-
|
|
56
|
-
this.client.setCache(cacheKey, result)
|
|
57
|
-
return result
|
|
58
|
-
} catch (error) {
|
|
59
|
-
logger.error('Failed to get pull requests', {
|
|
60
|
-
module: 'GitHub',
|
|
61
|
-
error: error instanceof Error ? error.message : String(error),
|
|
62
|
-
})
|
|
63
|
-
return []
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async getPullRequest(
|
|
68
|
-
owner: string,
|
|
69
|
-
repo: string,
|
|
70
|
-
prNumber: number
|
|
71
|
-
): Promise<PullRequestDetails | null> {
|
|
72
|
-
if (!this.client.octokit) {
|
|
73
|
-
return null
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const cacheKey = `pr:${owner}:${repo}:${String(prNumber)}`
|
|
77
|
-
const cached = this.client.getCached(cacheKey) as PullRequestDetails | null | undefined
|
|
78
|
-
if (cached !== undefined) return cached
|
|
79
|
-
|
|
80
|
-
try {
|
|
81
|
-
const response = await this.client.octokit.pulls.get({
|
|
82
|
-
owner,
|
|
83
|
-
repo,
|
|
84
|
-
pull_number: prNumber,
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
const pr = response.data
|
|
88
|
-
|
|
89
|
-
const details: PullRequestDetails = {
|
|
90
|
-
number: pr.number,
|
|
91
|
-
title: pr.title,
|
|
92
|
-
url: pr.html_url,
|
|
93
|
-
state: pr.merged_at ? 'MERGED' : pr.state === 'open' ? 'OPEN' : 'CLOSED',
|
|
94
|
-
body: pr.body,
|
|
95
|
-
draft: pr.draft ?? false,
|
|
96
|
-
headBranch: pr.head.ref,
|
|
97
|
-
baseBranch: pr.base.ref,
|
|
98
|
-
author: pr.user?.login ?? 'unknown',
|
|
99
|
-
createdAt: pr.created_at,
|
|
100
|
-
updatedAt: pr.updated_at,
|
|
101
|
-
mergedAt: pr.merged_at,
|
|
102
|
-
closedAt: pr.closed_at,
|
|
103
|
-
additions: pr.additions,
|
|
104
|
-
deletions: pr.deletions,
|
|
105
|
-
changedFiles: pr.changed_files,
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
this.client.setCache(cacheKey, details)
|
|
109
|
-
return details
|
|
110
|
-
} catch (error) {
|
|
111
|
-
logger.error('Failed to get PR details', {
|
|
112
|
-
module: 'GitHub',
|
|
113
|
-
entityId: prNumber,
|
|
114
|
-
error: error instanceof Error ? error.message : String(error),
|
|
115
|
-
})
|
|
116
|
-
return null
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
private static isCopilotAuthor(login: string): boolean {
|
|
121
|
-
const lower = login.toLowerCase()
|
|
122
|
-
return PullRequestsManager.COPILOT_BOT_PATTERNS.some(
|
|
123
|
-
(p) => lower === p || lower.includes('copilot')
|
|
124
|
-
)
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
async getReviews(owner: string, repo: string, prNumber: number): Promise<GitHubReview[]> {
|
|
128
|
-
if (!this.client.octokit) return []
|
|
129
|
-
|
|
130
|
-
const cacheKey = `reviews:${owner}:${repo}:${String(prNumber)}`
|
|
131
|
-
const cached = this.client.getCached(cacheKey) as GitHubReview[] | undefined
|
|
132
|
-
if (cached) return cached
|
|
133
|
-
|
|
134
|
-
try {
|
|
135
|
-
const response = await this.client.octokit.rest.pulls.listReviews({
|
|
136
|
-
owner,
|
|
137
|
-
repo,
|
|
138
|
-
pull_number: prNumber,
|
|
139
|
-
per_page: 100,
|
|
140
|
-
})
|
|
141
|
-
|
|
142
|
-
const reviews: GitHubReview[] = response.data.map((r) => ({
|
|
143
|
-
id: r.id,
|
|
144
|
-
author: r.user?.login ?? 'unknown',
|
|
145
|
-
state: r.state as GitHubReview['state'],
|
|
146
|
-
body: r.body ?? null,
|
|
147
|
-
submittedAt: r.submitted_at ?? r.commit_id ?? new Date().toISOString(),
|
|
148
|
-
isCopilot: PullRequestsManager.isCopilotAuthor(r.user?.login ?? ''),
|
|
149
|
-
}))
|
|
150
|
-
|
|
151
|
-
this.client.setCache(cacheKey, reviews)
|
|
152
|
-
return reviews
|
|
153
|
-
} catch (error) {
|
|
154
|
-
logger.error('Failed to get PR reviews', {
|
|
155
|
-
module: 'GitHub',
|
|
156
|
-
entityId: prNumber,
|
|
157
|
-
error: error instanceof Error ? error.message : String(error),
|
|
158
|
-
})
|
|
159
|
-
return []
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
async getReviewComments(
|
|
164
|
-
owner: string,
|
|
165
|
-
repo: string,
|
|
166
|
-
prNumber: number
|
|
167
|
-
): Promise<GitHubReviewComment[]> {
|
|
168
|
-
if (!this.client.octokit) return []
|
|
169
|
-
|
|
170
|
-
const cacheKey = `review-comments:${owner}:${repo}:${String(prNumber)}`
|
|
171
|
-
const cached = this.client.getCached(cacheKey) as GitHubReviewComment[] | undefined
|
|
172
|
-
if (cached) return cached
|
|
173
|
-
|
|
174
|
-
try {
|
|
175
|
-
const response = await this.client.octokit.rest.pulls.listReviewComments({
|
|
176
|
-
owner,
|
|
177
|
-
repo,
|
|
178
|
-
pull_number: prNumber,
|
|
179
|
-
per_page: 100,
|
|
180
|
-
})
|
|
181
|
-
|
|
182
|
-
const comments: GitHubReviewComment[] = response.data.map((c) => ({
|
|
183
|
-
id: c.id,
|
|
184
|
-
author: c.user?.login ?? 'unknown',
|
|
185
|
-
body: c.body,
|
|
186
|
-
path: c.path,
|
|
187
|
-
line: c.line ?? c.original_line ?? null,
|
|
188
|
-
side: c.side ?? 'RIGHT',
|
|
189
|
-
createdAt: c.created_at,
|
|
190
|
-
isCopilot: PullRequestsManager.isCopilotAuthor(c.user?.login ?? ''),
|
|
191
|
-
}))
|
|
192
|
-
|
|
193
|
-
this.client.setCache(cacheKey, comments)
|
|
194
|
-
return comments
|
|
195
|
-
} catch (error) {
|
|
196
|
-
logger.error('Failed to get review comments', {
|
|
197
|
-
module: 'GitHub',
|
|
198
|
-
entityId: prNumber,
|
|
199
|
-
error: error instanceof Error ? error.message : String(error),
|
|
200
|
-
})
|
|
201
|
-
return []
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
async getCopilotReviewSummary(
|
|
206
|
-
owner: string,
|
|
207
|
-
repo: string,
|
|
208
|
-
prNumber: number
|
|
209
|
-
): Promise<CopilotReviewSummary> {
|
|
210
|
-
const [reviews, comments] = await Promise.all([
|
|
211
|
-
this.getReviews(owner, repo, prNumber),
|
|
212
|
-
this.getReviewComments(owner, repo, prNumber),
|
|
213
|
-
])
|
|
214
|
-
|
|
215
|
-
const copilotReviews = reviews.filter((r) => r.isCopilot)
|
|
216
|
-
const copilotComments = comments.filter((c) => c.isCopilot)
|
|
217
|
-
|
|
218
|
-
let state: CopilotReviewSummary['state'] = 'none'
|
|
219
|
-
if (copilotReviews.length > 0) {
|
|
220
|
-
const latest = copilotReviews[copilotReviews.length - 1]
|
|
221
|
-
if (latest !== undefined) {
|
|
222
|
-
if (latest.state === 'APPROVED') state = 'approved'
|
|
223
|
-
else if (latest.state === 'CHANGES_REQUESTED') state = 'changes_requested'
|
|
224
|
-
else if (latest.state === 'COMMENTED') state = 'commented'
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
return {
|
|
229
|
-
prNumber,
|
|
230
|
-
state,
|
|
231
|
-
commentCount: copilotComments.length,
|
|
232
|
-
comments: copilotComments,
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { logger } from '../../utils/logger.js'
|
|
2
|
-
import type { GitHubClient } from './client.js'
|
|
3
|
-
import type { RepoInfo } from './types.js'
|
|
4
|
-
import type { GitHubWorkflowRun } from '../../types/index.js'
|
|
5
|
-
|
|
6
|
-
export class RepositoryManager {
|
|
7
|
-
constructor(private client: GitHubClient) {}
|
|
8
|
-
|
|
9
|
-
async getRepoInfo(): Promise<RepoInfo> {
|
|
10
|
-
try {
|
|
11
|
-
const branchResult = await this.client.git.branch()
|
|
12
|
-
const branch = branchResult.current || null
|
|
13
|
-
|
|
14
|
-
const remotes = await this.client.git.getRemotes(true)
|
|
15
|
-
const origin = remotes.find((r) => r.name === 'origin')
|
|
16
|
-
const remoteUrl = origin?.refs?.fetch || null
|
|
17
|
-
|
|
18
|
-
const { owner, repo } = this.parseRemoteUrl(remoteUrl)
|
|
19
|
-
|
|
20
|
-
const repoInfo = { owner, repo, branch, remoteUrl }
|
|
21
|
-
this.client.cachedRepoInfo = repoInfo
|
|
22
|
-
return repoInfo
|
|
23
|
-
} catch (error) {
|
|
24
|
-
logger.debug('Failed to get repo info (may not be a git repo)', {
|
|
25
|
-
module: 'GitHub',
|
|
26
|
-
error: error instanceof Error ? error.message : String(error),
|
|
27
|
-
})
|
|
28
|
-
return { owner: null, repo: null, branch: null, remoteUrl: null }
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
getCachedRepoInfo(): RepoInfo | null {
|
|
33
|
-
return this.client.cachedRepoInfo
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
private parseRemoteUrl(remoteUrl: string | null): {
|
|
37
|
-
owner: string | null
|
|
38
|
-
repo: string | null
|
|
39
|
-
} {
|
|
40
|
-
if (!remoteUrl) return { owner: null, repo: null }
|
|
41
|
-
|
|
42
|
-
if (remoteUrl.startsWith('git@github.com:')) {
|
|
43
|
-
const pathPart = remoteUrl.replace('git@github.com:', '').replace('.git', '')
|
|
44
|
-
const parts = pathPart.split('/')
|
|
45
|
-
if (parts.length >= 2) {
|
|
46
|
-
return { owner: parts[0] ?? null, repo: parts[1] ?? null }
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
try {
|
|
51
|
-
const url = new URL(remoteUrl)
|
|
52
|
-
if (url.hostname === 'github.com') {
|
|
53
|
-
const path = url.pathname.replace('.git', '').replace(/^\//, '')
|
|
54
|
-
const parts = path.split('/')
|
|
55
|
-
if (parts.length >= 2) {
|
|
56
|
-
return { owner: parts[0] ?? null, repo: parts[1] ?? null }
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
} catch {
|
|
60
|
-
// Not a valid URL
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return { owner: null, repo: null }
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
async getWorkflowRuns(owner: string, repo: string, limit = 10): Promise<GitHubWorkflowRun[]> {
|
|
67
|
-
if (!this.client.octokit) {
|
|
68
|
-
logger.debug('GitHub API not available - no token', { module: 'GitHub' })
|
|
69
|
-
return []
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const cacheKey = `workflows:${owner}:${repo}:${String(limit)}`
|
|
73
|
-
const cached = this.client.getCached(cacheKey) as GitHubWorkflowRun[] | undefined
|
|
74
|
-
if (cached) return cached
|
|
75
|
-
|
|
76
|
-
try {
|
|
77
|
-
const response = await this.client.octokit.rest.actions.listWorkflowRunsForRepo({
|
|
78
|
-
owner,
|
|
79
|
-
repo,
|
|
80
|
-
per_page: limit,
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
const result = response.data.workflow_runs.map((run) => ({
|
|
84
|
-
id: run.id,
|
|
85
|
-
name: run.name ?? 'Unknown Workflow',
|
|
86
|
-
status: run.status as 'queued' | 'in_progress' | 'completed',
|
|
87
|
-
conclusion: run.conclusion as
|
|
88
|
-
| 'success'
|
|
89
|
-
| 'failure'
|
|
90
|
-
| 'cancelled'
|
|
91
|
-
| 'skipped'
|
|
92
|
-
| null,
|
|
93
|
-
url: run.html_url,
|
|
94
|
-
headBranch: run.head_branch ?? '',
|
|
95
|
-
headSha: run.head_sha,
|
|
96
|
-
createdAt: run.created_at,
|
|
97
|
-
updatedAt: run.updated_at,
|
|
98
|
-
}))
|
|
99
|
-
|
|
100
|
-
this.client.setCache(cacheKey, result)
|
|
101
|
-
return result
|
|
102
|
-
} catch (error) {
|
|
103
|
-
logger.error('Failed to get workflow runs', {
|
|
104
|
-
module: 'GitHub',
|
|
105
|
-
error: error instanceof Error ? error.message : String(error),
|
|
106
|
-
})
|
|
107
|
-
return []
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type { GitHubIssue, GitHubPullRequest } from '../../types/index.js'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Local repository information
|
|
5
|
-
*/
|
|
6
|
-
export interface RepoInfo {
|
|
7
|
-
owner: string | null
|
|
8
|
-
repo: string | null
|
|
9
|
-
branch: string | null
|
|
10
|
-
remoteUrl: string | null
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* GitHub issue details (extended)
|
|
15
|
-
*/
|
|
16
|
-
export interface IssueDetails extends GitHubIssue {
|
|
17
|
-
nodeId: string
|
|
18
|
-
body: string | null
|
|
19
|
-
labels: string[]
|
|
20
|
-
assignees: string[]
|
|
21
|
-
createdAt: string
|
|
22
|
-
updatedAt: string
|
|
23
|
-
closedAt: string | null
|
|
24
|
-
commentsCount: number
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* GitHub PR details (extended)
|
|
29
|
-
*/
|
|
30
|
-
export interface PullRequestDetails extends GitHubPullRequest {
|
|
31
|
-
body: string | null
|
|
32
|
-
draft: boolean
|
|
33
|
-
headBranch: string
|
|
34
|
-
baseBranch: string
|
|
35
|
-
author: string
|
|
36
|
-
createdAt: string
|
|
37
|
-
updatedAt: string
|
|
38
|
-
mergedAt: string | null
|
|
39
|
-
closedAt: string | null
|
|
40
|
-
additions: number
|
|
41
|
-
deletions: number
|
|
42
|
-
changedFiles: number
|
|
43
|
-
}
|
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Journal MCP Server - GitHub Prompt Definitions
|
|
3
|
-
*
|
|
4
|
-
* Prompts: project-status-summary, pr-summary, code-review-prep,
|
|
5
|
-
* pr-retrospective, actions-failure-digest, project-milestone-tracker
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { IDatabaseAdapter } from '../../database/core/interfaces.js'
|
|
9
|
-
import { RAW_ENTRY_COLUMNS as ENTRY_COLUMNS } from '../../database/core/entry-columns.js'
|
|
10
|
-
import { ICON_PROMPT } from '../../constants/icons.js'
|
|
11
|
-
import { execQuery, type InternalPromptDef } from './index.js'
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Get GitHub prompt definitions
|
|
15
|
-
*/
|
|
16
|
-
export function getGitHubPromptDefinitions(): InternalPromptDef[] {
|
|
17
|
-
return [
|
|
18
|
-
{
|
|
19
|
-
name: 'project-status-summary',
|
|
20
|
-
description: 'GitHub Project status reports',
|
|
21
|
-
icons: [ICON_PROMPT],
|
|
22
|
-
arguments: [
|
|
23
|
-
{ name: 'project_number', description: 'GitHub Project number', required: true },
|
|
24
|
-
],
|
|
25
|
-
handler: (args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
26
|
-
const projectNumber = parseInt(args['project_number'] ?? '0', 10)
|
|
27
|
-
const entries = execQuery(
|
|
28
|
-
db,
|
|
29
|
-
`
|
|
30
|
-
SELECT ${ENTRY_COLUMNS} FROM memory_journal
|
|
31
|
-
WHERE project_number = ?
|
|
32
|
-
AND deleted_at IS NULL
|
|
33
|
-
ORDER BY timestamp DESC
|
|
34
|
-
LIMIT 20
|
|
35
|
-
`,
|
|
36
|
-
[projectNumber]
|
|
37
|
-
)
|
|
38
|
-
|
|
39
|
-
return {
|
|
40
|
-
messages: [
|
|
41
|
-
{
|
|
42
|
-
role: 'user',
|
|
43
|
-
content: {
|
|
44
|
-
type: 'text',
|
|
45
|
-
text: `Generate a status summary for Project #${String(projectNumber)}:\n\nEntries: ${JSON.stringify(entries, null, 2)}\n\nProvide: overview, recent activity, blockers, next steps.`,
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
],
|
|
49
|
-
}
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
name: 'pr-summary',
|
|
54
|
-
description: 'Pull request journal activity summary',
|
|
55
|
-
icons: [ICON_PROMPT],
|
|
56
|
-
arguments: [{ name: 'pr_number', description: 'Pull request number', required: true }],
|
|
57
|
-
handler: (args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
58
|
-
const prNumber = parseInt(args['pr_number'] ?? '0', 10)
|
|
59
|
-
const entries = execQuery(
|
|
60
|
-
db,
|
|
61
|
-
`
|
|
62
|
-
SELECT ${ENTRY_COLUMNS} FROM memory_journal
|
|
63
|
-
WHERE pr_number = ?
|
|
64
|
-
AND deleted_at IS NULL
|
|
65
|
-
ORDER BY timestamp ASC
|
|
66
|
-
`,
|
|
67
|
-
[prNumber]
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
return {
|
|
71
|
-
messages: [
|
|
72
|
-
{
|
|
73
|
-
role: 'user',
|
|
74
|
-
content: {
|
|
75
|
-
type: 'text',
|
|
76
|
-
text: `Summarize PR #${String(prNumber)} activity:\n\nJournal entries: ${JSON.stringify(entries, null, 2)}\n\nProvide: summary of changes, decisions made, testing done.`,
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
],
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
name: 'code-review-prep',
|
|
85
|
-
description: 'Comprehensive PR review preparation',
|
|
86
|
-
icons: [ICON_PROMPT],
|
|
87
|
-
arguments: [{ name: 'pr_number', description: 'Pull request number', required: true }],
|
|
88
|
-
handler: (args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
89
|
-
const prNumber = parseInt(args['pr_number'] ?? '0', 10)
|
|
90
|
-
const entries = execQuery(
|
|
91
|
-
db,
|
|
92
|
-
`
|
|
93
|
-
SELECT ${ENTRY_COLUMNS} FROM memory_journal
|
|
94
|
-
WHERE pr_number = ?
|
|
95
|
-
AND deleted_at IS NULL
|
|
96
|
-
ORDER BY timestamp ASC
|
|
97
|
-
`,
|
|
98
|
-
[prNumber]
|
|
99
|
-
)
|
|
100
|
-
|
|
101
|
-
return {
|
|
102
|
-
messages: [
|
|
103
|
-
{
|
|
104
|
-
role: 'user',
|
|
105
|
-
content: {
|
|
106
|
-
type: 'text',
|
|
107
|
-
text: `Prepare for code review of PR #${String(prNumber)}:\n\nContext entries: ${JSON.stringify(entries, null, 2)}\n\nProvide: review checklist, areas of concern, testing recommendations.`,
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
],
|
|
111
|
-
}
|
|
112
|
-
},
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
name: 'pr-retrospective',
|
|
116
|
-
description: 'Completed PR analysis with learnings',
|
|
117
|
-
icons: [ICON_PROMPT],
|
|
118
|
-
arguments: [{ name: 'pr_number', description: 'Pull request number', required: true }],
|
|
119
|
-
handler: (args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
120
|
-
const prNumber = parseInt(args['pr_number'] ?? '0', 10)
|
|
121
|
-
const entries = execQuery(
|
|
122
|
-
db,
|
|
123
|
-
`
|
|
124
|
-
SELECT ${ENTRY_COLUMNS} FROM memory_journal
|
|
125
|
-
WHERE pr_number = ?
|
|
126
|
-
AND deleted_at IS NULL
|
|
127
|
-
ORDER BY timestamp ASC
|
|
128
|
-
`,
|
|
129
|
-
[prNumber]
|
|
130
|
-
)
|
|
131
|
-
|
|
132
|
-
return {
|
|
133
|
-
messages: [
|
|
134
|
-
{
|
|
135
|
-
role: 'user',
|
|
136
|
-
content: {
|
|
137
|
-
type: 'text',
|
|
138
|
-
text: `Retrospective for PR #${String(prNumber)}:\n\nJournal entries: ${JSON.stringify(entries, null, 2)}\n\nProvide: what went well, challenges, lessons learned.`,
|
|
139
|
-
},
|
|
140
|
-
},
|
|
141
|
-
],
|
|
142
|
-
}
|
|
143
|
-
},
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
name: 'actions-failure-digest',
|
|
147
|
-
description: 'CI/CD failure analysis with root cause identification',
|
|
148
|
-
icons: [ICON_PROMPT],
|
|
149
|
-
arguments: [],
|
|
150
|
-
handler: (_args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
151
|
-
const entries = execQuery(
|
|
152
|
-
db,
|
|
153
|
-
`
|
|
154
|
-
SELECT ${ENTRY_COLUMNS} FROM memory_journal
|
|
155
|
-
WHERE workflow_run_id IS NOT NULL
|
|
156
|
-
AND deleted_at IS NULL
|
|
157
|
-
ORDER BY timestamp DESC
|
|
158
|
-
LIMIT 20
|
|
159
|
-
`
|
|
160
|
-
)
|
|
161
|
-
|
|
162
|
-
return {
|
|
163
|
-
messages: [
|
|
164
|
-
{
|
|
165
|
-
role: 'user',
|
|
166
|
-
content: {
|
|
167
|
-
type: 'text',
|
|
168
|
-
text: `Analyze CI/CD failures from these workflow entries:\n\n${JSON.stringify(entries, null, 2)}\n\nProvide: failure patterns, root causes, remediation steps.`,
|
|
169
|
-
},
|
|
170
|
-
},
|
|
171
|
-
],
|
|
172
|
-
}
|
|
173
|
-
},
|
|
174
|
-
},
|
|
175
|
-
{
|
|
176
|
-
name: 'project-milestone-tracker',
|
|
177
|
-
description: 'Milestone progress tracking',
|
|
178
|
-
icons: [ICON_PROMPT],
|
|
179
|
-
arguments: [
|
|
180
|
-
{ name: 'project_number', description: 'GitHub Project number', required: true },
|
|
181
|
-
],
|
|
182
|
-
handler: (args: Record<string, string>, db: IDatabaseAdapter) => {
|
|
183
|
-
const projectNumber = parseInt(args['project_number'] ?? '0', 10)
|
|
184
|
-
const entries = execQuery(
|
|
185
|
-
db,
|
|
186
|
-
`
|
|
187
|
-
SELECT ${ENTRY_COLUMNS} FROM memory_journal
|
|
188
|
-
WHERE project_number = ?
|
|
189
|
-
AND significance_type IS NOT NULL
|
|
190
|
-
AND deleted_at IS NULL
|
|
191
|
-
ORDER BY timestamp DESC
|
|
192
|
-
`,
|
|
193
|
-
[projectNumber]
|
|
194
|
-
)
|
|
195
|
-
|
|
196
|
-
return {
|
|
197
|
-
messages: [
|
|
198
|
-
{
|
|
199
|
-
role: 'user',
|
|
200
|
-
content: {
|
|
201
|
-
type: 'text',
|
|
202
|
-
text: `Track milestones for Project #${String(projectNumber)}:\n\nMilestone entries: ${JSON.stringify(entries, null, 2)}\n\nProvide: progress summary, upcoming milestones, timeline.`,
|
|
203
|
-
},
|
|
204
|
-
},
|
|
205
|
-
],
|
|
206
|
-
}
|
|
207
|
-
},
|
|
208
|
-
},
|
|
209
|
-
]
|
|
210
|
-
}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Journal MCP Server - Prompt Handlers
|
|
3
|
-
*
|
|
4
|
-
* Barrel file composing prompt definitions from sub-modules.
|
|
5
|
-
* Exports all MCP prompts for workflow guidance.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { IDatabaseAdapter } from '../../database/core/interfaces.js'
|
|
9
|
-
import type { McpIcon } from '../../types/index.js'
|
|
10
|
-
import { getWorkflowPromptDefinitions } from './workflow.js'
|
|
11
|
-
import { getGitHubPromptDefinitions } from './github.js'
|
|
12
|
-
import { ResourceNotFoundError } from '../../types/errors.js'
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Message format for MCP prompts
|
|
16
|
-
*/
|
|
17
|
-
export interface PromptMessage {
|
|
18
|
-
role: string
|
|
19
|
-
content: {
|
|
20
|
-
type: string
|
|
21
|
-
text: string
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Internal prompt definition with db handler
|
|
27
|
-
*/
|
|
28
|
-
export interface InternalPromptDef {
|
|
29
|
-
name: string
|
|
30
|
-
description: string
|
|
31
|
-
arguments?: {
|
|
32
|
-
name: string
|
|
33
|
-
description: string
|
|
34
|
-
required?: boolean
|
|
35
|
-
}[]
|
|
36
|
-
icons?: McpIcon[]
|
|
37
|
-
handler: (args: Record<string, string>, db: IDatabaseAdapter) => { messages: PromptMessage[] }
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Execute a raw SQL query on the database
|
|
42
|
-
*/
|
|
43
|
-
export function execQuery(
|
|
44
|
-
db: IDatabaseAdapter,
|
|
45
|
-
sql: string,
|
|
46
|
-
params: unknown[] = []
|
|
47
|
-
): Record<string, unknown>[] {
|
|
48
|
-
const result = db.executeRawQuery(sql, params)
|
|
49
|
-
if (result.length === 0) return []
|
|
50
|
-
|
|
51
|
-
const columns = result[0]?.columns ?? []
|
|
52
|
-
return (result[0]?.values ?? []).map((values: unknown[]) => {
|
|
53
|
-
const obj: Record<string, unknown> = {}
|
|
54
|
-
columns.forEach((col: string, i: number) => {
|
|
55
|
-
obj[col] = values[i]
|
|
56
|
-
})
|
|
57
|
-
return obj
|
|
58
|
-
})
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Get all prompt definitions for MCP list
|
|
63
|
-
*/
|
|
64
|
-
export function getPrompts(): object[] {
|
|
65
|
-
const prompts = getAllPromptDefinitions()
|
|
66
|
-
return prompts.map((p) => ({
|
|
67
|
-
name: p.name,
|
|
68
|
-
description: p.description,
|
|
69
|
-
arguments: p.arguments,
|
|
70
|
-
icons: p.icons,
|
|
71
|
-
}))
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Get a prompt by name
|
|
76
|
-
*/
|
|
77
|
-
export function getPrompt(
|
|
78
|
-
name: string,
|
|
79
|
-
args: Record<string, string>,
|
|
80
|
-
db: IDatabaseAdapter
|
|
81
|
-
): { messages: PromptMessage[] } {
|
|
82
|
-
const prompts = getAllPromptDefinitions()
|
|
83
|
-
const prompt = prompts.find((p) => p.name === name)
|
|
84
|
-
|
|
85
|
-
if (!prompt) {
|
|
86
|
-
throw new ResourceNotFoundError('Prompt', name)
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return prompt.handler(args, db)
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Get all prompt definitions by composing sub-module definitions
|
|
94
|
-
*/
|
|
95
|
-
function getAllPromptDefinitions(): InternalPromptDef[] {
|
|
96
|
-
return [...getWorkflowPromptDefinitions(), ...getGitHubPromptDefinitions()]
|
|
97
|
-
}
|