openwriter 0.34.0 → 0.35.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.
@@ -1,23 +1,24 @@
1
- {
2
- "name": "@openwriter/plugin-authors-voice",
3
- "version": "0.4.0",
4
- "description": "Rewrite text in your voice using Author's Voice",
5
- "type": "module",
6
- "main": "dist/index.js",
7
- "scripts": {
8
- "build": "tsc",
9
- "dev": "tsc --watch"
10
- },
11
- "devDependencies": {
12
- "@types/express": "^5.0.0",
13
- "typescript": "^5.6.0"
14
- },
15
- "openwriter": {
16
- "displayName": "Author's Voice",
17
- "category": "writing"
18
- },
19
- "files": [
20
- "dist/",
21
- "package.json"
22
- ]
23
- }
1
+ {
2
+ "name": "@openwriter/plugin-authors-voice",
3
+ "version": "0.4.0",
4
+ "description": "Rewrite text in your voice using Author's Voice",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "dev": "tsc --watch"
10
+ },
11
+ "devDependencies": {
12
+ "@types/express": "^5.0.0",
13
+ "typescript": "^5.6.0"
14
+ },
15
+ "openwriter": {
16
+ "displayName": "Author's Voice",
17
+ "category": "writing"
18
+ },
19
+ "files": [
20
+ "dist/",
21
+ "skill/",
22
+ "package.json"
23
+ ]
24
+ }
@@ -437,7 +437,7 @@ function defaultDirsForFramework(fw, detectedContentDir) {
437
437
  // ---- post_to_blog helpers ----
438
438
  /**
439
439
  * Strict double-quoted YAML emission for scalars — matches the style of
440
- * caloriebot's existing posts. Arrays are inline-square-bracket JSON for
440
+ * a typical Astro blog's existing posts. Arrays are inline-square-bracket JSON for
441
441
  * compactness. Booleans + numbers emit bare.
442
442
  */
443
443
  function yamlValue(v) {
@@ -564,7 +564,7 @@ export function buildFrontmatter(title, blogCtx, site, coverImagePath) {
564
564
  }
565
565
  // Date fields emit as UNQUOTED yaml scalars (pubDate: 2026-05-31), never
566
566
  // quoted strings. Astro's z.date() rejects a quoted value — js-yaml parses it
567
- // as a String, not a Date — which froze a live Netlify build (paybotapp.com,
567
+ // as a String, not a Date — which froze a live Netlify build (a production Astro blog,
568
568
  // 2026-06-01). The unquoted form is ALSO accepted by z.coerce.date() and by
569
569
  // Jekyll/Hugo/Next (gray-matter), so it is the universally-correct emit.
570
570
  // adr: adr/blog-image-contract.md
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openwriter",
3
- "version": "0.34.0",
3
+ "version": "0.35.1",
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
@@ -16,7 +16,7 @@ description: |
16
16
  Requires: OpenWriter MCP server configured. Browser UI at localhost:5050.
17
17
  metadata:
18
18
  author: travsteward
19
- version: "0.17.0"
19
+ version: "0.18.0"
20
20
  repository: https://github.com/travsteward/openwriter
21
21
  license: MIT
22
22
  ---
@@ -56,7 +56,7 @@ You are a writing collaborator. You read documents and make edits **exclusively
56
56
 
57
57
  **Why a minion, not inline.** Earlier this was "handle it inline, no minion — sorting is a judgment call." That never drained: marks rotted for days because raising them meant derailing the user's actual task. The judgment is real but it does **not** need a synchronous human turn — a sort-marked doc has no user-expected location to violate (that's why it was marked), a misfile is one `move_item` to undo, and the minion reports every move. Reversible + visible replaces the gate. This is the same autonomous-drain rail enrichment rides (firm rule 5).
58
58
 
59
- **Surfacing to the user:** treat sorting like enrichment and the inbox — a maintenance reflex, not a feature they ask for. Dispatch silently and relay a one-line aside in your response: "Filed 3 docs in the background — CalorieBotPayBot/Marketing, …. Now, …". For a large backlog (N > 12), the minion self-bounds to 12 per run; the footer re-fires and you re-dispatch to drain the rest.
59
+ **Surfacing to the user:** treat sorting like enrichment and the inbox — a maintenance reflex, not a feature they ask for. Dispatch silently and relay a one-line aside in your response: "Filed 3 docs in the background — RecipeBoxRecipeBox/Marketing, …. Now, …". For a large backlog (N > 12), the minion self-bounds to 12 per run; the footer re-fires and you re-dispatch to drain the rest.
60
60
 
61
61
  **Manual path still exists.** Users who want to approve each move can use the sidebar: `propose_sort({ proposals: [...] })` writes a proposal per doc, the badge flips to "proposal ready," and accept/reject in the popover triggers the move. The minion doesn't use this — it's for when the user explicitly wants a gate. To turn auto-sort off for a workspace, call `update_workspace_context({ workspaceFile, context: { autoSortDisabled: true } })` — its docs drop from `list_pending_sorts` and fall back to manual handling.
62
62
 
@@ -397,11 +397,23 @@ npx skills add https://github.com/travsteward/openwriter --skill x-writer
397
397
  # Book-scale long-form — chapter architecture, beats, workspace management
398
398
  npx skills add https://github.com/travsteward/openwriter --skill book-writer
399
399
 
400
- # Author's Voicevoice matching, minion dispatch, anti-AI (required by both above)
401
- claude install github:travsteward/authors-voice
400
+ # Channel-agnostic draftingbeats-first uncommitted drafts
401
+ npx skills add https://github.com/travsteward/openwriter --skill beat-writer
402
+
403
+ # Long-form blog posts — beats, titling, voice anchor, publish via github plugin
404
+ npx skills add https://github.com/travsteward/openwriter --skill blog-writer
405
+
406
+ # Weekly email newsletter pipeline
407
+ npx skills add https://github.com/travsteward/openwriter --skill newsletter-writer
408
+
409
+ # Copy polish to 90/100 + AI-fingerprint scrub
410
+ npx skills add https://github.com/travsteward/openwriter --skill polish
411
+ npx skills add https://github.com/travsteward/openwriter --skill anti-ai
402
412
  ```
403
413
 
404
- For voice-matched drafting without a custom voice profile, install **voice-presets** 5 pre-built frames (authority, provocateur, logical, storyteller, business). For an AI-detection pass without full authors-voice setup, install **anti-ai**. Both are optional.
414
+ Author's Voice (voice matching, minion dispatch required by the writers above) now ships INSIDE the authors-voice plugin: enabling the plugin delivers both the MCP tools and the skill at `plugins/authors-voice/skill/SKILL.md`. Standalone install also works: `claude install github:travsteward/authors-voice`.
415
+
416
+ For an AI-detection pass without full authors-voice setup, the bundled **anti-ai** skill stands alone.
405
417
 
406
418
  ## Workflow
407
419
 
@@ -632,7 +644,7 @@ Requires authentication via `request_login_code` + `verify_login`. All publish t
632
644
 
633
645
  ## Author's Voice Plugin
634
646
 
635
- 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.
647
+ The plugin ships with the Author's Voice skill built in (`plugins/authors-voice/skill/SKILL.md`) — enabling the plugin in Settings delivers both the MCP tools and the agent instructions. No separate install needed; see [authors-voice.com](https://www.authors-voice.com) for the standalone copy and docs.
636
648
 
637
649
  ## Updating
638
650
 
@@ -132,16 +132,16 @@ see them — they're on disk. Brevity matters.
132
132
 
133
133
  ## Worked example
134
134
 
135
- Input: dirty doc titled "Sexual Dimorphism — Master Reference", body
136
- covering the T-gate mechanism, tournament-vs-pairbonding contrast, contest
137
- mosaic theory, dimorphic trait inventory.
135
+ Input: dirty doc titled "Sleep Pressure — Master Reference", body
136
+ covering the adenosine mechanism, caffeine-vs-sleep-debt contrast, the
137
+ two-process model, circadian trait inventory.
138
138
 
139
139
  Output:
140
140
 
141
141
  ```json
142
142
  {
143
143
  "docId": "b88ede9b",
144
- "logline": "T-gate mechanism, dimorphic trait inventory, and the contest-vs-pairbonding selection contrast."
144
+ "logline": "Adenosine mechanism, circadian trait inventory, and the caffeine-vs-sleep-debt contrast."
145
145
  }
146
146
  ```
147
147
 
@@ -166,19 +166,19 @@ matters.
166
166
 
167
167
  ## Worked example
168
168
 
169
- Pending: doc "CalorieBot is the easiest way to track calories" (unfiled).
170
- Workspaces: `paybot-350b05a1.json` (logline: "PayBot product docs +
169
+ Pending: doc "RecipeBox is the easiest way to plan your meals" (unfiled).
170
+ Workspaces: `recipebox-350b05a1.json` (logline: "RecipeBox product docs +
171
171
  marketing"), `book-fatherhood.json` (logline: "Fatherhood book chapters").
172
172
 
173
173
  Read the body → it's product marketing copy for a calorie-tracking app.
174
- Best match: `paybot-350b05a1.json`, container "Marketing" (purpose: "landing
174
+ Best match: `recipebox-350b05a1.json`, container "Marketing" (purpose: "landing
175
175
  + launch copy").
176
176
 
177
177
  ```
178
- move_item({ type: "doc", workspaceFile: "paybot-350b05a1.json", itemId: "bb4f6c46", targetContainerId: "<marketing-container-id>" })
178
+ move_item({ type: "doc", workspaceFile: "recipebox-350b05a1.json", itemId: "bb4f6c46", targetContainerId: "<marketing-container-id>" })
179
179
  mark_sorted({ docs: [{ docId: "bb4f6c46" }] })
180
180
  ```
181
181
 
182
- Report: `Filed 1 doc: "CalorieBot is the easiest way…" → PayBot / Marketing.`
182
+ Report: `Filed 1 doc: "RecipeBox is the easiest way…" → RecipeBox / Marketing.`
183
183
 
184
184
  Run the procedure. File the docs. Return the summary. Exit.
@@ -68,9 +68,9 @@ Example prompt for one chunk (v0.19.0 — logline-only):
68
68
  ```
69
69
  Enrich these specific openwriter docs:
70
70
 
71
- - a1b2c3d4 — Frame Holding Master Reference
72
- - e5f6a7b8 — Tournament Male
73
- - 9z8y7x6w — Contest Mosaic Theory
71
+ - a1b2c3d4 — Onboarding Email Sequence
72
+ - e5f6a7b8 — Why We Sleep — Ch 2 Notes
73
+ - 9z8y7x6w — Product Launch Checklist
74
74
  - 1q2w3e4r — Ch 3 — Beats
75
75
  - 5t6y7u8i — Ch 4 — Draft
76
76