@holdyourvoice/hyv 3.3.4 → 3.4.0
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/Readme.md +85 -365
- package/dist/agents/catalog.js +118 -0
- package/dist/agents/catalog.test.js +60 -0
- package/dist/agents/emit.js +42 -0
- package/dist/agents/emit.test.js +64 -0
- package/dist/agents/index.js +4 -0
- package/dist/agents/load.js +184 -0
- package/dist/agents/load.test.js +149 -0
- package/dist/agents/types.js +18 -0
- package/dist/approval-capability.js +1 -4
- package/dist/approval-context.js +1 -1
- package/dist/cli.js +111 -2
- package/dist/cli.test.js +76 -0
- package/dist/copy-spec.js +1 -6
- package/dist/editorial-packs.js +1 -3
- package/dist/hidden-text.js +2 -12
- package/dist/internal.js +30 -0
- package/dist/judgment-task.js +1 -13
- package/dist/lifecycle-adapter.js +2 -1
- package/dist/mcp-tools.js +2 -1
- package/dist/pipeline.js +4 -12
- package/dist/profile.js +1 -3
- package/dist/rebuild-task.js +1 -16
- package/dist/rebuild-task.test.js +1 -1
- package/dist/release-audit.test.js +5 -1
- package/dist/rewrite-task.js +1 -5
- package/dist/semantic-review.js +1 -2
- package/dist/version.js +1 -1
- package/package.json +3 -3
- package/skills/hyv-analyze/SKILL.md +24 -0
- package/skills/hyv-analyze/agent.json +49 -0
- package/skills/hyv-analyze/agents/openai.yaml +4 -0
- package/skills/hyv-apply-hidden-text-policy/SKILL.md +24 -0
- package/skills/hyv-apply-hidden-text-policy/agent.json +49 -0
- package/skills/hyv-apply-hidden-text-policy/agents/openai.yaml +4 -0
- package/skills/hyv-apply-rebuild/SKILL.md +24 -0
- package/skills/hyv-apply-rebuild/agent.json +49 -0
- package/skills/hyv-apply-rebuild/agents/openai.yaml +4 -0
- package/skills/hyv-apply-rewrite/SKILL.md +24 -0
- package/skills/hyv-apply-rewrite/agent.json +48 -0
- package/skills/hyv-apply-rewrite/agents/openai.yaml +4 -0
- package/skills/hyv-batch-analyze/SKILL.md +24 -0
- package/skills/hyv-batch-analyze/agent.json +45 -0
- package/skills/hyv-batch-analyze/agents/openai.yaml +4 -0
- package/skills/hyv-fact-lint/SKILL.md +24 -0
- package/skills/hyv-fact-lint/agent.json +50 -0
- package/skills/hyv-fact-lint/agents/openai.yaml +4 -0
- package/skills/hyv-final-check/SKILL.md +24 -0
- package/skills/hyv-final-check/agent.json +43 -0
- package/skills/hyv-final-check/agents/openai.yaml +4 -0
- package/skills/hyv-hygiene/SKILL.md +24 -0
- package/skills/hyv-hygiene/agent.json +50 -0
- package/skills/hyv-hygiene/agents/openai.yaml +4 -0
- package/skills/hyv-inspect-hidden-text/SKILL.md +24 -0
- package/skills/hyv-inspect-hidden-text/agent.json +48 -0
- package/skills/hyv-inspect-hidden-text/agents/openai.yaml +4 -0
- package/skills/hyv-learning/SKILL.md +24 -0
- package/skills/hyv-learning/agent.json +48 -0
- package/skills/hyv-learning/agents/openai.yaml +4 -0
- package/skills/hyv-lifecycle/SKILL.md +24 -0
- package/skills/hyv-lifecycle/agent.json +48 -0
- package/skills/hyv-lifecycle/agents/openai.yaml +4 -0
- package/skills/hyv-logic-lint/SKILL.md +24 -0
- package/skills/hyv-logic-lint/agent.json +47 -0
- package/skills/hyv-logic-lint/agents/openai.yaml +4 -0
- package/skills/hyv-mcp/SKILL.md +24 -0
- package/skills/hyv-mcp/agent.json +43 -0
- package/skills/hyv-mcp/agents/openai.yaml +4 -0
- package/skills/hyv-patterns/SKILL.md +24 -0
- package/skills/hyv-patterns/agent.json +43 -0
- package/skills/hyv-patterns/agents/openai.yaml +4 -0
- package/skills/hyv-prepare-judgment/SKILL.md +24 -0
- package/skills/hyv-prepare-judgment/agent.json +52 -0
- package/skills/hyv-prepare-judgment/agents/openai.yaml +4 -0
- package/skills/hyv-prepare-rebuild/SKILL.md +24 -0
- package/skills/hyv-prepare-rebuild/agent.json +54 -0
- package/skills/hyv-prepare-rebuild/agents/openai.yaml +4 -0
- package/skills/hyv-prepare-rewrite/SKILL.md +24 -0
- package/skills/hyv-prepare-rewrite/agent.json +51 -0
- package/skills/hyv-prepare-rewrite/agents/openai.yaml +4 -0
- package/skills/hyv-profile/SKILL.md +24 -0
- package/skills/hyv-profile/agent.json +50 -0
- package/skills/hyv-profile/agents/openai.yaml +4 -0
- package/skills/hyv-rebuild-writer-request/SKILL.md +24 -0
- package/skills/hyv-rebuild-writer-request/agent.json +47 -0
- package/skills/hyv-rebuild-writer-request/agents/openai.yaml +4 -0
- package/skills/hyv-reduce-judgment/SKILL.md +24 -0
- package/skills/hyv-reduce-judgment/agent.json +45 -0
- package/skills/hyv-reduce-judgment/agents/openai.yaml +4 -0
- package/skills/hyv-rewrite-prompt/SKILL.md +24 -0
- package/skills/hyv-rewrite-prompt/agent.json +48 -0
- package/skills/hyv-rewrite-prompt/agents/openai.yaml +4 -0
- package/skills/hyv-verify/SKILL.md +24 -0
- package/skills/hyv-verify/agent.json +49 -0
- package/skills/hyv-verify/agents/openai.yaml +4 -0
- package/skills/hyv-verify-spec/SKILL.md +24 -0
- package/skills/hyv-verify-spec/agent.json +50 -0
- package/skills/hyv-verify-spec/agents/openai.yaml +4 -0
package/Readme.md
CHANGED
|
@@ -2,77 +2,45 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@holdyourvoice/hyv)
|
|
4
4
|
|
|
5
|
+
Hold Your Voice is a local-first writing gate. It helps you use AI without losing the parts of your writing that make it yours.
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
It runs two checks on a draft, with separate scores and pass states. A strong result in one engine leaves the other engine's finding unchanged.
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
- **VoiceDNA** compares your draft with observable elements from your own writing samples.
|
|
10
|
+
- **AI Editor** flags a versioned set of editorial patterns that make writing sound generic or formulaic.
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
- **AI Editor** flags a reviewed, versioned set of editorial patterns that can make writing generic, formulaic, or inflated.
|
|
12
|
+
Everything runs from local files. There are no accounts, no telemetry, and no runtime network requests. The optional Claude extension is a local adapter around the same engine.
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
Everything in the CLI runs from local files: accounts, API calls, telemetry, payment collection, and runtime network requests stay out of the core path. The optional Claude extension adds a local stdio MCP adapter around that same engine; it is not a hosted service.
|
|
16
|
-
|
|
17
|
-
> **Status:** [`@holdyourvoice/hyv`](https://www.npmjs.com/package/@holdyourvoice/hyv) **3.3.4** is the public founder-aware rewrite. It runs locally and makes no runtime network requests. The package includes Profile v3 policy, pre-edit SHIP/EDIT/REBUILD judgments, contiguous range edits, authorized rebuild, and a signed semantic lifecycle.
|
|
18
|
-
|
|
19
|
-
## Why it exists
|
|
20
|
-
|
|
21
|
-
A draft can avoid obvious AI-shaped writing and still sound unlike its author. It can also match a writer’s short sentences while leaning on empty persuasion templates. Those are different problems. Treating them as one generic score hides the useful signal.
|
|
22
|
-
|
|
23
|
-
Hold Your Voice keeps the work visible:
|
|
24
|
-
|
|
25
|
-
| Question | Program | Result |
|
|
26
|
-
| --- | --- | --- |
|
|
27
|
-
| Does the draft still resemble this writer’s observable mechanics? | VoiceDNA | A profile-based score, findings, and pass state. |
|
|
28
|
-
| Does the draft contain a configured editorial pattern worth inspecting? | AI Editor | A rule-based score, sentence findings, and pass state. |
|
|
29
|
-
| Did the rewrite introduce a new blocker or replace too much? | Verification | Regressions, preservation score, and a release decision. |
|
|
30
|
-
| Should this draft ship, take a bounded edit, or rebuild? | Judgment | A SHIP, EDIT, or REBUILD recommendation bound to the draft and profile. |
|
|
31
|
-
|
|
32
|
-
Its scope is a local writing gate. It includes a source-consistency fact linter, not a truth engine: it checks a final draft against the evidence you provide. Authorship detection, plagiarism review, and hosted generation each need their own tools.
|
|
14
|
+
> **Status:** [`@holdyourvoice/hyv`](https://www.npmjs.com/package/@holdyourvoice/hyv) runs locally and makes no runtime network requests.
|
|
33
15
|
|
|
34
16
|
## Start here
|
|
35
17
|
|
|
36
|
-
|
|
18
|
+
**Requirements:** Node.js 20+, npm, and at least two writing samples you have the right to use.
|
|
37
19
|
|
|
38
|
-
|
|
39
|
-
- npm.
|
|
40
|
-
- At least two local writing samples you have the right to use.
|
|
41
|
-
|
|
42
|
-
### Install and verify
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
npx @holdyourvoice/hyv patterns
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
Run any command without a global install with `npx @holdyourvoice/hyv`. To use the short `hyv` command repeatedly:
|
|
20
|
+
### Install
|
|
49
21
|
|
|
50
22
|
```bash
|
|
51
23
|
npm install --global @holdyourvoice/hyv
|
|
52
24
|
hyv patterns
|
|
53
25
|
```
|
|
54
26
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
### Use it in Claude Desktop
|
|
27
|
+
No global install? Run any command with `npx @holdyourvoice/hyv`.
|
|
58
28
|
|
|
59
|
-
Build
|
|
60
|
-
|
|
61
|
-
### Build a local VoiceDNA profile
|
|
29
|
+
### Build a profile
|
|
62
30
|
|
|
63
31
|
```bash
|
|
64
|
-
|
|
32
|
+
hyv profile profile.json samples/one.md samples/two.md --avoid=overused-phrase
|
|
65
33
|
```
|
|
66
34
|
|
|
67
|
-
Use writing by one person, with a similar audience and format
|
|
35
|
+
Use writing by one person, with a similar audience and format. The command needs at least two samples. It writes a portable JSON profile and keeps your samples on your machine. Repeat `--avoid=phrase` for each phrase that must block a candidate.
|
|
68
36
|
|
|
69
|
-
###
|
|
37
|
+
### Analyze a draft
|
|
70
38
|
|
|
71
39
|
```bash
|
|
72
|
-
|
|
40
|
+
hyv analyze draft.md profile.json
|
|
73
41
|
```
|
|
74
42
|
|
|
75
|
-
The result is JSON with independent reports
|
|
43
|
+
The result is JSON with independent reports. The outer `passed` field is true only when each engine passes.
|
|
76
44
|
|
|
77
45
|
```json
|
|
78
46
|
{
|
|
@@ -83,177 +51,39 @@ The result is JSON with independent reports:
|
|
|
83
51
|
}
|
|
84
52
|
```
|
|
85
53
|
|
|
86
|
-
|
|
54
|
+
### Edit and verify
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
hyv rewrite-prompt draft.md profile.json > rewrite-brief.md
|
|
58
|
+
hyv verify draft.md candidate.md profile.json
|
|
59
|
+
```
|
|
87
60
|
|
|
88
|
-
|
|
61
|
+
Give the brief and draft to a human editor or any model you trust. Ask for replacement sentences keyed by sentence number, then save them as a separate candidate file. `verify` compares the original and candidate, reports new findings, and exits `2` when the candidate fails the gate.
|
|
89
62
|
|
|
90
|
-
|
|
63
|
+
### Gate final output
|
|
91
64
|
|
|
92
65
|
```bash
|
|
93
66
|
producer | hyv final-check -
|
|
94
67
|
hyv final-check final-response.md
|
|
95
68
|
```
|
|
96
69
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
This is an integration boundary, not a background interceptor. HYV applies the same gate by default during rewrite and rebuild verification; unresolved output is withheld from their CLI and MCP evaluation result. A GUI, agent host, or external tool must still pass any later changed text to `hyv final-check -` or the read-only `hyv_final_check` MCP tool and deliver only accepted output. Run it after the last rewrite, formatter, template expansion, or manual edit; checking an earlier draft does not cover later changes.
|
|
100
|
-
|
|
101
|
-
### Inspect and clean hidden Unicode
|
|
70
|
+
`final-check` is the last step before text reaches a user. It needs no profile. Clean text goes to stdout byte-for-byte. If hidden Unicode remains, stdout stays empty and the command exits `2`. Run it after the last edit, formatter, or template expansion.
|
|
102
71
|
|
|
103
|
-
|
|
72
|
+
### Clean hidden Unicode
|
|
104
73
|
|
|
105
74
|
```bash
|
|
106
75
|
hyv hygiene draft.md
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
Add `--fix` to create `draft.cleaned.md` while keeping `draft.md` unchanged:
|
|
110
|
-
|
|
111
|
-
```bash
|
|
112
76
|
hyv hygiene draft.md --fix
|
|
113
|
-
hyv hygiene draft.md --fix --output=review-copy.md
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
The fix receipt lists every changed UTF-16 offset and code point. The conservative cleaner removes ASCII controls and byte-order marks. It reports other zero-width characters, unusual spaces, bidirectional controls, and tag characters without changing them because they can carry legitimate language, typography, or emoji behavior. Existing output files are never overwritten.
|
|
117
|
-
|
|
118
|
-
For a deliberately narrow, policy-backed cleanup of non-semantic ASCII controls and mid-document byte-order marks, inspect first and write a separate result:
|
|
119
|
-
|
|
120
|
-
```bash
|
|
121
|
-
hyv inspect-hidden-text draft.md policy.json
|
|
122
|
-
hyv apply-hidden-text-policy draft.md policy.json draft.sanitized.md
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
The receipt carries the input/output hashes, exact changes, remaining review findings, and an idempotence result. It does not label Unicode findings as watermarks or claim that any provider watermark was removed.
|
|
126
|
-
|
|
127
|
-
### Add contextual editorial guidance
|
|
128
|
-
|
|
129
|
-
Use an optional local WritingBrief when the same writer needs different guidance for a social post, deck, outreach note, blog, audit, or website. A brief activates only the relevant advisory format checks and can block explicitly prohibited local terms. It never changes your VoiceDNA profile or the default two-engine analysis.
|
|
130
|
-
|
|
131
|
-
```json
|
|
132
|
-
{
|
|
133
|
-
"version": "1",
|
|
134
|
-
"audience": "technical founders",
|
|
135
|
-
"intent": "start a useful discussion",
|
|
136
|
-
"format": "social",
|
|
137
|
-
"readerKnowsAuthor": false,
|
|
138
|
-
"vocabulary": ["deployment", "incident"],
|
|
139
|
-
"prohibitedTerms": ["internal contract value"],
|
|
140
|
-
"evidenceStatus": "attributed",
|
|
141
|
-
"argumentMap": {
|
|
142
|
-
"observation": "A worker fails during a live request.",
|
|
143
|
-
"mechanism": "Its in-memory state is lost.",
|
|
144
|
-
"consequence": "The request restarts instead of resuming.",
|
|
145
|
-
"readerValue": "Avoid the cost of a cold restart."
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
```bash
|
|
151
|
-
hyv analyze draft.md profile.json writing-brief.json
|
|
152
|
-
hyv rewrite-prompt draft.md profile.json writing-brief.json > rewrite-brief.md
|
|
153
|
-
hyv verify original.md candidate.md profile.json writing-brief.json
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
Format checks, an `unverified` evidence state, and a missing configured reader-value cue are yellow review cues. `argumentMap` is a soft editorial contract surfaced to the rewrite prompt; it does not become a universal formula. Explicit `prohibitedTerms` are red release blockers. Keep client-specific briefs outside public repositories unless you have the right to publish them.
|
|
157
|
-
|
|
158
|
-
### Inspect a batch
|
|
159
|
-
|
|
160
|
-
Use batch analysis to catch exact repeated opening or closing sentences across two or more drafts. It is advisory and keeps all drafts local.
|
|
161
|
-
|
|
162
|
-
```bash
|
|
163
|
-
hyv batch-analyze posts/one.md posts/two.md posts/three.md
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
### Create an editing brief
|
|
167
|
-
|
|
168
|
-
```bash
|
|
169
|
-
npx @holdyourvoice/hyv rewrite-prompt draft.md profile.json > rewrite-brief.md
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
Give the brief and draft to a human editor or any model you trust. This repository stays out of that provider call. Ask for replacement sentences keyed by sentence number, then save the output as a separate candidate file.
|
|
173
|
-
|
|
174
|
-
### Verify the candidate
|
|
175
|
-
|
|
176
|
-
```bash
|
|
177
|
-
npx @holdyourvoice/hyv verify draft.md candidate.md profile.json
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
`verify` returns the original and candidate reports, identifies newly introduced findings, calculates a coarse preservation score, and exits with status `2` when the candidate fails the dual gate. It does not mutate learning state. It exits with `1` for a usage or runtime error. Treat status `2` as a release signal in scripts or CI.
|
|
181
|
-
|
|
182
|
-
### Lock factual claims with a CopySpec
|
|
183
|
-
|
|
184
|
-
Use `verify-spec` when a draft has claims that must remain verbatim unless they declare atomic facts. A local CopySpec records each immutable claim alongside its evidence, then blocks a candidate if its required text or atoms are absent, or if it is joined by a prohibited claim.
|
|
185
|
-
|
|
186
|
-
```json
|
|
187
|
-
{
|
|
188
|
-
"version": "1",
|
|
189
|
-
"audience": "operators",
|
|
190
|
-
"intent": "explain a launch date",
|
|
191
|
-
"channel": "email",
|
|
192
|
-
"claims": [
|
|
193
|
-
{
|
|
194
|
-
"id": "launch-date",
|
|
195
|
-
"text": "The launch is on 14 August.",
|
|
196
|
-
"atoms": ["The launch is on 14 August."],
|
|
197
|
-
"evidence": "Release calendar, checked 7 August."
|
|
198
|
-
}
|
|
199
|
-
],
|
|
200
|
-
"prohibitedClaims": ["The launch is guaranteed to double revenue."]
|
|
201
|
-
}
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
```bash
|
|
205
|
-
hyv verify-spec original.md candidate.md profile.json copy-spec.json
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
The check is deterministic. Without `atoms`, an immutable claim remains a verbatim sentence check. With `atoms`, every declared phrase must remain somewhere in the candidate, allowing independent facts to be split or reordered. Atoms are lexical-presence checks, not factual validation.
|
|
209
|
-
|
|
210
|
-
### Check factual consistency with supplied sources
|
|
211
|
-
|
|
212
|
-
`fact-lint` compares a final draft with local evidence. It extracts claims with sentence and UTF-16 offsets, checks dates, names, quotes, capabilities, causal/comparative escalation, and draft contradictions, then returns JSON with exact local evidence.
|
|
213
|
-
|
|
214
|
-
```bash
|
|
215
|
-
hyv fact-lint final.md --source=release:release-notes.md --source=research:research.md
|
|
216
|
-
hyv fact-lint final.md --source=release:release-notes.md --human
|
|
217
|
-
hyv fact-lint final.md --source=release:release-notes.md --strict
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
The default is report-only and exits `0`; `--strict` exits `2` for error findings. Known conflicts such as a CSV-to-PDF change are errors. A new or unclear capability, or weak evidence such as “exists” versus “grows”, becomes `needs_human_review`. No source text leaves the process by default. The linter checks consistency with supplied evidence; it does not prove the sources are true. See the [fact linter guide](docs/wiki/Fact-Linter.md).
|
|
221
|
-
|
|
222
|
-
When a `WritingBrief` includes `factSources`, HYV runs the same local fact lint automatically during `verify`, `verify-spec`, rewrite evaluation, and their MCP equivalents. Error findings block verification. Source-free flows remain unchanged.
|
|
223
|
-
|
|
224
|
-
Use `requiredFacts` for facts that must appear in the final draft. Each required fact must be supported by its source text or declared atoms in `factSources`; HYV fails verification if it is missing, negated, or denied. It does not assume every fact from every source belongs in every output.
|
|
225
|
-
|
|
226
|
-
```json
|
|
227
|
-
{
|
|
228
|
-
"version": "1",
|
|
229
|
-
"audience": "founders",
|
|
230
|
-
"intent": "write a post",
|
|
231
|
-
"format": "social",
|
|
232
|
-
"factSources": [{ "id": "bio", "text": "Shashank is a LinkedIn Top Voice." }],
|
|
233
|
-
"requiredFacts": [{ "id": "linkedin-top-voice", "text": "Shashank is a LinkedIn Top Voice." }]
|
|
234
|
-
}
|
|
235
77
|
```
|
|
236
78
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
### Local voice memory
|
|
240
|
-
|
|
241
|
-
Learning changes are explicit. Use the learning commands below, or complete the separately authorized semantic-review and final-approval lifecycle before recording approved learning. State lives under `~/.hyv/learning/`, scoped to the portable profile, and stores no draft or candidate text. The next `rewrite-prompt` uses a bounded list of approved repairs.
|
|
242
|
-
|
|
243
|
-
```bash
|
|
244
|
-
hyv learning show profile.json
|
|
245
|
-
hyv learning add profile.json "Keep the direct opening."
|
|
246
|
-
hyv learning clear profile.json
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
`show` lets you inspect the exact local preferences. `clear` removes only that profile's learning file. Set `HYV_HOME` to place this local state elsewhere.
|
|
79
|
+
Inspect zero-width characters, bidirectional controls, tag characters, and unusual spaces. Add `--fix` to write a cleaned copy while leaving the original untouched. The cleaner only removes non-semantic ASCII controls and byte-order marks; everything else is reported for review because it can carry real meaning.
|
|
250
80
|
|
|
251
81
|
## The editing loop
|
|
252
82
|
|
|
253
83
|
```mermaid
|
|
254
84
|
flowchart LR
|
|
255
|
-
S[Your
|
|
256
|
-
P --> D[VoiceDNA
|
|
85
|
+
S[Your samples] --> P[Build profile]
|
|
86
|
+
P --> D[VoiceDNA profile]
|
|
257
87
|
T[Draft] --> A[Analyze]
|
|
258
88
|
D --> A
|
|
259
89
|
A --> V[VoiceDNA report]
|
|
@@ -264,178 +94,74 @@ flowchart LR
|
|
|
264
94
|
T --> G[Verify candidate]
|
|
265
95
|
C --> G
|
|
266
96
|
D --> G
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
G --> R[Errors block; review findings stay visible]
|
|
270
|
-
R --> H[final-check: hygiene before output]
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
The tool never applies changes to your draft. You decide which findings are valid, apply replacement sentences or an authorized rebuild deliberately, and run the final check.
|
|
274
|
-
|
|
275
|
-
## Founder-aware rewrite
|
|
276
|
-
|
|
277
|
-
3.3.0 keeps the original analyze → brief → verify loop and adds a structured rewrite path.
|
|
278
|
-
|
|
279
|
-
1. Prepare a pre-edit judgment. Findings reduce to **SHIP**, bounded **EDIT**, or **REBUILD**.
|
|
280
|
-
2. **SHIP** returns the original bytes. No model call.
|
|
281
|
-
3. **EDIT** applies eligible sentence replacements or contiguous range edits through `prepare-rewrite` / `apply-rewrite`. Clean and unflagged text stays in place. Overlapping, out-of-order, or partly locked ranges fail before a candidate is built.
|
|
282
|
-
4. **REBUILD** prepares a whole-document candidate only after a matching REBUILD recommendation, a CopySpec, and a signed `hyv.rebuild-authorization` capability. `prepare-rebuild` / `apply-rebuild` re-check that capability and the bound profile. Claim, polarity, hygiene, and semantic gates stay in force. Edit and rebuild responses are mutually incompatible.
|
|
283
|
-
|
|
284
|
-
For a meaning-first recomposition, pass an explicit lexical-residual policy to `prepare-rebuild`. HYV gives the external writer structured facts and constraints rather than automatically including the source draft in its prompt, then measures shared wording after the candidate returns. A passed residual report means only that the candidate meets the configured overlap policy. It does not detect, remove, or prove the absence of a provider watermark, and it does not establish authorship.
|
|
285
|
-
|
|
286
|
-
```bash
|
|
287
|
-
hyv prepare-judgment pre-edit argument draft.md profile.json task.json
|
|
288
|
-
hyv reduce-judgment envelope-a.json envelope-b.json envelope-c.json
|
|
289
|
-
hyv prepare-rewrite draft.md profile.json task.json
|
|
290
|
-
hyv apply-rewrite task.json response.json profile.json
|
|
291
|
-
hyv prepare-rebuild draft.md profile.json reduction.json copy-spec.json task.json --recomposition-policy policy.json --capability-file capability.json
|
|
292
|
-
hyv apply-rebuild task.json response.json profile.json --capability-file capability.json
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
CLI and MCP expose the same contracts. The engine never calls a model. An editor or chosen model still sits outside the package.
|
|
296
|
-
|
|
297
|
-
## The five rewrite tiers
|
|
298
|
-
|
|
299
|
-
The prompt has an order. Lower tiers can refine a higher tier; they cannot override it.
|
|
300
|
-
|
|
301
|
-
1. **Tier 0: preservation.** Keep facts, names, numbers, claims, and every unflagged sentence exactly. Keep the response within the supplied sentences.
|
|
302
|
-
2. **Tier 1: release blockers.** Resolve profile avoid-list phrases and red findings.
|
|
303
|
-
3. **Tier 2: VoiceDNA.** Use the 13 profile elements as a writer-specific target.
|
|
304
|
-
4. **Tier 3: AI Editor.** Inspect yellow findings. Change a line only when the repair helps.
|
|
305
|
-
5. **Tier 4: output.** Return replacement sentences keyed by sentence number.
|
|
306
|
-
|
|
307
|
-
This order protects meaning before style. Rebuild is a separate whole-document contract; it does not use sentence-number replacements. Read the complete [prompt contract](docs/PROMPT-CONTRACT.md) before changing either path.
|
|
308
|
-
|
|
309
|
-
## VoiceDNA: 13 observable elements
|
|
310
|
-
|
|
311
|
-
VoiceDNA is a local profile of writing mechanics drawn from the samples you choose. It makes no claim about personality. Its structural measurements support Unicode writing; the current point-of-view and transition lists are English-specific evidence.
|
|
312
|
-
|
|
313
|
-
| # | Element | What it captures | Current gate behavior |
|
|
314
|
-
| --- | --- | --- | --- |
|
|
315
|
-
| 1 | Sentence length | Mean words per sentence | Yellow finding outside the profile band. |
|
|
316
|
-
| 2 | Sentence variation | Spread of sentence lengths | Used to set the sentence-length tolerance. |
|
|
317
|
-
| 3 | Sentence structure | Frequent three-word openings | Profile evidence. |
|
|
318
|
-
| 4 | Rhythm | Change between neighbouring sentence lengths | Profile evidence. |
|
|
319
|
-
| 5 | Paragraph length | Mean sentences per paragraph | Profile evidence. |
|
|
320
|
-
| 6 | Opening moves | Frequent first words | Profile evidence. |
|
|
321
|
-
| 7 | Vocabulary | Frequent non-stop words | Profile evidence and rewrite context. |
|
|
322
|
-
| 8 | Lexical density | Share of non-stop words | Profile evidence. |
|
|
323
|
-
| 9 | Point of view | First, second, third, or mixed | Yellow finding for a dominant-profile mismatch. |
|
|
324
|
-
| 10 | Punctuation | Counts of selected marks | Profile evidence. |
|
|
325
|
-
| 11 | Case style | Lowercase, standard, or mixed | Yellow finding on mismatch. |
|
|
326
|
-
| 12 | Question rate | Sentences ending in questions | Yellow finding for a material difference. |
|
|
327
|
-
| 13 | Transitions | Frequent recognised connectors | Profile evidence and rewrite context. |
|
|
328
|
-
|
|
329
|
-
An explicit profile avoid list creates red findings. The other evidence-only elements are calculated and shown. Future enforcement needs a written policy, counterexamples, and tests.
|
|
330
|
-
|
|
331
|
-
Read the full [VoiceDNA reference](docs/VOICE-DNA.md) and [Wiki guide](https://github.com/shashank-sn/holdyourvoice/wiki/VoiceDNA).
|
|
332
|
-
|
|
333
|
-
## AI Editor: inspectable rules
|
|
334
|
-
|
|
335
|
-
AI Editor uses a local, deterministic ruleset. The current `3.2.0-reconciled.1` ruleset contains 148 stable catalog entries: the inherited catalog plus en-dash and performative-sincerity coverage. Applied profile policy determines whether a match blocks, advises, requires judgment, or is disabled. Duplicate legacy expressions remain cataloged for ID compatibility but emit one canonical finding. Most rules inspect sentences; selected inherited rules inspect one physical line to preserve multi-sentence and line-start behavior.
|
|
336
|
-
|
|
337
|
-
Run this command to see the rules and ruleset version that actually execute in the published CLI:
|
|
338
|
-
|
|
339
|
-
```bash
|
|
340
|
-
npx @holdyourvoice/hyv patterns
|
|
97
|
+
G --> R[Errors block; findings stay visible]
|
|
98
|
+
R --> H[final-check before output]
|
|
341
99
|
```
|
|
342
100
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
Red findings are release blockers. Yellow findings are a request to inspect a sentence in context. A match never proves who wrote the text, and a clean scan never proves the text is good.
|
|
346
|
-
|
|
347
|
-
The repository also includes a public [220-pattern editorial catalog](docs/patterns/AI-WRITING-PATTERNS-1-220.md). It is broader editorial guidance, not a claim that all 220 entries execute. A catalog entry becomes executable only after the project has defined its counterexamples, reviewed public provenance, written tests, and decided the rule is narrow enough to help without creating noise. Neither the executable rules nor the editorial catalog can prove authorship.
|
|
101
|
+
The tool never edits your draft. You decide which findings are valid, apply the changes yourself, and run the final check.
|
|
348
102
|
|
|
349
|
-
##
|
|
103
|
+
## A few more commands
|
|
350
104
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
- VoiceDNA passes.
|
|
354
|
-
- AI Editor passes.
|
|
355
|
-
- The candidate introduces zero new red findings.
|
|
356
|
-
- The lexical preservation score is at least 70.
|
|
357
|
-
|
|
358
|
-
The preservation score is a guardrail based on retained original words longer than four characters. A human still needs to review facts, source links, intent, and reader value.
|
|
359
|
-
|
|
360
|
-
## Commands
|
|
361
|
-
|
|
362
|
-
| Command | Input | Output | Use it when |
|
|
363
|
-
| --- | --- | --- | --- |
|
|
364
|
-
| `hyv profile <profile.json> <sample...>` | Two or more text files | Profile JSON | You need a new local reference. |
|
|
365
|
-
| `hyv analyze <draft> <profile.json>` | Draft and profile | Analysis JSON | You need both reports before editing. |
|
|
366
|
-
| `hyv hygiene <draft> [--fix] [--output=path]` | Draft | Hygiene report or cleaned copy plus receipt | You need to inspect or conservatively clean hidden Unicode. |
|
|
367
|
-
| `hyv final-check <path\|->` | Any final text | Exact accepted text on stdout or a withheld-output report on stderr | Text is about to cross a user-facing boundary. |
|
|
368
|
-
| `hyv rewrite-prompt <draft> <profile.json>` | Draft and profile | Markdown editing brief | You need a constrained request for an editor or model. |
|
|
369
|
-
| `hyv prepare-rewrite <draft> <profile.json> <task.json>` | Draft and profile | Versioned task file plus metadata | A host needs a fingerprint-bound sentence-edit or range-edit task. |
|
|
370
|
-
| `hyv apply-rewrite <task.json> <response.json> <profile.json>` | Task, response, and profile | Candidate evaluation JSON | A host needs to apply and recheck eligible sentence replacements. |
|
|
371
|
-
| `hyv prepare-judgment <pre-edit\|post-candidate> <kind> <draft> <profile.json> <task.json> [candidate.md]` | Draft, profile, and optional candidate | Versioned judgment task | Findings need a SHIP, EDIT, or REBUILD recommendation. |
|
|
372
|
-
| `hyv reduce-judgment <envelope.json> <envelope.json> [envelope.json...]` | Signed judgment envelopes | Recommendation JSON | Multiple judgment envelopes must reduce to one decision. |
|
|
373
|
-
| `hyv prepare-rebuild <draft> <profile.json> <reduction.json> <copy-spec.json> <task.json> [--recomposition-policy policy.json]` | Draft, recommendation, CopySpec, capability, and optional policy | Versioned rebuild task | An upstream REBUILD recommendation needs a whole-document candidate; an optional policy makes it meaning-first and adds lexical-residual evidence. |
|
|
374
|
-
| `hyv apply-rebuild <task.json> <response.json> <profile.json>` | Task, response, profile, and capability | Candidate evaluation JSON | A host needs to apply and recheck an authorized rebuild. |
|
|
375
|
-
| `hyv verify <original> <candidate> <profile.json>` | Original, candidate, profile | Verification JSON and exit code | You need the candidate gate. |
|
|
376
|
-
| `hyv verify-spec <original> <candidate> <profile.json> <copy-spec.json>` | Original, candidate, profile, CopySpec | Verification JSON with hard claim gate | A brief contains locked facts or prohibited claims. |
|
|
377
|
-
| `hyv learning <show\|inspect\|add\|record\|ratify\|supersede\|migrate\|clear> ...` | Profile, operation value, and bounded metadata options | Preferences or a text-free mutation receipt | You need to inspect, migrate, or manage profile-scoped learning. |
|
|
378
|
-
| `hyv lifecycle <prepare-semantic\|submit-verdict\|inspect\|validate-final-approval\|finalize> ...` | Versioned lifecycle artifacts | Canonical lifecycle artifact or metadata | A normal-policy semantic review or human decision must advance through the shared reducer. |
|
|
379
|
-
| `hyv patterns` | None | Ruleset JSON | You need the exact enabled rules. |
|
|
380
|
-
|
|
381
|
-
Every file argument can be `-` when the command accepts text input from standard input. Profile output is always written to the path you give it. Use `npx @holdyourvoice/hyv <command>` in place of `hyv <command>` when you have not installed the CLI globally.
|
|
382
|
-
|
|
383
|
-
Profile v3 learning is keyed by its stable local profile ID, so compatible history survives profile revisions. `record`, `ratify`, and `supersede` accept bounded `--mutation-id`, `--authority`, `--provenance`, `--weight`, and `--compatibility` options. `ratify` and `supersede` require Profile v3. `migrate` explicitly copies compatible legacy Profile v2 learning into one Profile v3 identity. Replaying an identical mutation is idempotent; reusing its ID for a different operation returns a conflict. Inspection and receipts expose event metadata only, never stored instructions or draft text.
|
|
384
|
-
|
|
385
|
-
The standalone CLI supports normal-policy semantic review. High-assurance review requires a trusted embedding and is rejected by the CLI. Approval and rebuild capabilities are accepted only through `--capability-stdin` or a permission-checked `--capability-file`; adapters validate capabilities but never mint them. Rejection needs no capability. Approval and `learning record-approved` require the matching signed final-approval capability. `apply-rewrite`, `apply-rebuild`, `lifecycle submit-verdict`, and `lifecycle finalize` exit `2` when the candidate or transition is not accepted, while usage and runtime failures exit `1`.
|
|
386
|
-
|
|
387
|
-
## Project map
|
|
388
|
-
|
|
389
|
-
| Path | Responsibility |
|
|
105
|
+
| Command | Use it when |
|
|
390
106
|
| --- | --- |
|
|
391
|
-
| `
|
|
392
|
-
| `
|
|
393
|
-
| `
|
|
394
|
-
| `
|
|
395
|
-
| `
|
|
396
|
-
| `
|
|
397
|
-
| `
|
|
398
|
-
| `
|
|
399
|
-
| `src/rewrite-task.ts` | Prepares and evaluates fingerprint-bound sentence-replacement and range-edit tasks. |
|
|
400
|
-
| `src/judgment-task.ts` | Reduces pre-edit SHIP/EDIT/REBUILD recommendations and post-candidate clearance. |
|
|
401
|
-
| `src/rebuild-task.ts` | Prepares whole-document rebuild after a matching recommendation, CopySpec, and signed capability. |
|
|
402
|
-
| `src/recomposition.ts` | Builds meaning-first rebuild briefs and measures declared lexical-residual evidence. |
|
|
403
|
-
| `src/semantic-review.ts` | Defines and reduces semantic and human-review lifecycle artifacts. |
|
|
404
|
-
| `src/approval-capability.ts` | Verifies canonical signed approval capabilities. |
|
|
405
|
-
| `src/approval-context.ts` | Loads permission-checked trust roots and evaluator authorization. |
|
|
406
|
-
| `src/lifecycle-adapter.ts` | Shares lifecycle operations across CLI and MCP adapters. |
|
|
407
|
-
| `src/cli.ts` | Local file and standard-input command adapter. |
|
|
408
|
-
| `src/mcp.ts` | Local stdio MCP registration and host-capability gating. |
|
|
409
|
-
| `src/pipeline.test.ts` | Contract and regression tests. |
|
|
410
|
-
| `CONTRIBUTING.md` | Public-safety rules and the contributor model. |
|
|
411
|
-
| `scripts/release-audit.mjs` | Checks source files for credential and network markers. |
|
|
412
|
-
|
|
413
|
-
`pipeline.ts` is the sole scored output-composition point. It combines pass states and preserves each engine’s separate score. Rewrite-task and lifecycle modules compose their own versioned, non-scoring artifacts.
|
|
414
|
-
|
|
415
|
-
## Privacy and data rights
|
|
416
|
-
|
|
417
|
-
The runtime uses files on your machine. Samples, drafts, profiles, candidates, and client data stay there. Verification is read-only. Explicit learning commands and approved lifecycle recording can write text-free local events under `~/.hyv/learning/`: profile fingerprint, finding IDs, severities, counts, timestamp, and an opaque one-way candidate digest for retry deduplication. An instruction added through `hyv learning add` is stored as entered.
|
|
107
|
+
| `hyv verify-spec` | A draft has facts that must stay verbatim (CopySpec). |
|
|
108
|
+
| `hyv fact-lint` | Check a draft against local evidence sources. |
|
|
109
|
+
| `hyv batch-analyze` | Catch exact repeated sentences across drafts. |
|
|
110
|
+
| `hyv prepare-rewrite` / `apply-rewrite` | Fingerprint-bound sentence or range edits. |
|
|
111
|
+
| `hyv prepare-rebuild` / `apply-rebuild` | Whole-document rebuild after an authorized recommendation. |
|
|
112
|
+
| `hyv prepare-judgment` / `reduce-judgment` | Reduce findings to SHIP, EDIT, or REBUILD. |
|
|
113
|
+
| `hyv lifecycle` | Semantic and human-review lifecycle steps. |
|
|
114
|
+
| `hyv learning show` | Inspect local voice-memory preferences. |
|
|
418
115
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
See the [privacy guide](https://github.com/shashank-sn/holdyourvoice/wiki/Privacy-and-Data-Rights) for maintainer and contributor boundaries.
|
|
422
|
-
|
|
423
|
-
## Benchmarks and claims
|
|
424
|
-
|
|
425
|
-
The repository preserves historical product material in [docs/BENCHMARKS.md](docs/BENCHMARKS.md), with related public articles about the [Voice Memory Composer](https://holdyourvoice.com/blog/voice-memory-composer) and [Hold Your Voice vs GPT-5.6 writing](https://holdyourvoice.com/blog/hold-your-voice-vs-gpt-5-6-writing).
|
|
116
|
+
## Commands
|
|
426
117
|
|
|
427
|
-
|
|
118
|
+
| Command | Input | Output |
|
|
119
|
+
| --- | --- | --- |
|
|
120
|
+
| `hyv profile <profile.json> <sample...>` | Two or more text files | Profile JSON |
|
|
121
|
+
| `hyv analyze <draft> <profile.json>` | Draft and profile | Analysis JSON |
|
|
122
|
+
| `hyv hygiene <draft> [--fix] [--output=path]` | Draft | Hygiene report or cleaned copy plus receipt |
|
|
123
|
+
| `hyv inspect-hidden-text <draft> [policy.json]` | Draft and optional policy | Hidden-text inspection report |
|
|
124
|
+
| `hyv apply-hidden-text-policy <draft> <policy.json> <output.md>` | Draft and approved policy | Sanitized output plus receipt |
|
|
125
|
+
| `hyv final-check <path\|->` | Any final text | Accepted text on stdout or a withheld-output report |
|
|
126
|
+
| `hyv logic-lint <draft\|-> [writing-brief.json]` | Draft and optional brief | Deterministic logic-lint report |
|
|
127
|
+
| `hyv rewrite-prompt <draft> <profile.json>` | Draft and profile | Markdown editing brief |
|
|
128
|
+
| `hyv prepare-rewrite <draft> <profile.json> <task.json>` | Draft and profile | Versioned task file |
|
|
129
|
+
| `hyv apply-rewrite <task.json> <response.json> <profile.json>` | Task, response, profile | Candidate evaluation JSON |
|
|
130
|
+
| `hyv prepare-judgment <pre-edit\|post-candidate> <kind> <draft> <profile.json> <task.json> [candidate.md]` | Draft, profile, optional candidate | Versioned judgment task |
|
|
131
|
+
| `hyv reduce-judgment <envelope.json> ...` | Signed judgment envelopes | Recommendation JSON |
|
|
132
|
+
| `hyv prepare-rebuild <draft> <profile.json> <reduction.json> <copy-spec.json> <task.json> [--recomposition-policy policy.json]` | Draft, recommendation, CopySpec, capability, optional policy | Versioned rebuild task |
|
|
133
|
+
| `hyv rebuild-writer-request <task.json> <writer-request.json>` | Rebuild task | Writer-only rebuild request |
|
|
134
|
+
| `hyv apply-rebuild <task.json> <response.json> <profile.json>` | Task, response, profile, capability | Candidate evaluation JSON |
|
|
135
|
+
| `hyv verify <original> <candidate> <profile.json>` | Original, candidate, profile | Verification JSON and exit code |
|
|
136
|
+
| `hyv verify-spec <original> <candidate> <profile.json> <copy-spec.json>` | Original, candidate, profile, CopySpec | Verification JSON with hard claim gate |
|
|
137
|
+
| `hyv learning <show\|inspect\|add\|record\|record-approved\|ratify\|supersede\|migrate\|clear> ...` | Profile, operation, bounded metadata | Preferences or a text-free receipt |
|
|
138
|
+
| `hyv lifecycle <prepare-semantic\|submit-verdict\|inspect\|validate-final-approval\|finalize> ...` | Versioned lifecycle artifacts | Lifecycle artifact or metadata |
|
|
139
|
+
| `hyv patterns` | None | Ruleset JSON |
|
|
140
|
+
| `hyv mcp` | None | Local MCP server on stdio |
|
|
141
|
+
| `hyv agent list\|validate\|describe\|emit <id> [--host HOST] [--mode prompt\|json] [--output FILE]` | Optional agent id | Portable agent contract (see below) |
|
|
142
|
+
|
|
143
|
+
Every file argument can be `-` when the command accepts input on standard input. Use `npx @holdyourvoice/hyv <command>` if you have not installed the CLI globally.
|
|
144
|
+
|
|
145
|
+
## Portable agents
|
|
146
|
+
|
|
147
|
+
The 23 writing and runtime commands are also model-neutral portable agent packages under `skills/hyv-*/` (an `agent.json` contract, a `SKILL.md`, and an `agents/openai.yaml` interface), mirroring the clean-code portable-agent pattern. `hyv agent list` prints every package; `hyv agent validate [id]` checks the contract schema; `hyv agent describe <id> --host HOST` resolves permissions against a host catalog; and `hyv agent emit <id> --mode prompt|json --host HOST` emits a host-aware contract. The subcommand stays local. `emit --output` creates a new contract file and refuses an existing target. Read the [portable agents guide](docs/wiki/Portable-Agents.md) for the package contract, host model, and examples.
|
|
148
|
+
|
|
149
|
+
## Privacy
|
|
150
|
+
|
|
151
|
+
Your samples, drafts, profiles, and candidates stay on your machine. Verification is read-only. Learning commands can write text-free local events under `~/.hyv/learning/` — profile fingerprint, finding IDs, counts, and an opaque digest. No writing text is uploaded, and the package makes no runtime network requests.
|
|
152
|
+
|
|
153
|
+
Keep writing samples, edit histories, and client text out of public commits unless you hold the rights and a provenance record. A profile is aggregated JSON and can still reveal vocabulary, so store private profiles outside public repositories.
|
|
428
154
|
|
|
429
155
|
## Documentation
|
|
430
156
|
|
|
431
157
|
| Read this | When you need |
|
|
432
158
|
| --- | --- |
|
|
433
|
-
| [The
|
|
434
|
-
| [Thesis](docs/THESIS.md) | The design argument for two independent engines. |
|
|
159
|
+
| [The Wiki](https://github.com/shashank-sn/holdyourvoice/wiki) | Product and contributor docs. |
|
|
435
160
|
| [Architecture](docs/ARCHITECTURE.md) | Source boundaries and extension rules. |
|
|
436
|
-
| [Local voice memory](docs/wiki/Local-Voice-Memory.md) | What default local learning stores, uses, and never changes. |
|
|
437
161
|
| [Prompt contract](docs/PROMPT-CONTRACT.md) | The tier order and editing constraints. |
|
|
438
|
-
| [
|
|
162
|
+
| [VoiceDNA](docs/VOICE-DNA.md) | The 13 profile elements. |
|
|
163
|
+
| [Fact linter](docs/wiki/Fact-Linter.md) | The source-consistency checker. |
|
|
164
|
+
| [Portable agents](docs/wiki/Portable-Agents.md) | Load or emit a host-aware contract for one HYV command. |
|
|
439
165
|
| [Support](SUPPORT.md) | Funding without a feature gate. |
|
|
440
166
|
|
|
441
167
|
## Contribute
|
|
@@ -445,16 +171,10 @@ npm test
|
|
|
445
171
|
npm run check:release
|
|
446
172
|
```
|
|
447
173
|
|
|
448
|
-
Read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request. Keep changes narrow
|
|
449
|
-
|
|
450
|
-
## npm releases
|
|
451
|
-
|
|
452
|
-
`@holdyourvoice/hyv` is published automatically after a change to the package source reaches `main`. The workflow publishes only when the version in `package.json` is not already on npm, so bump that version in the same pull request as a release-worthy change. It runs the tests and release audit before publishing, then verifies that npm reports the package as MIT licensed.
|
|
453
|
-
|
|
454
|
-
## Support
|
|
174
|
+
Read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request. Keep changes narrow, add tests when behavior changes, and keep private or unlicensed material out of the repo.
|
|
455
175
|
|
|
456
|
-
|
|
176
|
+
`@holdyourvoice/hyv` publishes automatically when a change reaches `main`. Bump the version in `package.json` in the same pull request as a release-worthy change; the workflow publishes only if that version is not already on npm.
|
|
457
177
|
|
|
458
178
|
## License
|
|
459
179
|
|
|
460
|
-
[MIT](LICENSE).
|
|
180
|
+
[MIT](LICENSE). Third-party writing and data retain their own rights.
|