memory-journal-mcp 6.1.0 → 6.1.2
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 +0 -6
- package/CHANGELOG.md +22 -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/releases/v6.1.2.md +23 -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 -2
- 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
|
@@ -32,8 +32,6 @@ jobs:
|
|
|
32
32
|
steps:
|
|
33
33
|
- name: Checkout repository
|
|
34
34
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
35
|
-
with:
|
|
36
|
-
ref: ${{ github.event.workflow_run.head_sha }}
|
|
37
35
|
|
|
38
36
|
- name: Set up Docker Buildx
|
|
39
37
|
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
|
|
@@ -93,8 +91,6 @@ jobs:
|
|
|
93
91
|
steps:
|
|
94
92
|
- name: Checkout repository
|
|
95
93
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
96
|
-
with:
|
|
97
|
-
ref: ${{ github.event.workflow_run.head_sha }}
|
|
98
94
|
|
|
99
95
|
- name: Set up Docker Buildx
|
|
100
96
|
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
|
|
@@ -175,8 +171,6 @@ jobs:
|
|
|
175
171
|
steps:
|
|
176
172
|
- name: Checkout repository
|
|
177
173
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
178
|
-
with:
|
|
179
|
-
ref: ${{ github.event.workflow_run.head_sha }}
|
|
180
174
|
|
|
181
175
|
- name: Download digests
|
|
182
176
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
package/CHANGELOG.md
CHANGED
|
@@ -5,7 +5,28 @@ 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.2...HEAD)
|
|
9
|
+
|
|
10
|
+
## [6.1.2](https://github.com/neverinfamous/memory-journal-mcp/releases/tag/v6.1.2) - 2026-03-22
|
|
11
|
+
|
|
12
|
+
### Security
|
|
13
|
+
|
|
14
|
+
- **Docker Workflow** — Removed `ref: ${{ github.event.workflow_run.head_sha }}` from `docker-publish.yml` checkout steps; CodeQL does not accept `persist-credentials: false` as mitigation for untrusted-checkout alerts (#145, #146, #161).
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- **Unused Import** — Removed orphaned `jose` import from `entries-auth-branches.test.ts` (#162), cascading from v6.1.1 `err` variable removal.
|
|
19
|
+
|
|
20
|
+
## [6.1.1](https://github.com/neverinfamous/memory-journal-mcp/releases/tag/v6.1.1) - 2026-03-22
|
|
21
|
+
|
|
22
|
+
### Security
|
|
23
|
+
|
|
24
|
+
- **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.
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
|
|
28
|
+
- **Useless Assignment** — Removed dead initial assignment `= 'unknown'` on `status` variable in `github-section.ts` (#148).
|
|
29
|
+
- **Unused Variables** — Removed 12 unused variables, imports, and constants across test files flagged by CodeQL (#149–#160).
|
|
9
30
|
|
|
10
31
|
## [6.1.0](https://github.com/neverinfamous/memory-journal-mcp/releases/tag/v6.1.0) - 2026-03-22
|
|
11
32
|
|
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.2",
|
|
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
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# v6.1.2 — CodeQL Cleanup (Follow-up)
|
|
2
|
+
|
|
3
|
+
Resolves 4 remaining CodeQL alerts from v6.1.1: 3 Docker workflow untrusted-checkout and 1 unused import.
|
|
4
|
+
|
|
5
|
+
## Security
|
|
6
|
+
|
|
7
|
+
- Remove `ref: ${{ github.event.workflow_run.head_sha }}` from `docker-publish.yml` checkout steps — CodeQL does not accept `persist-credentials: false` as mitigation (#145, #146, #161)
|
|
8
|
+
|
|
9
|
+
## Fixed
|
|
10
|
+
|
|
11
|
+
- Remove orphaned `jose` import from `entries-auth-branches.test.ts` (#162), cascading from v6.1.1 `err` variable removal
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
**Compare**: [`v6.1.1...v6.1.2`](https://github.com/neverinfamous/memory-journal-mcp/compare/v6.1.1...v6.1.2)
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install -g memory-journal-mcp@6.1.2
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
docker pull writenotenow/memory-journal-mcp:v6.1.2
|
|
23
|
+
```
|
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.2",
|
|
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.2",
|
|
11
|
+
"version": "6.1.2",
|
|
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') {
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
12
|
-
import * as jose from 'jose'
|
|
13
12
|
import Database from 'better-sqlite3'
|
|
14
13
|
|
|
15
14
|
vi.mock('../../src/utils/logger.js', () => ({
|
|
@@ -129,7 +128,6 @@ describe('TokenValidator — branch coverage', () => {
|
|
|
129
128
|
})
|
|
130
129
|
|
|
131
130
|
it('should handle JWTExpired', async () => {
|
|
132
|
-
const err = new jose.errors.JWTExpired('expired')
|
|
133
131
|
// Access private handleValidationError via validate path
|
|
134
132
|
const result = await validator.validate('invalid.token.here')
|
|
135
133
|
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,
|