scitex 2.15.2__py3-none-any.whl → 2.15.4__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.
- scitex/_mcp_resources/__init__.py +2 -0
- scitex/_mcp_resources/_scholar.py +148 -0
- scitex/_mcp_tools/scholar.py +50 -99
- scitex/_mcp_tools/social.py +15 -232
- scitex/_mcp_tools/writer.py +7 -17
- scitex/canvas/mcp_server.py +16 -3
- scitex/capture/mcp_server.py +16 -2
- scitex/cli/audio.py +90 -20
- scitex/cli/capture.py +120 -0
- scitex/cli/introspect.py +19 -12
- scitex/cli/plt.py +78 -21
- scitex/cli/scholar/__init__.py +160 -2
- scitex/cli/scholar/_crossref_scitex.py +25 -266
- scitex/cli/scholar/_openalex_scitex.py +55 -0
- scitex/cli/social.py +63 -22
- scitex/cli/stats.py +121 -3
- scitex/cli/writer.py +49 -423
- scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml +90 -0
- scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES.yaml +1571 -0
- scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES_DETAILED.yaml +6262 -0
- scitex/dev/plt/data/mpl/SIGNATURES_FLATTENED.yaml +1274 -0
- scitex/dev/plt/data/mpl/dir_ax.txt +459 -0
- scitex/introspect/_list_api.py +5 -2
- scitex/plt/docs/EXTERNAL_PACKAGE_BRANDING.md +2 -2
- scitex/scholar/__init__.py +14 -9
- scitex/scholar/_mcp/crossref_tool_schemas.py +133 -0
- scitex/scholar/_mcp/openalex_handlers.py +212 -0
- scitex/scholar/_mcp/openalex_tool_schemas.py +96 -0
- scitex/scholar/_mcp/tool_schemas.py +16 -1
- scitex/scholar/data/.gitkeep +0 -0
- scitex/scholar/data/README.md +44 -0
- scitex/scholar/data/bib_files/bibliography.bib +1952 -0
- scitex/scholar/data/bib_files/neurovista.bib +277 -0
- scitex/scholar/data/bib_files/neurovista_enriched.bib +441 -0
- scitex/scholar/data/bib_files/neurovista_enriched_enriched.bib +441 -0
- scitex/scholar/data/bib_files/neurovista_processed.bib +338 -0
- scitex/scholar/data/bib_files/openaccess.bib +89 -0
- scitex/scholar/data/bib_files/pac-seizure_prediction_enriched.bib +2178 -0
- scitex/scholar/data/bib_files/pac.bib +698 -0
- scitex/scholar/data/bib_files/pac_enriched.bib +1061 -0
- scitex/scholar/data/bib_files/pac_processed.bib +0 -0
- scitex/scholar/data/bib_files/pac_titles.txt +75 -0
- scitex/scholar/data/bib_files/paywalled.bib +98 -0
- scitex/scholar/data/bib_files/related-papers-by-coauthors.bib +58 -0
- scitex/scholar/data/bib_files/related-papers-by-coauthors_enriched.bib +87 -0
- scitex/scholar/data/bib_files/seizure_prediction.bib +694 -0
- scitex/scholar/data/bib_files/seizure_prediction_processed.bib +0 -0
- scitex/scholar/data/bib_files/test_complete_enriched.bib +437 -0
- scitex/scholar/data/bib_files/test_final_enriched.bib +437 -0
- scitex/scholar/data/bib_files/test_seizure.bib +46 -0
- scitex/scholar/data/impact_factor/JCR_IF_2022.xlsx +0 -0
- scitex/scholar/data/impact_factor/JCR_IF_2024.db +0 -0
- scitex/scholar/data/impact_factor/JCR_IF_2024.xlsx +0 -0
- scitex/scholar/data/impact_factor/JCR_IF_2024_v01.db +0 -0
- scitex/scholar/data/impact_factor.db +0 -0
- scitex/scholar/docs/EXTERNAL_PACKAGE_BRANDING.md +2 -2
- scitex/scholar/local_dbs/__init__.py +31 -0
- scitex/scholar/local_dbs/crossref_scitex.py +30 -0
- scitex/scholar/local_dbs/openalex_scitex.py +30 -0
- scitex/scholar/mcp_server.py +59 -4
- scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +2 -2
- scitex/stats/mcp_server.py +16 -3
- scitex/template/mcp_server.py +16 -3
- scitex/ui/mcp_server.py +16 -3
- scitex/writer/__init__.py +43 -34
- {scitex-2.15.2.dist-info → scitex-2.15.4.dist-info}/METADATA +22 -3
- {scitex-2.15.2.dist-info → scitex-2.15.4.dist-info}/RECORD +70 -38
- scitex/scholar/crossref_scitex.py +0 -367
- scitex/scholar/url_finder/.tmp/open_url/KNOWN_RESOLVERS.py +0 -462
- scitex/scholar/url_finder/.tmp/open_url/README.md +0 -223
- scitex/scholar/url_finder/.tmp/open_url/_DOIToURLResolver.py +0 -694
- scitex/scholar/url_finder/.tmp/open_url/_OpenURLResolver.py +0 -1160
- scitex/scholar/url_finder/.tmp/open_url/_ResolverLinkFinder.py +0 -344
- scitex/scholar/url_finder/.tmp/open_url/__init__.py +0 -24
- {scitex-2.15.2.dist-info → scitex-2.15.4.dist-info}/WHEEL +0 -0
- {scitex-2.15.2.dist-info → scitex-2.15.4.dist-info}/entry_points.txt +0 -0
- {scitex-2.15.2.dist-info → scitex-2.15.4.dist-info}/licenses/LICENSE +0 -0
scitex/cli/writer.py
CHANGED
|
@@ -1,453 +1,79 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""
|
|
3
|
-
SciTeX Writer
|
|
3
|
+
SciTeX Writer CLI - Thin wrapper delegating to scitex-writer package.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
All commands are delegated to scitex-writer CLI for maintainability.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
+
import subprocess
|
|
8
9
|
import sys
|
|
9
|
-
from pathlib import Path
|
|
10
10
|
|
|
11
11
|
import click
|
|
12
12
|
|
|
13
|
+
# Check if scitex-writer package is available
|
|
14
|
+
try:
|
|
15
|
+
import scitex_writer
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
)
|
|
18
|
-
@click.option("--help-recursive", is_flag=True, help="Show help for all subcommands")
|
|
19
|
-
@click.pass_context
|
|
20
|
-
def writer(ctx, help_recursive):
|
|
21
|
-
"""
|
|
22
|
-
Manuscript writing and LaTeX compilation
|
|
23
|
-
|
|
24
|
-
\b
|
|
25
|
-
Provides manuscript project management:
|
|
26
|
-
- Initialize new manuscript projects
|
|
27
|
-
- Compile manuscript, supplementary, and revision documents
|
|
28
|
-
- Watch mode for auto-recompilation
|
|
29
|
-
- Project structure management
|
|
30
|
-
"""
|
|
31
|
-
if help_recursive:
|
|
32
|
-
_print_help_recursive(ctx)
|
|
33
|
-
ctx.exit(0)
|
|
34
|
-
elif ctx.invoked_subcommand is None:
|
|
35
|
-
click.echo(ctx.get_help())
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def _print_help_recursive(ctx):
|
|
39
|
-
"""Print help for all commands recursively."""
|
|
40
|
-
fake_parent = click.Context(click.Group(), info_name="scitex")
|
|
41
|
-
parent_ctx = click.Context(writer, info_name="writer", parent=fake_parent)
|
|
42
|
-
|
|
43
|
-
click.secho("━━━ scitex writer ━━━", fg="cyan", bold=True)
|
|
44
|
-
click.echo(writer.get_help(parent_ctx))
|
|
45
|
-
|
|
46
|
-
for name in sorted(writer.list_commands(ctx) or []):
|
|
47
|
-
cmd = writer.get_command(ctx, name)
|
|
48
|
-
if cmd is None:
|
|
49
|
-
continue
|
|
50
|
-
click.echo()
|
|
51
|
-
click.secho(f"━━━ scitex writer {name} ━━━", fg="cyan", bold=True)
|
|
52
|
-
with click.Context(cmd, info_name=name, parent=parent_ctx) as sub_ctx:
|
|
53
|
-
click.echo(cmd.get_help(sub_ctx))
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
@writer.command()
|
|
57
|
-
@click.argument("project_dir", type=click.Path())
|
|
58
|
-
@click.option(
|
|
59
|
-
"--git-strategy",
|
|
60
|
-
"-g",
|
|
61
|
-
type=click.Choice(["child", "parent", "origin", "none"], case_sensitive=False),
|
|
62
|
-
default="child",
|
|
63
|
-
help="Git initialization strategy (default: child)",
|
|
64
|
-
)
|
|
65
|
-
@click.option("--branch", "-b", help="Specific branch of template to clone")
|
|
66
|
-
@click.option("--tag", "-t", help="Specific tag/release of template to clone")
|
|
67
|
-
def clone(project_dir, git_strategy, branch, tag):
|
|
68
|
-
"""
|
|
69
|
-
Clone a new writer project from template
|
|
70
|
-
|
|
71
|
-
\b
|
|
72
|
-
Arguments:
|
|
73
|
-
PROJECT_DIR Path to project directory (will be created)
|
|
17
|
+
HAS_WRITER_PKG = True
|
|
18
|
+
except ImportError:
|
|
19
|
+
HAS_WRITER_PKG = False
|
|
74
20
|
|
|
75
|
-
\b
|
|
76
|
-
Git Strategies:
|
|
77
|
-
child - Create isolated git in project directory (default)
|
|
78
|
-
parent - Use parent git repository
|
|
79
|
-
origin - Preserve template's original git history
|
|
80
|
-
none - Disable git initialization
|
|
81
21
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
try:
|
|
91
|
-
from scitex.writer._clone_writer_project import clone_writer_project
|
|
92
|
-
|
|
93
|
-
# Validate mutual exclusivity of branch and tag
|
|
94
|
-
if branch and tag:
|
|
95
|
-
click.echo("Error: Cannot specify both --branch and --tag", err=True)
|
|
96
|
-
sys.exit(1)
|
|
97
|
-
|
|
98
|
-
# Convert git_strategy 'none' to None
|
|
99
|
-
if git_strategy and git_strategy.lower() == "none":
|
|
100
|
-
git_strategy = None
|
|
101
|
-
|
|
102
|
-
click.echo(f"Cloning writer project: {project_dir}")
|
|
103
|
-
|
|
104
|
-
# Clone writer project
|
|
105
|
-
result = clone_writer_project(
|
|
106
|
-
project_dir=project_dir,
|
|
107
|
-
git_strategy=git_strategy,
|
|
108
|
-
branch=branch,
|
|
109
|
-
tag=tag,
|
|
22
|
+
def _require_writer_pkg():
|
|
23
|
+
"""Check if scitex-writer package is available."""
|
|
24
|
+
if not HAS_WRITER_PKG:
|
|
25
|
+
click.secho(
|
|
26
|
+
"scitex-writer package not installed. "
|
|
27
|
+
"Install with: pip install scitex-writer",
|
|
28
|
+
fg="red",
|
|
29
|
+
err=True,
|
|
110
30
|
)
|
|
111
|
-
|
|
112
|
-
if result:
|
|
113
|
-
project_path = Path(project_dir)
|
|
114
|
-
click.echo()
|
|
115
|
-
click.secho(
|
|
116
|
-
f"✓ Successfully cloned project at {project_path.absolute()}",
|
|
117
|
-
fg="green",
|
|
118
|
-
)
|
|
119
|
-
click.echo()
|
|
120
|
-
click.echo("Project structure:")
|
|
121
|
-
click.echo(f" {project_dir}/")
|
|
122
|
-
click.echo(
|
|
123
|
-
" ├── 00_shared/ # Shared resources (figures, bibliography)"
|
|
124
|
-
)
|
|
125
|
-
click.echo(" ├── 01_manuscript/ # Main manuscript")
|
|
126
|
-
click.echo(" ├── 02_supplementary/ # Supplementary materials")
|
|
127
|
-
click.echo(" ├── 03_revision/ # Revision documents")
|
|
128
|
-
click.echo(" └── scripts/ # Compilation scripts")
|
|
129
|
-
click.echo()
|
|
130
|
-
click.echo("Next steps:")
|
|
131
|
-
click.echo(f" cd {project_dir}")
|
|
132
|
-
click.echo(" # Edit your manuscript in 01_manuscript/contents/")
|
|
133
|
-
click.echo(" scitex writer compile manuscript")
|
|
134
|
-
else:
|
|
135
|
-
click.secho("✗ Failed to clone project", fg="red", err=True)
|
|
136
|
-
sys.exit(1)
|
|
137
|
-
|
|
138
|
-
except Exception as e:
|
|
139
|
-
click.secho(f"Error: {e}", fg="red", err=True)
|
|
140
|
-
sys.exit(1)
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
@writer.command()
|
|
144
|
-
@click.argument(
|
|
145
|
-
"document",
|
|
146
|
-
type=click.Choice(
|
|
147
|
-
["manuscript", "supplementary", "revision"], case_sensitive=False
|
|
148
|
-
),
|
|
149
|
-
default="manuscript",
|
|
150
|
-
)
|
|
151
|
-
@click.option(
|
|
152
|
-
"--dir",
|
|
153
|
-
"-d",
|
|
154
|
-
type=click.Path(exists=True),
|
|
155
|
-
help="Project directory (defaults to current directory)",
|
|
156
|
-
)
|
|
157
|
-
@click.option(
|
|
158
|
-
"--track-changes", is_flag=True, help="Enable change tracking (revision only)"
|
|
159
|
-
)
|
|
160
|
-
@click.option(
|
|
161
|
-
"--timeout",
|
|
162
|
-
type=int,
|
|
163
|
-
default=300,
|
|
164
|
-
help="Compilation timeout in seconds (default: 300)",
|
|
165
|
-
)
|
|
166
|
-
def compile(document, dir, track_changes, timeout):
|
|
167
|
-
"""
|
|
168
|
-
Compile LaTeX document to PDF
|
|
169
|
-
|
|
170
|
-
\b
|
|
171
|
-
Arguments:
|
|
172
|
-
DOCUMENT Document type to compile (manuscript|supplementary|revision)
|
|
173
|
-
|
|
174
|
-
\b
|
|
175
|
-
Examples:
|
|
176
|
-
scitex writer compile manuscript
|
|
177
|
-
scitex writer compile manuscript --dir ./my_paper
|
|
178
|
-
scitex writer compile revision --track-changes
|
|
179
|
-
scitex writer compile supplementary --timeout 600
|
|
180
|
-
"""
|
|
181
|
-
from scitex.writer import Writer
|
|
182
|
-
|
|
183
|
-
project_dir = Path(dir) if dir else Path.cwd()
|
|
184
|
-
|
|
185
|
-
# Check if this is a Writer project before trying to attach
|
|
186
|
-
required_dirs = ["01_manuscript", "02_supplementary", "03_revision"]
|
|
187
|
-
missing = [d for d in required_dirs if not (project_dir / d).exists()]
|
|
188
|
-
|
|
189
|
-
if missing:
|
|
190
|
-
click.echo(f"Not a Writer project: {project_dir.absolute()}")
|
|
191
|
-
click.echo(f"Missing directories: {', '.join(missing)}")
|
|
192
|
-
click.echo()
|
|
193
|
-
click.echo("To create a new project, run:")
|
|
194
|
-
click.echo(" scitex writer clone <project-name>")
|
|
195
|
-
return # Exit gracefully with code 0
|
|
196
|
-
|
|
197
|
-
try:
|
|
198
|
-
writer = Writer(project_dir)
|
|
199
|
-
|
|
200
|
-
click.echo(f"Compiling {document} in {project_dir}...")
|
|
201
|
-
click.echo()
|
|
202
|
-
|
|
203
|
-
# Compile based on document type
|
|
204
|
-
if document == "manuscript":
|
|
205
|
-
result = writer.compile_manuscript(timeout=timeout)
|
|
206
|
-
elif document == "supplementary":
|
|
207
|
-
result = writer.compile_supplementary(timeout=timeout)
|
|
208
|
-
elif document == "revision":
|
|
209
|
-
result = writer.compile_revision(
|
|
210
|
-
track_changes=track_changes, timeout=timeout
|
|
211
|
-
)
|
|
212
|
-
|
|
213
|
-
if result.success:
|
|
214
|
-
click.secho("✓ Compilation successful!", fg="green")
|
|
215
|
-
click.echo(f"PDF: {result.output_pdf}")
|
|
216
|
-
else:
|
|
217
|
-
click.secho(
|
|
218
|
-
f"✗ Compilation failed (exit code {result.exit_code})",
|
|
219
|
-
fg="red",
|
|
220
|
-
err=True,
|
|
221
|
-
)
|
|
222
|
-
if result.errors:
|
|
223
|
-
click.echo()
|
|
224
|
-
click.echo("Errors:")
|
|
225
|
-
for error in result.errors[:10]: # Show first 10 errors
|
|
226
|
-
click.echo(f" - {error}")
|
|
227
|
-
sys.exit(result.exit_code)
|
|
228
|
-
|
|
229
|
-
except Exception as e:
|
|
230
|
-
click.secho(f"Error: {e}", fg="red", err=True)
|
|
231
31
|
sys.exit(1)
|
|
232
32
|
|
|
233
33
|
|
|
234
|
-
@
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
34
|
+
@click.command(
|
|
35
|
+
context_settings={
|
|
36
|
+
"help_option_names": ["-h", "--help"],
|
|
37
|
+
"ignore_unknown_options": True,
|
|
38
|
+
"allow_extra_args": True,
|
|
39
|
+
"allow_interspersed_args": False,
|
|
40
|
+
},
|
|
240
41
|
)
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
\b
|
|
246
|
-
Examples:
|
|
247
|
-
scitex writer info
|
|
248
|
-
scitex writer info --dir ./my_paper
|
|
249
|
-
"""
|
|
250
|
-
from scitex.writer import Writer
|
|
251
|
-
|
|
252
|
-
project_dir = Path(dir) if dir else Path.cwd()
|
|
253
|
-
|
|
254
|
-
# Check if this is a Writer project before trying to attach
|
|
255
|
-
required_dirs = ["01_manuscript", "02_supplementary", "03_revision"]
|
|
256
|
-
missing = [d for d in required_dirs if not (project_dir / d).exists()]
|
|
257
|
-
|
|
258
|
-
if missing:
|
|
259
|
-
click.echo(f"Not a Writer project: {project_dir.absolute()}")
|
|
260
|
-
click.echo(f"Missing directories: {', '.join(missing)}")
|
|
261
|
-
return # Exit gracefully with code 0
|
|
262
|
-
|
|
263
|
-
try:
|
|
264
|
-
writer = Writer(project_dir)
|
|
265
|
-
|
|
266
|
-
click.echo(f"Project: {writer.project_name}")
|
|
267
|
-
click.echo(f"Location: {writer.project_dir.absolute()}")
|
|
268
|
-
click.echo(f"Git root: {writer.git_root}")
|
|
269
|
-
click.echo()
|
|
270
|
-
click.echo("Documents:")
|
|
271
|
-
click.echo(f" - Manuscript: {writer.manuscript.root}")
|
|
272
|
-
click.echo(f" - Supplementary: {writer.supplementary.root}")
|
|
273
|
-
click.echo(f" - Revision: {writer.revision.root}")
|
|
274
|
-
click.echo()
|
|
275
|
-
|
|
276
|
-
# Check for compiled PDFs
|
|
277
|
-
click.echo("Compiled PDFs:")
|
|
278
|
-
for doc_type in ["manuscript", "supplementary", "revision"]:
|
|
279
|
-
pdf = writer.get_pdf(doc_type)
|
|
280
|
-
if pdf:
|
|
281
|
-
click.secho(f" ✓ {doc_type}: {pdf}", fg="green")
|
|
282
|
-
else:
|
|
283
|
-
click.echo(f" - {doc_type}: not compiled")
|
|
284
|
-
|
|
285
|
-
except Exception as e:
|
|
286
|
-
click.secho(f"Error: {e}", fg="red", err=True)
|
|
287
|
-
sys.exit(1)
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
@writer.group()
|
|
291
|
-
def mcp():
|
|
42
|
+
@click.argument("args", nargs=-1, type=click.UNPROCESSED)
|
|
43
|
+
@click.pass_context
|
|
44
|
+
def writer(ctx, args):
|
|
292
45
|
"""
|
|
293
|
-
|
|
46
|
+
Manuscript writing and LaTeX compilation (delegates to scitex-writer)
|
|
294
47
|
|
|
295
48
|
\b
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
@click.option("--json", "as_json", is_flag=True, help="Output as JSON")
|
|
305
|
-
def list_tools(as_json: bool):
|
|
306
|
-
"""
|
|
307
|
-
List available MCP tools for writer module.
|
|
49
|
+
Commands (from scitex-writer):
|
|
50
|
+
compile Compile LaTeX to PDF
|
|
51
|
+
bib Bibliography management
|
|
52
|
+
tables Table management
|
|
53
|
+
figures Figure management
|
|
54
|
+
guidelines IMRAD writing guidelines
|
|
55
|
+
prompts AI prompts (Asta integration)
|
|
56
|
+
mcp MCP server commands
|
|
308
57
|
|
|
309
58
|
\b
|
|
310
59
|
Examples:
|
|
311
|
-
scitex writer
|
|
312
|
-
scitex writer
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
if as_json:
|
|
319
|
-
import json
|
|
320
|
-
|
|
321
|
-
output = {
|
|
322
|
-
"module": "writer",
|
|
323
|
-
"count": len(tools),
|
|
324
|
-
"tools": [
|
|
325
|
-
{
|
|
326
|
-
"name": t.name,
|
|
327
|
-
"description": t.description,
|
|
328
|
-
"parameters": list(t.inputSchema.get("properties", {}).keys()),
|
|
329
|
-
"required": t.inputSchema.get("required", []),
|
|
330
|
-
}
|
|
331
|
-
for t in tools
|
|
332
|
-
],
|
|
333
|
-
}
|
|
334
|
-
click.echo(json.dumps(output, indent=2))
|
|
335
|
-
else:
|
|
336
|
-
click.secho(
|
|
337
|
-
f"SciTeX Writer MCP Tools ({len(tools)} total)", fg="cyan", bold=True
|
|
338
|
-
)
|
|
339
|
-
click.echo()
|
|
340
|
-
|
|
341
|
-
for tool in tools:
|
|
342
|
-
click.secho(f" {tool.name}", fg="green", bold=True)
|
|
343
|
-
# First line of description
|
|
344
|
-
desc = tool.description.split("\n")[0] if tool.description else ""
|
|
345
|
-
click.echo(f" {desc}")
|
|
346
|
-
|
|
347
|
-
# Parameters
|
|
348
|
-
props = tool.inputSchema.get("properties", {})
|
|
349
|
-
required = tool.inputSchema.get("required", [])
|
|
350
|
-
if props:
|
|
351
|
-
params = []
|
|
352
|
-
for pname, pinfo in props.items():
|
|
353
|
-
req_marker = "*" if pname in required else ""
|
|
354
|
-
params.append(f"{pname}{req_marker}")
|
|
355
|
-
click.echo(f" Parameters: {', '.join(params)}")
|
|
356
|
-
click.echo()
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
@mcp.command("usage")
|
|
360
|
-
@click.argument("tool_name", required=False)
|
|
361
|
-
def usage(tool_name: str):
|
|
362
|
-
"""
|
|
363
|
-
Show detailed usage for writer MCP tools.
|
|
60
|
+
scitex writer compile manuscript ./my-paper
|
|
61
|
+
scitex writer bib list ./my-paper
|
|
62
|
+
scitex writer tables add ./my-paper data.csv
|
|
63
|
+
scitex writer figures list ./my-paper
|
|
64
|
+
scitex writer guidelines get abstract
|
|
65
|
+
scitex writer prompts asta ./my-paper --section introduction
|
|
364
66
|
|
|
365
67
|
\b
|
|
366
|
-
|
|
367
|
-
scitex writer
|
|
368
|
-
scitex
|
|
68
|
+
For full help:
|
|
69
|
+
scitex writer --help
|
|
70
|
+
scitex-writer --help
|
|
369
71
|
"""
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
tools = get_tool_schemas()
|
|
373
|
-
|
|
374
|
-
if tool_name:
|
|
375
|
-
# Find specific tool
|
|
376
|
-
tool = next((t for t in tools if t.name == tool_name), None)
|
|
377
|
-
if not tool:
|
|
378
|
-
click.secho(f"Tool '{tool_name}' not found", fg="red", err=True)
|
|
379
|
-
click.echo(f"Available tools: {', '.join(t.name for t in tools)}")
|
|
380
|
-
raise SystemExit(1)
|
|
381
|
-
tools = [tool]
|
|
382
|
-
|
|
383
|
-
for tool in tools:
|
|
384
|
-
click.secho(f"━━━ {tool.name} ━━━", fg="cyan", bold=True)
|
|
385
|
-
click.echo()
|
|
386
|
-
click.echo(f"Description: {tool.description}")
|
|
387
|
-
click.echo()
|
|
72
|
+
_require_writer_pkg()
|
|
388
73
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
if props:
|
|
393
|
-
click.secho("Parameters:", bold=True)
|
|
394
|
-
for pname, pinfo in props.items():
|
|
395
|
-
req = " (required)" if pname in required else ""
|
|
396
|
-
ptype = pinfo.get("type", "any")
|
|
397
|
-
pdesc = pinfo.get("description", "")
|
|
398
|
-
default = pinfo.get("default")
|
|
399
|
-
default_str = f" [default: {default}]" if default is not None else ""
|
|
400
|
-
|
|
401
|
-
click.echo(f" {pname}: {ptype}{req}{default_str}")
|
|
402
|
-
if pdesc:
|
|
403
|
-
click.echo(f" {pdesc}")
|
|
404
|
-
click.echo()
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
@writer.command()
|
|
408
|
-
@click.option(
|
|
409
|
-
"--dir",
|
|
410
|
-
"-d",
|
|
411
|
-
type=click.Path(exists=True),
|
|
412
|
-
help="Project directory (defaults to current directory)",
|
|
413
|
-
)
|
|
414
|
-
def watch(dir):
|
|
415
|
-
"""
|
|
416
|
-
Watch for file changes and auto-recompile
|
|
417
|
-
|
|
418
|
-
\b
|
|
419
|
-
Examples:
|
|
420
|
-
scitex writer watch
|
|
421
|
-
scitex writer watch --dir ./my_paper
|
|
422
|
-
"""
|
|
423
|
-
from scitex.writer import Writer
|
|
424
|
-
|
|
425
|
-
project_dir = Path(dir) if dir else Path.cwd()
|
|
426
|
-
|
|
427
|
-
# Check if this is a Writer project before trying to attach
|
|
428
|
-
required_dirs = ["01_manuscript", "02_supplementary", "03_revision"]
|
|
429
|
-
missing = [d for d in required_dirs if not (project_dir / d).exists()]
|
|
430
|
-
|
|
431
|
-
if missing:
|
|
432
|
-
click.echo(f"Not a Writer project: {project_dir.absolute()}")
|
|
433
|
-
click.echo(f"Missing directories: {', '.join(missing)}")
|
|
434
|
-
return # Exit gracefully with code 0
|
|
435
|
-
|
|
436
|
-
try:
|
|
437
|
-
writer = Writer(project_dir)
|
|
438
|
-
|
|
439
|
-
click.echo(f"Watching {project_dir} for changes...")
|
|
440
|
-
click.echo("Press Ctrl+C to stop")
|
|
441
|
-
click.echo()
|
|
442
|
-
|
|
443
|
-
writer.watch()
|
|
444
|
-
|
|
445
|
-
except KeyboardInterrupt:
|
|
446
|
-
click.echo()
|
|
447
|
-
click.echo("Stopped watching")
|
|
448
|
-
except Exception as e:
|
|
449
|
-
click.secho(f"Error: {e}", fg="red", err=True)
|
|
450
|
-
sys.exit(1)
|
|
74
|
+
# Delegate to scitex-writer CLI
|
|
75
|
+
cmd = ["scitex-writer"] + list(args)
|
|
76
|
+
sys.exit(subprocess.call(cmd))
|
|
451
77
|
|
|
452
78
|
|
|
453
79
|
# EOF
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Timestamp: "2025-12-21 12:37:14 (ywatanabe)"
|
|
2
|
+
# File: ./src/scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml
|
|
3
|
+
|
|
4
|
+
basic:
|
|
5
|
+
- plot # Line/marker plots
|
|
6
|
+
- scatter # Scatter plots
|
|
7
|
+
- bar # Vertical bar charts
|
|
8
|
+
- barh # Horizontal bar charts
|
|
9
|
+
- stem # Stem plots
|
|
10
|
+
- step # Step plots
|
|
11
|
+
- fill # Filled polygons
|
|
12
|
+
- fill_between # Fill between y-values
|
|
13
|
+
- fill_betweenx # Fill between x-values
|
|
14
|
+
|
|
15
|
+
statistical:
|
|
16
|
+
- hist # Histogram
|
|
17
|
+
- hist2d # 2D histogram
|
|
18
|
+
- boxplot # Box and whisker plots
|
|
19
|
+
- bxp # Box plot from precomputed stats
|
|
20
|
+
- violinplot # Violin plots
|
|
21
|
+
- violin # Single violin
|
|
22
|
+
- errorbar # Error bar plots
|
|
23
|
+
- pie # Pie charts
|
|
24
|
+
- ecdf # Empirical cumulative distribution
|
|
25
|
+
|
|
26
|
+
image:
|
|
27
|
+
- imshow # Display image/array
|
|
28
|
+
- matshow # Display matrix
|
|
29
|
+
- pcolor # Pseudocolor plot
|
|
30
|
+
- pcolormesh # Pseudocolor mesh (faster)
|
|
31
|
+
- pcolorfast # Pseudocolor (fastest)
|
|
32
|
+
- contour # Contour lines
|
|
33
|
+
- contourf # Filled contours
|
|
34
|
+
- hexbin # Hexagonal binning
|
|
35
|
+
- spy # Sparsity pattern
|
|
36
|
+
|
|
37
|
+
vector:
|
|
38
|
+
- quiver # Arrow/vector field
|
|
39
|
+
- streamplot # Streamlines
|
|
40
|
+
- barbs # Wind barbs
|
|
41
|
+
|
|
42
|
+
spectral:
|
|
43
|
+
- specgram # Spectrogram
|
|
44
|
+
- psd # Power spectral density
|
|
45
|
+
- csd # Cross spectral density
|
|
46
|
+
- cohere # Coherence
|
|
47
|
+
- acorr # Autocorrelation
|
|
48
|
+
- xcorr # Cross-correlation
|
|
49
|
+
- angle_spectrum # Phase angle spectrum
|
|
50
|
+
- magnitude_spectrum # Magnitude spectrum
|
|
51
|
+
- phase_spectrum # Phase spectrum
|
|
52
|
+
|
|
53
|
+
triangulation:
|
|
54
|
+
- tricontour # Triangular contour lines
|
|
55
|
+
- tricontourf # Triangular filled contours
|
|
56
|
+
- tripcolor # Triangular pseudocolor
|
|
57
|
+
- triplot # Triangular grid lines
|
|
58
|
+
|
|
59
|
+
composite:
|
|
60
|
+
- stackplot # Stacked area plots
|
|
61
|
+
- stairs # Stair/step plots
|
|
62
|
+
- eventplot # Event sequence plots
|
|
63
|
+
- broken_barh # Broken horizontal bars
|
|
64
|
+
|
|
65
|
+
log_scale:
|
|
66
|
+
- loglog # Log-log scale plot
|
|
67
|
+
- semilogx # Semi-log x scale
|
|
68
|
+
- semilogy # Semi-log y scale
|
|
69
|
+
|
|
70
|
+
annotation:
|
|
71
|
+
- annotate # Text with arrow annotation
|
|
72
|
+
- text # Text at position
|
|
73
|
+
- arrow # Arrow patch
|
|
74
|
+
- axhline # Horizontal line across axes
|
|
75
|
+
- axvline # Vertical line across axes
|
|
76
|
+
- hlines # Horizontal lines at y positions
|
|
77
|
+
- vlines # Vertical lines at x positions
|
|
78
|
+
- axhspan # Horizontal span (shaded region)
|
|
79
|
+
- axvspan # Vertical span (shaded region)
|
|
80
|
+
- axline # Infinite line
|
|
81
|
+
|
|
82
|
+
decoration:
|
|
83
|
+
- legend # Add legend
|
|
84
|
+
- grid # Add grid
|
|
85
|
+
- table # Add table
|
|
86
|
+
- clabel # Contour labels
|
|
87
|
+
- bar_label # Bar chart labels
|
|
88
|
+
- quiverkey # Quiver key/legend
|
|
89
|
+
|
|
90
|
+
# EOF
|