@demig0d2/skills 1.0.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.
Files changed (29) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/bin/cli.js +313 -0
  4. package/package.json +44 -0
  5. package/skills/book-writer/SKILL.md +1396 -0
  6. package/skills/book-writer/references/kdp_specs.md +139 -0
  7. package/skills/book-writer/scripts/kdp_check.py +255 -0
  8. package/skills/book-writer/scripts/toc_extract.py +151 -0
  9. package/skills/book-writer/scripts/word_count.py +196 -0
  10. package/skills/chapter-auditor/SKILL.md +231 -0
  11. package/skills/chapter-auditor/scripts/score_report.py +237 -0
  12. package/skills/concept-expander/SKILL.md +170 -0
  13. package/skills/concept-expander/scripts/validate_concept.py +255 -0
  14. package/skills/continuity-tracker/SKILL.md +251 -0
  15. package/skills/continuity-tracker/references/log_schema.md +149 -0
  16. package/skills/continuity-tracker/scripts/conflict_check.py +179 -0
  17. package/skills/continuity-tracker/scripts/log_manager.py +258 -0
  18. package/skills/humanizer/SKILL.md +632 -0
  19. package/skills/humanizer/references/patterns_quick_ref.md +71 -0
  20. package/skills/humanizer/scripts/dna_scan.py +168 -0
  21. package/skills/humanizer/scripts/scan_ai_patterns.py +279 -0
  22. package/skills/overhaul/SKILL.md +697 -0
  23. package/skills/overhaul/references/upgrade_checklist.md +81 -0
  24. package/skills/overhaul/scripts/changelog_gen.py +183 -0
  25. package/skills/overhaul/scripts/skill_parser.py +265 -0
  26. package/skills/overhaul/scripts/version_bump.py +128 -0
  27. package/skills/research-aggregator/SKILL.md +194 -0
  28. package/skills/research-aggregator/references/thinkers_reference.md +104 -0
  29. package/skills/research-aggregator/scripts/bank_formatter.py +206 -0
@@ -0,0 +1,194 @@
1
+ ---
2
+ name: research-aggregator
3
+ version: 1.0.0
4
+ description: |
5
+ Given a book's concept document and TOC, aggregates relevant quotes, thinkers,
6
+ frameworks, data points, anecdotes, and philosophical references — organized by
7
+ chapter — for use during the writing phase. Use after TOC is approved and before
8
+ chapter writing begins. Produces a Research Bank document the book-writer draws from.
9
+ Do NOT use for fiction books where no external references are needed.
10
+ allowed-tools:
11
+ - Read
12
+ - Write
13
+ - Bash
14
+ - WebSearch
15
+ ---
16
+
17
+ # Research Aggregator
18
+
19
+ ## Scripts
20
+
21
+ Save the research bank as `research_bank.json` after building it.
22
+
23
+ **Validate bank quality** (checks quote lengths, banned sources, missing fields):
24
+ ```bash
25
+ python scripts/bank_formatter.py research_bank.json --validate
26
+ ```
27
+
28
+ **View formatted bank:**
29
+ ```bash
30
+ python scripts/bank_formatter.py research_bank.json
31
+ python scripts/bank_formatter.py research_bank.json --chapter 3 # single chapter
32
+ ```
33
+
34
+ **Export as JSON for pipeline use:**
35
+ ```bash
36
+ python scripts/bank_formatter.py research_bank.json --json
37
+ ```
38
+
39
+ ## References
40
+
41
+ `references/thinkers_reference.md` — Curated thinkers, works, and pre-validated quotes
42
+ aligned with Vivid's genres (Philosophy/Essay, Self-help, Non-fiction/Technical).
43
+ Read when: building philosophical anchors or selecting quotes for any chapter.
44
+
45
+ **Always read the thinkers reference before selecting sources.**
46
+ It includes a banned sources list and overexposed quotes to avoid.
47
+
48
+ You build the Research Bank — a structured reference document organized by chapter that
49
+ the book-writer draws from during writing. Quality over quantity. Every item must earn
50
+ its place by being genuinely usable in the writing, not just topically adjacent.
51
+
52
+ ---
53
+
54
+ ## TRIGGER
55
+
56
+ Activate after Phase 4 (TOC approval) in the book-writing workflow, or when the user says:
57
+ - "Find references for my book"
58
+ - "Research this topic for my book"
59
+ - "Build a research bank for [book title/topic]"
60
+
61
+ ---
62
+
63
+ ## INPUT REQUIRED
64
+
65
+ 1. The approved Table of Contents (chapter titles + structure)
66
+ 2. The concept document (especially: core question, themes, reader profile)
67
+ 3. Genre (determines what kind of research is most useful)
68
+
69
+ ---
70
+
71
+ ## RESEARCH CATEGORIES
72
+
73
+ For each chapter, gather items across these categories (not all are needed for every chapter):
74
+
75
+ ### A. Philosophical / Intellectual Anchors
76
+ Thinkers, frameworks, or ideas that resonate with the chapter's theme.
77
+ Format: `[Thinker/Work] — [Core idea in 1 sentence] — [How it connects to this chapter]`
78
+
79
+ Vivid's approach: he arrives at these truths through experience, then names the concept.
80
+ So these are NOT citations to use directly — they're conceptual validation. Max 1 per chapter
81
+ should appear in the final text. The rest are background scaffolding.
82
+
83
+ Priority thinkers for Vivid's genres:
84
+ - Philosophy of identity: Epictetus, Marcus Aurelius, Simone de Beauvoir, Sartre, Camus
85
+ - Solitude / inner life: Rilke, Thoreau, Pascal, Kierkegaard, Montaigne
86
+ - Psychology of self: Carl Rogers, Viktor Frankl, Nathaniel Branden
87
+ - Eastern frameworks: Stoicism, Advaita Vedanta concepts (non-attachment, witness consciousness)
88
+ - Modern psychology: attachment theory, self-determination theory, cognitive defusion (ACT)
89
+
90
+ ### B. Empirical / Research Anchors
91
+ Studies, data, or documented findings relevant to the chapter's claims.
92
+ Format: `[Finding in plain English] — [Source if known or searchable] — [Chapter application]`
93
+
94
+ Use sparingly — Vivid is not a data-heavy writer. 1–2 per chapter max.
95
+ Prioritize: psychology studies, behavioral research, neuroscience of emotion.
96
+
97
+ ### C. Quotes
98
+ Powerful, precise quotes that could open a chapter or punctuate a key insight.
99
+ Format: `"[Quote]" — [Author, Work if known]`
100
+
101
+ Standards for a usable quote:
102
+ - Under 30 words
103
+ - Not overused (no "Be the change," no "The unexamined life")
104
+ - Says something that earns a standalone line
105
+ - Vivid would have thought of this himself — the quote confirms, not compensates
106
+
107
+ ### D. Anecdote / Case Study Templates
108
+ Brief real-world examples or documented cases that illustrate the chapter's theme.
109
+ These are NOT about name-dropping celebrities. Prioritize: ordinary people, historical figures
110
+ with specific documented experiences, or well-known stories with fresh angles.
111
+
112
+ ### E. Conceptual Oppositions
113
+ The strongest counterargument to the chapter's central claim. Useful for:
114
+ - Anticipating reader resistance
115
+ - Building nuance into the argument
116
+ - Structuring the "wrong attempts" section of the pain-to-transformation arc
117
+
118
+ ---
119
+
120
+ ## OUTPUT FORMAT
121
+
122
+ Produce one Research Bank document structured like this:
123
+
124
+ ```
125
+ RESEARCH BANK — [Book Title]
126
+ Generated for: [TOC chapters listed]
127
+ ═══════════════════════════════════════════════════════
128
+
129
+ GLOBAL ANCHORS (apply to the whole book, not a single chapter)
130
+ ───────────────────────────────────────────────────────
131
+ [3–5 foundational ideas/thinkers/quotes that are thematic to the entire manuscript]
132
+
133
+ ═══════════════════════════════════════════════════════
134
+
135
+ CHAPTER 1: [Title]
136
+ ───────────────────────────────────────────────────────
137
+ Theme reminder: [one sentence on what this chapter is about]
138
+
139
+ Philosophical anchors:
140
+ • [item]
141
+ • [item]
142
+
143
+ Quotes:
144
+ • "[quote]" — [Author]
145
+ • "[quote]" — [Author]
146
+
147
+ Research/data:
148
+ • [finding + source]
149
+
150
+ Conceptual opposition:
151
+ • [The best argument against this chapter's claim]
152
+
153
+ Writing notes:
154
+ [Any specific suggestions for how to deploy this research in Vivid's style —
155
+ e.g., "Don't cite Epictetus directly — arrive at his conclusion through the story,
156
+ then let the quote confirm it at the end"]
157
+
158
+ ═══════════════════════════════════════════════════════
159
+
160
+ CHAPTER 2: [Title]
161
+ [same structure]
162
+
163
+ ...
164
+ ═══════════════════════════════════════════════════════
165
+
166
+ UNUSED BUT NOTABLE
167
+ [Interesting material that didn't fit a specific chapter but could be useful]
168
+ ```
169
+
170
+ ---
171
+
172
+ ## QUALITY FILTERS
173
+
174
+ Before adding any item to the Research Bank, ask:
175
+ 1. Would Vivid actually use this? (Does it fit his voice and approach?)
176
+ 2. Is this specific enough to be useful? (No vague attributions — "researchers say" fails)
177
+ 3. Does this enrich or just decorate? (Decoration gets cut)
178
+ 4. Is the quote clean enough to stand alone without explanation?
179
+
180
+ Remove anything that fails these filters.
181
+
182
+ ---
183
+
184
+ ## VIVID-SPECIFIC RESEARCH RULES
185
+
186
+ - **No pop-psychology self-help citations** (no Tony Robbins, no Brené Brown framework
187
+ names, no "growth mindset")
188
+ - **No overexposed quotes** (Einstein on insanity, Churchill, Mandela patience quote)
189
+ - **Prioritize: philosophers who wrote from lived struggle** (Marcus Aurelius in war,
190
+ Frankl in camps, Montaigne in grief)
191
+ - **Favor precision over prestige** — a precise quote from an unknown thinker beats a
192
+ famous vague one
193
+ - **Eastern philosophy welcome but used lightly** — Vivid's framework is his own; external
194
+ philosophy is seasoning, not the meal
@@ -0,0 +1,104 @@
1
+ # Thinkers Reference — Vivid's Genres
2
+
3
+ Curated reference of thinkers, works, and ideas aligned with Vivid's
4
+ writing genres: Philosophy/Essay, Self-help/Motivational, Non-fiction/Technical.
5
+
6
+ Use as scaffolding — not direct citation. Vivid arrives at these conclusions
7
+ through experience, then names them simply. Max 1 citation per chapter.
8
+
9
+ ---
10
+
11
+ ## SOLITUDE & INNER LIFE
12
+
13
+ | Thinker | Key Work | Core Idea | Chapter Applications |
14
+ |---|---|---|---|
15
+ | Rainer Maria Rilke | Letters to a Young Poet | Solitude as the place where creation and self-knowledge happen | Chapters on embracing aloneness, inner world |
16
+ | Blaise Pascal | Pensées | "All of humanity's problems stem from man's inability to sit quietly in a room alone" | Chapters on distraction, running from self |
17
+ | Henry David Thoreau | Walden | Deliberate solitude as the condition for genuine life | Chapters on choosing aloneness |
18
+ | Søren Kierkegaard | The Sickness Unto Death | The self must relate itself to itself | Chapters on self-relationship, identity |
19
+ | Michel de Montaigne | Essays | "The greatest thing in the world is to know how to belong to oneself" | Chapter closings, independence |
20
+
21
+ ---
22
+
23
+ ## PHILOSOPHY OF IDENTITY & SELF
24
+
25
+ | Thinker | Key Work | Core Idea | Chapter Applications |
26
+ |---|---|---|---|
27
+ | Epictetus | Enchiridion | Distinguish what is in your control from what is not | Chapters on letting go, acceptance |
28
+ | Marcus Aurelius | Meditations | The inner citadel — strength from within regardless of external events | Emotional independence chapters |
29
+ | Albert Camus | The Myth of Sisyphus | Finding meaning in the absence of inherent meaning | Chapters on finding purpose alone |
30
+ | Jean-Paul Sartre | Existentialism is a Humanism | Existence precedes essence — you define yourself | Identity chapters |
31
+ | Viktor Frankl | Man's Search for Meaning | Meaning can be found in suffering; no one can take your inner freedom | Chapters on finding strength in hardship |
32
+
33
+ ---
34
+
35
+ ## PSYCHOLOGY OF SELF & RELATIONSHIPS
36
+
37
+ | Thinker | Key Work | Core Idea | Chapter Applications |
38
+ |---|---|---|---|
39
+ | Carl Rogers | On Becoming a Person | Unconditional positive self-regard as the foundation of health | Self-acceptance chapters |
40
+ | Nathaniel Branden | The Six Pillars of Self-Esteem | Self-esteem as self-efficacy + self-respect | Self-worth chapters |
41
+ | John Bowlby | Attachment Theory | Anxious attachment drives compulsive connection-seeking | Chapters on chasing connection |
42
+ | Harriet Lerner | The Dance of Anger | Pursuing and distancing patterns in relationships | Chapters on relational patterns |
43
+
44
+ ---
45
+
46
+ ## EASTERN & CONTEMPLATIVE FRAMEWORKS
47
+
48
+ | Framework | Core Idea | Chapter Applications |
49
+ |---|---|---|
50
+ | Non-attachment (Buddhist/Vedic) | Suffering arises from clinging — to people, outcomes, self-image | Chapters on letting go of outcomes |
51
+ | Witness consciousness (Advaita) | The observer within who watches without judgment | Chapters on self-reflection |
52
+ | Stoic practice | Focus exclusively on what is within your sphere of influence | Chapters on control, acceptance |
53
+ | Wabi-sabi (Japanese) | Finding beauty in imperfection and impermanence | Chapters on accepting the self as incomplete |
54
+
55
+ ---
56
+
57
+ ## QUOTES — VIVID-APPROPRIATE (pre-validated)
58
+
59
+ All under 30 words. None overexposed.
60
+
61
+ **Solitude & Self:**
62
+ - "The capacity to be alone is the capacity to love." — Osho
63
+ - "In solitude the mind gains strength and learns to lean upon itself." — Laurence Sterne
64
+ - "I exist as I am, that is enough." — Walt Whitman
65
+ - "To be alone is to be different, to be different is to be alone." — Suzanne Gordon
66
+
67
+ **Identity & Strength:**
68
+ - "He who knows others is wise; he who knows himself is enlightened." — Lao Tzu
69
+ - "You are enough just as you are." — Meghan Markle (quoting Brené Brown — better to find original)
70
+ - "The privilege of a lifetime is to become who you truly are." — Carl Jung
71
+ - "Without great solitude, no serious work is possible." — Pablo Picasso
72
+
73
+ **Pain & Growth:**
74
+ - "The wound is the place where the Light enters you." — Rumi
75
+ - "Out of suffering have emerged the strongest souls." — Khalil Gibran
76
+ - "Rock bottom became the solid foundation on which I rebuilt my life." — J.K. Rowling
77
+
78
+ ---
79
+
80
+ ## WHAT TO AVOID
81
+
82
+ ### Sources that conflict with Vivid's voice:
83
+ - Tony Robbins, Brené Brown (pop psychology — too mainstream)
84
+ - Gary Vee, Grant Cardone (hustle culture)
85
+ - Marie Kondo, life-hack culture
86
+ - Any quote from a "motivational poster"
87
+
88
+ ### Overexposed quotes (never use):
89
+ - "Be the change you wish to see in the world" (misattributed to Gandhi)
90
+ - "The unexamined life is not worth living" (Socrates — too academic)
91
+ - "Insanity is doing the same thing and expecting different results" (misattributed to Einstein)
92
+ - "You miss 100% of the shots you don't take" (Wayne Gretzky via Michael Scott)
93
+ - "In the middle of difficulty lies opportunity" (Einstein)
94
+
95
+ ---
96
+
97
+ ## HOW TO USE THIS REFERENCE
98
+
99
+ 1. Identify the chapter's core theme
100
+ 2. Find 1–2 relevant thinkers from this list
101
+ 3. Note the **core idea** — use this as scaffolding, not as text
102
+ 4. Write the chapter so Vivid arrives at this idea through experience
103
+ 5. If the quote is perfect and under 30 words: use it once, at the end, to confirm
104
+ 6. Never open a chapter with a quote from a thinker — earn the insight first
@@ -0,0 +1,206 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ bank_formatter.py — Format and validate a research bank
4
+
5
+ Reads a research bank JSON or markdown file and outputs a
6
+ structured, validated bank ready for the book-writer to use.
7
+ Also validates quote lengths and source attribution.
8
+
9
+ Usage:
10
+ python bank_formatter.py <bank.json>
11
+ python bank_formatter.py <bank.json> --chapter 3
12
+ python bank_formatter.py <bank.json> --validate
13
+ python bank_formatter.py <bank.json> --markdown
14
+ """
15
+
16
+ import sys
17
+ import re
18
+ import json
19
+ import argparse
20
+ from pathlib import Path
21
+
22
+ MAX_QUOTE_WORDS = 30
23
+
24
+ # ─── Banned / Overexposed Terms ───────────────────────────────────────────────
25
+
26
+ BANNED_SOURCES = [
27
+ "tony robbins", "brené brown", "marie kondo", "simon sinek",
28
+ "gary vee", "gary vaynerchuk", "oprah",
29
+ ]
30
+
31
+ OVEREXPOSED_QUOTES = [
32
+ "be the change you wish to see",
33
+ "the unexamined life is not worth living",
34
+ "insanity is doing the same thing",
35
+ "you miss 100% of the shots",
36
+ "it always seems impossible until it's done",
37
+ "in the middle of difficulty lies opportunity",
38
+ "the only way to do great work",
39
+ ]
40
+
41
+
42
+ def validate_quote(quote: str) -> list:
43
+ """Return list of issues with a quote."""
44
+ issues = []
45
+ words = quote.split()
46
+ if len(words) > MAX_QUOTE_WORDS:
47
+ issues.append(f"Quote too long ({len(words)} words, max {MAX_QUOTE_WORDS})")
48
+
49
+ quote_lower = quote.lower()
50
+ for overexposed in OVEREXPOSED_QUOTES:
51
+ if overexposed in quote_lower:
52
+ issues.append(f"Overexposed quote detected — find something more original")
53
+ break
54
+
55
+ return issues
56
+
57
+
58
+ def validate_source(source: str) -> list:
59
+ """Return list of issues with a source attribution."""
60
+ issues = []
61
+ source_lower = source.lower()
62
+
63
+ for banned in BANNED_SOURCES:
64
+ if banned in source_lower:
65
+ issues.append(f"Pop-psychology source not aligned with Vivid's voice: {source}")
66
+
67
+ if source.lower() in ("unknown", "anonymous", "") :
68
+ issues.append("Source is unknown — verify or remove")
69
+
70
+ return issues
71
+
72
+
73
+ def validate_bank(bank: dict) -> dict:
74
+ """Run full validation on a research bank."""
75
+ all_issues = []
76
+
77
+ for chapter_key, chapter_data in bank.get("chapters", {}).items():
78
+ chapter_issues = []
79
+
80
+ for quote_item in chapter_data.get("quotes", []):
81
+ quote = quote_item.get("quote", "")
82
+ source = quote_item.get("source", "")
83
+ q_issues = validate_quote(quote)
84
+ s_issues = validate_source(source)
85
+ if q_issues or s_issues:
86
+ chapter_issues.append({
87
+ "chapter": chapter_key,
88
+ "type": "quote",
89
+ "content": quote[:60],
90
+ "issues": q_issues + s_issues,
91
+ })
92
+
93
+ for anchor in chapter_data.get("philosophical_anchors", []):
94
+ if not anchor.get("connection"):
95
+ chapter_issues.append({
96
+ "chapter": chapter_key,
97
+ "type": "anchor",
98
+ "content": str(anchor)[:60],
99
+ "issues": ["Missing 'connection' field — how does this relate to the chapter?"],
100
+ })
101
+
102
+ all_issues.extend(chapter_issues)
103
+
104
+ return {
105
+ "total_issues": len(all_issues),
106
+ "clean": len(all_issues) == 0,
107
+ "issues": all_issues,
108
+ }
109
+
110
+
111
+ def format_chapter_bank(chapter_key: str, chapter_data: dict) -> str:
112
+ lines = []
113
+ lines.append(f"\n{'─' * 56}")
114
+ lines.append(f"CHAPTER {chapter_key}: {chapter_data.get('title', '')}")
115
+ lines.append(f"Theme: {chapter_data.get('theme', 'Not specified')}")
116
+
117
+ anchors = chapter_data.get("philosophical_anchors", [])
118
+ if anchors:
119
+ lines.append(f"\nPhilosophical anchors:")
120
+ for a in anchors:
121
+ thinker = a.get("thinker", "Unknown")
122
+ idea = a.get("idea", "")
123
+ connection = a.get("connection", "")
124
+ lines.append(f" • {thinker} — {idea}")
125
+ if connection:
126
+ lines.append(f" → {connection}")
127
+
128
+ quotes = chapter_data.get("quotes", [])
129
+ if quotes:
130
+ lines.append(f"\nQuotes ({len(quotes)}):")
131
+ for q in quotes:
132
+ lines.append(f" \"{q.get('quote', '')}\"")
133
+ lines.append(f" — {q.get('source', 'Unknown')}")
134
+
135
+ research = chapter_data.get("research", [])
136
+ if research:
137
+ lines.append(f"\nResearch / data:")
138
+ for r in research:
139
+ lines.append(f" • {r.get('finding', '')} [{r.get('source', '')}]")
140
+
141
+ opposition = chapter_data.get("opposition", "")
142
+ if opposition:
143
+ lines.append(f"\nConceptual opposition:")
144
+ lines.append(f" {opposition}")
145
+
146
+ notes = chapter_data.get("writing_notes", "")
147
+ if notes:
148
+ lines.append(f"\nWriting notes:")
149
+ lines.append(f" {notes}")
150
+
151
+ return "\n".join(lines)
152
+
153
+
154
+ def print_bank(bank: dict, chapter_filter: int = None):
155
+ print(f"\n{'═' * 60}")
156
+ print(f" RESEARCH BANK — {bank.get('book_title', 'Unknown Book')}")
157
+ print(f"{'═' * 60}")
158
+
159
+ global_anchors = bank.get("global_anchors", [])
160
+ if global_anchors:
161
+ print(f"\nGLOBAL ANCHORS (whole manuscript):")
162
+ for a in global_anchors:
163
+ print(f" • {a}")
164
+
165
+ chapters = bank.get("chapters", {})
166
+ for key, data in sorted(chapters.items(), key=lambda x: int(x[0]) if x[0].isdigit() else 0):
167
+ if chapter_filter and int(key) != chapter_filter:
168
+ continue
169
+ print(format_chapter_bank(key, data))
170
+
171
+ print(f"\n{'═' * 60}")
172
+ print(f" Chapters in bank: {len(chapters)}")
173
+ print()
174
+
175
+
176
+ if __name__ == "__main__":
177
+ parser = argparse.ArgumentParser()
178
+ parser.add_argument("bank_file")
179
+ parser.add_argument("--chapter", type=int, help="Show specific chapter only")
180
+ parser.add_argument("--validate", action="store_true")
181
+ parser.add_argument("--markdown", action="store_true")
182
+ parser.add_argument("--json", action="store_true")
183
+ args = parser.parse_args()
184
+
185
+ path = Path(args.bank_file)
186
+ if not path.exists():
187
+ print(f"Error: File not found: {args.bank_file}", file=sys.stderr)
188
+ sys.exit(1)
189
+
190
+ bank = json.loads(path.read_text(encoding="utf-8"))
191
+
192
+ if args.validate:
193
+ result = validate_bank(bank)
194
+ if result["clean"]:
195
+ print(f"\n ✓ Research bank is clean — {len(bank.get('chapters', {}))} chapters validated\n")
196
+ else:
197
+ print(f"\n ✗ {result['total_issues']} issue(s) found:\n")
198
+ for issue in result["issues"]:
199
+ print(f" Ch.{issue['chapter']} [{issue['type']}]: {issue['content']}")
200
+ for i in issue["issues"]:
201
+ print(f" → {i}")
202
+ print()
203
+ elif args.json:
204
+ print(json.dumps(bank, indent=2))
205
+ else:
206
+ print_bank(bank, args.chapter)