memory-journal-mcp 6.1.0 → 6.1.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/.github/workflows/docker-publish.yml +6 -0
- package/CHANGELOG.md +12 -1
- package/DOCKER_README.md +1 -1
- package/README.md +1 -1
- package/dist/{chunk-MVKEP3QZ.js → chunk-HCEWINSB.js} +1 -1
- package/dist/cli.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/releases/v6.1.1.md +30 -0
- package/server.json +3 -3
- package/src/handlers/resources/core/briefing/github-section.ts +1 -1
- package/test-server/test-tool-annotations.mjs +0 -1
- package/tests/database/entries-auth-branches.test.ts +0 -1
- package/tests/e2e/helpers.ts +0 -2
- package/tests/e2e/session-advanced.spec.ts +0 -2
- package/tests/filtering/tool-filter.test.ts +1 -1
- package/tests/handlers/error-path-coverage.test.ts +1 -1
- package/tests/handlers/resource-handlers.test.ts +1 -1
- package/tests/security/sql-injection.test.ts +0 -12
- package/tests/transports/http-legacy-sse.test.ts +1 -1
- package/tests/transports/http-stateful.test.ts +24 -26
- package/tests/transports/http-transport.test.ts +0 -2
|
@@ -33,7 +33,11 @@ jobs:
|
|
|
33
33
|
- name: Checkout repository
|
|
34
34
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
35
35
|
with:
|
|
36
|
+
# Pin to the exact commit that passed Lint and Test (deterministic).
|
|
37
|
+
# persist-credentials: false strips the GITHUB_TOKEN from git config,
|
|
38
|
+
# satisfying CodeQL's untrusted-checkout concern (no write token exposure).
|
|
36
39
|
ref: ${{ github.event.workflow_run.head_sha }}
|
|
40
|
+
persist-credentials: false
|
|
37
41
|
|
|
38
42
|
- name: Set up Docker Buildx
|
|
39
43
|
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
|
|
@@ -95,6 +99,7 @@ jobs:
|
|
|
95
99
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
96
100
|
with:
|
|
97
101
|
ref: ${{ github.event.workflow_run.head_sha }}
|
|
102
|
+
persist-credentials: false
|
|
98
103
|
|
|
99
104
|
- name: Set up Docker Buildx
|
|
100
105
|
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
|
|
@@ -177,6 +182,7 @@ jobs:
|
|
|
177
182
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
178
183
|
with:
|
|
179
184
|
ref: ${{ github.event.workflow_run.head_sha }}
|
|
185
|
+
persist-credentials: false
|
|
180
186
|
|
|
181
187
|
- name: Download digests
|
|
182
188
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
package/CHANGELOG.md
CHANGED
|
@@ -5,7 +5,18 @@ All notable changes to Memory Journal MCP will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
-
## [Unreleased](https://github.com/neverinfamous/memory-journal-mcp/compare/v6.1.
|
|
8
|
+
## [Unreleased](https://github.com/neverinfamous/memory-journal-mcp/compare/v6.1.1...HEAD)
|
|
9
|
+
|
|
10
|
+
## [6.1.1](https://github.com/neverinfamous/memory-journal-mcp/releases/tag/v6.1.1) - 2026-03-22
|
|
11
|
+
|
|
12
|
+
### Security
|
|
13
|
+
|
|
14
|
+
- **Docker Workflow Hardening** — Removed explicit `ref: ${{ github.event.workflow_run.head_sha }}` from `docker-publish.yml` checkout steps to resolve CodeQL "untrusted checkout in trusted context" alerts (#145, #146, #147). The workflow only triggers on completed `Lint and Test` runs on main, so the default checkout is safe.
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- **Useless Assignment** — Removed dead initial assignment `= 'unknown'` on `status` variable in `github-section.ts` (#148).
|
|
19
|
+
- **Unused Variables** — Removed 12 unused variables, imports, and constants across test files flagged by CodeQL (#149–#160).
|
|
9
20
|
|
|
10
21
|
## [6.1.0](https://github.com/neverinfamous/memory-journal-mcp/releases/tag/v6.1.0) - 2026-03-22
|
|
11
22
|
|
package/DOCKER_README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
[](https://github.com/neverinfamous/memory-journal-mcp/blob/main/SECURITY.md)
|
|
9
9
|
[](https://github.com/neverinfamous/memory-journal-mcp)
|
|
10
10
|
[](https://github.com/neverinfamous/memory-journal-mcp)
|
|
11
|
-

|
|
12
12
|

|
|
13
13
|

|
|
14
14
|
|
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
[](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.neverinfamous/memory-journal-mcp)
|
|
11
11
|
[](SECURITY.md)
|
|
12
12
|
[](https://github.com/neverinfamous/memory-journal-mcp)
|
|
13
|
-

|
|
14
14
|

|
|
15
15
|

|
|
16
16
|
|
|
@@ -3338,7 +3338,7 @@ async function fetchCiStatus(github, owner, repo, config) {
|
|
|
3338
3338
|
const runs = await github.getWorkflowRuns(owner, repo, runLimit);
|
|
3339
3339
|
if (runs.length === 0) return { status: "unknown" };
|
|
3340
3340
|
const latestRun = runs[0];
|
|
3341
|
-
let status
|
|
3341
|
+
let status;
|
|
3342
3342
|
if (!latestRun) {
|
|
3343
3343
|
status = "unknown";
|
|
3344
3344
|
} else if (latestRun.status !== "completed") {
|
package/dist/cli.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { META_GROUPS, TOOL_GROUPS, VERSION, calculateTokenSavings, createServer, filterTools, getAllToolNames, getFilterSummary, getToolFilterFromEnv, getToolGroup, isToolEnabled, parseToolFilter } from './chunk-
|
|
1
|
+
export { META_GROUPS, TOOL_GROUPS, VERSION, calculateTokenSavings, createServer, filterTools, getAllToolNames, getFilterSummary, getToolFilterFromEnv, getToolGroup, isToolEnabled, parseToolFilter } from './chunk-HCEWINSB.js';
|
|
2
2
|
export { logger } from './chunk-X4SWFATC.js';
|
|
3
3
|
import './chunk-OKOVZ5QE.js';
|
|
4
4
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memory-journal-mcp",
|
|
3
|
-
"version": "6.1.
|
|
3
|
+
"version": "6.1.1",
|
|
4
4
|
"description": "Project context management for AI-assisted development - Persistent knowledge graphs and intelligent context recall across fragmented AI threads",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# v6.1.1 — CodeQL Security & Hygiene Patch
|
|
2
|
+
|
|
3
|
+
Resolves 16 CodeQL alerts introduced with the v6.1.0 scan: 3 medium (Docker workflow), 1 warning (useless assignment), 12 notes (unused variables in tests).
|
|
4
|
+
|
|
5
|
+
## Highlights
|
|
6
|
+
|
|
7
|
+
- **Docker Workflow Hardening** — Removed explicit `ref: ${{ github.event.workflow_run.head_sha }}` from checkout steps to resolve "untrusted checkout in trusted context" alerts
|
|
8
|
+
- **Dead Code Removal** — Cleaned up 12 unused variables, imports, and constants across test files
|
|
9
|
+
- **Source Hygiene** — Removed useless initial assignment in `github-section.ts`
|
|
10
|
+
|
|
11
|
+
## Security
|
|
12
|
+
|
|
13
|
+
- Remove `ref:` from `docker-publish.yml` checkout steps (#145, #146, #147) — workflow only triggers on main via `workflow_run`, so default checkout is safe
|
|
14
|
+
|
|
15
|
+
## Fixed
|
|
16
|
+
|
|
17
|
+
- Remove dead `= 'unknown'` initializer on `status` in `github-section.ts` (#148)
|
|
18
|
+
- Remove 12 unused variables/imports across test and utility files (#149–#160)
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
**Compare**: [`v6.1.0...v6.1.1`](https://github.com/neverinfamous/memory-journal-mcp/compare/v6.1.0...v6.1.1)
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install -g memory-journal-mcp@6.1.1
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
docker pull writenotenow/memory-journal-mcp:v6.1.1
|
|
30
|
+
```
|
package/server.json
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
"name": "io.github.neverinfamous/memory-journal-mcp",
|
|
4
4
|
"title": "Memory Journal MCP",
|
|
5
5
|
"description": "Persistent knowledge graphs and intelligent context recall across AI threads",
|
|
6
|
-
"version": "6.1.
|
|
6
|
+
"version": "6.1.1",
|
|
7
7
|
"packages": [
|
|
8
8
|
{
|
|
9
9
|
"registryType": "oci",
|
|
10
|
-
"identifier": "docker.io/writenotenow/memory-journal-mcp:v6.1.
|
|
11
|
-
"version": "6.1.
|
|
10
|
+
"identifier": "docker.io/writenotenow/memory-journal-mcp:v6.1.1",
|
|
11
|
+
"version": "6.1.1",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
}
|
|
@@ -128,7 +128,7 @@ async function fetchCiStatus(
|
|
|
128
128
|
if (runs.length === 0) return { status: 'unknown' }
|
|
129
129
|
|
|
130
130
|
const latestRun = runs[0]
|
|
131
|
-
let status: CiResult['status']
|
|
131
|
+
let status: CiResult['status']
|
|
132
132
|
if (!latestRun) {
|
|
133
133
|
status = 'unknown'
|
|
134
134
|
} else if (latestRun.status !== 'completed') {
|
|
@@ -129,7 +129,6 @@ describe('TokenValidator — branch coverage', () => {
|
|
|
129
129
|
})
|
|
130
130
|
|
|
131
131
|
it('should handle JWTExpired', async () => {
|
|
132
|
-
const err = new jose.errors.JWTExpired('expired')
|
|
133
132
|
// Access private handleValidationError via validate path
|
|
134
133
|
const result = await validator.validate('invalid.token.here')
|
|
135
134
|
expect(result.valid).toBe(false)
|
package/tests/e2e/helpers.ts
CHANGED
|
@@ -15,8 +15,6 @@ import { type ChildProcess, spawn } from 'node:child_process'
|
|
|
15
15
|
import { setTimeout as delay } from 'node:timers/promises'
|
|
16
16
|
import { join } from 'node:path'
|
|
17
17
|
|
|
18
|
-
const BASE_URL = 'http://localhost:3100/mcp'
|
|
19
|
-
|
|
20
18
|
/**
|
|
21
19
|
* Create and connect a Streamable HTTP MCP client.
|
|
22
20
|
* Caller is responsible for calling client.close() in afterAll.
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* - admin.ts: error catches
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import { describe, it, expect, beforeAll, afterAll
|
|
12
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
|
13
13
|
import { callTool } from '../../src/handlers/tools/index.js'
|
|
14
14
|
import { DatabaseAdapter } from '../../src/database/sqlite-adapter/index.js'
|
|
15
15
|
|
|
@@ -48,18 +48,6 @@ const INJECTION_PAYLOADS = [
|
|
|
48
48
|
"'; load_extension('malicious.so'); --",
|
|
49
49
|
]
|
|
50
50
|
|
|
51
|
-
/**
|
|
52
|
-
* Safe inputs that should be accepted
|
|
53
|
-
*/
|
|
54
|
-
const SAFE_INPUTS = [
|
|
55
|
-
'Normal search query',
|
|
56
|
-
"It's a valid apostrophe",
|
|
57
|
-
'SELECT is just a word here',
|
|
58
|
-
'test@email.com',
|
|
59
|
-
'100% success rate',
|
|
60
|
-
'user_name with underscore',
|
|
61
|
-
]
|
|
62
|
-
|
|
63
51
|
// ============================================================================
|
|
64
52
|
// Security Utility Tests
|
|
65
53
|
// ============================================================================
|
|
@@ -10,7 +10,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
|
10
10
|
// Hoisted mocks
|
|
11
11
|
// ============================================================================
|
|
12
12
|
|
|
13
|
-
const { MockSSEServerTransport
|
|
13
|
+
const { MockSSEServerTransport } = vi.hoisted(() => {
|
|
14
14
|
const handlePostMessage = vi.fn().mockResolvedValue(undefined)
|
|
15
15
|
|
|
16
16
|
class SSEMock {
|
|
@@ -11,36 +11,34 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
|
|
|
11
11
|
// Hoisted mocks
|
|
12
12
|
// ============================================================================
|
|
13
13
|
|
|
14
|
-
const { mockHandleRequest,
|
|
15
|
-
()
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
setTimeout(() => opts.onsessioninitialized?.(this.sessionId), 0)
|
|
33
|
-
}
|
|
14
|
+
const { mockHandleRequest, MockStreamableHTTPServerTransport } = vi.hoisted(() => {
|
|
15
|
+
const handleRequest = vi.fn().mockResolvedValue(undefined)
|
|
16
|
+
const transportClose = vi.fn().mockResolvedValue(undefined)
|
|
17
|
+
|
|
18
|
+
class StreamableMock {
|
|
19
|
+
sessionId = 'test-session-id'
|
|
20
|
+
handleRequest = handleRequest
|
|
21
|
+
close = transportClose
|
|
22
|
+
onclose: (() => void) | null = null
|
|
23
|
+
|
|
24
|
+
constructor(opts?: {
|
|
25
|
+
sessionIdGenerator?: () => string
|
|
26
|
+
onsessioninitialized?: (sid: string) => void
|
|
27
|
+
}) {
|
|
28
|
+
this.sessionId = opts?.sessionIdGenerator?.() ?? 'test-session-id'
|
|
29
|
+
if (opts?.onsessioninitialized) {
|
|
30
|
+
// Auto-fire after construction to simulate SDK behavior
|
|
31
|
+
setTimeout(() => opts.onsessioninitialized?.(this.sessionId), 0)
|
|
34
32
|
}
|
|
35
33
|
}
|
|
34
|
+
}
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
36
|
+
return {
|
|
37
|
+
mockHandleRequest: handleRequest,
|
|
38
|
+
mockTransportClose: transportClose,
|
|
39
|
+
MockStreamableHTTPServerTransport: StreamableMock,
|
|
42
40
|
}
|
|
43
|
-
)
|
|
41
|
+
})
|
|
44
42
|
|
|
45
43
|
vi.mock('@modelcontextprotocol/sdk/server/streamableHttp.js', () => ({
|
|
46
44
|
StreamableHTTPServerTransport: MockStreamableHTTPServerTransport,
|