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.
@@ -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.0...HEAD)
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
  [![Security](https://img.shields.io/badge/Security-Enhanced-green.svg)](https://github.com/neverinfamous/memory-journal-mcp/blob/main/SECURITY.md)
9
9
  [![GitHub Stars](https://img.shields.io/github/stars/neverinfamous/memory-journal-mcp?style=social)](https://github.com/neverinfamous/memory-journal-mcp)
10
10
  [![TypeScript](https://img.shields.io/badge/TypeScript-Strict-blue.svg)](https://github.com/neverinfamous/memory-journal-mcp)
11
- ![Coverage](https://img.shields.io/badge/Coverage-96.21%25-brightgreen.svg)
11
+ ![Coverage](https://img.shields.io/badge/Coverage-96.1%25-brightgreen.svg)
12
12
  ![Tests](https://img.shields.io/badge/Tests-1679_passed-brightgreen.svg)
13
13
  ![E2E Tests](https://img.shields.io/badge/E2E_Tests-247_passed-brightgreen.svg)
14
14
 
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  [![MCP Registry](https://img.shields.io/badge/MCP_Registry-Published-green)](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.neverinfamous/memory-journal-mcp)
11
11
  [![Security](https://img.shields.io/badge/Security-Enhanced-green.svg)](SECURITY.md)
12
12
  [![TypeScript](https://img.shields.io/badge/TypeScript-Strict-blue.svg)](https://github.com/neverinfamous/memory-journal-mcp)
13
- ![Coverage](https://img.shields.io/badge/Coverage-96.21%25-brightgreen.svg)
13
+ ![Coverage](https://img.shields.io/badge/Coverage-96.1%25-brightgreen.svg)
14
14
  ![Tests](https://img.shields.io/badge/Tests-1679_passed-brightgreen.svg)
15
15
  ![E2E Tests](https://img.shields.io/badge/E2E_Tests-247_passed-brightgreen.svg)
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 = "unknown";
3341
+ let status;
3342
3342
  if (!latestRun) {
3343
3343
  status = "unknown";
3344
3344
  } else if (latestRun.status !== "completed") {
package/dist/cli.js CHANGED
@@ -1,4 +1,4 @@
1
- import { VERSION, createServer } from './chunk-MVKEP3QZ.js';
1
+ import { VERSION, createServer } from './chunk-HCEWINSB.js';
2
2
  import { logger } from './chunk-X4SWFATC.js';
3
3
  import './chunk-OKOVZ5QE.js';
4
4
  import { Command } from 'commander';
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-MVKEP3QZ.js';
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.0",
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.0",
6
+ "version": "6.1.2",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "oci",
10
- "identifier": "docker.io/writenotenow/memory-journal-mcp:v6.1.0",
11
- "version": "6.1.0",
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'] = 'unknown'
131
+ let status: CiResult['status']
132
132
  if (!latestRun) {
133
133
  status = 'unknown'
134
134
  } else if (latestRun.status !== 'completed') {
@@ -1,5 +1,4 @@
1
1
  import { spawn } from 'child_process'
2
- import { join } from 'path'
3
2
 
4
3
  const projectDir = 'C:\\Users\\chris\\Desktop\\memory-journal-mcp'
5
4
  const proc = spawn('node', ['dist/cli.js', '--instruction-level', 'essential'], {
@@ -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)
@@ -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.
@@ -19,8 +19,6 @@ test.describe('Advanced Session Management', () => {
19
19
  { capabilities: {} }
20
20
  )
21
21
 
22
- let sseSessionId: string | undefined
23
-
24
22
  try {
25
23
  await sseClient.connect(sseTransport)
26
24
 
@@ -4,7 +4,7 @@
4
4
  * Tests the tool filtering system: groups, meta-groups, parsing, filtering.
5
5
  */
6
6
 
7
- import { describe, it, expect, vi, afterEach } from 'vitest'
7
+ import { describe, it, expect, afterEach } from 'vitest'
8
8
  import {
9
9
  TOOL_GROUPS,
10
10
  META_GROUPS,
@@ -9,7 +9,7 @@
9
9
  * - admin.ts: error catches
10
10
  */
11
11
 
12
- import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest'
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
 
@@ -28,7 +28,7 @@ describe('Resource Handlers', () => {
28
28
  projectNumber: 42,
29
29
  issueNumber: 7,
30
30
  })
31
- const e3 = db.createEntry({
31
+ db.createEntry({
32
32
  content: 'Resource test entry gamma',
33
33
  prNumber: 15,
34
34
  })
@@ -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, mockHandlePostMessage } = vi.hoisted(() => {
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, mockTransportClose, MockStreamableHTTPServerTransport } = vi.hoisted(
15
- () => {
16
- const handleRequest = vi.fn().mockResolvedValue(undefined)
17
- const transportClose = vi.fn().mockResolvedValue(undefined)
18
-
19
- class StreamableMock {
20
- sessionId = 'test-session-id'
21
- handleRequest = handleRequest
22
- close = transportClose
23
- onclose: (() => void) | null = null
24
-
25
- constructor(opts?: {
26
- sessionIdGenerator?: () => string
27
- onsessioninitialized?: (sid: string) => void
28
- }) {
29
- this.sessionId = opts?.sessionIdGenerator?.() ?? 'test-session-id'
30
- if (opts?.onsessioninitialized) {
31
- // Auto-fire after construction to simulate SDK behavior
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
- return {
38
- mockHandleRequest: handleRequest,
39
- mockTransportClose: transportClose,
40
- MockStreamableHTTPServerTransport: StreamableMock,
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,
@@ -13,8 +13,6 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'
13
13
  // ============================================================================
14
14
 
15
15
  const {
16
- mockHandleRequest,
17
- mockTransportClose,
18
16
  mockRoutes,
19
17
  mockMiddlewares,
20
18
  mockApp,