scitex 2.15.1__py3-none-any.whl → 2.15.2__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/__init__.py +68 -61
- scitex/_mcp_tools/introspect.py +42 -23
- scitex/_mcp_tools/template.py +24 -0
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +30 -1550
- scitex/ai/classification/timeseries/_sliding_window_core.py +467 -0
- scitex/ai/classification/timeseries/_sliding_window_plotting.py +369 -0
- scitex/audio/__init__.py +2 -2
- scitex/audio/_tts.py +18 -10
- scitex/audio/engines/base.py +17 -10
- scitex/audio/engines/elevenlabs_engine.py +1 -1
- scitex/canvas/editor/flask_editor/_core/__init__.py +27 -0
- scitex/canvas/editor/flask_editor/_core/_bbox_extraction.py +200 -0
- scitex/canvas/editor/flask_editor/_core/_editor.py +173 -0
- scitex/canvas/editor/flask_editor/_core/_export_helpers.py +353 -0
- scitex/canvas/editor/flask_editor/_core/_routes_basic.py +190 -0
- scitex/canvas/editor/flask_editor/_core/_routes_export.py +332 -0
- scitex/canvas/editor/flask_editor/_core/_routes_panels.py +252 -0
- scitex/canvas/editor/flask_editor/_core/_routes_save.py +218 -0
- scitex/canvas/editor/flask_editor/_core.py +25 -1684
- scitex/cli/introspect.py +112 -74
- scitex/cli/main.py +2 -0
- scitex/cli/plt.py +357 -0
- scitex/cli/repro.py +15 -8
- scitex/cli/resource.py +15 -8
- scitex/cli/scholar/__init__.py +15 -8
- scitex/cli/social.py +6 -6
- scitex/cli/stats.py +15 -8
- scitex/cli/template.py +129 -12
- scitex/cli/tex.py +15 -8
- scitex/cli/writer.py +15 -8
- scitex/cloud/__init__.py +41 -2
- scitex/config/_env_registry.py +84 -19
- scitex/context/__init__.py +22 -0
- scitex/dev/__init__.py +20 -1
- scitex/gen/__init__.py +50 -14
- scitex/gen/_list_packages.py +4 -4
- scitex/introspect/__init__.py +16 -9
- scitex/introspect/_core.py +7 -8
- scitex/{gen/_inspect_module.py → introspect/_list_api.py} +43 -54
- scitex/introspect/_mcp/__init__.py +10 -6
- scitex/introspect/_mcp/handlers.py +37 -12
- scitex/introspect/_members.py +7 -3
- scitex/introspect/_signature.py +3 -3
- scitex/introspect/_source.py +2 -2
- scitex/io/_save.py +1 -2
- scitex/logging/_formatters.py +19 -9
- scitex/mcp_server.py +1 -1
- scitex/os/__init__.py +4 -0
- scitex/{gen → os}/_check_host.py +4 -5
- scitex/plt/__init__.py +11 -14
- scitex/session/__init__.py +26 -7
- scitex/session/_decorator.py +1 -1
- scitex/sh/__init__.py +7 -4
- scitex/social/__init__.py +10 -8
- scitex/stats/_mcp/_handlers/__init__.py +31 -0
- scitex/stats/_mcp/_handlers/_corrections.py +113 -0
- scitex/stats/_mcp/_handlers/_descriptive.py +78 -0
- scitex/stats/_mcp/_handlers/_effect_size.py +106 -0
- scitex/stats/_mcp/_handlers/_format.py +94 -0
- scitex/stats/_mcp/_handlers/_normality.py +110 -0
- scitex/stats/_mcp/_handlers/_posthoc.py +224 -0
- scitex/stats/_mcp/_handlers/_power.py +247 -0
- scitex/stats/_mcp/_handlers/_recommend.py +102 -0
- scitex/stats/_mcp/_handlers/_run_test.py +279 -0
- scitex/stats/_mcp/_handlers/_stars.py +48 -0
- scitex/stats/_mcp/handlers.py +19 -1171
- scitex/stats/auto/_stat_style.py +175 -0
- scitex/stats/auto/_style_definitions.py +411 -0
- scitex/stats/auto/_styles.py +22 -620
- scitex/stats/descriptive/__init__.py +11 -8
- scitex/stats/descriptive/_ci.py +39 -0
- scitex/stats/power/_power.py +15 -4
- scitex/str/__init__.py +2 -1
- scitex/str/_title_case.py +63 -0
- scitex/template/__init__.py +25 -10
- scitex/template/_code_templates.py +147 -0
- scitex/template/_mcp/handlers.py +81 -0
- scitex/template/_mcp/tool_schemas.py +55 -0
- scitex/template/_templates/__init__.py +51 -0
- scitex/template/_templates/audio.py +233 -0
- scitex/template/_templates/canvas.py +312 -0
- scitex/template/_templates/capture.py +268 -0
- scitex/template/_templates/config.py +43 -0
- scitex/template/_templates/diagram.py +294 -0
- scitex/template/_templates/io.py +107 -0
- scitex/template/_templates/module.py +53 -0
- scitex/template/_templates/plt.py +202 -0
- scitex/template/_templates/scholar.py +267 -0
- scitex/template/_templates/session.py +130 -0
- scitex/template/_templates/session_minimal.py +43 -0
- scitex/template/_templates/session_plot.py +67 -0
- scitex/template/_templates/session_stats.py +77 -0
- scitex/template/_templates/stats.py +323 -0
- scitex/template/_templates/writer.py +296 -0
- scitex/ui/_backends/_email.py +10 -2
- scitex/ui/_backends/_webhook.py +5 -1
- scitex/web/_search_pubmed.py +10 -6
- {scitex-2.15.1.dist-info → scitex-2.15.2.dist-info}/METADATA +1 -1
- {scitex-2.15.1.dist-info → scitex-2.15.2.dist-info}/RECORD +105 -64
- scitex/gen/_ci.py +0 -12
- scitex/gen/_title_case.py +0 -89
- /scitex/{gen → context}/_detect_environment.py +0 -0
- /scitex/{gen → context}/_get_notebook_path.py +0 -0
- /scitex/{gen/_shell.py → sh/_shell_legacy.py} +0 -0
- {scitex-2.15.1.dist-info → scitex-2.15.2.dist-info}/WHEEL +0 -0
- {scitex-2.15.1.dist-info → scitex-2.15.2.dist-info}/entry_points.txt +0 -0
- {scitex-2.15.1.dist-info → scitex-2.15.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Scitex
|
|
2
|
+
"""Scitex descriptive statistics module."""
|
|
3
3
|
|
|
4
|
+
from ._ci import ci
|
|
5
|
+
from ._circular import (
|
|
6
|
+
circular_concentration,
|
|
7
|
+
circular_kurtosis,
|
|
8
|
+
circular_mean,
|
|
9
|
+
circular_skewness,
|
|
10
|
+
describe_circular,
|
|
11
|
+
)
|
|
4
12
|
from ._describe import describe, verify_non_leakage
|
|
5
13
|
from ._nan import (
|
|
6
14
|
nanargmax,
|
|
@@ -35,15 +43,10 @@ from ._real import (
|
|
|
35
43
|
var,
|
|
36
44
|
zscore,
|
|
37
45
|
)
|
|
38
|
-
from ._circular import (
|
|
39
|
-
circular_mean,
|
|
40
|
-
circular_concentration,
|
|
41
|
-
circular_skewness,
|
|
42
|
-
circular_kurtosis,
|
|
43
|
-
describe_circular,
|
|
44
|
-
)
|
|
45
46
|
|
|
46
47
|
__all__ = [
|
|
48
|
+
# Confidence interval
|
|
49
|
+
"ci",
|
|
47
50
|
# For Ordinal Distribution
|
|
48
51
|
"describe",
|
|
49
52
|
"kurtosis",
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Timestamp: 2026-01-26
|
|
3
|
+
# File: /home/ywatanabe/proj/scitex-python/src/scitex/stats/descriptive/_ci.py
|
|
4
|
+
|
|
5
|
+
"""Confidence interval computation."""
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def ci(xx, axis=None):
|
|
11
|
+
"""Compute 95% confidence interval.
|
|
12
|
+
|
|
13
|
+
Calculates the confidence interval using the formula:
|
|
14
|
+
CI = 1.96 * std / sqrt(n)
|
|
15
|
+
|
|
16
|
+
Parameters
|
|
17
|
+
----------
|
|
18
|
+
xx : array-like
|
|
19
|
+
Input data array
|
|
20
|
+
axis : int, optional
|
|
21
|
+
Axis along which to compute CI (default: None, compute over entire array)
|
|
22
|
+
|
|
23
|
+
Returns
|
|
24
|
+
-------
|
|
25
|
+
float or array
|
|
26
|
+
95% confidence interval
|
|
27
|
+
|
|
28
|
+
Example
|
|
29
|
+
-------
|
|
30
|
+
>>> import numpy as np
|
|
31
|
+
>>> data = np.array([1, 2, 3, 4, 5])
|
|
32
|
+
>>> ci(data)
|
|
33
|
+
1.2389...
|
|
34
|
+
"""
|
|
35
|
+
indi = ~np.isnan(xx)
|
|
36
|
+
return 1.96 * (xx[indi]).std(axis=axis) / np.sqrt(indi.sum())
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# EOF
|
scitex/stats/power/_power.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
2
|
# Timestamp: "2025-10-01 14:55:00 (ywatanabe)"
|
|
4
3
|
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/stats/utils/_power.py
|
|
5
4
|
|
|
@@ -19,12 +18,13 @@ IO:
|
|
|
19
18
|
"""
|
|
20
19
|
|
|
21
20
|
"""Imports"""
|
|
22
|
-
import sys
|
|
23
21
|
import argparse
|
|
22
|
+
from typing import Literal, Optional, Union
|
|
23
|
+
|
|
24
24
|
import numpy as np
|
|
25
25
|
import pandas as pd
|
|
26
|
-
from typing import Union, Optional, Literal
|
|
27
26
|
from scipy import stats
|
|
27
|
+
|
|
28
28
|
import scitex as stx
|
|
29
29
|
from scitex.logging import getLogger
|
|
30
30
|
|
|
@@ -151,7 +151,17 @@ def power_ttest(
|
|
|
151
151
|
ncp = effect_size * np.sqrt(sample_size)
|
|
152
152
|
|
|
153
153
|
# Compute power using non-central t-distribution
|
|
154
|
-
|
|
154
|
+
# For very large ncp (>37), power is essentially 1.0 (avoid numerical overflow)
|
|
155
|
+
if abs(ncp) > 37:
|
|
156
|
+
# With ncp > 37, the non-central t-distribution is so far from 0
|
|
157
|
+
# that power approaches 1.0 for correct direction, 0.0 for wrong direction
|
|
158
|
+
if alternative == "two-sided":
|
|
159
|
+
power = 1.0
|
|
160
|
+
elif alternative == "greater":
|
|
161
|
+
power = 1.0 if ncp > 0 else 0.0
|
|
162
|
+
else: # less
|
|
163
|
+
power = 1.0 if ncp < 0 else 0.0
|
|
164
|
+
elif alternative == "two-sided":
|
|
155
165
|
# For two-sided, power = P(|T| > t_crit | ncp)
|
|
156
166
|
power = 1 - stats.nct.cdf(t_crit, df, ncp) + stats.nct.cdf(-t_crit, df, ncp)
|
|
157
167
|
elif alternative == "greater":
|
|
@@ -405,6 +415,7 @@ def run_main():
|
|
|
405
415
|
global CONFIG, sys, plt, rng
|
|
406
416
|
|
|
407
417
|
import sys
|
|
418
|
+
|
|
408
419
|
import matplotlib.pyplot as plt
|
|
409
420
|
|
|
410
421
|
args = parse_args()
|
scitex/str/__init__.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
2
|
# Timestamp: "2025-06-13 22:55:11 (ywatanabe)"
|
|
4
3
|
# File: /ssh:sp:/home/ywatanabe/proj/SciTeX-Code/src/scitex/str/__init__.py
|
|
5
4
|
# ----------------------------------------
|
|
@@ -62,6 +61,7 @@ from ._remove_ansi import remove_ansi
|
|
|
62
61
|
from ._replace import replace
|
|
63
62
|
from ._search import search
|
|
64
63
|
from ._squeeze_space import squeeze_spaces
|
|
64
|
+
from ._title_case import title_case
|
|
65
65
|
|
|
66
66
|
__all__ = [
|
|
67
67
|
"LaTeXFallbackError",
|
|
@@ -106,6 +106,7 @@ __all__ = [
|
|
|
106
106
|
"smart_tick_formatter",
|
|
107
107
|
"squeeze_spaces",
|
|
108
108
|
"title",
|
|
109
|
+
"title_case",
|
|
109
110
|
"to_latex_style",
|
|
110
111
|
]
|
|
111
112
|
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Timestamp: 2026-01-26
|
|
3
|
+
# File: /home/ywatanabe/proj/scitex-python/src/scitex/str/_title_case.py
|
|
4
|
+
|
|
5
|
+
"""Title case conversion for strings."""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def title_case(text):
|
|
9
|
+
"""
|
|
10
|
+
Convert a string to title case.
|
|
11
|
+
|
|
12
|
+
Keeps certain prepositions, conjunctions, and articles in lowercase,
|
|
13
|
+
and ensures words detected as potential acronyms (all uppercase) are
|
|
14
|
+
fully capitalized.
|
|
15
|
+
|
|
16
|
+
Parameters
|
|
17
|
+
----------
|
|
18
|
+
text : str
|
|
19
|
+
The text to convert to title case.
|
|
20
|
+
|
|
21
|
+
Returns
|
|
22
|
+
-------
|
|
23
|
+
str
|
|
24
|
+
The converted text in title case with certain words in lowercase
|
|
25
|
+
and potential acronyms fully capitalized.
|
|
26
|
+
|
|
27
|
+
Examples
|
|
28
|
+
--------
|
|
29
|
+
>>> title_case("welcome to the world of ai and using CPUs for gaming")
|
|
30
|
+
'Welcome to the World of AI and Using CPUs for Gaming'
|
|
31
|
+
"""
|
|
32
|
+
# List of words to keep in lowercase
|
|
33
|
+
lowercase_words = [
|
|
34
|
+
"a",
|
|
35
|
+
"an",
|
|
36
|
+
"the",
|
|
37
|
+
"and",
|
|
38
|
+
"but",
|
|
39
|
+
"or",
|
|
40
|
+
"nor",
|
|
41
|
+
"at",
|
|
42
|
+
"by",
|
|
43
|
+
"to",
|
|
44
|
+
"in",
|
|
45
|
+
"with",
|
|
46
|
+
"of",
|
|
47
|
+
"on",
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
words = text.split()
|
|
51
|
+
final_words = []
|
|
52
|
+
for word in words:
|
|
53
|
+
# Check if the word is fully in uppercase and more than one character
|
|
54
|
+
if word.isupper() and len(word) > 1:
|
|
55
|
+
final_words.append(word)
|
|
56
|
+
elif word.lower() in lowercase_words:
|
|
57
|
+
final_words.append(word.lower())
|
|
58
|
+
else:
|
|
59
|
+
final_words.append(word.capitalize())
|
|
60
|
+
return " ".join(final_words)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
# EOF
|
scitex/template/__init__.py
CHANGED
|
@@ -1,25 +1,36 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
2
|
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/template/__init__.py
|
|
4
3
|
|
|
5
4
|
"""
|
|
6
5
|
Template management for SciTeX projects.
|
|
7
6
|
"""
|
|
8
7
|
|
|
9
|
-
from .clone_research import clone_research, TEMPLATE_REPO_URL as RESEARCH_URL
|
|
10
|
-
from .clone_pip_project import clone_pip_project, TEMPLATE_REPO_URL as PIP_PROJECT_URL
|
|
11
|
-
from .clone_singularity import clone_singularity, TEMPLATE_REPO_URL as SINGULARITY_URL
|
|
12
|
-
from .clone_writer_directory import (
|
|
13
|
-
clone_writer_directory,
|
|
14
|
-
TEMPLATE_REPO_URL as PAPER_DIRECTORY_URL,
|
|
15
|
-
)
|
|
16
8
|
from scitex.git import (
|
|
17
|
-
init_git_repo,
|
|
18
|
-
find_parent_git,
|
|
19
9
|
create_child_git,
|
|
10
|
+
find_parent_git,
|
|
11
|
+
init_git_repo,
|
|
20
12
|
remove_child_git,
|
|
21
13
|
)
|
|
22
14
|
|
|
15
|
+
from ._code_templates import (
|
|
16
|
+
CODE_TEMPLATES,
|
|
17
|
+
get_all_templates,
|
|
18
|
+
get_code_template,
|
|
19
|
+
list_code_templates,
|
|
20
|
+
)
|
|
21
|
+
from .clone_pip_project import TEMPLATE_REPO_URL as PIP_PROJECT_URL
|
|
22
|
+
from .clone_pip_project import clone_pip_project
|
|
23
|
+
from .clone_research import TEMPLATE_REPO_URL as RESEARCH_URL
|
|
24
|
+
from .clone_research import clone_research
|
|
25
|
+
from .clone_singularity import TEMPLATE_REPO_URL as SINGULARITY_URL
|
|
26
|
+
from .clone_singularity import clone_singularity
|
|
27
|
+
from .clone_writer_directory import (
|
|
28
|
+
TEMPLATE_REPO_URL as PAPER_DIRECTORY_URL,
|
|
29
|
+
)
|
|
30
|
+
from .clone_writer_directory import (
|
|
31
|
+
clone_writer_directory,
|
|
32
|
+
)
|
|
33
|
+
|
|
23
34
|
|
|
24
35
|
def get_available_templates_info():
|
|
25
36
|
"""
|
|
@@ -106,6 +117,10 @@ __all__ = [
|
|
|
106
117
|
"clone_singularity",
|
|
107
118
|
"clone_writer_directory",
|
|
108
119
|
"get_available_templates_info",
|
|
120
|
+
"get_code_template",
|
|
121
|
+
"list_code_templates",
|
|
122
|
+
"get_all_templates",
|
|
123
|
+
"CODE_TEMPLATES",
|
|
109
124
|
"init_git_repo",
|
|
110
125
|
"find_parent_git",
|
|
111
126
|
"create_child_git",
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Code templates for common SciTeX patterns.
|
|
3
|
+
|
|
4
|
+
Provides ready-to-use code snippets for scripts and modules.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from datetime import datetime
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Optional
|
|
10
|
+
|
|
11
|
+
# Import templates from subdirectory
|
|
12
|
+
from ._templates import CODE_TEMPLATES
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def get_code_template(
|
|
16
|
+
template_id: str,
|
|
17
|
+
filepath: Optional[str] = None,
|
|
18
|
+
docstring: Optional[str] = None,
|
|
19
|
+
) -> str:
|
|
20
|
+
"""
|
|
21
|
+
Get a code template by ID.
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
template_id : str
|
|
26
|
+
Template identifier (session, session-minimal, session-plot, etc.)
|
|
27
|
+
filepath : str, optional
|
|
28
|
+
File path to include in template header.
|
|
29
|
+
docstring : str, optional
|
|
30
|
+
Custom docstring for the template.
|
|
31
|
+
|
|
32
|
+
Returns
|
|
33
|
+
-------
|
|
34
|
+
str
|
|
35
|
+
Formatted template content.
|
|
36
|
+
"""
|
|
37
|
+
if template_id not in CODE_TEMPLATES:
|
|
38
|
+
available = ", ".join(CODE_TEMPLATES.keys())
|
|
39
|
+
raise ValueError(f"Unknown template: '{template_id}'. Available: {available}")
|
|
40
|
+
|
|
41
|
+
template = CODE_TEMPLATES[template_id]
|
|
42
|
+
content = template["content"]
|
|
43
|
+
|
|
44
|
+
# Format placeholders
|
|
45
|
+
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
46
|
+
filepath = filepath or template["filename"]
|
|
47
|
+
docstring = docstring or "Description of this script/module"
|
|
48
|
+
|
|
49
|
+
filename = Path(filepath).name
|
|
50
|
+
filename_stem = Path(filepath).stem
|
|
51
|
+
|
|
52
|
+
return content.format(
|
|
53
|
+
timestamp=timestamp,
|
|
54
|
+
filepath=filepath,
|
|
55
|
+
filename=filename,
|
|
56
|
+
filename_stem=filename_stem,
|
|
57
|
+
docstring=docstring,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def list_code_templates():
|
|
62
|
+
"""
|
|
63
|
+
List all available code templates.
|
|
64
|
+
|
|
65
|
+
Returns
|
|
66
|
+
-------
|
|
67
|
+
list[dict]
|
|
68
|
+
List of template info dictionaries.
|
|
69
|
+
"""
|
|
70
|
+
return [
|
|
71
|
+
{
|
|
72
|
+
"id": tid,
|
|
73
|
+
"name": info["name"],
|
|
74
|
+
"description": info["description"],
|
|
75
|
+
"filename": info["filename"],
|
|
76
|
+
"usage": info.get("usage", ""),
|
|
77
|
+
}
|
|
78
|
+
for tid, info in CODE_TEMPLATES.items()
|
|
79
|
+
]
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def get_all_templates() -> str:
|
|
83
|
+
"""
|
|
84
|
+
Get all templates combined into one string.
|
|
85
|
+
|
|
86
|
+
Returns
|
|
87
|
+
-------
|
|
88
|
+
str
|
|
89
|
+
All templates with headers, ordered by priority:
|
|
90
|
+
1. session - Main workflow template
|
|
91
|
+
2. io - File I/O patterns
|
|
92
|
+
3. Others (config, module, etc.)
|
|
93
|
+
"""
|
|
94
|
+
# Priority order
|
|
95
|
+
priority_order = [
|
|
96
|
+
# Core templates (priority 1-3)
|
|
97
|
+
"session",
|
|
98
|
+
"io",
|
|
99
|
+
"config",
|
|
100
|
+
# Session variants
|
|
101
|
+
"session-minimal",
|
|
102
|
+
"session-plot",
|
|
103
|
+
"session-stats",
|
|
104
|
+
"module",
|
|
105
|
+
# Module usage templates
|
|
106
|
+
"plt",
|
|
107
|
+
"stats",
|
|
108
|
+
"scholar",
|
|
109
|
+
"audio",
|
|
110
|
+
"capture",
|
|
111
|
+
"diagram",
|
|
112
|
+
"canvas",
|
|
113
|
+
"writer",
|
|
114
|
+
]
|
|
115
|
+
|
|
116
|
+
sections = []
|
|
117
|
+
sections.append("=" * 70)
|
|
118
|
+
sections.append("SCITEX CODE TEMPLATES")
|
|
119
|
+
sections.append("=" * 70)
|
|
120
|
+
|
|
121
|
+
for tid in priority_order:
|
|
122
|
+
if tid not in CODE_TEMPLATES:
|
|
123
|
+
continue
|
|
124
|
+
info = CODE_TEMPLATES[tid]
|
|
125
|
+
sections.append("")
|
|
126
|
+
sections.append("-" * 70)
|
|
127
|
+
sections.append(f"TEMPLATE: {tid}")
|
|
128
|
+
sections.append(f" {info['name']} - {info['description']}")
|
|
129
|
+
sections.append("-" * 70)
|
|
130
|
+
if info.get("usage"):
|
|
131
|
+
sections.append(info["usage"].strip())
|
|
132
|
+
sections.append("")
|
|
133
|
+
sections.append("```python" if not tid == "config" else "```yaml")
|
|
134
|
+
sections.append(info["content"].strip())
|
|
135
|
+
sections.append("```")
|
|
136
|
+
|
|
137
|
+
return "\n".join(sections)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
__all__ = [
|
|
141
|
+
"get_code_template",
|
|
142
|
+
"list_code_templates",
|
|
143
|
+
"get_all_templates",
|
|
144
|
+
"CODE_TEMPLATES",
|
|
145
|
+
]
|
|
146
|
+
|
|
147
|
+
# EOF
|
scitex/template/_mcp/handlers.py
CHANGED
|
@@ -201,6 +201,85 @@ async def clone_template_handler(
|
|
|
201
201
|
}
|
|
202
202
|
|
|
203
203
|
|
|
204
|
+
async def get_code_template_handler(
|
|
205
|
+
template_id: str,
|
|
206
|
+
filepath: Optional[str] = None,
|
|
207
|
+
docstring: Optional[str] = None,
|
|
208
|
+
) -> dict:
|
|
209
|
+
"""
|
|
210
|
+
Get a code template by ID.
|
|
211
|
+
|
|
212
|
+
Parameters
|
|
213
|
+
----------
|
|
214
|
+
template_id : str
|
|
215
|
+
Template identifier (session, io, config, session-minimal, session-plot, session-stats, module, all)
|
|
216
|
+
filepath : str, optional
|
|
217
|
+
File path to include in template header
|
|
218
|
+
docstring : str, optional
|
|
219
|
+
Custom docstring for the template
|
|
220
|
+
|
|
221
|
+
Returns
|
|
222
|
+
-------
|
|
223
|
+
dict
|
|
224
|
+
Success status and template content
|
|
225
|
+
"""
|
|
226
|
+
try:
|
|
227
|
+
if template_id == "all":
|
|
228
|
+
from scitex.template import get_all_templates
|
|
229
|
+
|
|
230
|
+
content = get_all_templates()
|
|
231
|
+
else:
|
|
232
|
+
from scitex.template import get_code_template
|
|
233
|
+
|
|
234
|
+
content = get_code_template(
|
|
235
|
+
template_id=template_id,
|
|
236
|
+
filepath=filepath,
|
|
237
|
+
docstring=docstring,
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
return {
|
|
241
|
+
"success": True,
|
|
242
|
+
"template_id": template_id,
|
|
243
|
+
"content": content,
|
|
244
|
+
}
|
|
245
|
+
except ValueError as e:
|
|
246
|
+
return {
|
|
247
|
+
"success": False,
|
|
248
|
+
"error": str(e),
|
|
249
|
+
}
|
|
250
|
+
except Exception as e:
|
|
251
|
+
return {
|
|
252
|
+
"success": False,
|
|
253
|
+
"error": str(e),
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
async def list_code_templates_handler() -> dict:
|
|
258
|
+
"""
|
|
259
|
+
List all available code templates.
|
|
260
|
+
|
|
261
|
+
Returns
|
|
262
|
+
-------
|
|
263
|
+
dict
|
|
264
|
+
Success status and list of code templates
|
|
265
|
+
"""
|
|
266
|
+
try:
|
|
267
|
+
from scitex.template import list_code_templates
|
|
268
|
+
|
|
269
|
+
templates = list_code_templates()
|
|
270
|
+
|
|
271
|
+
return {
|
|
272
|
+
"success": True,
|
|
273
|
+
"count": len(templates),
|
|
274
|
+
"templates": templates,
|
|
275
|
+
}
|
|
276
|
+
except Exception as e:
|
|
277
|
+
return {
|
|
278
|
+
"success": False,
|
|
279
|
+
"error": str(e),
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
|
|
204
283
|
async def list_git_strategies_handler() -> dict:
|
|
205
284
|
"""
|
|
206
285
|
List available git initialization strategies.
|
|
@@ -254,6 +333,8 @@ __all__ = [
|
|
|
254
333
|
"get_template_info_handler",
|
|
255
334
|
"clone_template_handler",
|
|
256
335
|
"list_git_strategies_handler",
|
|
336
|
+
"get_code_template_handler",
|
|
337
|
+
"list_code_templates_handler",
|
|
257
338
|
]
|
|
258
339
|
|
|
259
340
|
# EOF
|
|
@@ -104,6 +104,61 @@ def get_tool_schemas() -> list[types.Tool]:
|
|
|
104
104
|
"required": [],
|
|
105
105
|
},
|
|
106
106
|
),
|
|
107
|
+
# Get code template
|
|
108
|
+
types.Tool(
|
|
109
|
+
name="get_code_template",
|
|
110
|
+
description="Get a code template for @stx.session scripts, module usage, or config files. Returns ready-to-use Python code with usage guidelines. Core templates: session, io, config. Module usage: plt, stats, scholar, audio, capture, diagram, canvas, writer.",
|
|
111
|
+
inputSchema={
|
|
112
|
+
"type": "object",
|
|
113
|
+
"properties": {
|
|
114
|
+
"template_id": {
|
|
115
|
+
"type": "string",
|
|
116
|
+
"description": "Template identifier. Core (priority 1-3): session, io, config. Session variants: session-minimal, session-plot, session-stats, module. Module usage: plt, stats, scholar, audio, capture, diagram, canvas, writer. Use 'all' for all templates.",
|
|
117
|
+
"enum": [
|
|
118
|
+
# Core templates
|
|
119
|
+
"session",
|
|
120
|
+
"io",
|
|
121
|
+
"config",
|
|
122
|
+
# Session variants
|
|
123
|
+
"session-minimal",
|
|
124
|
+
"session-plot",
|
|
125
|
+
"session-stats",
|
|
126
|
+
"module",
|
|
127
|
+
# Module usage templates
|
|
128
|
+
"plt",
|
|
129
|
+
"stats",
|
|
130
|
+
"scholar",
|
|
131
|
+
"audio",
|
|
132
|
+
"capture",
|
|
133
|
+
"diagram",
|
|
134
|
+
"canvas",
|
|
135
|
+
"writer",
|
|
136
|
+
# All
|
|
137
|
+
"all",
|
|
138
|
+
],
|
|
139
|
+
},
|
|
140
|
+
"filepath": {
|
|
141
|
+
"type": "string",
|
|
142
|
+
"description": "File path to include in template header (optional)",
|
|
143
|
+
},
|
|
144
|
+
"docstring": {
|
|
145
|
+
"type": "string",
|
|
146
|
+
"description": "Custom docstring for the template (optional)",
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
"required": ["template_id"],
|
|
150
|
+
},
|
|
151
|
+
),
|
|
152
|
+
# List code templates
|
|
153
|
+
types.Tool(
|
|
154
|
+
name="list_code_templates",
|
|
155
|
+
description="List all available code templates for scripts and modules",
|
|
156
|
+
inputSchema={
|
|
157
|
+
"type": "object",
|
|
158
|
+
"properties": {},
|
|
159
|
+
"required": [],
|
|
160
|
+
},
|
|
161
|
+
),
|
|
107
162
|
]
|
|
108
163
|
|
|
109
164
|
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Code templates registry - loads all template definitions."""
|
|
3
|
+
|
|
4
|
+
# Core templates (priority 1-3)
|
|
5
|
+
from .audio import TEMPLATE as AUDIO
|
|
6
|
+
from .canvas import TEMPLATE as CANVAS
|
|
7
|
+
from .capture import TEMPLATE as CAPTURE
|
|
8
|
+
from .config import TEMPLATE as CONFIG
|
|
9
|
+
from .diagram import TEMPLATE as DIAGRAM
|
|
10
|
+
from .io import TEMPLATE as IO
|
|
11
|
+
|
|
12
|
+
# Module template
|
|
13
|
+
from .module import TEMPLATE as MODULE
|
|
14
|
+
|
|
15
|
+
# Module usage templates (priority 4+)
|
|
16
|
+
from .plt import TEMPLATE as PLT
|
|
17
|
+
from .scholar import TEMPLATE as SCHOLAR
|
|
18
|
+
from .session import TEMPLATE as SESSION
|
|
19
|
+
|
|
20
|
+
# Session variants
|
|
21
|
+
from .session_minimal import TEMPLATE as SESSION_MINIMAL
|
|
22
|
+
from .session_plot import TEMPLATE as SESSION_PLOT
|
|
23
|
+
from .session_stats import TEMPLATE as SESSION_STATS
|
|
24
|
+
from .stats import TEMPLATE as STATS
|
|
25
|
+
from .writer import TEMPLATE as WRITER
|
|
26
|
+
|
|
27
|
+
CODE_TEMPLATES = {
|
|
28
|
+
# Priority 1-3: Core templates
|
|
29
|
+
"session": SESSION,
|
|
30
|
+
"io": IO,
|
|
31
|
+
"config": CONFIG,
|
|
32
|
+
# Session variants
|
|
33
|
+
"session-minimal": SESSION_MINIMAL,
|
|
34
|
+
"session-plot": SESSION_PLOT,
|
|
35
|
+
"session-stats": SESSION_STATS,
|
|
36
|
+
# Module template
|
|
37
|
+
"module": MODULE,
|
|
38
|
+
# Module usage templates
|
|
39
|
+
"plt": PLT,
|
|
40
|
+
"stats": STATS,
|
|
41
|
+
"scholar": SCHOLAR,
|
|
42
|
+
"audio": AUDIO,
|
|
43
|
+
"capture": CAPTURE,
|
|
44
|
+
"diagram": DIAGRAM,
|
|
45
|
+
"canvas": CANVAS,
|
|
46
|
+
"writer": WRITER,
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
__all__ = ["CODE_TEMPLATES"]
|
|
50
|
+
|
|
51
|
+
# EOF
|