empathy-framework 4.6.6__py3-none-any.whl → 4.7.1__py3-none-any.whl

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 (273) hide show
  1. empathy_framework-4.7.1.dist-info/METADATA +690 -0
  2. empathy_framework-4.7.1.dist-info/RECORD +379 -0
  3. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/top_level.txt +1 -2
  4. empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
  5. empathy_llm_toolkit/agent_factory/__init__.py +6 -6
  6. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
  7. empathy_llm_toolkit/agents_md/__init__.py +22 -0
  8. empathy_llm_toolkit/agents_md/loader.py +218 -0
  9. empathy_llm_toolkit/agents_md/parser.py +271 -0
  10. empathy_llm_toolkit/agents_md/registry.py +307 -0
  11. empathy_llm_toolkit/commands/__init__.py +51 -0
  12. empathy_llm_toolkit/commands/context.py +375 -0
  13. empathy_llm_toolkit/commands/loader.py +301 -0
  14. empathy_llm_toolkit/commands/models.py +231 -0
  15. empathy_llm_toolkit/commands/parser.py +371 -0
  16. empathy_llm_toolkit/commands/registry.py +429 -0
  17. empathy_llm_toolkit/config/__init__.py +8 -8
  18. empathy_llm_toolkit/config/unified.py +3 -7
  19. empathy_llm_toolkit/context/__init__.py +22 -0
  20. empathy_llm_toolkit/context/compaction.py +455 -0
  21. empathy_llm_toolkit/context/manager.py +434 -0
  22. empathy_llm_toolkit/hooks/__init__.py +24 -0
  23. empathy_llm_toolkit/hooks/config.py +306 -0
  24. empathy_llm_toolkit/hooks/executor.py +289 -0
  25. empathy_llm_toolkit/hooks/registry.py +302 -0
  26. empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
  27. empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
  28. empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
  29. empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
  30. empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
  31. empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
  32. empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
  33. empathy_llm_toolkit/learning/__init__.py +30 -0
  34. empathy_llm_toolkit/learning/evaluator.py +438 -0
  35. empathy_llm_toolkit/learning/extractor.py +514 -0
  36. empathy_llm_toolkit/learning/storage.py +560 -0
  37. empathy_llm_toolkit/providers.py +4 -11
  38. empathy_llm_toolkit/security/__init__.py +17 -17
  39. empathy_llm_toolkit/utils/tokens.py +2 -5
  40. empathy_os/__init__.py +202 -70
  41. empathy_os/cache_monitor.py +5 -3
  42. empathy_os/cli/__init__.py +11 -55
  43. empathy_os/cli/__main__.py +29 -15
  44. empathy_os/cli/commands/inspection.py +21 -12
  45. empathy_os/cli/commands/memory.py +4 -12
  46. empathy_os/cli/commands/profiling.py +198 -0
  47. empathy_os/cli/commands/utilities.py +27 -7
  48. empathy_os/cli.py +28 -57
  49. empathy_os/cli_unified.py +525 -1164
  50. empathy_os/cost_tracker.py +9 -3
  51. empathy_os/dashboard/server.py +200 -2
  52. empathy_os/hot_reload/__init__.py +7 -7
  53. empathy_os/hot_reload/config.py +6 -7
  54. empathy_os/hot_reload/integration.py +35 -35
  55. empathy_os/hot_reload/reloader.py +57 -57
  56. empathy_os/hot_reload/watcher.py +28 -28
  57. empathy_os/hot_reload/websocket.py +2 -2
  58. empathy_os/memory/__init__.py +11 -4
  59. empathy_os/memory/claude_memory.py +1 -1
  60. empathy_os/memory/cross_session.py +8 -12
  61. empathy_os/memory/edges.py +6 -6
  62. empathy_os/memory/file_session.py +770 -0
  63. empathy_os/memory/graph.py +30 -30
  64. empathy_os/memory/nodes.py +6 -6
  65. empathy_os/memory/short_term.py +15 -9
  66. empathy_os/memory/unified.py +606 -140
  67. empathy_os/meta_workflows/agent_creator.py +3 -9
  68. empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
  69. empathy_os/meta_workflows/form_engine.py +6 -18
  70. empathy_os/meta_workflows/intent_detector.py +64 -24
  71. empathy_os/meta_workflows/models.py +3 -1
  72. empathy_os/meta_workflows/pattern_learner.py +13 -31
  73. empathy_os/meta_workflows/plan_generator.py +55 -47
  74. empathy_os/meta_workflows/session_context.py +2 -3
  75. empathy_os/meta_workflows/workflow.py +20 -51
  76. empathy_os/models/cli.py +2 -2
  77. empathy_os/models/tasks.py +1 -2
  78. empathy_os/models/telemetry.py +4 -1
  79. empathy_os/models/token_estimator.py +3 -1
  80. empathy_os/monitoring/alerts.py +938 -9
  81. empathy_os/monitoring/alerts_cli.py +346 -183
  82. empathy_os/orchestration/execution_strategies.py +12 -29
  83. empathy_os/orchestration/pattern_learner.py +20 -26
  84. empathy_os/orchestration/real_tools.py +6 -15
  85. empathy_os/platform_utils.py +2 -1
  86. empathy_os/plugins/__init__.py +2 -2
  87. empathy_os/plugins/base.py +64 -64
  88. empathy_os/plugins/registry.py +32 -32
  89. empathy_os/project_index/index.py +49 -15
  90. empathy_os/project_index/models.py +1 -2
  91. empathy_os/project_index/reports.py +1 -1
  92. empathy_os/project_index/scanner.py +1 -0
  93. empathy_os/redis_memory.py +10 -7
  94. empathy_os/resilience/__init__.py +1 -1
  95. empathy_os/resilience/health.py +10 -10
  96. empathy_os/routing/__init__.py +7 -7
  97. empathy_os/routing/chain_executor.py +37 -37
  98. empathy_os/routing/classifier.py +36 -36
  99. empathy_os/routing/smart_router.py +40 -40
  100. empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
  101. empathy_os/scaffolding/__init__.py +8 -8
  102. empathy_os/scaffolding/__main__.py +1 -1
  103. empathy_os/scaffolding/cli.py +28 -28
  104. empathy_os/socratic/__init__.py +3 -19
  105. empathy_os/socratic/ab_testing.py +25 -36
  106. empathy_os/socratic/blueprint.py +38 -38
  107. empathy_os/socratic/cli.py +34 -20
  108. empathy_os/socratic/collaboration.py +30 -28
  109. empathy_os/socratic/domain_templates.py +9 -1
  110. empathy_os/socratic/embeddings.py +17 -13
  111. empathy_os/socratic/engine.py +135 -70
  112. empathy_os/socratic/explainer.py +70 -60
  113. empathy_os/socratic/feedback.py +24 -19
  114. empathy_os/socratic/forms.py +15 -10
  115. empathy_os/socratic/generator.py +51 -35
  116. empathy_os/socratic/llm_analyzer.py +25 -23
  117. empathy_os/socratic/mcp_server.py +99 -159
  118. empathy_os/socratic/session.py +19 -13
  119. empathy_os/socratic/storage.py +98 -67
  120. empathy_os/socratic/success.py +38 -27
  121. empathy_os/socratic/visual_editor.py +51 -39
  122. empathy_os/socratic/web_ui.py +99 -66
  123. empathy_os/telemetry/cli.py +3 -1
  124. empathy_os/telemetry/usage_tracker.py +1 -3
  125. empathy_os/test_generator/__init__.py +3 -3
  126. empathy_os/test_generator/cli.py +28 -28
  127. empathy_os/test_generator/generator.py +64 -66
  128. empathy_os/test_generator/risk_analyzer.py +11 -11
  129. empathy_os/vscode_bridge 2.py +173 -0
  130. empathy_os/vscode_bridge.py +173 -0
  131. empathy_os/workflows/__init__.py +212 -120
  132. empathy_os/workflows/batch_processing.py +8 -24
  133. empathy_os/workflows/bug_predict.py +1 -1
  134. empathy_os/workflows/code_review.py +20 -5
  135. empathy_os/workflows/code_review_pipeline.py +13 -8
  136. empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
  137. empathy_os/workflows/manage_documentation.py +1 -0
  138. empathy_os/workflows/orchestrated_health_check.py +6 -11
  139. empathy_os/workflows/orchestrated_release_prep.py +3 -3
  140. empathy_os/workflows/pr_review.py +18 -10
  141. empathy_os/workflows/progressive/README 2.md +454 -0
  142. empathy_os/workflows/progressive/__init__ 2.py +92 -0
  143. empathy_os/workflows/progressive/__init__.py +2 -12
  144. empathy_os/workflows/progressive/cli 2.py +242 -0
  145. empathy_os/workflows/progressive/cli.py +14 -37
  146. empathy_os/workflows/progressive/core 2.py +488 -0
  147. empathy_os/workflows/progressive/core.py +12 -12
  148. empathy_os/workflows/progressive/orchestrator 2.py +701 -0
  149. empathy_os/workflows/progressive/orchestrator.py +166 -144
  150. empathy_os/workflows/progressive/reports 2.py +528 -0
  151. empathy_os/workflows/progressive/reports.py +22 -31
  152. empathy_os/workflows/progressive/telemetry 2.py +280 -0
  153. empathy_os/workflows/progressive/telemetry.py +8 -14
  154. empathy_os/workflows/progressive/test_gen 2.py +514 -0
  155. empathy_os/workflows/progressive/test_gen.py +29 -48
  156. empathy_os/workflows/progressive/workflow 2.py +628 -0
  157. empathy_os/workflows/progressive/workflow.py +31 -70
  158. empathy_os/workflows/release_prep.py +21 -6
  159. empathy_os/workflows/release_prep_crew.py +1 -0
  160. empathy_os/workflows/secure_release.py +13 -6
  161. empathy_os/workflows/security_audit.py +8 -3
  162. empathy_os/workflows/test_coverage_boost_crew.py +3 -2
  163. empathy_os/workflows/test_maintenance_crew.py +1 -0
  164. empathy_os/workflows/test_runner.py +16 -12
  165. empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
  166. empathy_software_plugin/cli.py +0 -122
  167. patterns/README.md +119 -0
  168. patterns/__init__.py +95 -0
  169. patterns/behavior.py +298 -0
  170. patterns/code_review_memory.json +441 -0
  171. patterns/core.py +97 -0
  172. patterns/debugging.json +3763 -0
  173. patterns/empathy.py +268 -0
  174. patterns/health_check_memory.json +505 -0
  175. patterns/input.py +161 -0
  176. patterns/memory_graph.json +8 -0
  177. patterns/refactoring_memory.json +1113 -0
  178. patterns/registry.py +663 -0
  179. patterns/security_memory.json +8 -0
  180. patterns/structural.py +415 -0
  181. patterns/validation.py +194 -0
  182. coach_wizards/__init__.py +0 -45
  183. coach_wizards/accessibility_wizard.py +0 -91
  184. coach_wizards/api_wizard.py +0 -91
  185. coach_wizards/base_wizard.py +0 -209
  186. coach_wizards/cicd_wizard.py +0 -91
  187. coach_wizards/code_reviewer_README.md +0 -60
  188. coach_wizards/code_reviewer_wizard.py +0 -180
  189. coach_wizards/compliance_wizard.py +0 -91
  190. coach_wizards/database_wizard.py +0 -91
  191. coach_wizards/debugging_wizard.py +0 -91
  192. coach_wizards/documentation_wizard.py +0 -91
  193. coach_wizards/generate_wizards.py +0 -347
  194. coach_wizards/localization_wizard.py +0 -173
  195. coach_wizards/migration_wizard.py +0 -91
  196. coach_wizards/monitoring_wizard.py +0 -91
  197. coach_wizards/observability_wizard.py +0 -91
  198. coach_wizards/performance_wizard.py +0 -91
  199. coach_wizards/prompt_engineering_wizard.py +0 -661
  200. coach_wizards/refactoring_wizard.py +0 -91
  201. coach_wizards/scaling_wizard.py +0 -90
  202. coach_wizards/security_wizard.py +0 -92
  203. coach_wizards/testing_wizard.py +0 -91
  204. empathy_framework-4.6.6.dist-info/METADATA +0 -1597
  205. empathy_framework-4.6.6.dist-info/RECORD +0 -410
  206. empathy_llm_toolkit/wizards/__init__.py +0 -43
  207. empathy_llm_toolkit/wizards/base_wizard.py +0 -364
  208. empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
  209. empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
  210. empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
  211. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
  212. empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
  213. empathy_os/wizard_factory_cli.py +0 -170
  214. empathy_software_plugin/wizards/__init__.py +0 -42
  215. empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
  216. empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
  217. empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
  218. empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
  219. empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
  220. empathy_software_plugin/wizards/base_wizard.py +0 -288
  221. empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
  222. empathy_software_plugin/wizards/code_review_wizard.py +0 -604
  223. empathy_software_plugin/wizards/debugging/__init__.py +0 -50
  224. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
  225. empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
  226. empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
  227. empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
  228. empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
  229. empathy_software_plugin/wizards/debugging/verification.py +0 -369
  230. empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
  231. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
  232. empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
  233. empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
  234. empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
  235. empathy_software_plugin/wizards/performance/__init__.py +0 -9
  236. empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
  237. empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
  238. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
  239. empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
  240. empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
  241. empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
  242. empathy_software_plugin/wizards/security/__init__.py +0 -32
  243. empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
  244. empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
  245. empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
  246. empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
  247. empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
  248. empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
  249. empathy_software_plugin/wizards/testing/__init__.py +0 -27
  250. empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
  251. empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
  252. empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
  253. empathy_software_plugin/wizards/testing_wizard.py +0 -274
  254. wizards/__init__.py +0 -82
  255. wizards/admission_assessment_wizard.py +0 -644
  256. wizards/care_plan.py +0 -321
  257. wizards/clinical_assessment.py +0 -769
  258. wizards/discharge_planning.py +0 -77
  259. wizards/discharge_summary_wizard.py +0 -468
  260. wizards/dosage_calculation.py +0 -497
  261. wizards/incident_report_wizard.py +0 -454
  262. wizards/medication_reconciliation.py +0 -85
  263. wizards/nursing_assessment.py +0 -171
  264. wizards/patient_education.py +0 -654
  265. wizards/quality_improvement.py +0 -705
  266. wizards/sbar_report.py +0 -324
  267. wizards/sbar_wizard.py +0 -608
  268. wizards/shift_handoff_wizard.py +0 -535
  269. wizards/soap_note_wizard.py +0 -679
  270. wizards/treatment_plan.py +0 -15
  271. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/WHEEL +0 -0
  272. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/entry_points.txt +0 -0
  273. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,519 +0,0 @@
1
- """Book Chapter Wizard - Level 4 Anticipatory Empathy
2
-
3
- Transforms technical documentation into polished book chapters.
4
-
5
- This wizard encodes the patterns discovered during the creation of
6
- "Persistent Memory for AI" book, where 5 chapters + 5 appendices
7
- were written in ~2 hours through systematic transformation of
8
- existing documentation.
9
-
10
- Key Insight: Technical docs contain the knowledge, but not the
11
- narrative structure. This wizard bridges that gap.
12
-
13
- Copyright 2025 Smart AI Memory, LLC
14
- Licensed under Fair Source 0.9
15
- """
16
-
17
- import os
18
- import re
19
- import sys
20
- from typing import Any
21
-
22
- sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "src"))
23
-
24
- from empathy_os.plugins import BaseWizard
25
-
26
-
27
- class BookChapterWizard(BaseWizard):
28
- """Level 4 Anticipatory: Transforms technical docs into book chapters.
29
-
30
- Key Insight from Experience:
31
- When writing the MemDocs/Empathy book, we discovered that existing
32
- documentation could be transformed into high-quality book chapters
33
- in minutes rather than hours by following consistent patterns.
34
-
35
- This wizard automates that transformation process.
36
- """
37
-
38
- # Chapter structure template (what made our chapters successful)
39
- CHAPTER_STRUCTURE = {
40
- "opening_quote": "Memorable quote setting the theme",
41
- "introduction": {
42
- "hook": "Why this topic matters",
43
- "preview": "What you'll learn (bullet points)",
44
- "context": "How this connects to previous chapters",
45
- },
46
- "sections": {
47
- "count": "5-7 substantive sections",
48
- "structure": {
49
- "concept": "Explain the idea",
50
- "code_example": "Show it in action",
51
- "real_world": "Connect to practical use",
52
- },
53
- },
54
- "key_takeaways": "5-6 bullet points summarizing chapter",
55
- "exercise": "Hands-on 'Try It Yourself' activity",
56
- "navigation": "Next chapter link",
57
- }
58
-
59
- # Voice patterns (extracted from successful chapters)
60
- VOICE_PATTERNS = {
61
- "authority": "State facts confidently without hedging",
62
- "practicality": "Every concept should have code",
63
- "progression": "Build complexity gradually",
64
- "callbacks": "Reference earlier chapters",
65
- "foreshadowing": "Hint at upcoming topics",
66
- }
67
-
68
- def __init__(self):
69
- super().__init__(
70
- name="Book Chapter Wizard",
71
- domain="documentation",
72
- empathy_level=4,
73
- category="content_transformation",
74
- )
75
-
76
- def get_required_context(self) -> list[str]:
77
- """Required context for analysis"""
78
- return [
79
- "source_document", # Path to source technical doc
80
- "chapter_number", # Target chapter number
81
- "chapter_title", # Target chapter title
82
- "book_context", # Brief context about the book
83
- ]
84
-
85
- async def analyze(self, context: dict[str, Any]) -> dict[str, Any]:
86
- """Analyze source document and generate transformation plan.
87
-
88
- Returns a complete blueprint for chapter creation.
89
- """
90
- self.validate_context(context)
91
-
92
- source_doc = context["source_document"]
93
- chapter_num = context["chapter_number"]
94
- chapter_title = context["chapter_title"]
95
- book_context = context.get("book_context", "")
96
-
97
- # Read and analyze source document
98
- source_content = self._read_source(source_doc)
99
- if not source_content:
100
- return self._error_result(f"Could not read source: {source_doc}")
101
-
102
- # Extract key elements from source
103
- elements = await self._extract_elements(source_content)
104
-
105
- # Generate transformation plan
106
- transformation_plan = await self._create_transformation_plan(
107
- elements,
108
- chapter_num,
109
- chapter_title,
110
- book_context,
111
- )
112
-
113
- # Level 4: Predict potential issues
114
- predictions = await self._predict_transformation_issues(elements, transformation_plan)
115
-
116
- # Generate chapter outline
117
- outline = self._generate_outline(elements, chapter_num, chapter_title)
118
-
119
- # Generate draft content
120
- draft = await self._generate_draft(
121
- elements,
122
- outline,
123
- chapter_num,
124
- chapter_title,
125
- book_context,
126
- )
127
-
128
- return {
129
- "source_analysis": elements,
130
- "transformation_plan": transformation_plan,
131
- "predictions": predictions,
132
- "outline": outline,
133
- "draft": draft,
134
- "recommendations": self._generate_recommendations(predictions),
135
- "confidence": 0.88,
136
- "metadata": {
137
- "wizard": self.name,
138
- "empathy_level": self.empathy_level,
139
- "source_words": len(source_content.split()),
140
- "estimated_chapter_words": len(draft.split()) if draft else 0,
141
- },
142
- }
143
-
144
- def _read_source(self, source_path: str) -> str:
145
- """Read source document content."""
146
- try:
147
- with open(source_path, encoding="utf-8") as f:
148
- return f.read()
149
- except OSError:
150
- return ""
151
-
152
- async def _extract_elements(self, content: str) -> dict[str, Any]:
153
- """Extract key elements from source document."""
154
- return {
155
- "headings": self._extract_headings(content),
156
- "code_blocks": self._extract_code_blocks(content),
157
- "key_concepts": self._extract_concepts(content),
158
- "metrics": self._extract_metrics(content),
159
- "examples": self._extract_examples(content),
160
- "word_count": len(content.split()),
161
- "complexity": self._assess_complexity(content),
162
- }
163
-
164
- def _extract_headings(self, content: str) -> list[dict]:
165
- """Extract markdown headings with levels."""
166
- headings = []
167
- for match in re.finditer(r"^(#{1,6})\s+(.+)$", content, re.MULTILINE):
168
- headings.append(
169
- {
170
- "level": len(match.group(1)),
171
- "text": match.group(2).strip(),
172
- },
173
- )
174
- return headings
175
-
176
- def _extract_code_blocks(self, content: str) -> list[dict]:
177
- """Extract code blocks with language hints."""
178
- blocks = []
179
- pattern = r"```(\w*)\n(.*?)```"
180
- for match in re.finditer(pattern, content, re.DOTALL):
181
- blocks.append(
182
- {
183
- "language": match.group(1) or "text",
184
- "code": match.group(2).strip(),
185
- "lines": len(match.group(2).strip().split("\n")),
186
- },
187
- )
188
- return blocks
189
-
190
- def _extract_concepts(self, content: str) -> list[str]:
191
- """Extract key concepts (bold text, definitions)."""
192
- concepts = []
193
- # Bold text often indicates key concepts
194
- for match in re.finditer(r"\*\*([^*]+)\*\*", content):
195
- concept = match.group(1).strip()
196
- if len(concept) < 50: # Reasonable concept length
197
- concepts.append(concept)
198
- return list(dict.fromkeys(concepts))[:20] # Dedupe (preserves order), limit
199
-
200
- def _extract_metrics(self, content: str) -> list[str]:
201
- """Extract metrics and numbers (good for book credibility)."""
202
- metrics = []
203
- # Look for percentage patterns
204
- for match in re.finditer(r"\d+\.?\d*%", content):
205
- metrics.append(match.group(0))
206
- # Look for multiplier patterns
207
- for match in re.finditer(r"\d+\.?\d*x\s+\w+", content):
208
- metrics.append(match.group(0))
209
- return list(dict.fromkeys(metrics))[:10] # Dedupe (preserves order)
210
-
211
- def _extract_examples(self, content: str) -> list[str]:
212
- """Extract example scenarios."""
213
- examples = []
214
- # Look for "Example:" or "For example" sections
215
- pattern = r"(?:Example|For example)[:\s]+([^\n]+(?:\n(?!\n)[^\n]+)*)"
216
- for match in re.finditer(pattern, content, re.IGNORECASE):
217
- examples.append(match.group(1).strip()[:200])
218
- return examples[:5]
219
-
220
- def _assess_complexity(self, content: str) -> str:
221
- """Assess content complexity."""
222
- code_ratio = content.count("```") / max(1, len(content.split()) / 100)
223
- if code_ratio > 2:
224
- return "high_code"
225
- if "architecture" in content.lower() or "system" in content.lower():
226
- return "architectural"
227
- if len(content.split()) < 500:
228
- return "brief"
229
- return "standard"
230
-
231
- async def _create_transformation_plan(
232
- self,
233
- elements: dict,
234
- chapter_num: int,
235
- chapter_title: str,
236
- book_context: str,
237
- ) -> dict[str, Any]:
238
- """Create a plan for transforming source to chapter."""
239
- return {
240
- "approach": self._determine_approach(elements),
241
- "structure_mapping": {
242
- "source_headings_to_sections": self._map_headings(elements["headings"]),
243
- "code_integration": f"{len(elements['code_blocks'])} blocks to integrate",
244
- "concepts_to_define": elements["key_concepts"][:10],
245
- "metrics_to_highlight": elements["metrics"],
246
- },
247
- "additions_needed": [
248
- "Opening quote",
249
- "Introduction with learning objectives",
250
- "Key takeaways section",
251
- "Try It Yourself exercise",
252
- "Next chapter navigation",
253
- ],
254
- "voice_adjustments": [
255
- "Convert technical jargon to accessible language",
256
- "Add narrative flow between sections",
257
- "Include 'why this matters' context",
258
- "Add real-world analogies where appropriate",
259
- ],
260
- "estimated_expansion": self._estimate_expansion(elements),
261
- }
262
-
263
- def _determine_approach(self, elements: dict) -> str:
264
- """Determine transformation approach based on content."""
265
- if elements["complexity"] == "high_code":
266
- return "code_first: Lead with examples, explain after"
267
- if elements["complexity"] == "architectural":
268
- return "concept_first: Explain architecture, then show implementation"
269
- if elements["complexity"] == "brief":
270
- return "expansion: Significantly expand with examples and context"
271
- return "balanced: Mix concepts and code throughout"
272
-
273
- def _map_headings(self, headings: list) -> list[dict]:
274
- """Map source headings to chapter sections."""
275
- mapped = []
276
- section_num = 1
277
- for h in headings:
278
- if h["level"] <= 2:
279
- mapped.append(
280
- {
281
- "source": h["text"],
282
- "target_section": f"Section {section_num}: {h['text']}",
283
- "recommendation": "Keep and expand",
284
- },
285
- )
286
- section_num += 1
287
- return mapped
288
-
289
- def _estimate_expansion(self, elements: dict) -> str:
290
- """Estimate how much expansion is needed."""
291
- source_words = elements["word_count"]
292
- if source_words < 500:
293
- return f"High expansion needed: {source_words} → ~3000 words (6x)"
294
- if source_words < 1500:
295
- return f"Moderate expansion: {source_words} → ~3500 words (2-3x)"
296
- return f"Light expansion: {source_words} → ~4000 words (1.5x)"
297
-
298
- async def _predict_transformation_issues(
299
- self,
300
- elements: dict,
301
- plan: dict,
302
- ) -> list[dict[str, Any]]:
303
- """Level 4: Predict issues before they occur."""
304
- predictions = []
305
-
306
- # Check for missing code examples
307
- if len(elements["code_blocks"]) < 3:
308
- predictions.append(
309
- {
310
- "type": "insufficient_code",
311
- "alert": (
312
- "Source has fewer than 3 code examples. "
313
- "Book chapters benefit from 5-8 code blocks for engagement."
314
- ),
315
- "probability": "high",
316
- "impact": "medium",
317
- "prevention": "Add additional examples during transformation",
318
- },
319
- )
320
-
321
- # Check for missing metrics
322
- if not elements["metrics"]:
323
- predictions.append(
324
- {
325
- "type": "missing_metrics",
326
- "alert": (
327
- "No metrics found in source. "
328
- "Readers trust content more with concrete numbers."
329
- ),
330
- "probability": "high",
331
- "impact": "medium",
332
- "prevention": "Add relevant metrics from project data",
333
- },
334
- )
335
-
336
- # Check for concept density
337
- if len(elements["key_concepts"]) > 15:
338
- predictions.append(
339
- {
340
- "type": "concept_overload",
341
- "alert": (
342
- f"Found {len(elements['key_concepts'])} key concepts. "
343
- "Consider splitting into multiple chapters or prioritizing."
344
- ),
345
- "probability": "medium",
346
- "impact": "high",
347
- "prevention": "Focus on 8-10 core concepts, defer others",
348
- },
349
- )
350
-
351
- # Check for missing examples
352
- if len(elements["examples"]) < 2:
353
- predictions.append(
354
- {
355
- "type": "insufficient_examples",
356
- "alert": (
357
- "Few practical examples found. "
358
- "Book chapters need real-world scenarios to resonate."
359
- ),
360
- "probability": "high",
361
- "impact": "high",
362
- "prevention": "Create 2-3 relatable use cases",
363
- },
364
- )
365
-
366
- return predictions
367
-
368
- def _generate_outline(
369
- self,
370
- elements: dict,
371
- chapter_num: int,
372
- chapter_title: str,
373
- ) -> str:
374
- """Generate chapter outline."""
375
- outline = f"""# Chapter {chapter_num}: {chapter_title}
376
-
377
- > "Opening quote here"
378
-
379
- ## Introduction
380
-
381
- - Why this topic matters
382
- - What you'll learn:
383
- - Learning objective 1
384
- - Learning objective 2
385
- - Learning objective 3
386
- - Connection to previous chapters
387
-
388
- ---
389
-
390
- """
391
- # Add sections from source headings
392
- for _i, h in enumerate(elements["headings"][:7], 1):
393
- if h["level"] <= 2:
394
- outline += f"""## {h["text"]}
395
-
396
- [Transform content from source]
397
- [Add code example]
398
- [Add practical application]
399
-
400
- ---
401
-
402
- """
403
-
404
- outline += """## Key Takeaways
405
-
406
- 1. Takeaway 1
407
- 2. Takeaway 2
408
- 3. Takeaway 3
409
- 4. Takeaway 4
410
- 5. Takeaway 5
411
-
412
- ---
413
-
414
- ## Try It Yourself
415
-
416
- **Exercise: [Title]**
417
-
418
- 1. Step 1
419
- 2. Step 2
420
- 3. Step 3
421
-
422
- **Expected outcome**: [Description]
423
-
424
- ---
425
-
426
- **Next:** [Chapter N+1: Title](./next-chapter.md)
427
- """
428
- return outline
429
-
430
- async def _generate_draft(
431
- self,
432
- elements: dict,
433
- outline: str,
434
- chapter_num: int,
435
- chapter_title: str,
436
- book_context: str,
437
- ) -> str:
438
- """Generate draft chapter content."""
439
- # This would ideally call an LLM for full generation
440
- # For now, return enhanced outline with guidance
441
- draft = f"""# Chapter {chapter_num}: {chapter_title}
442
-
443
- > "Quote to be selected based on chapter theme"
444
-
445
- ## Introduction
446
-
447
- [Opening hook connecting to reader's experience]
448
-
449
- Throughout this book, we've explored [previous context]. Now we turn to {chapter_title.lower()}, which [significance].
450
-
451
- **What You'll Learn:**
452
- """
453
- # Add learning objectives from concepts
454
- for _i, concept in enumerate(elements["key_concepts"][:4], 1):
455
- draft += f"- {concept}\n"
456
-
457
- draft += "\n---\n\n"
458
-
459
- # Add sections with code blocks
460
- for i, h in enumerate(elements["headings"][:6], 1):
461
- if h["level"] <= 2:
462
- draft += f"## {h['text']}\n\n"
463
- draft += "[Expand this section with narrative and examples]\n\n"
464
-
465
- # Add relevant code block if available
466
- if i <= len(elements["code_blocks"]):
467
- block = elements["code_blocks"][i - 1]
468
- draft += f"```{block['language']}\n{block['code']}\n```\n\n"
469
-
470
- draft += "---\n\n"
471
-
472
- # Add key takeaways
473
- draft += """## Key Takeaways
474
-
475
- """
476
- for i, concept in enumerate(elements["key_concepts"][:5], 1):
477
- draft += f"{i}. **{concept}** - [Expand with one-sentence summary]\n"
478
-
479
- draft += """
480
- ---
481
-
482
- ## Try It Yourself
483
-
484
- **Exercise: Apply What You've Learned**
485
-
486
- 1. [First step based on chapter content]
487
- 2. [Second step building on first]
488
- 3. [Third step completing the exercise]
489
-
490
- **Expected outcome**: [What success looks like]
491
-
492
- ---
493
-
494
- **Next:** [Next Chapter Title](./next-chapter.md)
495
- """
496
- return draft
497
-
498
- def _generate_recommendations(self, predictions: list) -> list[str]:
499
- """Generate actionable recommendations."""
500
- recs = []
501
-
502
- for pred in predictions:
503
- if pred.get("impact") in ["high", "medium"]:
504
- recs.append(f"[{pred['type'].upper()}] {pred['alert']}")
505
- recs.append(f" → Prevention: {pred['prevention']}")
506
-
507
- if not recs:
508
- recs.append("Source document is well-suited for transformation.")
509
- recs.append("Proceed with standard chapter structure.")
510
-
511
- return recs
512
-
513
- def _error_result(self, message: str) -> dict[str, Any]:
514
- """Return error result."""
515
- return {
516
- "error": message,
517
- "confidence": 0.0,
518
- "metadata": {"wizard": self.name},
519
- }