empathy-framework 4.6.6__py3-none-any.whl → 4.7.0__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.
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/METADATA +7 -6
- empathy_framework-4.7.0.dist-info/RECORD +354 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/top_level.txt +0 -2
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
- empathy_llm_toolkit/agent_factory/__init__.py +6 -6
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
- empathy_llm_toolkit/agents_md/__init__.py +22 -0
- empathy_llm_toolkit/agents_md/loader.py +218 -0
- empathy_llm_toolkit/agents_md/parser.py +271 -0
- empathy_llm_toolkit/agents_md/registry.py +307 -0
- empathy_llm_toolkit/commands/__init__.py +51 -0
- empathy_llm_toolkit/commands/context.py +375 -0
- empathy_llm_toolkit/commands/loader.py +301 -0
- empathy_llm_toolkit/commands/models.py +231 -0
- empathy_llm_toolkit/commands/parser.py +371 -0
- empathy_llm_toolkit/commands/registry.py +429 -0
- empathy_llm_toolkit/config/__init__.py +8 -8
- empathy_llm_toolkit/config/unified.py +3 -7
- empathy_llm_toolkit/context/__init__.py +22 -0
- empathy_llm_toolkit/context/compaction.py +455 -0
- empathy_llm_toolkit/context/manager.py +434 -0
- empathy_llm_toolkit/hooks/__init__.py +24 -0
- empathy_llm_toolkit/hooks/config.py +306 -0
- empathy_llm_toolkit/hooks/executor.py +289 -0
- empathy_llm_toolkit/hooks/registry.py +302 -0
- empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
- empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
- empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
- empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
- empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
- empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
- empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
- empathy_llm_toolkit/learning/__init__.py +30 -0
- empathy_llm_toolkit/learning/evaluator.py +438 -0
- empathy_llm_toolkit/learning/extractor.py +514 -0
- empathy_llm_toolkit/learning/storage.py +560 -0
- empathy_llm_toolkit/providers.py +4 -11
- empathy_llm_toolkit/security/__init__.py +17 -17
- empathy_llm_toolkit/utils/tokens.py +2 -5
- empathy_os/__init__.py +202 -70
- empathy_os/cache_monitor.py +5 -3
- empathy_os/cli/__init__.py +11 -55
- empathy_os/cli/__main__.py +29 -15
- empathy_os/cli/commands/inspection.py +21 -12
- empathy_os/cli/commands/memory.py +4 -12
- empathy_os/cli/commands/profiling.py +198 -0
- empathy_os/cli/commands/utilities.py +27 -7
- empathy_os/cli.py +28 -57
- empathy_os/cli_unified.py +525 -1164
- empathy_os/cost_tracker.py +9 -3
- empathy_os/dashboard/server.py +200 -2
- empathy_os/hot_reload/__init__.py +7 -7
- empathy_os/hot_reload/config.py +6 -7
- empathy_os/hot_reload/integration.py +35 -35
- empathy_os/hot_reload/reloader.py +57 -57
- empathy_os/hot_reload/watcher.py +28 -28
- empathy_os/hot_reload/websocket.py +2 -2
- empathy_os/memory/__init__.py +11 -4
- empathy_os/memory/claude_memory.py +1 -1
- empathy_os/memory/cross_session.py +8 -12
- empathy_os/memory/edges.py +6 -6
- empathy_os/memory/file_session.py +770 -0
- empathy_os/memory/graph.py +30 -30
- empathy_os/memory/nodes.py +6 -6
- empathy_os/memory/short_term.py +15 -9
- empathy_os/memory/unified.py +606 -140
- empathy_os/meta_workflows/agent_creator.py +3 -9
- empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
- empathy_os/meta_workflows/form_engine.py +6 -18
- empathy_os/meta_workflows/intent_detector.py +64 -24
- empathy_os/meta_workflows/models.py +3 -1
- empathy_os/meta_workflows/pattern_learner.py +13 -31
- empathy_os/meta_workflows/plan_generator.py +55 -47
- empathy_os/meta_workflows/session_context.py +2 -3
- empathy_os/meta_workflows/workflow.py +20 -51
- empathy_os/models/cli.py +2 -2
- empathy_os/models/tasks.py +1 -2
- empathy_os/models/telemetry.py +4 -1
- empathy_os/models/token_estimator.py +3 -1
- empathy_os/monitoring/alerts.py +938 -9
- empathy_os/monitoring/alerts_cli.py +346 -183
- empathy_os/orchestration/execution_strategies.py +12 -29
- empathy_os/orchestration/pattern_learner.py +20 -26
- empathy_os/orchestration/real_tools.py +6 -15
- empathy_os/platform_utils.py +2 -1
- empathy_os/plugins/__init__.py +2 -2
- empathy_os/plugins/base.py +64 -64
- empathy_os/plugins/registry.py +32 -32
- empathy_os/project_index/index.py +49 -15
- empathy_os/project_index/models.py +1 -2
- empathy_os/project_index/reports.py +1 -1
- empathy_os/project_index/scanner.py +1 -0
- empathy_os/redis_memory.py +10 -7
- empathy_os/resilience/__init__.py +1 -1
- empathy_os/resilience/health.py +10 -10
- empathy_os/routing/__init__.py +7 -7
- empathy_os/routing/chain_executor.py +37 -37
- empathy_os/routing/classifier.py +36 -36
- empathy_os/routing/smart_router.py +40 -40
- empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
- empathy_os/scaffolding/__init__.py +8 -8
- empathy_os/scaffolding/__main__.py +1 -1
- empathy_os/scaffolding/cli.py +28 -28
- empathy_os/socratic/__init__.py +3 -19
- empathy_os/socratic/ab_testing.py +25 -36
- empathy_os/socratic/blueprint.py +38 -38
- empathy_os/socratic/cli.py +34 -20
- empathy_os/socratic/collaboration.py +30 -28
- empathy_os/socratic/domain_templates.py +9 -1
- empathy_os/socratic/embeddings.py +17 -13
- empathy_os/socratic/engine.py +135 -70
- empathy_os/socratic/explainer.py +70 -60
- empathy_os/socratic/feedback.py +24 -19
- empathy_os/socratic/forms.py +15 -10
- empathy_os/socratic/generator.py +51 -35
- empathy_os/socratic/llm_analyzer.py +25 -23
- empathy_os/socratic/mcp_server.py +99 -159
- empathy_os/socratic/session.py +19 -13
- empathy_os/socratic/storage.py +98 -67
- empathy_os/socratic/success.py +38 -27
- empathy_os/socratic/visual_editor.py +51 -39
- empathy_os/socratic/web_ui.py +99 -66
- empathy_os/telemetry/cli.py +3 -1
- empathy_os/telemetry/usage_tracker.py +1 -3
- empathy_os/test_generator/__init__.py +3 -3
- empathy_os/test_generator/cli.py +28 -28
- empathy_os/test_generator/generator.py +64 -66
- empathy_os/test_generator/risk_analyzer.py +11 -11
- empathy_os/vscode_bridge.py +173 -0
- empathy_os/workflows/__init__.py +212 -120
- empathy_os/workflows/batch_processing.py +8 -24
- empathy_os/workflows/bug_predict.py +1 -1
- empathy_os/workflows/code_review.py +20 -5
- empathy_os/workflows/code_review_pipeline.py +13 -8
- empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
- empathy_os/workflows/manage_documentation.py +1 -0
- empathy_os/workflows/orchestrated_health_check.py +6 -11
- empathy_os/workflows/orchestrated_release_prep.py +3 -3
- empathy_os/workflows/pr_review.py +18 -10
- empathy_os/workflows/progressive/__init__.py +2 -12
- empathy_os/workflows/progressive/cli.py +14 -37
- empathy_os/workflows/progressive/core.py +12 -12
- empathy_os/workflows/progressive/orchestrator.py +166 -144
- empathy_os/workflows/progressive/reports.py +22 -31
- empathy_os/workflows/progressive/telemetry.py +8 -14
- empathy_os/workflows/progressive/test_gen.py +29 -48
- empathy_os/workflows/progressive/workflow.py +31 -70
- empathy_os/workflows/release_prep.py +21 -6
- empathy_os/workflows/release_prep_crew.py +1 -0
- empathy_os/workflows/secure_release.py +13 -6
- empathy_os/workflows/security_audit.py +8 -3
- empathy_os/workflows/test_coverage_boost_crew.py +3 -2
- empathy_os/workflows/test_maintenance_crew.py +1 -0
- empathy_os/workflows/test_runner.py +16 -12
- empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
- empathy_software_plugin/cli.py +0 -122
- coach_wizards/__init__.py +0 -45
- coach_wizards/accessibility_wizard.py +0 -91
- coach_wizards/api_wizard.py +0 -91
- coach_wizards/base_wizard.py +0 -209
- coach_wizards/cicd_wizard.py +0 -91
- coach_wizards/code_reviewer_README.md +0 -60
- coach_wizards/code_reviewer_wizard.py +0 -180
- coach_wizards/compliance_wizard.py +0 -91
- coach_wizards/database_wizard.py +0 -91
- coach_wizards/debugging_wizard.py +0 -91
- coach_wizards/documentation_wizard.py +0 -91
- coach_wizards/generate_wizards.py +0 -347
- coach_wizards/localization_wizard.py +0 -173
- coach_wizards/migration_wizard.py +0 -91
- coach_wizards/monitoring_wizard.py +0 -91
- coach_wizards/observability_wizard.py +0 -91
- coach_wizards/performance_wizard.py +0 -91
- coach_wizards/prompt_engineering_wizard.py +0 -661
- coach_wizards/refactoring_wizard.py +0 -91
- coach_wizards/scaling_wizard.py +0 -90
- coach_wizards/security_wizard.py +0 -92
- coach_wizards/testing_wizard.py +0 -91
- empathy_framework-4.6.6.dist-info/RECORD +0 -410
- empathy_llm_toolkit/wizards/__init__.py +0 -43
- empathy_llm_toolkit/wizards/base_wizard.py +0 -364
- empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
- empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
- empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
- empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
- empathy_os/wizard_factory_cli.py +0 -170
- empathy_software_plugin/wizards/__init__.py +0 -42
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
- empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
- empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
- empathy_software_plugin/wizards/base_wizard.py +0 -288
- empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
- empathy_software_plugin/wizards/code_review_wizard.py +0 -604
- empathy_software_plugin/wizards/debugging/__init__.py +0 -50
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
- empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
- empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
- empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
- empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
- empathy_software_plugin/wizards/debugging/verification.py +0 -369
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
- empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
- empathy_software_plugin/wizards/performance/__init__.py +0 -9
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
- empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
- empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
- empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
- empathy_software_plugin/wizards/security/__init__.py +0 -32
- empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
- empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
- empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
- empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
- empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
- empathy_software_plugin/wizards/testing/__init__.py +0 -27
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
- empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
- empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
- empathy_software_plugin/wizards/testing_wizard.py +0 -274
- wizards/__init__.py +0 -82
- wizards/admission_assessment_wizard.py +0 -644
- wizards/care_plan.py +0 -321
- wizards/clinical_assessment.py +0 -769
- wizards/discharge_planning.py +0 -77
- wizards/discharge_summary_wizard.py +0 -468
- wizards/dosage_calculation.py +0 -497
- wizards/incident_report_wizard.py +0 -454
- wizards/medication_reconciliation.py +0 -85
- wizards/nursing_assessment.py +0 -171
- wizards/patient_education.py +0 -654
- wizards/quality_improvement.py +0 -705
- wizards/sbar_report.py +0 -324
- wizards/sbar_wizard.py +0 -608
- wizards/shift_handoff_wizard.py +0 -535
- wizards/soap_note_wizard.py +0 -679
- wizards/treatment_plan.py +0 -15
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/WHEEL +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/entry_points.txt +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.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
|
-
}
|