@hanna84/mcp-writing 3.17.0 → 3.17.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/CHANGELOG.md CHANGED
@@ -4,9 +4,23 @@ All notable changes to this project will be documented in this file. Dates are d
4
4
 
5
5
  Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
6
6
 
7
+ #### [v3.17.2](https://github.com/hannasdev/mcp-writing/compare/v3.17.1...v3.17.2)
8
+
9
+ - docs: complete Docker deployment readiness [`#216`](https://github.com/hannasdev/mcp-writing/pull/216)
10
+
11
+ #### [v3.17.1](https://github.com/hannasdev/mcp-writing/compare/v3.17.0...v3.17.1)
12
+
13
+ > 23 May 2026
14
+
15
+ - docs: add database backup recovery initiative [`#215`](https://github.com/hannasdev/mcp-writing/pull/215)
16
+ - Release 3.17.1 [`a0fa16c`](https://github.com/hannasdev/mcp-writing/commit/a0fa16cac37add24dc1fbcaecd3c4301e9ee2873)
17
+
7
18
  #### [v3.17.0](https://github.com/hannasdev/mcp-writing/compare/v3.16.0...v3.17.0)
8
19
 
20
+ > 23 May 2026
21
+
9
22
  - feat: support runnable Docker workflow [`#213`](https://github.com/hannasdev/mcp-writing/pull/213)
23
+ - Release 3.17.0 [`136c384`](https://github.com/hannasdev/mcp-writing/commit/136c3841b58d92a8f265cf3e53d1d9ca4a160b3b)
10
24
 
11
25
  #### [v3.16.0](https://github.com/hannasdev/mcp-writing/compare/v3.15.1...v3.16.0)
12
26
 
package/README.md CHANGED
@@ -28,8 +28,9 @@ Instead of feeding an entire manuscript to an AI and hoping it fits in the conte
28
28
 
29
29
  **Current status:**
30
30
  - **Core platform complete:** Metadata-first analysis, sidecar-backed metadata maintenance, AI-assisted prose editing with confirmation + git history, review bundles, and Scrivener Direct extraction are all implemented.
31
- - **Recently completed:** Filesystem Boundary Hardening centralized local file mutation through application-aware helpers and lint guardrails.
32
- - **Active development:** Docker, CI, and Deployment Workflow is making Docker a supported way to build, run, smoke-test, and deploy Writing MCP.
31
+ - **Recently completed:** Docker, CI, and Deployment Workflow made Docker a supported way to build, run, smoke-test, and deploy Writing MCP.
32
+ - **Previous milestone:** Filesystem Boundary Hardening centralized local file mutation through application-aware helpers and lint guardrails.
33
+ - **Active development:** No active initiative is currently selected.
33
34
  - **Deferred backlog:** OpenClaw integration, client-agnostic setup, chapter-structure follow-up, and embeddings search.
34
35
  - **Ideas and open questions:** tracked separately so future exploration does not distort the active roadmap.
35
36
 
@@ -45,7 +46,7 @@ Instead of feeding an entire manuscript to an AI and hoping it fits in the conte
45
46
  |---|---|
46
47
  | [docs/guides/setup.md](docs/guides/setup.md) | Prerequisites, first-time setup, Scrivener import, native sync format |
47
48
  | [mcp-writing-vscode](https://github.com/hannasdev/mcp-writing-vscode) | VS Code extension for client-native setup flows |
48
- | [docs/guides/docker.md](docs/guides/docker.md) | Docker Compose, OpenClaw integration, SSH hardening |
49
+ | [docs/guides/docker.md](docs/guides/docker.md) | Docker Compose, deployment operations, MCP gateway notes |
49
50
  | [docs/foundations/managed-structure-contract.md](docs/foundations/managed-structure-contract.md) | Design boundaries for structural mutation, generated views, import, and maintenance workflows |
50
51
  | [docs/agents/tools.md](docs/agents/tools.md) | Full tool reference — auto-generated from source |
51
52
  | [docs/agents/README.md](docs/agents/README.md) | Index of agent-focused guidance, examples, and boot files |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hanna84/mcp-writing",
3
- "version": "3.17.0",
3
+ "version": "3.17.2",
4
4
  "description": "MCP service for AI-assisted reasoning and editing on long-form fiction projects",
5
5
  "homepage": "https://hannasdev.github.io/mcp-writing/",
6
6
  "type": "module",
@@ -73,9 +73,10 @@
73
73
  "release": "release-it",
74
74
  "lint": "eslint *.js eslint-rules src/index.js src/core src/review-bundles src/runtime src/setup src/scripts src/structure src/styleguide src/sync src/tools src/workflows src/world",
75
75
  "guard:legacy-root-imports": "node src/scripts/check-legacy-root-imports.mjs",
76
+ "guard:docker-docs": "node src/scripts/check-docker-docs.mjs",
76
77
  "docs": "node src/scripts/generate-tool-docs.mjs",
77
78
  "check:docs": "npm run docs && git diff --exit-code -- docs/agents/tools.md",
78
- "check:static": "npm run lint && npm run guard:legacy-root-imports && npm run check:docs",
79
+ "check:static": "npm run lint && npm run guard:legacy-root-imports && npm run guard:docker-docs && npm run check:docs",
79
80
  "check:pr": "npm run check:static && npm test",
80
81
  "lint:metadata": "node src/scripts/lint-metadata.mjs",
81
82
  "sync:server-json-version": "node src/scripts/sync-server-json-version.mjs",
@@ -0,0 +1,77 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
6
+
7
+ const dockerfile = fs.readFileSync(path.join(ROOT, "Dockerfile"), "utf8");
8
+ const compose = fs.readFileSync(path.join(ROOT, "docker-compose.example.yml"), "utf8");
9
+ const guide = fs.readFileSync(path.join(ROOT, "docs", "guides", "docker.md"), "utf8");
10
+
11
+ const requiredDocSnippets = [
12
+ "`WRITING_SYNC_DIR`",
13
+ "`DB_PATH`",
14
+ "`HTTP_PORT`",
15
+ "`MCP_TRANSPORT`",
16
+ "`OWNERSHIP_GUARD_MODE`",
17
+ "`/sync`",
18
+ "`/data`",
19
+ "`/ssh`",
20
+ "Upgrade Checklist",
21
+ "Backup Checklist",
22
+ "Rollback",
23
+ "Supported Deployment Targets",
24
+ "OpenClaw",
25
+ ];
26
+
27
+ const requiredComposeSnippets = [
28
+ "WRITING_SYNC_DIR: /sync",
29
+ "DB_PATH: /data/writing.db",
30
+ "HTTP_PORT: \"3000\"",
31
+ "OWNERSHIP_GUARD_MODE:",
32
+ "MCP_TRANSPORT: http",
33
+ "${WRITING_SYNC_DIR_HOST:-./sync}:/sync",
34
+ "${WRITING_DATA_DIR_HOST:-./data}:/data",
35
+ "WRITING_SSH_DIR_HOST",
36
+ "GIT_SSH_COMMAND",
37
+ ];
38
+
39
+ const requiredDockerfileSnippets = [
40
+ "ENV WRITING_SYNC_DIR=/sync",
41
+ "ENV DB_PATH=/data/writing.db",
42
+ "ENV HTTP_PORT=3000",
43
+ "ENV MCP_TRANSPORT=http",
44
+ "git openssh-client",
45
+ "HEALTHCHECK",
46
+ "/healthz",
47
+ ];
48
+
49
+ const findings = [];
50
+
51
+ function requireSnippet(label, content, snippet) {
52
+ if (!content.includes(snippet)) {
53
+ findings.push(`${label} is missing ${JSON.stringify(snippet)}`);
54
+ }
55
+ }
56
+
57
+ for (const snippet of requiredDocSnippets) {
58
+ requireSnippet("docs/guides/docker.md", guide, snippet);
59
+ }
60
+
61
+ for (const snippet of requiredComposeSnippets) {
62
+ requireSnippet("docker-compose.example.yml", compose, snippet);
63
+ }
64
+
65
+ for (const snippet of requiredDockerfileSnippets) {
66
+ requireSnippet("Dockerfile", dockerfile, snippet);
67
+ }
68
+
69
+ if (findings.length > 0) {
70
+ console.error("Docker docs drift check failed:");
71
+ for (const finding of findings) {
72
+ console.error(`- ${finding}`);
73
+ }
74
+ process.exit(1);
75
+ }
76
+
77
+ console.log("Docker docs drift check passed.");