scitex 2.14.0__py3-none-any.whl → 2.15.3__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 (264) hide show
  1. scitex/__init__.py +71 -17
  2. scitex/_env_loader.py +156 -0
  3. scitex/_mcp_resources/__init__.py +37 -0
  4. scitex/_mcp_resources/_cheatsheet.py +135 -0
  5. scitex/_mcp_resources/_figrecipe.py +138 -0
  6. scitex/_mcp_resources/_formats.py +102 -0
  7. scitex/_mcp_resources/_modules.py +337 -0
  8. scitex/_mcp_resources/_session.py +149 -0
  9. scitex/_mcp_tools/__init__.py +4 -0
  10. scitex/_mcp_tools/audio.py +66 -0
  11. scitex/_mcp_tools/diagram.py +11 -95
  12. scitex/_mcp_tools/introspect.py +210 -0
  13. scitex/_mcp_tools/plt.py +260 -305
  14. scitex/_mcp_tools/scholar.py +74 -0
  15. scitex/_mcp_tools/social.py +27 -0
  16. scitex/_mcp_tools/template.py +24 -0
  17. scitex/_mcp_tools/writer.py +17 -210
  18. scitex/ai/_gen_ai/_PARAMS.py +10 -7
  19. scitex/ai/classification/reporters/_SingleClassificationReporter.py +45 -1603
  20. scitex/ai/classification/reporters/_mixins/__init__.py +36 -0
  21. scitex/ai/classification/reporters/_mixins/_constants.py +67 -0
  22. scitex/ai/classification/reporters/_mixins/_cv_summary.py +387 -0
  23. scitex/ai/classification/reporters/_mixins/_feature_importance.py +119 -0
  24. scitex/ai/classification/reporters/_mixins/_metrics.py +275 -0
  25. scitex/ai/classification/reporters/_mixins/_plotting.py +179 -0
  26. scitex/ai/classification/reporters/_mixins/_reports.py +153 -0
  27. scitex/ai/classification/reporters/_mixins/_storage.py +160 -0
  28. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +30 -1550
  29. scitex/ai/classification/timeseries/_sliding_window_core.py +467 -0
  30. scitex/ai/classification/timeseries/_sliding_window_plotting.py +369 -0
  31. scitex/audio/README.md +40 -36
  32. scitex/audio/__init__.py +129 -61
  33. scitex/audio/_branding.py +185 -0
  34. scitex/audio/_mcp/__init__.py +32 -0
  35. scitex/audio/_mcp/handlers.py +59 -6
  36. scitex/audio/_mcp/speak_handlers.py +238 -0
  37. scitex/audio/_relay.py +225 -0
  38. scitex/audio/_tts.py +18 -10
  39. scitex/audio/engines/base.py +17 -10
  40. scitex/audio/engines/elevenlabs_engine.py +7 -2
  41. scitex/audio/mcp_server.py +228 -75
  42. scitex/canvas/README.md +1 -1
  43. scitex/canvas/editor/_dearpygui/__init__.py +25 -0
  44. scitex/canvas/editor/_dearpygui/_editor.py +147 -0
  45. scitex/canvas/editor/_dearpygui/_handlers.py +476 -0
  46. scitex/canvas/editor/_dearpygui/_panels/__init__.py +17 -0
  47. scitex/canvas/editor/_dearpygui/_panels/_control.py +119 -0
  48. scitex/canvas/editor/_dearpygui/_panels/_element_controls.py +190 -0
  49. scitex/canvas/editor/_dearpygui/_panels/_preview.py +43 -0
  50. scitex/canvas/editor/_dearpygui/_panels/_sections.py +390 -0
  51. scitex/canvas/editor/_dearpygui/_plotting.py +187 -0
  52. scitex/canvas/editor/_dearpygui/_rendering.py +504 -0
  53. scitex/canvas/editor/_dearpygui/_selection.py +295 -0
  54. scitex/canvas/editor/_dearpygui/_state.py +93 -0
  55. scitex/canvas/editor/_dearpygui/_utils.py +61 -0
  56. scitex/canvas/editor/flask_editor/_core/__init__.py +27 -0
  57. scitex/canvas/editor/flask_editor/_core/_bbox_extraction.py +200 -0
  58. scitex/canvas/editor/flask_editor/_core/_editor.py +173 -0
  59. scitex/canvas/editor/flask_editor/_core/_export_helpers.py +353 -0
  60. scitex/canvas/editor/flask_editor/_core/_routes_basic.py +190 -0
  61. scitex/canvas/editor/flask_editor/_core/_routes_export.py +332 -0
  62. scitex/canvas/editor/flask_editor/_core/_routes_panels.py +252 -0
  63. scitex/canvas/editor/flask_editor/_core/_routes_save.py +218 -0
  64. scitex/canvas/editor/flask_editor/_core.py +25 -1684
  65. scitex/canvas/editor/flask_editor/templates/__init__.py +32 -70
  66. scitex/cli/__init__.py +38 -43
  67. scitex/cli/audio.py +160 -41
  68. scitex/cli/capture.py +133 -20
  69. scitex/cli/introspect.py +488 -0
  70. scitex/cli/main.py +200 -109
  71. scitex/cli/mcp.py +60 -34
  72. scitex/cli/plt.py +414 -0
  73. scitex/cli/repro.py +15 -8
  74. scitex/cli/resource.py +15 -8
  75. scitex/cli/scholar/__init__.py +154 -8
  76. scitex/cli/scholar/_crossref_scitex.py +296 -0
  77. scitex/cli/scholar/_fetch.py +25 -3
  78. scitex/cli/social.py +355 -0
  79. scitex/cli/stats.py +136 -11
  80. scitex/cli/template.py +129 -12
  81. scitex/cli/tex.py +15 -8
  82. scitex/cli/writer.py +49 -299
  83. scitex/cloud/__init__.py +41 -2
  84. scitex/config/README.md +1 -1
  85. scitex/config/__init__.py +16 -2
  86. scitex/config/_env_registry.py +256 -0
  87. scitex/context/__init__.py +22 -0
  88. scitex/dev/__init__.py +20 -1
  89. scitex/diagram/__init__.py +42 -19
  90. scitex/diagram/mcp_server.py +13 -125
  91. scitex/gen/__init__.py +50 -14
  92. scitex/gen/_list_packages.py +4 -4
  93. scitex/introspect/__init__.py +82 -0
  94. scitex/introspect/_call_graph.py +303 -0
  95. scitex/introspect/_class_hierarchy.py +163 -0
  96. scitex/introspect/_core.py +41 -0
  97. scitex/introspect/_docstring.py +131 -0
  98. scitex/introspect/_examples.py +113 -0
  99. scitex/introspect/_imports.py +271 -0
  100. scitex/{gen/_inspect_module.py → introspect/_list_api.py} +48 -56
  101. scitex/introspect/_mcp/__init__.py +41 -0
  102. scitex/introspect/_mcp/handlers.py +233 -0
  103. scitex/introspect/_members.py +155 -0
  104. scitex/introspect/_resolve.py +89 -0
  105. scitex/introspect/_signature.py +131 -0
  106. scitex/introspect/_source.py +80 -0
  107. scitex/introspect/_type_hints.py +172 -0
  108. scitex/io/_save.py +1 -2
  109. scitex/io/bundle/README.md +1 -1
  110. scitex/logging/_formatters.py +19 -9
  111. scitex/mcp_server.py +98 -5
  112. scitex/os/__init__.py +4 -0
  113. scitex/{gen → os}/_check_host.py +4 -5
  114. scitex/plt/__init__.py +245 -550
  115. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +5 -10
  116. scitex/plt/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  117. scitex/plt/gallery/README.md +1 -1
  118. scitex/plt/utils/_hitmap/__init__.py +82 -0
  119. scitex/plt/utils/_hitmap/_artist_extraction.py +343 -0
  120. scitex/plt/utils/_hitmap/_color_application.py +346 -0
  121. scitex/plt/utils/_hitmap/_color_conversion.py +121 -0
  122. scitex/plt/utils/_hitmap/_constants.py +40 -0
  123. scitex/plt/utils/_hitmap/_hitmap_core.py +334 -0
  124. scitex/plt/utils/_hitmap/_path_extraction.py +357 -0
  125. scitex/plt/utils/_hitmap/_query.py +113 -0
  126. scitex/plt/utils/_hitmap.py +46 -1616
  127. scitex/plt/utils/_metadata/__init__.py +80 -0
  128. scitex/plt/utils/_metadata/_artists/__init__.py +25 -0
  129. scitex/plt/utils/_metadata/_artists/_base.py +195 -0
  130. scitex/plt/utils/_metadata/_artists/_collections.py +356 -0
  131. scitex/plt/utils/_metadata/_artists/_extract.py +57 -0
  132. scitex/plt/utils/_metadata/_artists/_images.py +80 -0
  133. scitex/plt/utils/_metadata/_artists/_lines.py +261 -0
  134. scitex/plt/utils/_metadata/_artists/_patches.py +247 -0
  135. scitex/plt/utils/_metadata/_artists/_text.py +106 -0
  136. scitex/plt/utils/_metadata/_csv.py +416 -0
  137. scitex/plt/utils/_metadata/_detect.py +225 -0
  138. scitex/plt/utils/_metadata/_legend.py +127 -0
  139. scitex/plt/utils/_metadata/_rounding.py +117 -0
  140. scitex/plt/utils/_metadata/_verification.py +202 -0
  141. scitex/schema/README.md +1 -1
  142. scitex/scholar/__init__.py +8 -0
  143. scitex/scholar/_mcp/crossref_handlers.py +265 -0
  144. scitex/scholar/core/Scholar.py +63 -1700
  145. scitex/scholar/core/_mixins/__init__.py +36 -0
  146. scitex/scholar/core/_mixins/_enrichers.py +270 -0
  147. scitex/scholar/core/_mixins/_library_handlers.py +100 -0
  148. scitex/scholar/core/_mixins/_loaders.py +103 -0
  149. scitex/scholar/core/_mixins/_pdf_download.py +375 -0
  150. scitex/scholar/core/_mixins/_pipeline.py +312 -0
  151. scitex/scholar/core/_mixins/_project_handlers.py +125 -0
  152. scitex/scholar/core/_mixins/_savers.py +69 -0
  153. scitex/scholar/core/_mixins/_search.py +103 -0
  154. scitex/scholar/core/_mixins/_services.py +88 -0
  155. scitex/scholar/core/_mixins/_url_finding.py +105 -0
  156. scitex/scholar/crossref_scitex.py +367 -0
  157. scitex/scholar/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  158. scitex/scholar/examples/00_run_all.sh +120 -0
  159. scitex/scholar/jobs/_executors.py +27 -3
  160. scitex/scholar/pdf_download/ScholarPDFDownloader.py +38 -416
  161. scitex/scholar/pdf_download/_cli.py +154 -0
  162. scitex/scholar/pdf_download/strategies/__init__.py +11 -8
  163. scitex/scholar/pdf_download/strategies/manual_download_fallback.py +80 -3
  164. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +73 -121
  165. scitex/scholar/pipelines/ScholarPipelineParallel.py +80 -138
  166. scitex/scholar/pipelines/ScholarPipelineSingle.py +43 -63
  167. scitex/scholar/pipelines/_single_steps.py +71 -36
  168. scitex/scholar/storage/_LibraryManager.py +97 -1695
  169. scitex/scholar/storage/_mixins/__init__.py +30 -0
  170. scitex/scholar/storage/_mixins/_bibtex_handlers.py +128 -0
  171. scitex/scholar/storage/_mixins/_library_operations.py +218 -0
  172. scitex/scholar/storage/_mixins/_metadata_conversion.py +226 -0
  173. scitex/scholar/storage/_mixins/_paper_saving.py +456 -0
  174. scitex/scholar/storage/_mixins/_resolution.py +376 -0
  175. scitex/scholar/storage/_mixins/_storage_helpers.py +121 -0
  176. scitex/scholar/storage/_mixins/_symlink_handlers.py +226 -0
  177. scitex/security/README.md +3 -3
  178. scitex/session/README.md +1 -1
  179. scitex/session/__init__.py +26 -7
  180. scitex/session/_decorator.py +1 -1
  181. scitex/sh/README.md +1 -1
  182. scitex/sh/__init__.py +7 -4
  183. scitex/social/__init__.py +155 -0
  184. scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  185. scitex/stats/_mcp/_handlers/__init__.py +31 -0
  186. scitex/stats/_mcp/_handlers/_corrections.py +113 -0
  187. scitex/stats/_mcp/_handlers/_descriptive.py +78 -0
  188. scitex/stats/_mcp/_handlers/_effect_size.py +106 -0
  189. scitex/stats/_mcp/_handlers/_format.py +94 -0
  190. scitex/stats/_mcp/_handlers/_normality.py +110 -0
  191. scitex/stats/_mcp/_handlers/_posthoc.py +224 -0
  192. scitex/stats/_mcp/_handlers/_power.py +247 -0
  193. scitex/stats/_mcp/_handlers/_recommend.py +102 -0
  194. scitex/stats/_mcp/_handlers/_run_test.py +279 -0
  195. scitex/stats/_mcp/_handlers/_stars.py +48 -0
  196. scitex/stats/_mcp/handlers.py +19 -1171
  197. scitex/stats/auto/_stat_style.py +175 -0
  198. scitex/stats/auto/_style_definitions.py +411 -0
  199. scitex/stats/auto/_styles.py +22 -620
  200. scitex/stats/descriptive/__init__.py +11 -8
  201. scitex/stats/descriptive/_ci.py +39 -0
  202. scitex/stats/power/_power.py +15 -4
  203. scitex/str/__init__.py +2 -1
  204. scitex/str/_title_case.py +63 -0
  205. scitex/template/README.md +1 -1
  206. scitex/template/__init__.py +25 -10
  207. scitex/template/_code_templates.py +147 -0
  208. scitex/template/_mcp/handlers.py +81 -0
  209. scitex/template/_mcp/tool_schemas.py +55 -0
  210. scitex/template/_templates/__init__.py +51 -0
  211. scitex/template/_templates/audio.py +233 -0
  212. scitex/template/_templates/canvas.py +312 -0
  213. scitex/template/_templates/capture.py +268 -0
  214. scitex/template/_templates/config.py +43 -0
  215. scitex/template/_templates/diagram.py +294 -0
  216. scitex/template/_templates/io.py +107 -0
  217. scitex/template/_templates/module.py +53 -0
  218. scitex/template/_templates/plt.py +202 -0
  219. scitex/template/_templates/scholar.py +267 -0
  220. scitex/template/_templates/session.py +130 -0
  221. scitex/template/_templates/session_minimal.py +43 -0
  222. scitex/template/_templates/session_plot.py +67 -0
  223. scitex/template/_templates/session_stats.py +77 -0
  224. scitex/template/_templates/stats.py +323 -0
  225. scitex/template/_templates/writer.py +296 -0
  226. scitex/template/clone_writer_directory.py +5 -5
  227. scitex/ui/_backends/_email.py +10 -2
  228. scitex/ui/_backends/_webhook.py +5 -1
  229. scitex/web/_search_pubmed.py +10 -6
  230. scitex/writer/README.md +1 -1
  231. scitex/writer/__init__.py +43 -34
  232. scitex/writer/_mcp/handlers.py +11 -744
  233. scitex/writer/_mcp/tool_schemas.py +5 -335
  234. scitex-2.15.3.dist-info/METADATA +667 -0
  235. {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/RECORD +241 -120
  236. scitex/canvas/editor/flask_editor/templates/_scripts.py +0 -4933
  237. scitex/canvas/editor/flask_editor/templates/_styles.py +0 -1658
  238. scitex/diagram/_compile.py +0 -312
  239. scitex/diagram/_diagram.py +0 -355
  240. scitex/diagram/_mcp/__init__.py +0 -4
  241. scitex/diagram/_mcp/handlers.py +0 -400
  242. scitex/diagram/_mcp/tool_schemas.py +0 -157
  243. scitex/diagram/_presets.py +0 -173
  244. scitex/diagram/_schema.py +0 -182
  245. scitex/diagram/_split.py +0 -278
  246. scitex/gen/_ci.py +0 -12
  247. scitex/gen/_title_case.py +0 -89
  248. scitex/plt/_mcp/__init__.py +0 -4
  249. scitex/plt/_mcp/_handlers_annotation.py +0 -102
  250. scitex/plt/_mcp/_handlers_figure.py +0 -195
  251. scitex/plt/_mcp/_handlers_plot.py +0 -252
  252. scitex/plt/_mcp/_handlers_style.py +0 -219
  253. scitex/plt/_mcp/handlers.py +0 -74
  254. scitex/plt/_mcp/tool_schemas.py +0 -497
  255. scitex/plt/mcp_server.py +0 -231
  256. scitex/scholar/examples/SUGGESTIONS.md +0 -865
  257. scitex/scholar/examples/dev.py +0 -38
  258. scitex-2.14.0.dist-info/METADATA +0 -1238
  259. /scitex/{gen → context}/_detect_environment.py +0 -0
  260. /scitex/{gen → context}/_get_notebook_path.py +0 -0
  261. /scitex/{gen/_shell.py → sh/_shell_legacy.py} +0 -0
  262. {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/WHEEL +0 -0
  263. {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/entry_points.txt +0 -0
  264. {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,296 @@
1
+ #!/usr/bin/env python3
2
+ # Timestamp: 2026-01-25
3
+ # File: src/scitex/template/_templates/writer.py
4
+ # ----------------------------------------
5
+
6
+ """Template for stx.writer LaTeX manuscript compilation module usage."""
7
+
8
+ TEMPLATE = {
9
+ "name": "Writer Module",
10
+ "description": "stx.writer usage for LaTeX manuscript compilation and paper writing",
11
+ "filename": "writer_script.py",
12
+ "priority": 9,
13
+ "content": '''#!/usr/bin/env python3
14
+ # -*- coding: utf-8 -*-
15
+ # Timestamp: {timestamp}
16
+ # File: {filepath}
17
+
18
+ """
19
+ stx.writer - LaTeX Manuscript Compilation
20
+ =========================================
21
+
22
+ stx.writer provides:
23
+ - LaTeX to PDF compilation
24
+ - BibTeX bibliography processing
25
+ - Figure and table management
26
+ - Word count and statistics
27
+ - Manuscript structure scaffolding
28
+
29
+ Usage Patterns
30
+ --------------
31
+ 1. CLI: scitex writer <command> [options]
32
+ 2. MCP: writer_usage tool for documentation
33
+ 3. Python API: stx.writer.* functions
34
+
35
+ Typical Workflow
36
+ ----------------
37
+ 1. Clone paper template: scitex template clone paper ./manuscript
38
+ 2. Write manuscript: Edit .tex files
39
+ 3. Compile: scitex writer compile ./manuscript
40
+ 4. Check: scitex writer wordcount ./manuscript
41
+ """
42
+
43
+ import scitex as stx
44
+
45
+ # ============================================================
46
+ # Pattern 1: CLI Usage (Recommended)
47
+ # ============================================================
48
+
49
+ """
50
+ CLI Commands:
51
+ -------------
52
+
53
+ # Compile manuscript to PDF
54
+ scitex writer compile ./manuscript
55
+ scitex writer compile ./manuscript --output paper.pdf
56
+
57
+ # Compile with bibliography
58
+ scitex writer compile ./manuscript --bib
59
+
60
+ # Clean auxiliary files
61
+ scitex writer clean ./manuscript
62
+
63
+ # Word count
64
+ scitex writer wordcount ./manuscript
65
+
66
+ # Check for common LaTeX errors
67
+ scitex writer check ./manuscript
68
+
69
+ # Watch for changes and auto-compile
70
+ scitex writer watch ./manuscript
71
+ """
72
+
73
+ # ============================================================
74
+ # Pattern 2: Project Structure
75
+ # ============================================================
76
+
77
+ """
78
+ Recommended Manuscript Structure:
79
+ ---------------------------------
80
+
81
+ manuscript/
82
+ main.tex # Main document
83
+ sections/
84
+ abstract.tex # Abstract
85
+ introduction.tex # Introduction
86
+ methods.tex # Methods
87
+ results.tex # Results
88
+ discussion.tex # Discussion
89
+ references.tex # References section
90
+ figures/
91
+ fig1.png # Figure files
92
+ fig2.pdf
93
+ tables/
94
+ table1.tex # LaTeX tables
95
+ references.bib # BibTeX bibliography
96
+ config/
97
+ preamble.tex # Custom packages/macros
98
+
99
+ Create this structure with:
100
+ scitex template clone paper ./manuscript
101
+ """
102
+
103
+ # ============================================================
104
+ # Pattern 3: LaTeX Best Practices
105
+ # ============================================================
106
+
107
+ """
108
+ LaTeX Writing Guidelines:
109
+ -------------------------
110
+
111
+ 1. Document Structure:
112
+ \\\\documentclass[article]
113
+ \\\\input[config/preamble]
114
+ \\\\begin[document]
115
+ \\\\input[sections/abstract]
116
+ \\\\input[sections/introduction]
117
+ \\\\input[sections/methods]
118
+ \\\\input[sections/results]
119
+ \\\\input[sections/discussion]
120
+ \\\\bibliography[references]
121
+ \\\\end[document]
122
+
123
+ 2. Figure Inclusion:
124
+ \\\\begin[figure][htbp]
125
+ \\\\centering
126
+ \\\\includegraphics[width=0.8\\\\linewidth][figures/fig1.png]
127
+ \\\\caption[Description of the figure.]
128
+ \\\\label[fig:main]
129
+ \\\\end[figure]
130
+
131
+ 3. Table Inclusion:
132
+ \\\\begin[table][htbp]
133
+ \\\\centering
134
+ \\\\caption[Description of the table.]
135
+ \\\\label[tab:results]
136
+ \\\\input[tables/table1]
137
+ \\\\end[table]
138
+
139
+ 4. Citations:
140
+ As shown in previous work~\\\\cite[author2023]...
141
+ Multiple citations~\\\\cite[ref1,ref2,ref3]...
142
+
143
+ 5. Cross-references:
144
+ See Figure~\\\\ref[fig:main]...
145
+ Table~\\\\ref[tab:results] shows...
146
+ Section~\\\\ref[sec:methods] describes...
147
+
148
+ Note: Replace [] with curly braces in actual LaTeX code.
149
+ """
150
+
151
+ # ============================================================
152
+ # Pattern 4: BibTeX Management
153
+ # ============================================================
154
+
155
+ """
156
+ BibTeX Best Practices:
157
+ ----------------------
158
+
159
+ # references.bib structure
160
+ @article key=author2023,
161
+ author = Smith, John and Doe, Jane,
162
+ title = Title of the Paper,
163
+ journal = Journal Name,
164
+ year = 2023,
165
+ volume = 10,
166
+ pages = 1--15,
167
+ doi = 10.1000/example
168
+
169
+
170
+ # Enrich with scitex scholar
171
+ scitex scholar enrich --bibtex references.bib
172
+
173
+ # This adds:
174
+ # - Missing DOIs
175
+ # - Abstracts
176
+ # - Citation counts
177
+ # - Impact factors
178
+ """
179
+
180
+ # ============================================================
181
+ # Pattern 5: Integration with SciTeX
182
+ # ============================================================
183
+
184
+ @stx.session
185
+ def main(
186
+ manuscript_dir="./manuscript",
187
+ CONFIG=stx.INJECTED,
188
+ logger=stx.INJECTED,
189
+ ):
190
+ """Manuscript preparation workflow."""
191
+ from pathlib import Path
192
+
193
+ ms_dir = Path(manuscript_dir)
194
+
195
+ # 1. Generate figures from analysis
196
+ logger.info("Generating figures...")
197
+ # (figures created with stx.plt would go in ms_dir/figures/)
198
+
199
+ # 2. Generate tables from data
200
+ logger.info("Generating tables...")
201
+ # (tables created with stx.io.save() in LaTeX format)
202
+
203
+ # 3. Copy to manuscript directory
204
+ import shutil
205
+ if (CONFIG.SDIR_OUT / "figures").exists():
206
+ for fig in (CONFIG.SDIR_OUT / "figures").glob("*.png"):
207
+ shutil.copy(fig, ms_dir / "figures" / fig.name)
208
+ logger.info("Copied figure to manuscript")
209
+
210
+ logger.info("Figures ready in manuscript/figures/")
211
+ return 0
212
+
213
+ # ============================================================
214
+ # Pattern 6: Python API
215
+ # ============================================================
216
+
217
+ def python_api_example():
218
+ """Direct Python API for writer."""
219
+ from scitex.writer import (
220
+ compile_manuscript,
221
+ clean_auxiliary,
222
+ word_count,
223
+ check_manuscript,
224
+ )
225
+
226
+ # Compile
227
+ result = compile_manuscript(
228
+ manuscript_dir="./manuscript",
229
+ output="paper.pdf",
230
+ bibliography=True
231
+ )
232
+ print("Compilation complete")
233
+
234
+ # Word count
235
+ stats = word_count("./manuscript")
236
+ print("Word count complete")
237
+
238
+ # Check for issues
239
+ issues = check_manuscript("./manuscript")
240
+ for issue in issues:
241
+ print("Warning found")
242
+
243
+ # Clean
244
+ clean_auxiliary("./manuscript")
245
+
246
+ # ============================================================
247
+ # Pattern 7: Automated Paper Generation
248
+ # ============================================================
249
+
250
+ """
251
+ Automated Workflow:
252
+ -------------------
253
+
254
+ 1. Run analysis scripts:
255
+ python scripts/analysis.py
256
+
257
+ 2. Figures auto-generated to:
258
+ script_out/FINISHED_SUCCESS/<session>/
259
+
260
+ 3. Copy figures to manuscript:
261
+ cp script_out/FINISHED_SUCCESS/*/figures/* manuscript/figures/
262
+
263
+ 4. Compile manuscript:
264
+ scitex writer compile ./manuscript
265
+
266
+ 5. Check word count:
267
+ scitex writer wordcount ./manuscript
268
+ """
269
+
270
+ # ============================================================
271
+ # MCP Tools Reference
272
+ # ============================================================
273
+
274
+ """
275
+ MCP Tools:
276
+ ----------
277
+
278
+ Documentation:
279
+ - writer_usage() # Get complete usage guide
280
+
281
+ Note: Most writer operations are done via CLI:
282
+ - scitex writer compile <dir>
283
+ - scitex writer clean <dir>
284
+ - scitex writer wordcount <dir>
285
+ - scitex writer check <dir>
286
+ - scitex writer watch <dir>
287
+ """
288
+
289
+ if __name__ == "__main__":
290
+ main()
291
+ ''',
292
+ }
293
+
294
+ __all__ = ["TEMPLATE"]
295
+
296
+ # EOF
@@ -25,8 +25,8 @@ TEMPLATE_REPO_URL = "https://github.com/ywatanabe1989/scitex-writer.git"
25
25
  def clone_writer_directory(
26
26
  project_dir: str,
27
27
  git_strategy: Optional[str] = "child",
28
- branch: Optional[str] = None,
29
- tag: Optional[str] = "v2.0.0",
28
+ branch: Optional[str] = "main",
29
+ tag: Optional[str] = None,
30
30
  ) -> bool:
31
31
  """
32
32
  Create a new paper directory from the scitex-writer template repository.
@@ -39,10 +39,10 @@ def clone_writer_directory(
39
39
  git_strategy : str, optional
40
40
  Git initialization strategy ('child', 'parent', None). Default is 'child'.
41
41
  branch : str, optional
42
- Specific branch of the template repository to clone. If None, clones the default branch.
42
+ Specific branch of the template repository to clone. Default is 'main'.
43
43
  Mutually exclusive with tag parameter.
44
44
  tag : str, optional
45
- Specific tag/release of the template repository to clone. Default is 'v2.0.0'.
45
+ Specific tag/release of the template repository to clone. If None, uses the branch.
46
46
  Mutually exclusive with branch parameter.
47
47
 
48
48
  Returns
@@ -53,7 +53,7 @@ def clone_writer_directory(
53
53
  Example
54
54
  -------
55
55
  >>> from scitex.template import clone_writer_directory
56
- >>> clone_writer_directory("my_paper") # Uses v2.0.0
56
+ >>> clone_writer_directory("my_paper") # Uses main branch
57
57
  >>> clone_writer_directory("./papers/my_paper")
58
58
  >>> clone_writer_directory("my_paper", branch="develop")
59
59
  >>> clone_writer_directory("my_paper", tag="v2.0.0")
@@ -24,8 +24,16 @@ class EmailBackend(BaseNotifyBackend):
24
24
  recipient: Optional[str] = None,
25
25
  sender: Optional[str] = None,
26
26
  ):
27
- self.recipient = recipient or os.getenv("SCITEX_NOTIFY_EMAIL_TO")
28
- self.sender = sender or os.getenv("SCITEX_NOTIFY_EMAIL_FROM")
27
+ self.recipient = (
28
+ recipient
29
+ or os.getenv("SCITEX_UI_EMAIL_NOTIFICATION_TO")
30
+ or os.getenv("SCITEX_NOTIFY_EMAIL_TO")
31
+ )
32
+ self.sender = (
33
+ sender
34
+ or os.getenv("SCITEX_UI_EMAIL_NOTIFICATION_FROM")
35
+ or os.getenv("SCITEX_NOTIFY_EMAIL_FROM")
36
+ )
29
37
 
30
38
  def is_available(self) -> bool:
31
39
  return bool(
@@ -22,7 +22,11 @@ class WebhookBackend(BaseNotifyBackend):
22
22
  name = "webhook"
23
23
 
24
24
  def __init__(self, url: Optional[str] = None):
25
- self.url = url or os.getenv("SCITEX_NOTIFY_WEBHOOK_URL")
25
+ self.url = (
26
+ url
27
+ or os.getenv("SCITEX_UI_WEBHOOK_URL")
28
+ or os.getenv("SCITEX_NOTIFY_WEBHOOK_URL")
29
+ )
26
30
 
27
31
  def is_available(self) -> bool:
28
32
  return bool(self.url)
@@ -179,9 +179,11 @@ def get_crossref_metrics(
179
179
 
180
180
  # Use provided email or fallback to environment variables
181
181
  if not email:
182
- email = os.getenv(
183
- "SCITEX_CROSSREF_EMAIL",
184
- os.getenv("SCITEX_PUBMED_EMAIL", "research@example.com"),
182
+ email = (
183
+ os.getenv("SCITEX_SCHOLAR_CROSSREF_EMAIL")
184
+ or os.getenv("SCITEX_CROSSREF_EMAIL")
185
+ or os.getenv("SCITEX_SCHOLAR_PUBMED_EMAIL")
186
+ or os.getenv("SCITEX_PUBMED_EMAIL", "research@example.com")
185
187
  )
186
188
  headers = {"User-Agent": f"SciTeX/1.0 (mailto:{email})"}
187
189
 
@@ -218,9 +220,11 @@ async def get_crossref_metrics_async(
218
220
 
219
221
  # Use provided email or fallback to environment variables
220
222
  if not email:
221
- email = os.getenv(
222
- "SCITEX_CROSSREF_EMAIL",
223
- os.getenv("SCITEX_PUBMED_EMAIL", "research@example.com"),
223
+ email = (
224
+ os.getenv("SCITEX_SCHOLAR_CROSSREF_EMAIL")
225
+ or os.getenv("SCITEX_CROSSREF_EMAIL")
226
+ or os.getenv("SCITEX_SCHOLAR_PUBMED_EMAIL")
227
+ or os.getenv("SCITEX_PUBMED_EMAIL", "research@example.com")
224
228
  )
225
229
  headers = {"User-Agent": f"SciTeX/1.0 (mailto:{email})"}
226
230
 
scitex/writer/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  <!-- ---
2
2
  !-- Timestamp: 2025-10-29 17:33:34
3
3
  !-- Author: ywatanabe
4
- !-- File: /home/ywatanabe/proj/scitex-code/src/scitex/writer/README.md
4
+ !-- File: /home/ywatanabe/proj/scitex-python/src/scitex/writer/README.md
5
5
  !-- --- -->
6
6
 
7
7
  # SciTeX Writer
scitex/writer/__init__.py CHANGED
@@ -1,46 +1,55 @@
1
1
  #!/usr/bin/env python3
2
- # File: /home/ywatanabe/proj/scitex-code/src/scitex/writer/__init__.py
3
-
4
2
  """
5
- SciTeX Writer - LaTeX Compilation System
6
-
7
- Python wrapper around scitex-writer shell scripts for LaTeX compilation.
3
+ SciTeX Writer - Thin wrapper delegating to scitex-writer package.
8
4
 
9
- Examples:
10
- >>> from scitex.writer import Writer, compile
5
+ Single source of truth: scitex-writer package
6
+ This module re-exports scitex-writer as-is, without modifications.
11
7
 
12
- # Using Writer class
13
- >>> writer = Writer(project_dir=Path("."))
14
- >>> result = writer.compile_manuscript()
15
-
16
- # Using unified compile function
17
- >>> result = compile("manuscript", project_dir=Path("."))
18
- >>> results = compile("manuscript", "supplementary", project_dir=Path("."))
19
- >>> results = await compile("all", project_dir=Path("."), async_=True)
8
+ Install: pip install scitex-writer
20
9
  """
21
10
 
22
- from . import utils
23
- from ._compile import compile
24
- from .Writer import Writer
11
+ import os as _os
12
+
13
+ # Set branding environment variables BEFORE importing scitex-writer
14
+ _os.environ.setdefault("SCITEX_WRITER_BRAND", "scitex.writer")
15
+ _os.environ.setdefault("SCITEX_WRITER_ALIAS", "sw")
16
+
17
+ # Re-export from scitex-writer package (single source of truth)
18
+ try:
19
+ from scitex_writer import __version__ as writer_version
20
+ from scitex_writer import (
21
+ bib,
22
+ compile,
23
+ figures,
24
+ guidelines,
25
+ project,
26
+ prompts,
27
+ tables,
28
+ )
29
+
30
+ HAS_WRITER_PKG = True
31
+
32
+ except ImportError:
33
+ HAS_WRITER_PKG = False
34
+ writer_version = None
35
+ bib = None
36
+ compile = None
37
+ figures = None
38
+ guidelines = None
39
+ project = None
40
+ prompts = None
41
+ tables = None
25
42
 
26
43
  __all__ = [
27
- "Writer",
44
+ "HAS_WRITER_PKG",
45
+ "writer_version",
46
+ "bib",
28
47
  "compile",
29
- "utils",
48
+ "figures",
49
+ "guidelines",
50
+ "project",
51
+ "prompts",
52
+ "tables",
30
53
  ]
31
54
 
32
-
33
- # Clean up namespace - hide internal submodules
34
- def _cleanup():
35
- import sys
36
-
37
- _this = sys.modules[__name__]
38
- for _attr in list(vars(_this).keys()):
39
- if _attr in ("_dataclasses",):
40
- delattr(_this, _attr)
41
-
42
-
43
- _cleanup()
44
- del _cleanup
45
-
46
55
  # EOF