@holdyourvoice/hyv 2.3.0 → 2.3.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/agents/chatgpt.md +18 -0
- package/agents/claude-code.md +39 -0
- package/agents/codex.md +22 -0
- package/agents/cursor.md +19 -0
- package/agents/generic.md +30 -0
- package/agents/windsurf.md +12 -0
- package/package.json +3 -2
- package/assets/chatgpt-instructions 2.txt +0 -8
- package/assets/chatgpt-instructions 3.txt +0 -8
- package/assets/claude-code-skill 2.md +0 -24
- package/assets/cursor-rules 2.md +0 -12
- package/assets/cursor-rules 3.md +0 -12
- package/scripts/postinstall 2.js +0 -110
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Hold Your Voice — Writing Rules
|
|
2
|
+
|
|
3
|
+
The user has a voice profile. All writing must match their personal style.
|
|
4
|
+
|
|
5
|
+
## Rules
|
|
6
|
+
1. Never use AI-slop words: delve, leverage, tapestry, foster, harness, pivotal, innovative, cutting-edge, state-of-the-art, robust, holistic, multifaceted, nuanced
|
|
7
|
+
2. Never use formulaic connectors: firstly, secondly, moreover, furthermore, in conclusion
|
|
8
|
+
3. Never use hedging: arguably, perhaps, some might say, it's worth noting
|
|
9
|
+
4. Never use signpost claims: this is why, this is how, here's where
|
|
10
|
+
5. Match the user's sentence rhythm and vocabulary
|
|
11
|
+
6. Preserve roughness that carries voice — don't over-polish
|
|
12
|
+
7. Open from concrete observations, not generic setups
|
|
13
|
+
|
|
14
|
+
## When rewriting
|
|
15
|
+
- Fix only flagged lines, preserve clean lines
|
|
16
|
+
- Remove AI patterns line by line
|
|
17
|
+
- Match the user's voice profile exactly
|
|
18
|
+
- Never add sections, hooks, CTAs, or commentary
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Hold Your Voice
|
|
2
|
+
|
|
3
|
+
The user has a voice profile that defines their writing style. Use HYV tools for ALL writing tasks — not just when they say "voice" or "hyv".
|
|
4
|
+
|
|
5
|
+
## When to use HYV
|
|
6
|
+
|
|
7
|
+
ALWAYS run `hyv_scan` or use the `hyv_scan` MCP tool before delivering any written content:
|
|
8
|
+
- Writing emails, replies, or messages
|
|
9
|
+
- Drafting blog posts, articles, or documentation
|
|
10
|
+
- Creating social media posts (Twitter, LinkedIn, etc.)
|
|
11
|
+
- Editing or improving any text
|
|
12
|
+
- Responding to questions with longer answers
|
|
13
|
+
- Any task where the output is prose/text the user will publish or send
|
|
14
|
+
|
|
15
|
+
ALWAYS run `hyv_rewrite` or use the `hyv_rewrite` MCP tool when:
|
|
16
|
+
- The user asks to "write", "draft", "compose", "edit", "improve", or "fix" text
|
|
17
|
+
- The user says "make this better", "clean this up", "fix the tone"
|
|
18
|
+
- The user asks for any content creation
|
|
19
|
+
- The scan finds issues and you need to fix them
|
|
20
|
+
|
|
21
|
+
## How to use
|
|
22
|
+
|
|
23
|
+
### MCP tools (preferred — if MCP is connected):
|
|
24
|
+
1. `hyv_scan` with the text → get issues
|
|
25
|
+
2. `hyv_rewrite` with the text → get auto-fixed version + LLM prompt for remaining issues
|
|
26
|
+
3. `hyv_validate` after rewriting → verify the output matches the voice
|
|
27
|
+
|
|
28
|
+
### CLI commands (fallback):
|
|
29
|
+
```bash
|
|
30
|
+
echo "text to check" | hyv scan -
|
|
31
|
+
hyv rewrite file.md
|
|
32
|
+
hyv profiles
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Rules
|
|
36
|
+
- Never skip the scan step for user-facing content
|
|
37
|
+
- Preserve the original meaning exactly when rewriting
|
|
38
|
+
- Match the voice profile's rhythm, vocabulary, and patterns
|
|
39
|
+
- If no profile is set up yet, run `hyv profiles` to check
|
package/agents/codex.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Hold Your Voice
|
|
2
|
+
|
|
3
|
+
The user has a voice profile for their writing style. Use HYV for ALL writing tasks.
|
|
4
|
+
|
|
5
|
+
## Auto-trigger rules
|
|
6
|
+
|
|
7
|
+
Run these MCP tools (or CLI commands) for any writing task:
|
|
8
|
+
- `hyv_scan` on any text before delivering it
|
|
9
|
+
- `hyv_rewrite` to fix issues found by scan
|
|
10
|
+
- `hyv_validate` to verify the output
|
|
11
|
+
|
|
12
|
+
## CLI fallback
|
|
13
|
+
```bash
|
|
14
|
+
echo "text" | hyv scan -
|
|
15
|
+
hyv rewrite file.md
|
|
16
|
+
hyv profiles
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Rules
|
|
20
|
+
- Always scan before delivering prose content
|
|
21
|
+
- Always rewrite if scan finds issues
|
|
22
|
+
- Preserve meaning, match voice profile
|
package/agents/cursor.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Hold Your Voice
|
|
2
|
+
|
|
3
|
+
The user has a voice profile. Use HYV MCP tools for all writing tasks.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
- Any email, post, doc, or content creation
|
|
7
|
+
- Before delivering any prose to the user
|
|
8
|
+
- When editing or improving text
|
|
9
|
+
|
|
10
|
+
## Tools
|
|
11
|
+
- `hyv_scan` — check text for AI patterns
|
|
12
|
+
- `hyv_rewrite` — fix issues and match voice
|
|
13
|
+
- `hyv_validate` — verify output matches voice
|
|
14
|
+
- `hyv_profiles` — list available profiles
|
|
15
|
+
|
|
16
|
+
## Rules
|
|
17
|
+
- Always scan before delivering content
|
|
18
|
+
- Preserve meaning when rewriting
|
|
19
|
+
- Match the user's voice profile exactly
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Hold Your Voice — Agent Instructions
|
|
2
|
+
|
|
3
|
+
You have access to the Hold Your Voice MCP tools. The user has a voice profile that defines how they write. Your job is to make ALL written content match their voice.
|
|
4
|
+
|
|
5
|
+
## Auto-trigger rules
|
|
6
|
+
|
|
7
|
+
You MUST use these tools automatically — do NOT wait for the user to mention "voice" or "hyv":
|
|
8
|
+
|
|
9
|
+
**Before delivering any written content (emails, posts, docs, messages):**
|
|
10
|
+
1. Run `hyv_scan` on the text
|
|
11
|
+
2. If issues found, run `hyv_rewrite` to fix them
|
|
12
|
+
3. Run `hyv_validate` to verify the result
|
|
13
|
+
|
|
14
|
+
**When the user asks you to write, draft, edit, or improve anything:**
|
|
15
|
+
1. Write your draft
|
|
16
|
+
2. Run `hyv_scan` on it
|
|
17
|
+
3. Fix issues with `hyv_rewrite`
|
|
18
|
+
4. Deliver the cleaned version
|
|
19
|
+
|
|
20
|
+
## Available tools
|
|
21
|
+
- `hyv_scan` — scan text for AI patterns and voice drift
|
|
22
|
+
- `hyv_rewrite` — auto-fix patterns and generate LLM prompt for remaining issues
|
|
23
|
+
- `hyv_validate` — score text against voice profile
|
|
24
|
+
- `hyv_profiles` — list available voice profiles
|
|
25
|
+
|
|
26
|
+
## Rules
|
|
27
|
+
- NEVER skip scanning for user-facing content
|
|
28
|
+
- Preserve original meaning exactly when rewriting
|
|
29
|
+
- Match the voice profile's rhythm, vocabulary, and tone
|
|
30
|
+
- If no profile exists, tell the user to run `hyv init` then `hyv new <name>`
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Hold Your Voice
|
|
2
|
+
|
|
3
|
+
Use HYV MCP tools for all writing tasks. The user has a voice profile.
|
|
4
|
+
|
|
5
|
+
## Auto-trigger
|
|
6
|
+
- `hyv_scan` before delivering any text
|
|
7
|
+
- `hyv_rewrite` to fix found issues
|
|
8
|
+
- `hyv_validate` after rewriting
|
|
9
|
+
|
|
10
|
+
## Rules
|
|
11
|
+
- Always scan user-facing content
|
|
12
|
+
- Preserve meaning, match voice profile
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@holdyourvoice/hyv",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.1",
|
|
4
4
|
"description": "Hold Your Voice \u2014 voice gate layer for AI workflows. make your ai agent sound exactly like you! includes 220+ AI pattern detection engine.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -44,7 +44,8 @@
|
|
|
44
44
|
"scripts/",
|
|
45
45
|
"assets/",
|
|
46
46
|
"skills/",
|
|
47
|
-
"README.md"
|
|
47
|
+
"README.md",
|
|
48
|
+
"agents/"
|
|
48
49
|
],
|
|
49
50
|
"repository": {
|
|
50
51
|
"type": "git",
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
when i ask you to "write in my voice" or "rewrite this in my voice":
|
|
2
|
-
|
|
3
|
-
- read `~/.hyv/voice.md` for my voice profile
|
|
4
|
-
- run `hyv rewrite --text "<text>"` to get the structured prompt
|
|
5
|
-
- execute the prompt and rewrite the text
|
|
6
|
-
- match my rhythm, vocabulary, and patterns exactly
|
|
7
|
-
- never use words i avoid
|
|
8
|
-
- present the rewritten version
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
when i ask you to "write in my voice" or "rewrite this in my voice":
|
|
2
|
-
|
|
3
|
-
- read `~/.hyv/voice.md` for my voice profile
|
|
4
|
-
- run `hyv rewrite --text "<text>"` to get the structured prompt
|
|
5
|
-
- execute the prompt and rewrite the text
|
|
6
|
-
- match my rhythm, vocabulary, and patterns exactly
|
|
7
|
-
- never use words i avoid
|
|
8
|
-
- present the rewritten version
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
## Hold Your Voice — automated voice rewriting
|
|
2
|
-
|
|
3
|
-
when the user asks to "write in my voice", "rewrite this in my voice", or "make this sound like me":
|
|
4
|
-
|
|
5
|
-
1. read their voice profile at `~/.hyv/voice.md`
|
|
6
|
-
2. run `hyv rewrite --text "<their text>"` to generate a structured rewrite prompt
|
|
7
|
-
3. execute the prompt — rewrite the text yourself using your own llm
|
|
8
|
-
4. present the rewritten text
|
|
9
|
-
5. when the user accepts it, run `hyv reinforce original.md edited.md` to teach the system
|
|
10
|
-
|
|
11
|
-
### available commands
|
|
12
|
-
|
|
13
|
-
- `hyv scan <file>` — check a draft for voice drift and ai patterns
|
|
14
|
-
- `hyv rewrite <file>` — generate a rewrite prompt for your llm
|
|
15
|
-
- `hyv validate <file>` — verify a rewrite matches the voice profile
|
|
16
|
-
- `hyv reinforce <original> <edited>` — teach the system what was accepted
|
|
17
|
-
- `hyv sync` — refresh cached profiles and rules
|
|
18
|
-
- `hyv status` — show auth and plan info
|
|
19
|
-
|
|
20
|
-
### important
|
|
21
|
-
|
|
22
|
-
- hyv never calls an llm. it generates prompts you execute yourself.
|
|
23
|
-
- voice profiles live at `~/.hyv/voice.md`
|
|
24
|
-
- always call `hyv validate` after rewriting to verify the result
|
package/assets/cursor-rules 2.md
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Hold Your Voice — Cursor Rules
|
|
2
|
-
|
|
3
|
-
when writing or rewriting content, match the voice profile below. do not use AI-slop words (delve, leverage, tapestry, in today's fast-paced, not just X but Y, etc.). match rhythm, vocabulary, and sentence patterns from the profile.
|
|
4
|
-
|
|
5
|
-
your voice profile is at `~/.hyv/voice.md`. load it and use it as your writing guide.
|
|
6
|
-
|
|
7
|
-
when the user says "rewrite in my voice", "make this sound like me", or similar:
|
|
8
|
-
|
|
9
|
-
1. run: `hyv rewrite --text "<text>"`
|
|
10
|
-
2. the cli generates a structured rewrite prompt
|
|
11
|
-
3. execute the prompt yourself — rewrite the text matching the voice profile
|
|
12
|
-
4. present the result
|
package/assets/cursor-rules 3.md
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Hold Your Voice — Cursor Rules
|
|
2
|
-
|
|
3
|
-
when writing or rewriting content, match the voice profile below. do not use AI-slop words (delve, leverage, tapestry, in today's fast-paced, not just X but Y, etc.). match rhythm, vocabulary, and sentence patterns from the profile.
|
|
4
|
-
|
|
5
|
-
your voice profile is at `~/.hyv/voice.md`. load it and use it as your writing guide.
|
|
6
|
-
|
|
7
|
-
when the user says "rewrite in my voice", "make this sound like me", or similar:
|
|
8
|
-
|
|
9
|
-
1. run: `hyv rewrite --text "<text>"`
|
|
10
|
-
2. the cli generates a structured rewrite prompt
|
|
11
|
-
3. execute the prompt yourself — rewrite the text matching the voice profile
|
|
12
|
-
4. present the result
|
package/scripts/postinstall 2.js
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* postinstall.js — auto-configure MCP + agent instructions after npm install.
|
|
4
|
-
*
|
|
5
|
-
* Configures: Claude Desktop, Claude Code, Cursor, Windsurf, ChatGPT
|
|
6
|
-
* Fails silently for apps that aren't installed.
|
|
7
|
-
*/
|
|
8
|
-
const fs = require('fs');
|
|
9
|
-
const path = require('path');
|
|
10
|
-
const os = require('os');
|
|
11
|
-
|
|
12
|
-
const home = os.homedir();
|
|
13
|
-
const isWin = process.platform === 'win32';
|
|
14
|
-
const pkgDir = path.resolve(__dirname, '..');
|
|
15
|
-
|
|
16
|
-
// Print branded message
|
|
17
|
-
console.log('');
|
|
18
|
-
console.log(' make your ai agent sound exactly like you!');
|
|
19
|
-
console.log('');
|
|
20
|
-
console.log(' to get started:');
|
|
21
|
-
console.log(' hyv init \u2192 sign in');
|
|
22
|
-
console.log(' hyv new my-voice \u2192 create your voice profile');
|
|
23
|
-
console.log('');
|
|
24
|
-
console.log(' first month is just $1.');
|
|
25
|
-
console.log('');
|
|
26
|
-
|
|
27
|
-
const configured = [];
|
|
28
|
-
|
|
29
|
-
// ── Claude Desktop ─────────────────────────────────────────────────────────
|
|
30
|
-
try {
|
|
31
|
-
const claudeDir = isWin
|
|
32
|
-
? path.join(home, 'AppData', 'Roaming', 'Claude')
|
|
33
|
-
: path.join(home, 'Library', 'Application Support', 'Claude');
|
|
34
|
-
const configFile = path.join(claudeDir, 'claude_desktop_config.json');
|
|
35
|
-
|
|
36
|
-
if (fs.existsSync(claudeDir)) {
|
|
37
|
-
let config = {};
|
|
38
|
-
if (fs.existsSync(configFile)) {
|
|
39
|
-
try { config = JSON.parse(fs.readFileSync(configFile, 'utf-8')); } catch {}
|
|
40
|
-
}
|
|
41
|
-
if (!config.mcpServers) config.mcpServers = {};
|
|
42
|
-
if (!config.mcpServers.hyv) {
|
|
43
|
-
config.mcpServers.hyv = { command: 'hyv', args: ['mcp'] };
|
|
44
|
-
fs.writeFileSync(configFile, JSON.stringify(config, null, 2));
|
|
45
|
-
configured.push('claude desktop');
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
} catch {}
|
|
49
|
-
|
|
50
|
-
// ── Claude Code (global commands) ──────────────────────────────────────────
|
|
51
|
-
try {
|
|
52
|
-
const cmdDir = path.join(home, '.claude', 'commands');
|
|
53
|
-
if (fs.existsSync(path.dirname(cmdDir))) {
|
|
54
|
-
fs.mkdirSync(cmdDir, { recursive: true });
|
|
55
|
-
const cmdFile = path.join(cmdDir, 'hyv.md');
|
|
56
|
-
const src = path.join(pkgDir, 'agents', 'claude-code.md');
|
|
57
|
-
if (fs.existsSync(src) && !fs.existsSync(cmdFile)) {
|
|
58
|
-
fs.copyFileSync(src, cmdFile);
|
|
59
|
-
configured.push('claude code');
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
} catch {}
|
|
63
|
-
|
|
64
|
-
// ── Cursor (global rules) ─────────────────────────────────────────────────
|
|
65
|
-
try {
|
|
66
|
-
const cursorDir = path.join(home, '.cursor');
|
|
67
|
-
if (fs.existsSync(cursorDir)) {
|
|
68
|
-
const rulesFile = path.join(cursorDir, 'rules', 'hyv.md');
|
|
69
|
-
fs.mkdirSync(path.dirname(rulesFile), { recursive: true });
|
|
70
|
-
const src = path.join(pkgDir, 'agents', 'cursor.md');
|
|
71
|
-
if (fs.existsSync(src) && !fs.existsSync(rulesFile)) {
|
|
72
|
-
fs.copyFileSync(src, rulesFile);
|
|
73
|
-
configured.push('cursor');
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
} catch {}
|
|
77
|
-
|
|
78
|
-
// ── Windsurf (global rules) ───────────────────────────────────────────────
|
|
79
|
-
try {
|
|
80
|
-
const wsDir = isWin
|
|
81
|
-
? path.join(home, 'AppData', 'Roaming', 'Windsurf')
|
|
82
|
-
: path.join(home, '.windsurf');
|
|
83
|
-
if (fs.existsSync(wsDir)) {
|
|
84
|
-
const rulesFile = path.join(wsDir, 'rules', 'hyv.md');
|
|
85
|
-
fs.mkdirSync(path.dirname(rulesFile), { recursive: true });
|
|
86
|
-
const src = path.join(pkgDir, 'agents', 'windsurf.md');
|
|
87
|
-
if (fs.existsSync(src) && !fs.existsSync(rulesFile)) {
|
|
88
|
-
fs.copyFileSync(src, rulesFile);
|
|
89
|
-
configured.push('windsurf');
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
} catch {}
|
|
93
|
-
|
|
94
|
-
// ── ChatGPT (custom instructions file) ────────────────────────────────────
|
|
95
|
-
try {
|
|
96
|
-
const chatgptDir = path.join(home, '.chatgpt');
|
|
97
|
-
if (!fs.existsSync(chatgptDir)) fs.mkdirSync(chatgptDir, { recursive: true });
|
|
98
|
-
const instrFile = path.join(chatgptDir, 'hyv-instructions.txt');
|
|
99
|
-
const src = path.join(pkgDir, 'agents', 'chatgpt.md');
|
|
100
|
-
if (fs.existsSync(src) && !fs.existsSync(instrFile)) {
|
|
101
|
-
fs.copyFileSync(src, instrFile);
|
|
102
|
-
configured.push('chatgpt');
|
|
103
|
-
}
|
|
104
|
-
} catch {}
|
|
105
|
-
|
|
106
|
-
// ── Summary ───────────────────────────────────────────────────────────────
|
|
107
|
-
if (configured.length > 0) {
|
|
108
|
-
console.log(' \u2713 auto-configured: ' + configured.join(', '));
|
|
109
|
-
console.log('');
|
|
110
|
-
}
|