openwriter 0.6.7 → 0.6.9

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.
@@ -10,8 +10,8 @@
10
10
  <link rel="preconnect" href="https://fonts.googleapis.com" />
11
11
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
12
12
  <link href="https://fonts.googleapis.com/css2?family=Charter:ital,wght@0,400;0,700;1,400&family=Crimson+Pro:ital,wght@0,300;0,400;0,600;0,700;1,400&family=DM+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400&family=DM+Serif+Display&family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600&family=Inter:wght@400;500;600;700&family=Libre+Baskerville:ital,wght@0,400;0,700;1,400&family=Literata:ital,opsz,wght@0,7..72,400;0,7..72,600;0,7..72,700;1,7..72,400&family=Newsreader:ital,opsz,wght@0,6..72,400;0,6..72,600;1,6..72,400&family=Playfair+Display:wght@400;600;700;900&family=Source+Serif+4:ital,opsz,wght@0,8..60,400;0,8..60,600;0,8..60,700;1,8..60,400&family=Space+Grotesk:wght@400;500;600;700&family=Space+Mono:wght@400;700&display=swap" rel="stylesheet" />
13
- <script type="module" crossorigin src="/assets/index-DxAyyL3w.js"></script>
14
- <link rel="stylesheet" crossorigin href="/assets/index-BDSezXwn.css">
13
+ <script type="module" crossorigin src="/assets/index-iGNTYLM-.js"></script>
14
+ <link rel="stylesheet" crossorigin href="/assets/index-CeGtzvqW.css">
15
15
  </head>
16
16
  <body>
17
17
  <div id="root"></div>
@@ -102,6 +102,7 @@ export function listDocuments() {
102
102
  ...(data.docId ? { docId: data.docId } : {}),
103
103
  ...(data.newsletterContext?.lastSend?.sentAt ? { lastSent: data.newsletterContext.lastSend.sentAt } : data.tweetContext?.lastPost?.postedAt ? { lastSent: data.tweetContext.lastPost.postedAt } : data.blogContext?.lastPublish?.publishedAt ? { lastSent: data.blogContext.lastPublish.publishedAt } : data.articleContext?.lastPost?.postedAt ? { lastSent: data.articleContext.lastPost.postedAt } : data.manualPost?.postedAt ? { lastSent: data.manualPost.postedAt } : {}),
104
104
  ...(data.tweetContext?.lastPost?.tweetUrl ? { postedUrl: data.tweetContext.lastPost.tweetUrl } : {}),
105
+ ...(data.newsletterContext ? { isNewsletter: true } : {}),
105
106
  };
106
107
  }
107
108
  catch {
@@ -138,6 +139,7 @@ export function listDocuments() {
138
139
  ...(data.docId ? { docId: data.docId } : {}),
139
140
  ...(data.newsletterContext?.lastSend?.sentAt ? { lastSent: data.newsletterContext.lastSend.sentAt } : data.tweetContext?.lastPost?.postedAt ? { lastSent: data.tweetContext.lastPost.postedAt } : data.blogContext?.lastPublish?.publishedAt ? { lastSent: data.blogContext.lastPublish.publishedAt } : {}),
140
141
  ...(data.tweetContext?.lastPost?.tweetUrl ? { postedUrl: data.tweetContext.lastPost.tweetUrl } : {}),
142
+ ...(data.newsletterContext ? { isNewsletter: true } : {}),
141
143
  });
142
144
  }
143
145
  catch { /* skip unreadable external files */ }
@@ -30,7 +30,7 @@ import { createSchedulerRouter } from './scheduler-routes.js';
30
30
  import { createBlogRouter } from './blog-routes.js';
31
31
  import { platformFetch, isAuthenticated } from './connections.js';
32
32
  import { PluginManager } from './plugin-manager.js';
33
- import { checkForUpdate } from './update-check.js';
33
+ import { checkForUpdate, getUpdateInfo, getCurrentVersion } from './update-check.js';
34
34
  import { addMark, getMarks, resolveMarks } from './marks.js';
35
35
  const __filename = fileURLToPath(import.meta.url);
36
36
  const __dirname = dirname(__filename);
@@ -74,6 +74,10 @@ export async function startHttpServer(options = {}) {
74
74
  res.status(500).json({ content: [{ type: 'text', text: `Error: ${err.message}` }] });
75
75
  }
76
76
  });
77
+ app.get('/api/update-info', (_req, res) => {
78
+ const latestVersion = getUpdateInfo();
79
+ res.json({ updateAvailable: latestVersion, currentVersion: getCurrentVersion() });
80
+ });
77
81
  app.get('/api/document', (_req, res) => {
78
82
  res.json({ document: getDocument(), title: getTitle(), metadata: getMetadata() });
79
83
  });
@@ -28,7 +28,7 @@ export function compareVersions(a, b) {
28
28
  return 0;
29
29
  }
30
30
  /** Read current package version from package.json on disk. */
31
- function getCurrentVersion() {
31
+ export function getCurrentVersion() {
32
32
  try {
33
33
  const pkgPath = join(__dirname, '../../package.json');
34
34
  const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openwriter",
3
- "version": "0.6.7",
3
+ "version": "0.6.9",
4
4
  "description": "The open-source writing surface for AI agents. Markdown-native editor with pending change review — your agent writes, you accept or reject.",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/skill/SKILL.md CHANGED
@@ -15,7 +15,7 @@ description: |
15
15
  Requires: OpenWriter MCP server configured. Browser UI at localhost:5050.
16
16
  metadata:
17
17
  author: travsteward
18
- version: "0.2.4"
18
+ version: "0.2.6"
19
19
  repository: https://github.com/travsteward/openwriter
20
20
  license: MIT
21
21
  ---
@@ -528,6 +528,19 @@ Requires authentication via `request_login_code` + `verify_login`. All publish t
528
528
  → returns: stats (delivered, opens, clicks, bounces), per-subscriber events, recipient list
529
529
  ```
530
530
 
531
+ ## Author's Voice Plugin
532
+
533
+ When the user enables the Author's Voice plugin in Settings, install the skill — see [authors-voice.com](https://www.authors-voice.com) for install methods. The skill handles API key setup and everything else.
534
+
535
+ ## Updating
536
+
537
+ ```bash
538
+ npm install -g openwriter@latest
539
+ npx openwriter install-skill
540
+ ```
541
+
542
+ Then restart your Claude Code session (`/mcp` to reconnect).
543
+
531
544
  ## Troubleshooting
532
545
 
533
546
  **MCP tools not available** — The OpenWriter MCP server isn't configured yet. Follow the [setup instructions](#mcp-tools-are-not-available-skill-first-install) above. After adding the MCP config, the user must restart their Claude Code session.