@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.
- package/LICENSE +21 -0
- package/README.md +111 -0
- package/bin/cli.js +313 -0
- package/package.json +44 -0
- package/skills/book-writer/SKILL.md +1396 -0
- package/skills/book-writer/references/kdp_specs.md +139 -0
- package/skills/book-writer/scripts/kdp_check.py +255 -0
- package/skills/book-writer/scripts/toc_extract.py +151 -0
- package/skills/book-writer/scripts/word_count.py +196 -0
- package/skills/chapter-auditor/SKILL.md +231 -0
- package/skills/chapter-auditor/scripts/score_report.py +237 -0
- package/skills/concept-expander/SKILL.md +170 -0
- package/skills/concept-expander/scripts/validate_concept.py +255 -0
- package/skills/continuity-tracker/SKILL.md +251 -0
- package/skills/continuity-tracker/references/log_schema.md +149 -0
- package/skills/continuity-tracker/scripts/conflict_check.py +179 -0
- package/skills/continuity-tracker/scripts/log_manager.py +258 -0
- package/skills/humanizer/SKILL.md +632 -0
- package/skills/humanizer/references/patterns_quick_ref.md +71 -0
- package/skills/humanizer/scripts/dna_scan.py +168 -0
- package/skills/humanizer/scripts/scan_ai_patterns.py +279 -0
- package/skills/overhaul/SKILL.md +697 -0
- package/skills/overhaul/references/upgrade_checklist.md +81 -0
- package/skills/overhaul/scripts/changelog_gen.py +183 -0
- package/skills/overhaul/scripts/skill_parser.py +265 -0
- package/skills/overhaul/scripts/version_bump.py +128 -0
- package/skills/research-aggregator/SKILL.md +194 -0
- package/skills/research-aggregator/references/thinkers_reference.md +104 -0
- package/skills/research-aggregator/scripts/bank_formatter.py +206 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: concept-expander
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: |
|
|
5
|
+
Expands a rough book seed (1 paragraph, bullet points, or a vague idea) into a full,
|
|
6
|
+
structured concept document that the book-writer skill can consume directly. Use when
|
|
7
|
+
the user says "I have an idea for a book," "here's a rough concept," or provides a
|
|
8
|
+
seed that is too thin to drive the full writing workflow. Outputs a ready-to-use
|
|
9
|
+
concept document. Do NOT use for books where a full concept already exists.
|
|
10
|
+
allowed-tools:
|
|
11
|
+
- Read
|
|
12
|
+
- Write
|
|
13
|
+
- Bash
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Concept Expander
|
|
17
|
+
|
|
18
|
+
## Scripts
|
|
19
|
+
|
|
20
|
+
**Validate concept document completeness** before passing to book-writer:
|
|
21
|
+
```bash
|
|
22
|
+
python scripts/validate_concept.py <concept.md>
|
|
23
|
+
python scripts/validate_concept.py <concept.md> --strict # stricter word count minimums
|
|
24
|
+
python scripts/validate_concept.py <concept.md> --json # machine-readable
|
|
25
|
+
```
|
|
26
|
+
Checks all required fields (logline, core question, reader, promise, unique angle,
|
|
27
|
+
central tension, emotional arc, thematic clusters, genre) and scores completeness.
|
|
28
|
+
Also validates the logline for banned words and word count.
|
|
29
|
+
|
|
30
|
+
**Always run validation before handing the concept document to book-writer.**
|
|
31
|
+
A concept that fails validation will produce a weaker structure in Module 2.
|
|
32
|
+
|
|
33
|
+
You take a rough seed — a paragraph, a title, a feeling, a few bullet points — and develop
|
|
34
|
+
it into a complete concept document that drives the entire book-writing workflow.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## TRIGGER
|
|
39
|
+
|
|
40
|
+
Activate when the user provides:
|
|
41
|
+
- A vague book idea ("I want to write a book about identity")
|
|
42
|
+
- A single title or working title only
|
|
43
|
+
- A rough paragraph summary
|
|
44
|
+
- A list of themes with no structure
|
|
45
|
+
- Anything too thin for book-writer Phase 1 to work with
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## PROCESS
|
|
50
|
+
|
|
51
|
+
### Step 1 — Seed Extraction
|
|
52
|
+
Read the user's raw input. Identify:
|
|
53
|
+
- The core emotional or intellectual question at the heart of the idea
|
|
54
|
+
- Who this is likely for (implied audience)
|
|
55
|
+
- What genre it maps to in Vivid's categories (Philosophy/Essay, Self-help/Motivational, Non-fiction/Technical)
|
|
56
|
+
- Any natural tension or paradox in the idea (this is the engine of good books)
|
|
57
|
+
|
|
58
|
+
### Step 2 — Clarifying Questions (if needed)
|
|
59
|
+
If the seed is genuinely too sparse (under 3 usable signals), ask ONE round of targeted questions:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
Before I expand this, a few quick questions:
|
|
63
|
+
1. Who is this book for — what is their core pain or question?
|
|
64
|
+
2. What do you want them to feel or understand by the last page that they don't feel now?
|
|
65
|
+
3. Is there a personal story or experience at the root of this idea?
|
|
66
|
+
4. Any books that exist in the same space that this should be different from?
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Do not ask all four if some are already answerable from the seed.
|
|
70
|
+
|
|
71
|
+
### Step 3 — Concept Document Generation
|
|
72
|
+
Produce the full concept document in this format:
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
BOOK CONCEPT DOCUMENT
|
|
78
|
+
═══════════════════════════════════════════════════════
|
|
79
|
+
|
|
80
|
+
WORKING TITLE: [compelling title + optional subtitle]
|
|
81
|
+
ALTERNATE TITLES: [2 other options]
|
|
82
|
+
|
|
83
|
+
LOGLINE (one sentence):
|
|
84
|
+
[The book's entire premise in 25 words or fewer. If you can't say it in one sentence,
|
|
85
|
+
the concept isn't tight enough yet.]
|
|
86
|
+
|
|
87
|
+
THE CORE QUESTION:
|
|
88
|
+
[The one question the book answers. Not a topic — a question. E.g., not "loneliness"
|
|
89
|
+
but "Why does being surrounded by people sometimes feel lonelier than being truly alone?"]
|
|
90
|
+
|
|
91
|
+
THE READER:
|
|
92
|
+
Who they are: [demographic + psychographic sketch]
|
|
93
|
+
What they're feeling right now: [their current emotional state]
|
|
94
|
+
What they've already tried: [what hasn't worked for them]
|
|
95
|
+
What they secretly want: [the real desire beneath the surface problem]
|
|
96
|
+
|
|
97
|
+
THE PROMISE:
|
|
98
|
+
[What the reader will have — know, feel, be able to do — after finishing this book
|
|
99
|
+
that they don't have now. Be specific. Not "a better life" but exactly what changes.]
|
|
100
|
+
|
|
101
|
+
GENRE: [Vivid's category]
|
|
102
|
+
TONE: [e.g., raw/confessional, philosophical, instructional-personal, polemical]
|
|
103
|
+
REGISTER: [e.g., intimate/direct, authoritative/grounded, exploratory/questioning]
|
|
104
|
+
|
|
105
|
+
THE UNIQUE ANGLE:
|
|
106
|
+
[What makes this book different from existing books on this topic. What does Vivid's
|
|
107
|
+
lived experience add that a generic author couldn't? Be specific.]
|
|
108
|
+
|
|
109
|
+
THE CENTRAL TENSION OR PARADOX:
|
|
110
|
+
[Every great book has a tension at its core. E.g., "The more you chase connection,
|
|
111
|
+
the more alone you feel." Name the paradox this book lives in.]
|
|
112
|
+
|
|
113
|
+
EMOTIONAL ARC (reader's journey):
|
|
114
|
+
Start: [where the reader is emotionally when they open page 1]
|
|
115
|
+
Middle: [what they confront, what gets harder before it gets better]
|
|
116
|
+
End: [what shifts — not necessarily solved, but transformed]
|
|
117
|
+
|
|
118
|
+
THEMATIC CLUSTERS (7–10 themes/territories to explore):
|
|
119
|
+
1. [Theme + one sentence on what to explore within it]
|
|
120
|
+
2.
|
|
121
|
+
3.
|
|
122
|
+
4.
|
|
123
|
+
5.
|
|
124
|
+
6.
|
|
125
|
+
7.
|
|
126
|
+
[add more as needed]
|
|
127
|
+
|
|
128
|
+
SIGNATURE ELEMENTS:
|
|
129
|
+
[Recurring devices, structural choices, or content features that will define this book.
|
|
130
|
+
E.g., "dual My Story / My Reflection structure," "opens each chapter with a paradox,"
|
|
131
|
+
"uses no external citations — all insight is arrived at through lived experience"]
|
|
132
|
+
|
|
133
|
+
COMPARABLE BOOKS (comp titles):
|
|
134
|
+
[2–3 books this sits near in a bookstore — and crucially, how this is different from each]
|
|
135
|
+
|
|
136
|
+
ESTIMATED SCOPE:
|
|
137
|
+
[short / medium / full-length — with reasoning]
|
|
138
|
+
|
|
139
|
+
POTENTIAL CHAPTER TERRITORIES (rough, pre-structure):
|
|
140
|
+
[8–14 possible chapter-level questions or themes — these feed Phase 2 of book-writer]
|
|
141
|
+
|
|
142
|
+
RISKS / BLIND SPOTS:
|
|
143
|
+
[Honest assessment: what could make this book fall flat? What would a skeptical reader
|
|
144
|
+
push back on? What does the author need to be careful not to oversimplify?]
|
|
145
|
+
|
|
146
|
+
═══════════════════════════════════════════════════════
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## OUTPUT
|
|
152
|
+
|
|
153
|
+
Deliver the complete concept document.
|
|
154
|
+
Then add one line:
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
→ This concept document is ready for the book-writer skill. Upload it or paste it to begin.
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## QUALITY CHECKS
|
|
163
|
+
|
|
164
|
+
Before delivering, verify:
|
|
165
|
+
- [ ] Logline is under 25 words and doesn't use vague terms ("journey," "transformation," "discover")
|
|
166
|
+
- [ ] Core question is a genuine question, not a topic
|
|
167
|
+
- [ ] The unique angle names something specific Vivid brings — not generic
|
|
168
|
+
- [ ] Thematic clusters are distinct from each other (no overlap)
|
|
169
|
+
- [ ] The emotional arc has a real middle — not just start and end
|
|
170
|
+
- [ ] Comparable books are real, named, and the differentiators are honest
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
validate_concept.py — Validate a concept document for completeness
|
|
4
|
+
|
|
5
|
+
Checks that a concept document has all required fields before
|
|
6
|
+
it enters the book-writer pipeline. Scores completeness and
|
|
7
|
+
flags missing or thin sections.
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
python validate_concept.py <concept.md>
|
|
11
|
+
python validate_concept.py <concept.md> --json
|
|
12
|
+
python validate_concept.py <concept.md> --strict
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import sys
|
|
16
|
+
import re
|
|
17
|
+
import json
|
|
18
|
+
import argparse
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
# ─── Required Fields ──────────────────────────────────────────────────────────
|
|
22
|
+
|
|
23
|
+
REQUIRED_FIELDS = [
|
|
24
|
+
{
|
|
25
|
+
"key": "working_title",
|
|
26
|
+
"patterns": [r"WORKING TITLE:", r"Title:"],
|
|
27
|
+
"min_words": 2,
|
|
28
|
+
"weight": "required",
|
|
29
|
+
"label": "Working title",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"key": "logline",
|
|
33
|
+
"patterns": [r"LOGLINE", r"One[- ]sentence", r"Premise:"],
|
|
34
|
+
"min_words": 10,
|
|
35
|
+
"max_words": 30,
|
|
36
|
+
"weight": "required",
|
|
37
|
+
"label": "Logline (≤25 words)",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"key": "core_question",
|
|
41
|
+
"patterns": [r"CORE QUESTION", r"THE CORE QUESTION", r"Central question"],
|
|
42
|
+
"min_words": 8,
|
|
43
|
+
"weight": "required",
|
|
44
|
+
"label": "Core question",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"key": "reader",
|
|
48
|
+
"patterns": [r"THE READER", r"Reader:", r"Audience:"],
|
|
49
|
+
"min_words": 15,
|
|
50
|
+
"weight": "required",
|
|
51
|
+
"label": "Reader profile",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"key": "promise",
|
|
55
|
+
"patterns": [r"THE PROMISE", r"Promise:", r"What they gain"],
|
|
56
|
+
"min_words": 10,
|
|
57
|
+
"weight": "required",
|
|
58
|
+
"label": "The promise",
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"key": "unique_angle",
|
|
62
|
+
"patterns": [r"UNIQUE ANGLE", r"THE UNIQUE ANGLE", r"What makes this different"],
|
|
63
|
+
"min_words": 15,
|
|
64
|
+
"weight": "required",
|
|
65
|
+
"label": "Unique angle",
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"key": "central_tension",
|
|
69
|
+
"patterns": [r"CENTRAL TENSION", r"PARADOX", r"The tension"],
|
|
70
|
+
"min_words": 8,
|
|
71
|
+
"weight": "required",
|
|
72
|
+
"label": "Central tension / paradox",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"key": "emotional_arc",
|
|
76
|
+
"patterns": [r"EMOTIONAL ARC", r"Arc:", r"Start:", r"Journey:"],
|
|
77
|
+
"min_words": 20,
|
|
78
|
+
"weight": "required",
|
|
79
|
+
"label": "Emotional arc",
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"key": "thematic_clusters",
|
|
83
|
+
"patterns": [r"THEMATIC CLUSTERS", r"Themes:", r"Chapter territories"],
|
|
84
|
+
"min_words": 30,
|
|
85
|
+
"weight": "required",
|
|
86
|
+
"label": "Thematic clusters (7–10)",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"key": "comparable_books",
|
|
90
|
+
"patterns": [r"COMPARABLE BOOKS", r"Comp titles", r"Similar books"],
|
|
91
|
+
"min_words": 10,
|
|
92
|
+
"weight": "recommended",
|
|
93
|
+
"label": "Comparable books",
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"key": "risks",
|
|
97
|
+
"patterns": [r"RISKS", r"BLIND SPOTS", r"Risks:"],
|
|
98
|
+
"min_words": 10,
|
|
99
|
+
"weight": "recommended",
|
|
100
|
+
"label": "Risks / blind spots",
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"key": "genre",
|
|
104
|
+
"patterns": [r"GENRE:", r"Genre:"],
|
|
105
|
+
"min_words": 1,
|
|
106
|
+
"weight": "required",
|
|
107
|
+
"label": "Genre",
|
|
108
|
+
},
|
|
109
|
+
]
|
|
110
|
+
|
|
111
|
+
# Banned logline words
|
|
112
|
+
BANNED_LOGLINE_WORDS = ["journey", "transformation", "discover", "explore", "delve", "embark"]
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def find_field(text: str, field: dict) -> tuple[bool, str, int]:
|
|
116
|
+
"""Return (found, extracted_text, word_count)."""
|
|
117
|
+
for pattern in field["patterns"]:
|
|
118
|
+
match = re.search(pattern, text, re.IGNORECASE)
|
|
119
|
+
if match:
|
|
120
|
+
# Extract text after this heading until next all-caps heading or end
|
|
121
|
+
start = match.end()
|
|
122
|
+
remainder = text[start:start + 600]
|
|
123
|
+
# Stop at next heading-like line
|
|
124
|
+
stop = re.search(r"\n[A-Z]{3,}[\s:]", remainder)
|
|
125
|
+
extracted = remainder[:stop.start() if stop else 400].strip()
|
|
126
|
+
words = len(extracted.split())
|
|
127
|
+
return True, extracted, words
|
|
128
|
+
return False, "", 0
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def validate_logline(text: str) -> list:
|
|
132
|
+
"""Check logline specifically for quality."""
|
|
133
|
+
issues = []
|
|
134
|
+
logline_match = re.search(r"LOGLINE[^\n]*\n(.{10,200})", text, re.IGNORECASE)
|
|
135
|
+
if logline_match:
|
|
136
|
+
logline = logline_match.group(1).strip()
|
|
137
|
+
words = len(logline.split())
|
|
138
|
+
if words > 25:
|
|
139
|
+
issues.append(f"Logline is {words} words — should be ≤25")
|
|
140
|
+
for banned in BANNED_LOGLINE_WORDS:
|
|
141
|
+
if banned in logline.lower():
|
|
142
|
+
issues.append(f"Logline contains banned word: '{banned}'")
|
|
143
|
+
return issues
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def validate_concept(filepath: str, strict: bool = False) -> dict:
|
|
147
|
+
path = Path(filepath)
|
|
148
|
+
if not path.exists():
|
|
149
|
+
print(f"Error: File not found: {filepath}", file=sys.stderr)
|
|
150
|
+
sys.exit(1)
|
|
151
|
+
|
|
152
|
+
text = path.read_text(encoding="utf-8")
|
|
153
|
+
total_words = len(text.split())
|
|
154
|
+
|
|
155
|
+
results = []
|
|
156
|
+
score = 0
|
|
157
|
+
max_score = 0
|
|
158
|
+
|
|
159
|
+
for field in REQUIRED_FIELDS:
|
|
160
|
+
found, extracted, word_count = find_field(text, field)
|
|
161
|
+
is_required = field["weight"] == "required"
|
|
162
|
+
field_score = 2 if is_required else 1
|
|
163
|
+
max_score += field_score
|
|
164
|
+
|
|
165
|
+
issues = []
|
|
166
|
+
if not found:
|
|
167
|
+
issues.append(f"Field not found")
|
|
168
|
+
else:
|
|
169
|
+
min_words = field.get("min_words", 0)
|
|
170
|
+
max_words = field.get("max_words", 9999)
|
|
171
|
+
if word_count < min_words:
|
|
172
|
+
issues.append(f"Too thin ({word_count} words, min {min_words})")
|
|
173
|
+
if word_count > max_words:
|
|
174
|
+
issues.append(f"Too long ({word_count} words, max {max_words})")
|
|
175
|
+
|
|
176
|
+
if not issues:
|
|
177
|
+
score += field_score
|
|
178
|
+
|
|
179
|
+
results.append({
|
|
180
|
+
"field": field["label"],
|
|
181
|
+
"key": field["key"],
|
|
182
|
+
"weight": field["weight"],
|
|
183
|
+
"found": found,
|
|
184
|
+
"word_count": word_count,
|
|
185
|
+
"issues": issues,
|
|
186
|
+
"pass": len(issues) == 0,
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
# Logline quality check
|
|
190
|
+
logline_issues = validate_logline(text)
|
|
191
|
+
|
|
192
|
+
completeness = round((score / max_score) * 100) if max_score else 0
|
|
193
|
+
required_passing = all(r["pass"] for r in results if r["weight"] == "required")
|
|
194
|
+
|
|
195
|
+
return {
|
|
196
|
+
"file": str(path),
|
|
197
|
+
"total_words": total_words,
|
|
198
|
+
"score": score,
|
|
199
|
+
"max_score": max_score,
|
|
200
|
+
"completeness_pct": completeness,
|
|
201
|
+
"ready": required_passing and completeness >= 80,
|
|
202
|
+
"fields": results,
|
|
203
|
+
"logline_issues": logline_issues,
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def print_report(result: dict):
|
|
208
|
+
ready_icon = "✓" if result["ready"] else "✗"
|
|
209
|
+
print(f"\n{'═' * 60}")
|
|
210
|
+
print(f" CONCEPT DOCUMENT VALIDATION")
|
|
211
|
+
print(f" File: {result['file']}")
|
|
212
|
+
print(f"{'═' * 60}")
|
|
213
|
+
print(f" Completeness: {result['completeness_pct']}% ({result['score']}/{result['max_score']} points)")
|
|
214
|
+
print(f" Status: {ready_icon} {'READY for book-writer' if result['ready'] else 'NOT READY — fix required fields'}")
|
|
215
|
+
|
|
216
|
+
print(f"\n {'FIELD':<35} {'STATUS':<12} {'WORDS'}")
|
|
217
|
+
print(f" {'─' * 55}")
|
|
218
|
+
|
|
219
|
+
for field in result["fields"]:
|
|
220
|
+
if field["pass"]:
|
|
221
|
+
status = "✓ ok"
|
|
222
|
+
else:
|
|
223
|
+
status = "✗ " + (field["issues"][0][:20] if field["issues"] else "?")
|
|
224
|
+
req = " *" if field["weight"] == "required" else " "
|
|
225
|
+
print(f" {req}{field['field']:<33} {status:<12} {field['word_count']}")
|
|
226
|
+
|
|
227
|
+
if result["logline_issues"]:
|
|
228
|
+
print(f"\n LOGLINE ISSUES:")
|
|
229
|
+
for issue in result["logline_issues"]:
|
|
230
|
+
print(f" ⚠ {issue}")
|
|
231
|
+
|
|
232
|
+
missing = [f for f in result["fields"] if not f["pass"] and f["weight"] == "required"]
|
|
233
|
+
if missing:
|
|
234
|
+
print(f"\n REQUIRED FIXES ({len(missing)}):")
|
|
235
|
+
for f in missing:
|
|
236
|
+
for issue in f["issues"]:
|
|
237
|
+
print(f" ✗ {f['field']}: {issue}")
|
|
238
|
+
|
|
239
|
+
print(f"\n (* = required field)")
|
|
240
|
+
print(f"{'═' * 60}\n")
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
if __name__ == "__main__":
|
|
244
|
+
parser = argparse.ArgumentParser()
|
|
245
|
+
parser.add_argument("concept_file")
|
|
246
|
+
parser.add_argument("--json", action="store_true")
|
|
247
|
+
parser.add_argument("--strict", action="store_true")
|
|
248
|
+
args = parser.parse_args()
|
|
249
|
+
|
|
250
|
+
result = validate_concept(args.concept_file, args.strict)
|
|
251
|
+
|
|
252
|
+
if args.json:
|
|
253
|
+
print(json.dumps(result, indent=2))
|
|
254
|
+
else:
|
|
255
|
+
print_report(result)
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: continuity-tracker
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: |
|
|
5
|
+
Maintains a running continuity log across all chapters of a book in progress. Tracks
|
|
6
|
+
established facts, recurring metaphors, tone decisions, narrative commitments, and
|
|
7
|
+
chapter summaries so nothing contradicts itself across a long manuscript. Use after
|
|
8
|
+
each chapter is finalized to update the log, and before each new chapter is written
|
|
9
|
+
to brief the book-writer on what's been established. Essential for books over 5 chapters.
|
|
10
|
+
allowed-tools:
|
|
11
|
+
- Read
|
|
12
|
+
- Write
|
|
13
|
+
- Bash
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Continuity Tracker
|
|
17
|
+
|
|
18
|
+
## Scripts
|
|
19
|
+
|
|
20
|
+
The continuity log (`continuity_log.json`) persists all tracking data across sessions.
|
|
21
|
+
Run these scripts to manage it — never edit the JSON manually.
|
|
22
|
+
|
|
23
|
+
**Initialize log at project start:**
|
|
24
|
+
```bash
|
|
25
|
+
python scripts/log_manager.py init "Book Title"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**After each finalized chapter — update log:**
|
|
29
|
+
```bash
|
|
30
|
+
python scripts/log_manager.py add-chapter 3 "Aloneness Is Not the Enemy"
|
|
31
|
+
python scripts/log_manager.py add-fact "Author walked miles to save money"
|
|
32
|
+
python scripts/log_manager.py add-insight 3 "Aloneness and loneliness are distinct"
|
|
33
|
+
python scripts/log_manager.py add-metaphor 3 "invisible chains beginning to loosen"
|
|
34
|
+
python scripts/log_manager.py add-thread "Ch.3 raised idea of earned freedom — needs depth in Ch.7"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Before each new chapter — check for conflicts:**
|
|
38
|
+
```bash
|
|
39
|
+
python scripts/conflict_check.py chapter_draft.md --log continuity_log.json
|
|
40
|
+
```
|
|
41
|
+
Scan the draft against retired metaphors, delivered insights, and established facts
|
|
42
|
+
before finalizing. Surfaces potential contradictions with line-level detail.
|
|
43
|
+
|
|
44
|
+
**View full log / summary:**
|
|
45
|
+
```bash
|
|
46
|
+
python scripts/log_manager.py show
|
|
47
|
+
python scripts/log_manager.py summary
|
|
48
|
+
python scripts/log_manager.py threads # open threads only
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Close a resolved thread:**
|
|
52
|
+
```bash
|
|
53
|
+
python scripts/log_manager.py threads # find index
|
|
54
|
+
python scripts/log_manager.py close-thread 0 # close by index
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## References
|
|
58
|
+
|
|
59
|
+
`references/log_schema.md` — Full log JSON schema and CLI quick reference.
|
|
60
|
+
Read when: setting up the log for a new project or adding custom fields.
|
|
61
|
+
|
|
62
|
+
You are the book's memory. You track everything that has been established so the
|
|
63
|
+
manuscript stays internally consistent — in logic, tone, narrative, and voice.
|
|
64
|
+
No contradictions. No repetition of insights already delivered. No forgotten threads.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## TRIGGER
|
|
69
|
+
|
|
70
|
+
Activate:
|
|
71
|
+
1. **After each chapter is finalized** → update the Continuity Log
|
|
72
|
+
2. **Before each new chapter is written** → output the Continuity Brief for that chapter
|
|
73
|
+
3. **When user asks** "what have I already covered?", "have I used this metaphor before?",
|
|
74
|
+
"does this contradict anything earlier?"
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## THE CONTINUITY LOG
|
|
79
|
+
|
|
80
|
+
The log is a living document. It grows with each chapter. Structure:
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
CONTINUITY LOG — [Book Title]
|
|
84
|
+
Last updated after: Chapter [N]
|
|
85
|
+
═══════════════════════════════════════════════════════
|
|
86
|
+
|
|
87
|
+
BOOK-LEVEL COMMITMENTS
|
|
88
|
+
───────────────────────────────────────────────────────
|
|
89
|
+
These were established in front matter / introduction and must not be contradicted:
|
|
90
|
+
|
|
91
|
+
• [commitment 1 — e.g., "Author frames himself as someone who lived this, not an expert"]
|
|
92
|
+
• [commitment 2 — e.g., "Book promises no quick fixes — lasting transformation only"]
|
|
93
|
+
• [commitment 3]
|
|
94
|
+
[add as discovered]
|
|
95
|
+
|
|
96
|
+
═══════════════════════════════════════════════════════
|
|
97
|
+
|
|
98
|
+
ESTABLISHED FACTS & NARRATIVE DETAILS
|
|
99
|
+
───────────────────────────────────────────────────────
|
|
100
|
+
Facts about the author's story that have been stated and must remain consistent:
|
|
101
|
+
|
|
102
|
+
• [fact — e.g., "Father passed away during author's degree years"]
|
|
103
|
+
• [fact — e.g., "Author lived in a tiny penthouse apartment alone"]
|
|
104
|
+
• [fact — e.g., "Author walked miles to save money on transport"]
|
|
105
|
+
• [fact — e.g., "Author cooked rice and lentils, stretched groceries"]
|
|
106
|
+
[add per chapter]
|
|
107
|
+
|
|
108
|
+
═══════════════════════════════════════════════════════
|
|
109
|
+
|
|
110
|
+
METAPHORS & IMAGES USED (per chapter)
|
|
111
|
+
───────────────────────────────────────────────────────
|
|
112
|
+
Track to avoid: (a) repetition of same image, (b) contradictory images for same concept
|
|
113
|
+
|
|
114
|
+
Ch.1: [metaphors used — e.g., "loneliness as deafening scream," "silence pressing in"]
|
|
115
|
+
Ch.2: [metaphors used]
|
|
116
|
+
Ch.3: [metaphors used]
|
|
117
|
+
[update each chapter]
|
|
118
|
+
|
|
119
|
+
AVAILABLE FOR FUTURE USE (not yet used):
|
|
120
|
+
• [strong image from research bank or concept doc that hasn't appeared yet]
|
|
121
|
+
|
|
122
|
+
RETIRED (used — do not repeat):
|
|
123
|
+
• [list]
|
|
124
|
+
|
|
125
|
+
═══════════════════════════════════════════════════════
|
|
126
|
+
|
|
127
|
+
CORE INSIGHTS DELIVERED (per chapter)
|
|
128
|
+
───────────────────────────────────────────────────────
|
|
129
|
+
Track to avoid restating the same insight in different words across chapters.
|
|
130
|
+
Each insight should appear once, deeply — not scattered thinly across chapters.
|
|
131
|
+
|
|
132
|
+
Ch.1: [central insight delivered — e.g., "Loneliness as mirror of self-relationship"]
|
|
133
|
+
Ch.2: [central insight — e.g., "Chasing connection from fear, not love, creates neediness"]
|
|
134
|
+
Ch.3: [central insight]
|
|
135
|
+
[update each chapter]
|
|
136
|
+
|
|
137
|
+
═══════════════════════════════════════════════════════
|
|
138
|
+
|
|
139
|
+
TONE DECISIONS
|
|
140
|
+
───────────────────────────────────────────────────────
|
|
141
|
+
Tone choices that have been established and should be maintained:
|
|
142
|
+
|
|
143
|
+
• Register: [e.g., "intimate and confessional in My Story sections"]
|
|
144
|
+
• Reader address: [e.g., "direct 'you' in Reflection sections, not 'one' or 'people'"]
|
|
145
|
+
• Author position: [e.g., "always in-process, never above the reader — no 'I've solved this'"]
|
|
146
|
+
• Emotional ceiling: [e.g., "darkest content already appeared in Ch.1 — Ch.5+ should feel lighter but not falsely resolved"]
|
|
147
|
+
|
|
148
|
+
═══════════════════════════════════════════════════════
|
|
149
|
+
|
|
150
|
+
STRUCTURAL PATTERNS ESTABLISHED
|
|
151
|
+
───────────────────────────────────────────────────────
|
|
152
|
+
• Section format: [e.g., "My Story then My Reflection — both present in all chapters so far"]
|
|
153
|
+
• Chapter length pattern: [e.g., "Ch.1: 2,400w / Ch.2: 2,200w / Ch.3: 2,600w — avg ~2,400w"]
|
|
154
|
+
• Opening style: [e.g., "All chapters open with immersive scene in My Story — maintain"]
|
|
155
|
+
• Closing style: [e.g., "All chapters close with a single standalone insight sentence"]
|
|
156
|
+
|
|
157
|
+
═══════════════════════════════════════════════════════
|
|
158
|
+
|
|
159
|
+
OPEN THREADS (introduced but not resolved)
|
|
160
|
+
───────────────────────────────────────────────────────
|
|
161
|
+
Themes, questions, or narrative elements that were raised and need to pay off:
|
|
162
|
+
|
|
163
|
+
• [thread — e.g., "Ch.2 mentioned 'the small proof that my life has value' — this needs deeper exploration"]
|
|
164
|
+
• [thread]
|
|
165
|
+
• [thread]
|
|
166
|
+
|
|
167
|
+
Flag these for the book-writer when their resolution chapter arrives.
|
|
168
|
+
|
|
169
|
+
═══════════════════════════════════════════════════════
|
|
170
|
+
|
|
171
|
+
CHAPTER SUMMARIES
|
|
172
|
+
───────────────────────────────────────────────────────
|
|
173
|
+
One-paragraph summary per completed chapter (for quick reference during later chapters):
|
|
174
|
+
|
|
175
|
+
Ch.1 — [Title]: [summary]
|
|
176
|
+
Ch.2 — [Title]: [summary]
|
|
177
|
+
[add each chapter]
|
|
178
|
+
|
|
179
|
+
═══════════════════════════════════════════════════════
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## CONTINUITY BRIEF (Pre-Chapter Output)
|
|
185
|
+
|
|
186
|
+
Before the book-writer begins each new chapter, output this brief:
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
CONTINUITY BRIEF — Before Writing Chapter [N]: [Title]
|
|
190
|
+
═══════════════════════════════════════════════════════
|
|
191
|
+
|
|
192
|
+
WHAT'S BEEN ESTABLISHED (relevant to this chapter):
|
|
193
|
+
• [facts, decisions, tone commitments relevant to this chapter's theme]
|
|
194
|
+
|
|
195
|
+
OPEN THREADS TO RESOLVE IN THIS CHAPTER (if any):
|
|
196
|
+
• [threads from the log that this chapter should address]
|
|
197
|
+
|
|
198
|
+
METAPHORS TO AVOID (already used):
|
|
199
|
+
• [list of images already in play — don't repeat]
|
|
200
|
+
|
|
201
|
+
INSIGHTS TO NOT REPEAT:
|
|
202
|
+
• [insights already delivered that this chapter's theme might accidentally echo]
|
|
203
|
+
|
|
204
|
+
TONE REMINDERS:
|
|
205
|
+
• [any tone decisions particularly relevant to this chapter]
|
|
206
|
+
|
|
207
|
+
WORD COUNT GUIDANCE:
|
|
208
|
+
• Previous chapters averaged [X] words. Target [Y–Z] for this chapter.
|
|
209
|
+
|
|
210
|
+
═══════════════════════════════════════════════════════
|
|
211
|
+
Proceed to write Chapter [N].
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## UPDATE PROCESS (Post-Chapter)
|
|
217
|
+
|
|
218
|
+
After each chapter is finalized:
|
|
219
|
+
1. Extract all new facts, metaphors, insights, tone decisions, open threads
|
|
220
|
+
2. Add chapter summary
|
|
221
|
+
3. Update the log
|
|
222
|
+
4. Confirm: "Continuity Log updated. [N] new items added. [X] open threads now active."
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## CONTRADICTION DETECTION
|
|
227
|
+
|
|
228
|
+
When reviewing a chapter, check against the log:
|
|
229
|
+
- Do any facts contradict established narrative details?
|
|
230
|
+
- Does the author's position (in-process vs. resolved) contradict what's been established?
|
|
231
|
+
- Are any metaphors repeated with different or conflicting meaning?
|
|
232
|
+
- Is an insight being delivered that was already fully delivered in a prior chapter?
|
|
233
|
+
|
|
234
|
+
If yes → flag immediately before the chapter proceeds to humanizer:
|
|
235
|
+
```
|
|
236
|
+
⚠ CONTINUITY CONFLICT DETECTED
|
|
237
|
+
Chapter [N] contains: [description of conflict]
|
|
238
|
+
Conflicts with: [Chapter X, specific detail]
|
|
239
|
+
Resolution options:
|
|
240
|
+
1. [option]
|
|
241
|
+
2. [option]
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## BEHAVIOR RULES
|
|
247
|
+
|
|
248
|
+
- Update the log AFTER every finalized chapter — do not wait until the end
|
|
249
|
+
- Brief the book-writer BEFORE every new chapter — do not skip
|
|
250
|
+
- Flag open threads proactively — do not let them die silently
|
|
251
|
+
- Track word counts per chapter to flag if the manuscript is drifting from target scope
|