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.
- package/dist/plugins/authors-voice/package.json +24 -23
- package/dist/plugins/github/dist/blog-tools.js +2 -2
- package/package.json +1 -1
- package/skill/SKILL.md +18 -6
- package/skill/agents/openwriter-enrichment-minion.md +4 -4
- package/skill/agents/openwriter-sort-minion.md +5 -5
- package/skill/docs/enrichment.md +3 -3
|
@@ -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
|
-
"
|
|
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
|
-
*
|
|
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 (
|
|
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.
|
|
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.
|
|
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 —
|
|
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 — RecipeBox → RecipeBox/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
|
-
#
|
|
401
|
-
|
|
400
|
+
# Channel-agnostic drafting — beats-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
|
-
|
|
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
|
-
|
|
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 "
|
|
136
|
-
covering the
|
|
137
|
-
|
|
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": "
|
|
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 "
|
|
170
|
-
Workspaces: `
|
|
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: `
|
|
174
|
+
Best match: `recipebox-350b05a1.json`, container "Marketing" (purpose: "landing
|
|
175
175
|
+ launch copy").
|
|
176
176
|
|
|
177
177
|
```
|
|
178
|
-
move_item({ type: "doc", workspaceFile: "
|
|
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: "
|
|
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.
|
package/skill/docs/enrichment.md
CHANGED
|
@@ -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 —
|
|
72
|
-
- e5f6a7b8 —
|
|
73
|
-
- 9z8y7x6w —
|
|
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
|
|