{"id":40994197,"url":"https://github.com/ywatanabe1989/scitex-python","last_synced_at":"2026-05-30T23:01:20.763Z","repository":{"id":300325207,"uuid":"1001456268","full_name":"ywatanabe1989/scitex-python","owner":"ywatanabe1989","description":"Python toolkit for reproducible science. CLI commands, 371+ MCP tools, built-in skills. From raw data to manuscript — with reproducibility verification. For AI and human researchers.","archived":false,"fork":false,"pushed_at":"2026-03-29T00:15:45.000Z","size":103097,"stargazers_count":61,"open_issues_count":14,"forks_count":19,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-29T01:52:57.613Z","etag":null,"topics":["academic-writing","ai-research","automation","bibtex","data-visualization","generative-ai","latex","literature-review","machine-learning","matplotlib","mcp","mcp-server","pandas","python","pytorch","reproducibility","research-automation","scientific-computing","scitex","statistics"],"latest_commit_sha":null,"homepage":"https://scitex.ai","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ywatanabe1989.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":"CLA.md"},"funding":{"github":"ywatanabe1989","buy_me_a_coffee":"ywatanabe","custom":["https://scitex.ai/donate/"]}},"created_at":"2025-06-13T12:12:28.000Z","updated_at":"2026-03-28T15:27:12.000Z","dependencies_parsed_at":"2026-01-07T12:03:29.222Z","dependency_job_id":"87e53ee4-49c8-449b-b749-756f6f21681c","html_url":"https://github.com/ywatanabe1989/scitex-python","commit_stats":null,"previous_names":["ywatanabe1989/scitex-code","ywatanabe1989/scitex-python"],"tags_count":71,"template":false,"template_full_name":null,"purl":"pkg:github/ywatanabe1989/scitex-python","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ywatanabe1989%2Fscitex-python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ywatanabe1989%2Fscitex-python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ywatanabe1989%2Fscitex-python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ywatanabe1989%2Fscitex-python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ywatanabe1989","download_url":"https://codeload.github.com/ywatanabe1989/scitex-python/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ywatanabe1989%2Fscitex-python/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31291943,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["academic-writing","ai-research","automation","bibtex","data-visualization","generative-ai","latex","literature-review","machine-learning","matplotlib","mcp","mcp-server","pandas","python","pytorch","reproducibility","research-automation","scientific-computing","scitex","statistics"],"created_at":"2026-01-22T08:07:23.004Z","updated_at":"2026-05-30T23:01:20.755Z","avatar_url":"https://github.com/ywatanabe1989.png","language":"Python","funding_links":["https://github.com/sponsors/ywatanabe1989","https://buymeacoffee.com/ywatanabe","https://scitex.ai/donate/"],"categories":[],"sub_categories":[],"readme":"\u003c!-- ---\n!-- Timestamp: 2026-03-23 01:22:48\n!-- Author: ywatanabe\n!-- File: /home/ywatanabe/proj/scitex-python/README.md\n!-- --- --\u003e\n\n# SciTeX (\u003ccode\u003escitex\u003c/code\u003e)\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://scitex.ai\"\u003e\n    \u003cimg src=\"docs/assets/images/scitex-logo-blue-cropped.png\" alt=\"SciTeX\" width=\"400\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003cb\u003ePython Library for Science. For AI and Human Researchers\u003c/b\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://badge.fury.io/py/scitex\"\u003e\u003cimg src=\"https://badge.fury.io/py/scitex.svg\" alt=\"PyPI version\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://pypi.org/project/scitex/\"\u003e\u003cimg src=\"https://img.shields.io/pypi/pyversions/scitex.svg\" alt=\"Python Versions\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://scitex-python.readthedocs.io\"\u003e\u003cimg src=\"https://readthedocs.org/projects/scitex-python/badge/?version=latest\" alt=\"Documentation\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/ywatanabe1989/scitex-python/blob/main/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/ywatanabe1989/scitex-python\" alt=\"License\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://scitex-python.readthedocs.io\"\u003eDocs\u003c/a\u003e \u0026middot;\n  \u003ca href=\"https://scitex-python.readthedocs.io/en/latest/quickstart.html\"\u003eQuick Start\u003c/a\u003e \u0026middot;\n  \u003ca href=\"https://scitex-python.readthedocs.io/en/latest/api/index.html\"\u003eAPI\u003c/a\u003e \u0026middot;\n  \u003ccode\u003epip install scitex[all]\u003c/code\u003e\n\u003c/p\u003e\n\n---\n\nThis repository provides `scitex`, the orchestration layer of the SciTeX ecosystem — solving key problems in scientific research:\n\n## Problem and Solution\n\n| # | Problem | Solution |\n|---|---------|----------|\n| 1 | **Fragmented tools** -- literature search, statistics, figures, and writing each require separate tools with incompatible formats | **Unified toolkit** -- `import scitex as stx` provides 73 modules under one namespace, accessible via Python API, CLI, and MCP. These modules are standalone packages but loosely coupled through a plugin registry — each works on its own, yet composes into designed synergy (save a figure → auto-exports CSV + YAML recipe → hash-tracked by Clew → citeable in scitex-writer). |\n| 2 | **No verification** -- existing tools address whether work *could* be reproduced, not whether it *has* been verified | **Cryptographic verification** -- Clew builds SHA-256 hash-chain DAGs linking every manuscript claim back to source data |\n| 3 | **AI agents lack context** -- general-purpose LLMs cannot operate across the full research lifecycle without domain-specific tools | **323 MCP tools** -- AI agents run statistics, create figures, search literature, and compile manuscripts through structured tool calls |\n| 4 | **No custom tooling** -- every lab needs domain-specific tools, but building and sharing them requires deep infrastructure knowledge | **App Maker and Store** -- researchers create custom apps with [scitex-app](https://github.com/ywatanabe1989/scitex-app) SDK and share via [SciTeX Cloud](https://scitex.ai) |\n| 5 | **Vendor lock-in** -- cloud research tools (Overleaf, Zotero, Mendeley, Colab, GitHub Copilot) keep data on third-party servers and depend on APIs that can disappear overnight or monetize tomorrow | **Open and self-hostable** -- every SciTeX package is AGPL-3.0; the full 39-package ecosystem runs on your own hardware (or SciTeX Cloud which itself is self-hostable); cloud integrations are pluggable extras, not requirements |\n\n## SciTeX and Research Workflow\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"scripts/assets/workflow_out/workflow.png\" alt=\"SciTeX Research Workflow\" width=\"600\"\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003csub\u003e\u003cb\u003eFigure 1.\u003c/b\u003e SciTeX research pipeline -- from literature search to manuscript compilation, with every step cryptographically linked.\u003c/sub\u003e\u003c/p\u003e\n\n## Demo — Automated Research from Data to Manuscript\n\n**40 min, minimal human intervention** — an AI agent using SciTeX completed a full research cycle: literature search, statistical analysis, publication-ready figures, a 21-page manuscript, and peer review simulation. More demos are available at [https://scitex.ai/demos/](https://scitex.ai/demos/).\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://scitex.ai/demos/watch/scitex-automated-research/\"\u003e\n    \u003cimg src=\"docs/assets/images/scitex-demo.gif\" alt=\"SciTeX Demo\" width=\"800\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## Installation\n\n```bash\n# Recommended — uv resolver, ~3 min (10–30× faster than pip on scitex[all])\nuv pip install \"scitex[all]\"\n\n# Plain pip works but expect ~30–90 min — pip's resolver backtracks\n# heavily on the full extras set. See Installation Tips below.\npip install \"scitex[all]\"\n```\n\n\u003e **Why uv?** `scitex[all]` pulls a large transitive set\n\u003e (numpy/pandas/torch/jax/playwright/openalex-local/sphinx-rtd-theme/…).\n\u003e pip's serial resolver walks version histories trying to satisfy\n\u003e every constraint and can spend 30+ min just downloading metadata\n\u003e before installing a single wheel. uv resolves the same set in\n\u003e parallel in 1–3 min. Install uv once with\n\u003e `pip install uv` (or `curl -LsSf https://astral.sh/uv/install.sh | sh`).\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003ePer-module extras\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\npip install scitex                     # Core only (minimal)\npip install scitex[plt,stats,scholar]  # Typical research setup\npip install scitex[plt]                # Publication-ready figures (figrecipe)\npip install scitex[stats]              # Statistical testing (23+ tests)\npip install scitex[scholar]            # Literature search, PDF download, BibTeX enrichment\npip install scitex[writer]             # LaTeX manuscript compilation\npip install scitex[audio]              # Text-to-speech\npip install scitex[ai]                 # LLM APIs (OpenAI, Anthropic, Google) + ML tools\npip install scitex[dataset]            # Scientific datasets (DANDI, OpenNeuro, PhysioNet)\npip install scitex[browser]            # Web automation (Playwright)\npip install scitex[capture]            # Screenshot capture and monitoring\npip install scitex[cloud]              # Cloud platform integration\n```\n\nRequires Python 3.10+. Prefix any of the above with `uv ` (e.g. `uv pip install scitex[plt,stats,scholar]`) for a 10–30× faster resolve.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eInstallation Tips — timeouts, mirrors, \u003ccode\u003e[all]\u003c/code\u003e size\u003c/strong\u003e\u003c/summary\u003e\n\n`scitex[all]` pulls the full 33-package ecosystem plus heavy extras (playwright browsers, torch, jax, pymupdf, Apptainer/Docker integrations, etc.). With **plain pip** this takes **30–90 minutes** because pip's resolver thrashes on the transitive set; with **uv** it takes ~3 min. Recommended order of preference:\n\n```bash\n# 1. uv (recommended) — parallel Rust resolver, 10-30× faster\npip install uv \u0026\u0026 uv pip install \"scitex[all]\"\n\n# 2. pip with extended timeouts (default 15s aborts mid-wheel on slow links)\npip install --timeout 600 --retries 5 \"scitex[all]\"\n\n# 3. Install in groups if a single run keeps failing\nuv pip install scitex[io,stats,plt]         # core analysis layer first\nuv pip install scitex[scholar,writer]       # research layer\nuv pip install scitex[audio,browser,dataset,cloud]   # heavy extras last\n\n# 4. Mirror — for networks where pypi.org is unreliable\nuv pip install -i https://pypi.tuna.tsinghua.edu.cn/simple \"scitex[all]\"\n```\n\nIf a single dep hangs, identify it with `pip install -v` and install that package alone with `--no-deps`, then resume the full install.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eModule Overview\u003c/strong\u003e\u003c/summary\u003e\n\n| Category | Modules | Description |\n|----------|---------|-------------|\n| **Core** | `session`, `io`, `config`, `clew` | Experiment tracking, file I/O, config, cryptographic verification |\n| **Analysis** | `stats`, `plt`, `dsp`, `linalg` | Statistics, plotting, signal processing, linear algebra |\n| **Research** | `scholar`, `writer`, `diagram`, `canvas` | Literature, manuscripts, diagrams, figure composition |\n| **ML/AI** | `ai`, `nn`, `torch`, `cv`, `benchmark` | LLM APIs, neural networks, PyTorch, computer vision |\n| **Data** | `pd`, `db`, `dataset`, `schema` | Pandas utilities, databases, scientific datasets |\n| **Infra** | `app`, `cloud`, `tunnel`, `container` | App SDK, cloud, SSH tunnels, containers |\n| **Automation** | `browser`, `capture`, `audio`, `notification` | Web automation, screenshots, TTS, notifications |\n| **Dev** | `dev`, `template`, `linter`, `introspect` | Ecosystem tools, scaffolding, code analysis |\n\n\u003c/details\u003e\n\n## Architecture — Packages (3-Layer Cascade)\n\nThe 33-package ecosystem follows a strict **dependency cascade**: upstream imports middle imports downstream, never the reverse. Downstream apps must work standalone; the umbrella only orchestrates.\n\n```\nUpstream (orchestration — SOC, integration tests only)\n    scitex (scitex-python), scitex-cloud\n        │ imports / re-exposes\n        ▼\nMiddle (shared infrastructure — wraps, doesn't replace)\n    scitex-io, scitex-stats, scitex-app, scitex-ui, scitex-audio, scitex-dev\n        │ integrates / wraps via plugin registry\n        ▼\nDownstream (standalone apps — own IO/GUI, unit tests)\n    figrecipe, scitex-writer, scitex-scholar, scitex-clew, scitex-notebook,\n    scitex-dataset, scitex-ssh, scitex-container, scitex-browser, scitex-linter,\n    openalex-local, crossref-local, socialia, + utility leaves\n    (scitex-{path,str,dict,logging,types,db,repro,audit,parallel,compat,gists,etc,core})\n```\n\n**One-line contract**: downstream does not know upstream exists; upstream does not duplicate downstream logic. See [01_ecosystem_01_upstream-and-downstream.md](https://github.com/ywatanabe1989/scitex-dev/blob/main/src/scitex_dev/_skills/general/01_ecosystem_01_upstream-and-downstream.md) for full rules (testing, cascade, interfaces) and [01_ecosystem_02_dependency-and-version-pinning.md](https://github.com/ywatanabe1989/scitex-dev/blob/main/src/scitex_dev/_skills/general/01_ecosystem_02_dependency-and-version-pinning.md) for dep-pinning.\n\n## Quick Start\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003e@scitex.session\u003c/code\u003e -- Reproducible Experiment Tracking\u003c/strong\u003e\u003c/summary\u003e\n\nOne decorator gives you: auto-CLI, YAML config injection, random seed fixation, structured output, and logging.\n\n```python\nimport scitex as stx\nimport numpy as np\n\n@stx.session\ndef main(\n    data_path: str = \"./data.csv\",   # --data-path data.csv\n    n_samples: int = 100,            # --n-samples 200\n    CONFIG=stx.session.INJECTED,     # Aggregated ./config/*.yaml\n    plt=stx.session.INJECTED,        # Pre-configured matplotlib\n    logger=stx.session.INJECTED,     # Session logger\n):\n    \"\"\"Analyze data. Docstring becomes --help text.\"\"\"\n    \n    # Load\n    data = stx.io.load(data_path)\n    \n    # Demo data\n    x = np.linspace(0, 2 * np.pi, n_samples)\n    y = np.sin(x) + np.random.randn(n_samples) * 0.1\n    \n    # FigRecipe Plot\n    fig, ax = stx.plt.subplots()\n    ax.plot(x, y)\n    ax.set_xyt(\"Time\", \"Amplitude\", \"Noisy Sine Wave\")\n    \n    # Save sine.png + sine.csv with logging message\n    stx.io.save(fig, \"sine.png\")\n    \n    return 0\n\nif __name__ == \"__main__\":\n    main()\n```\n\n```bash\n$ python script.py --data-path experiment.csv --n-samples 200\n$ python script.py --help\n# usage: script.py [-h] [--data-path DATA_PATH] [--n-samples N_SAMPLES]\n# Analyze data. Docstring becomes --help text.\n```\n\n```\nscript_out/FINISHED_SUCCESS/2026-03-18_14-30-00_Z5MR/\n├── sine.png, sine.csv         # Figure + auto-exported plot data\n├── CONFIGS/CONFIG.yaml        # Frozen parameters\n└── logs/{stdout,stderr}.log   # Execution logs\n```\n\nThe injected `CONFIG` is a `DotDict` merging YAML user configs with session-resolved keys:\n\n| Key | Meaning |\n|-----|---------|\n| `CONFIG.ID` | Session identifier, e.g. `2026-04-23T21-30-00_Z5MR` |\n| `CONFIG.PID` | Python process ID |\n| `CONFIG.START_DATETIME` | When the session started |\n| `CONFIG.FILE` | Path to caller script |\n| `CONFIG.SDIR_OUT` | Base output dir, e.g. `analysis_out/` |\n| `CONFIG.SDIR_RUN` | This run's dir, e.g. `analysis_out/FINISHED_SUCCESS/\u003cID\u003e/` |\n| `CONFIG.ARGS` | Parsed CLI args |\n| `CONFIG.MODEL.*` | Values from `./config/MODEL.yaml` (one namespace per YAML file) |\n\nUse `CONFIG.SDIR_RUN / \"results.csv\"` to re-load a file saved earlier in the same session. A frozen copy of `CONFIG` is persisted to `CONFIG.SDIR_RUN/CONFIGS/{CONFIG.yaml,CONFIG.pkl}` so any run is fully auditable. See the [Session config docs](https://scitex-python.readthedocs.io/en/latest/api/session.html) for the full reference.\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.io\u003c/code\u003e -- Unified File I/O (50+ Formats)\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport scitex as stx\n\n# Save and load -- format detected from extension.\n# symlink_from_cwd=True drops a symlink at cwd so round-trip by filename works;\n# without it, save() routes to \u003cscript\u003e_out/ and load() must use an absolute path.\nstx.io.save(df, \"results.csv\", symlink_from_cwd=True)\ndf = stx.io.load(\"results.csv\")\n\nstx.io.save(arr, \"data.npy\", symlink_from_cwd=True)\narr = stx.io.load(\"data.npy\")\n\nstx.io.save(fig, \"figure.png\")       # Also exports figure data as CSV\nstx.io.save(config, \"config.yaml\")\nstx.io.save(model, \"model.pkl\")\n\n# Aggregate ./config/*.yaml into a single DotDict\nCONFIG = stx.io.load_configs(config_dir=\"./config\")\nprint(CONFIG.MODEL.hidden_size)      # Dot-notation access\n\n# Register custom formats\n@stx.io.register_saver(\".custom\")\ndef save_custom(obj, path, **kw):\n    with open(path, \"w\") as f:\n        f.write(str(obj))\n\n@stx.io.register_loader(\".custom\")\ndef load_custom(path, **kw):\n    with open(path) as f:\n        return f.read()\n```\n\nSupports: CSV, JSON, YAML, TOML, HDF5, NPY, NPZ, PKL, PNG, JPG, SVG, PDF, Excel, Parquet, Zarr, INI, TXT, MAT, WAV, MP3, BibTeX, and more.\n\n**Built-in features**: Auto directory creation, path resolution to `\u003cscript_name\u003e_out/`, symlinks (`symlink_from_cwd=True`), save logging with file size, and Clew hash tracking.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.plt\u003c/code\u003e -- Reproducible, Restylable Figures\u003c/strong\u003e\u003c/summary\u003e\n\nPowered by [figrecipe](https://github.com/ywatanabe1989/figrecipe). Figures are **reproducible nodes** in the Clew verification DAG -- scientific data and visual style are decomposed, so figures can be restyled (fonts, colors, layout) without altering the underlying data hash. Every figure auto-exports its data as CSV + a YAML recipe for exact reproduction.\n\n```python\nimport scitex as stx\nfig, axes = stx.plt.subplots(1, 3)\naxes[0].stx_line(x, y)\naxes[0].set_xyt(\"Time\", \"Value\", \"Line\")\n\naxes[1].stx_violin([g1, g2, g3])\naxes[1].set_xyt(\"Group\", \"Score\", \"Violin\")\n\naxes[2].stx_heatmap(corr_matrix)\naxes[2].set_xyt(\"X\", \"Y\", \"Heatmap\")\nstx.io.save(fig, \"analysis.png\")  # Saves analysis.png + analysis.csv + analysis.yaml\n\n# Restyle without changing data (hash stays valid for Clew verification)\nstx.plt.reproduce(\"analysis.yaml\", style=\"nature\")\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.stats\u003c/code\u003e -- Publication-Ready Statistics (23+ Tests)\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport scitex as stx\nresult = stx.stats.run_test(\"ttest_ind\", group1, group2, return_as=\"dataframe\")\n# Returns: p-value, effect size (Cohen's d), CI, normality check, power\nrecommendations = stx.stats.recommend_tests(data)\nstx.stats.annotate(ax, test=result, style=\"apa\")   # stars + \"t(58) = 2.34, p = .021, d = 0.60\" on a matplotlib Axes\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.scholar\u003c/code\u003e -- Literature Management\u003c/strong\u003e\u003c/summary\u003e\n\nSearch, download, enrich papers. Backed by local CrossRef (167M+) and OpenAlex (250M+) databases.\n\n```python\nimport scitex as stx\nscholar = stx.scholar.Scholar()                             # lazy-load library\npapers = scholar.process_papers([\"neural oscillations working memory\"])\nscholar.download_pdfs_from_dois([\"10.1038/s41586-024-07804-3\"])\nscholar.enrich_papers(bibtex_path=\"references.bib\")\n```\n\n```bash\nscitex scholar crossref-scitex search \"neural oscillations\" --abstracts\nscitex scholar fetch --from-bibtex references.bib --project myproject\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.writer\u003c/code\u003e -- LaTeX Manuscript Compilation\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport scitex as stx\nstx.writer.compile.manuscript(\"paper/\")                     # latexmk wrapper\nstx.writer.figures.add(\"paper/\", \"results.png\", caption=\"Main results\")\nstx.writer.tables.add(\"paper/\", \"stats.csv\", caption=\"Statistical summary\")\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.notification\u003c/code\u003e -- Multi-Backend Notifications\u003c/strong\u003e\u003c/summary\u003e\n\nGet notified when experiments finish -- via desktop, phone call, SMS, or email -- with automatic fallback.\n\n```python\nimport scitex as stx\nstx.notification.alert(\"Experiment complete: accuracy = 94.2%\")\nstx.notification.call(\"Training diverged -- loss is NaN\")\nstx.notification.sms(\"GPU job finished on node-42\")\n\n@stx.session(notify=True)   # Notifies on completion or failure\ndef main(CONFIG=stx.session.INJECTED): ...\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.clew\u003c/code\u003e -- Cryptographic Verification for AI-Driven Science\u003c/strong\u003e\u003c/summary\u003e\n\nAs AI agents produce research at scale, the question shifts from *\"could this be reproduced?\"* to *\"has this been verified?\"*. Clew builds a **SHA-256 hash-chain DAG** linking every manuscript claim back to source data.\n\n```python\nimport scitex as stx\n\n# Every stx.io.load/save automatically records file hashes -- zero config\nstx.clew.status()                          # {'verified': 12, 'mismatched': 0, 'missing': 0}\nstx.clew.chain(\"results/figure1.png\")      # Trace one file back to source data\nstx.clew.dag(claims=True)                  # Verify all manuscript claims\n\n# Register traceable assertions\nstx.clew.add_claim(\n    file_path=\"paper/main.tex\", claim_type=\"statistic\", line_number=142,\n    claim_value=\"t(58) = 2.34, p = .021\",\n    source_session=\"2026-03-18_14-30-00_Z5MR\", source_file=\"results/stats.csv\",\n)\n\nstx.clew.mermaid(claims=True)              # Visualize provenance DAG\n```\n\n| Mode | Function | Answers |\n|------|----------|---------|\n| **Project** | `clew.dag()` | Is the whole project intact? |\n| **File** | `clew.chain(\"output.csv\")` | Can I trust this specific file? |\n| **Claim** | `clew.verify_claim(\"Fig 1\")` | Is this manuscript assertion valid? |\n\n**L1** hash comparison (ms) / **L2** sandbox re-execution (min) / **L3** registered timestamp proof (optional).\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/clew-dag.png\" alt=\"Clew DAG\" width=\"300\"\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003csub\u003e\u003cb\u003eFigure 2.\u003c/b\u003e Clew verification DAG -- green nodes are verified (hash match), red nodes have mismatches. Each node shows its SHA-256 hash prefix.\u003c/sub\u003e\u003c/p\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.audio\u003c/code\u003e -- Text-to-Speech (ElevenLabs / LuxTTS / gTTS / pyttsx3)\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport scitex as stx\nstx.audio.speak(\"Training complete. Accuracy ninety-four percent.\")\nstx.audio.speak(\"Offline only\", backend=\"pyttsx3\")                  # force offline\nstx.audio.speak(\"Report\", output_path=\"report.mp3\", play=False)     # TTS → file\n```\nBackends fall back automatically: ElevenLabs (paid, highest) → LuxTTS (offline, 48 kHz, voice-cloning) → gTTS (free online) → pyttsx3 (offline espeak).\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.dataset\u003c/code\u003e -- OpenNeuro / DANDI / PhysioNet / Zenodo Fetcher\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport scitex as stx\nds = stx.dataset.neuroscience.openneuro.fetch_all_datasets(max_datasets=10)\nstx.dataset.neuroscience.dandi.fetch_all_datasets(max_datasets=10)\nhits = stx.dataset.search_datasets(ds, text_query=\"phase-amplitude coupling\")\n```\nUniform API across neuroscience / biomedical / clinical-trial repositories.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.container\u003c/code\u003e -- Apptainer / Docker Management\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport scitex as stx\nstx.container.apptainer.build(def_name=\"recipe\")        # versioned SIF\nstx.container.apptainer.switch_version(\"2.19.5\")        # atomic active-SIF flip\nstx.container.apptainer.rollback()                      # revert to previous\nsnap = stx.container.env_snapshot()                     # full env for papers\n```\nReproducible HPC containers — build, version, rollback, env-snapshot for manuscripts.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.tunnel\u003c/code\u003e -- Persistent SSH Reverse Tunnels\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport scitex as stx\nstx.tunnel.setup(port=8888, bastion_server=\"gw.example.com\")\nstx.tunnel.status()                                     # {\"8888\": \"active\"}\n```\nNAT traversal for lab machines — autossh-backed systemd service.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.linter\u003c/code\u003e -- 47-Rule Convention Checker\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport scitex as stx\nissues = stx.linter.lint_file(\"src/\")\nfor i in issues:\n    print(f\"{i.filepath}:{i.line} [{i.rule.id}] {i.message}\")\n```\nLints SciTeX projects for ecosystem conventions (`stx.io.save` usage, CONFIGS naming, matplotlib prefs, import hygiene). Complements ruff/flake8.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.repro\u003c/code\u003e -- Seed Everything + Array Hashing\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport scitex as stx\nrng = stx.repro.RandomStateManager(seed=42)             # seeds random + numpy + torch + tf\nrun_id = stx.repro.gen_ID()                             # \"20260423_2155_abc12345\"\ndigest = stx.repro.hash_array(np_array)                 # deterministic SHA\n```\nOne call seeds every RNG; generates experiment-run IDs; hashes arrays for fingerprinting.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.parallel\u003c/code\u003e -- Threaded Map with tqdm\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport scitex as stx\nresults = stx.parallel.run(download, [(u,) for u in urls], n_jobs=-1)\n```\nDrop-in parallel map for I/O-bound work — HTTP fetches, file reads, API calls. tqdm progress bar built-in.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.path\u003c/code\u003e -- Project-Aware Paths \u0026amp; Session Dirs\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport scitex as stx\nroot = stx.path.find_git_root()                     # walk up for .git/\nout = stx.path.get_spath(\"results.csv\")             # → {script}_out/results.csv\nstx.path.create_relative_symlink(src, dst)          # relative (portable) symlink\nlatest = stx.path.find_latest(\".\", \"model_\", \".pt\") # model_v003.pt (highest version)\nstx.path.fix_broken_symlinks(\"dir/\", remove=True)   # cleanup dangling links\n```\nAuto-routes saves to `{script}_out/` and resolves session-scoped paths so `@stx.session` scripts produce dated, hash-trackable output dirs with no boilerplate.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.logging\u003c/code\u003e -- Extended Logging + Exception Hierarchy + Tee\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport scitex as stx\nlogger = stx.logging.getLogger(__name__)\nlogger.success(\"Training converged at epoch 87\")    # SUCCESS level (custom)\nlogger.fail(\"Validation loss diverged\")             # FAIL level (custom)\n\n# Structured warnings with SciTeX categories\nstx.logging.warn_deprecated(\"old_api\", replacement=\"new_api\", version=\"3.0\")\nstx.logging.warn_data_loss(\"NaN values dropped in column 'bp'\")\n\n# Typed exceptions (30+ subclasses of SciTeXError)\nraise stx.logging.ShapeError(\"expected (N, 2), got (N, 3)\")\n\n# Tee stdout/stderr to a log file\nwith stx.logging.Tee(\"run.log\"):\n    main()                                           # prints go to screen + file\n```\nExtends stdlib `logging` with SUCCESS/FAIL levels, a 30+ class exception tree (`IOError`/`ShapeError`/`ConfigKeyError`/...), structured warning categories, and tee-to-file. `SCITEX_LOGGING_LEVEL` env var sets default at import.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.db\u003c/code\u003e -- SQLite3 / PostgreSQL with ndarray BLOB Storage\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport scitex as stx, numpy as np\n\ndb = stx.db.SQLite3(\"experiments.db\")\nwith db:                                             # context-manager transaction\n    db.execute(\"CREATE TABLE IF NOT EXISTS runs (id TEXT, acc REAL)\")\n    db.save_array(\"weights_epoch_87\", np.random.rand(1024, 1024))   # compressed BLOB\n\ndf = db.to_df(\"runs\")                                # pandas round-trip\nw = db.load_array(\"weights_epoch_87\")                # typed ndarray back\ndb.check_health()                                    # integrity + schema drift\nstx.db.delete_duplicates(conn, \"runs\", columns=[\"id\"])\n```\nSQLite / PostgreSQL clients with first-class compressed-ndarray BLOBs, dataframe round-trips, health checks, and duplicate removal. Drop-in replacement for hand-rolling `pickle → BLOB` storage or SQLAlchemy Core when you don't need an ORM.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e\u003ccode\u003escitex.browser\u003c/code\u003e -- Playwright Helpers for Scientific Scraping\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport scitex as stx, asyncio\n\nasync def grab_pdf():\n    async with stx.browser.SyncBrowserSession() as session:\n        page = await session.new_page()\n        await page.goto(\"https://journal.example/article/123\")\n        await stx.browser.click_with_fallbacks_async(\n            page, [\"button.download-pdf\", \"a[href$='.pdf']\"]   # fall through selectors\n        )\n        await stx.browser.save_as_pdf_async(page, \"article.pdf\")\n\nasyncio.run(grab_pdf())\n```\nPlaywright wrappers with: Chrome-PDF-viewer download helper, popup/cookie dismissers (`close_popups_async`, `PopupHandler`), cursor/click/step overlays for debug video recording, console-log collectors, test-failure artifact capture. Drop-in replacement for raw Playwright scripts + stealth plugins.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eUtility modules — lower-level helpers\u003c/strong\u003e\u003c/summary\u003e\n\n| Module | Purpose | Key API |\n|--------|---------|---------|\n| `stx.str` | Text / LaTeX fallback / colored prints | `printc`, `safe_latex_render`, `grep` |\n| `stx.dict` | `DotDict` + safe merge / flatten | `DotDict`, `safe_merge`, `flatten` |\n| `stx.types` | Union type aliases + predicates | `ArrayLike`, `ColorLike`, `is_array_like` |\n| `stx.audit` | Unified security scan (bandit / shellcheck / pip-audit) | `audit()` |\n| `stx.compat` | Deprecation shims | `@deprecated`, `notify` legacy alias |\n| `stx.etc` | Terminal keypress helpers | `wait_key`, `count` |\n\nSee [docs/05_ADDITIONAL_MODULES.md](./docs/05_ADDITIONAL_MODULES.md) for full examples.\n\u003c/details\u003e\n\n\u003e **[Agentic usage](./docs/06_AGENTIC_USAGE.md)** — MCP setup, example prompts, real one-shot outputs, and skill-trigger testing.\n\n\u003e **[Full API reference](https://scitex-python.readthedocs.io/en/latest/api/index.html)** \u0026middot; **[Examples](./examples/)** \u0026middot; **[Module status](./docs/04_MODULE_STATUS.md)**\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCLI Commands\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\nscitex --help-recursive                  # Show all commands\nscitex scholar crossref-scitex search \"topic\"   # Search literature (CrossRef 167M+)\nscitex scholar fetch \"10.1038/...\"       # Download paper by DOI\nscitex stats recommend                   # Suggest statistical tests\nscitex clew status                       # Project verification overview\nscitex clew dag --claims                 # Verify all manuscript claims\nscitex audio speak \"Analysis complete\"   # Text-to-speech\nscitex notification send \"Job finished\"  # Multi-backend notification\nscitex template clone research my_proj   # Scaffold a project\nscitex dev ecosystem list                # Check ecosystem versions\nscitex mcp list-tools                    # List all MCP tools (323)\n```\n\n\u003e **[Full CLI reference](./docs/01_CLI_COMMANDS.md)**\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eMCP Server (323 tools across 23 modules)\u003c/strong\u003e\u003c/summary\u003e\n\nTurn AI agents into autonomous researchers via [MCP](https://modelcontextprotocol.io/).\n\n| Category | Tools | | Category | Tools | | Category | Tools |\n|----------|-------|-|----------|-------|-|----------|-------|\n| plt | 73 | | crossref | 15 | | io | 5 |\n| cloud | 50 | | dev | 13 | | template | 4 |\n| writer | 38 | | introspect | 12 | | openalex | 4 |\n| scholar | 22 | | stats | 10 | | linter | 3 |\n| clew | 9 | | dataset | 8 | | social | 3 |\n| project | 6 | | notify | 5 | | tunnel | 3 |\n| docs | 4 | | ui | 2 | | usage | 2 |\n\n```json\n{\"mcpServers\": {\"scitex\": {\"command\": \"scitex\", \"args\": [\"mcp\", \"start\"],\n  \"env\": {\"SCITEX_ENV_SRC\": \"${SCITEX_ENV_SRC}\"}}}}\n```\n\n\u003e **[Full MCP reference](./docs/02_MCP_TOOLS.md)**\n\u003c/details\u003e\n\n## Configuration\n\n```bash\ncp -r .env.d.examples .env.d   # 1. Copy examples\n$EDITOR .env.d/                # 2. Edit credentials\nsource .env.d/entry.src        # 3. Source in shell\n```\n\n\u003e **[Full configuration reference](./.env.d.examples/README.md)**\n\n\n## SciTeX Ecosystem\n\n[`scitex-cloud`](https://github.com/ywatanabe1989/scitex-cloud) is a self-hosted web application that serves as a collaborative research workspace — with a built-in Writer, Scholar, and App Store where researchers build custom tools using [`scitex-app`](https://github.com/ywatanabe1989/scitex-app) SDK and [`scitex-ui`](https://github.com/ywatanabe1989/scitex-ui) components, then share them with the community. A live instance is hosted at [scitex.ai](https://scitex.ai).\n\n\u003c!-- hook-bypass: line-limit --\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eFull Ecosystem (37 packages, grouped by primary interface)\u003c/strong\u003e\u003c/summary\u003e\n\nEach package exposes the ecosystem via up to six interfaces: Python library, CLI, MCP tools, Claude Code skills, hooks, and HTTP. Ratings: ⭐⭐⭐ = primary / canonical surface, ⭐⭐ = strong secondary, ⭐ = thin, — = not provided. Packages are grouped by their *primary* interface — the one users should reach for first.\n\n### Python-first (library API is primary)\n\n| Package | Module | Interfaces | Description |\n|---------|--------|-----------|-------------|\n| [crossref-local](https://github.com/ywatanabe1989/crossref-local) | `stx.scholar` | Py ⭐⭐⭐ · CLI ⭐⭐ · MCP ⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | Offline, zero-API-key DOI lookup + full-text search over the CrossRef corpus |\n| [openalex-local](https://github.com/ywatanabe1989/openalex-local) | `stx.scholar` | Py ⭐⭐⭐ · CLI ⭐⭐ · MCP ⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | Offline, zero-API-key search over the full OpenAlex academic corpus |\n| [scitex-browser](https://github.com/ywatanabe1989/scitex-browser) | `stx.browser` | Py ⭐⭐⭐ · CLI — · MCP — · Skills ⭐⭐ · Hook — · HTTP — | Playwright wrappers for scientific web scraping + AI-agent browsing |\n| [scitex-compat](https://github.com/ywatanabe1989/scitex-compat) | `stx.compat` | Py ⭐⭐⭐ · CLI — · MCP — · Skills ⭐ · Hook — · HTTP — | Backward-compatibility shims for deprecated SciTeX APIs |\n| [scitex-core](https://github.com/ywatanabe1989/scitex-core) | `stx.core` | Py ⭐⭐⭐ · CLI — · MCP — · Skills ⭐⭐ · Hook — · HTTP — | Foundation layer for the SciTeX ecosystem |\n| [scitex-dataset](https://github.com/ywatanabe1989/scitex-dataset) | `stx.dataset` | Py ⭐⭐⭐ · CLI ⭐ · MCP ⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | Unified dataset-discovery API across 7 scientific repositories |\n| [scitex-db](https://github.com/ywatanabe1989/scitex-db) | `stx.db` | Py ⭐⭐⭐ · CLI ⭐ · MCP — · Skills ⭐⭐ · Hook — · HTTP — | Relational-DB wrapper for scientific Python |\n| [scitex-dict](https://github.com/ywatanabe1989/scitex-dict) | `stx.dict` | Py ⭐⭐⭐ · CLI — · MCP — · Skills ⭐ · Hook — · HTTP — | Dictionary utilities for scientific Python |\n| [scitex-etc](https://github.com/ywatanabe1989/scitex-etc) | `stx.etc` | Py ⭐⭐⭐ · CLI — · MCP — · Skills ⭐ · Hook — · HTTP — | Miscellaneous SciTeX utilities |\n| [scitex-gists](https://github.com/ywatanabe1989/scitex-gists) | `stx.gists` | Py ⭐⭐⭐ · CLI — · MCP — · Skills ⭐ · Hook — · HTTP — | SigmaPlot v12 macro snippets as printable Python functions |\n| [scitex-logging](https://github.com/ywatanabe1989/scitex-logging) | `stx.logging` | Py ⭐⭐⭐ · CLI — · MCP — · Skills ⭐⭐ · Hook — · HTTP — | Enhanced Python logging + warnings + exceptions for SciTeX |\n| [scitex-parallel](https://github.com/ywatanabe1989/scitex-parallel) | `stx.parallel` | Py ⭐⭐⭐ · CLI — · MCP — · Skills ⭐ · Hook — · HTTP — | Minimal thread-pool parallel execution for scientific Python |\n| [scitex-path](https://github.com/ywatanabe1989/scitex-path) | `stx.path` | Py ⭐⭐⭐ · CLI — · MCP — · Skills ⭐⭐ · Hook — · HTTP — | Project-aware path utilities for scientific Python |\n| [scitex-plt](https://github.com/ywatanabe1989/scitex-plt) | `stx.plt` | Py ⭐⭐⭐ · CLI — · MCP ⭐⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | Publication-ready plotting (thin wrapper around figrecipe) |\n| [scitex-repro](https://github.com/ywatanabe1989/scitex-repro) | `stx.repro` | Py ⭐⭐⭐ · CLI — · MCP — · Skills ⭐⭐ · Hook — · HTTP — | Reproducibility helpers for scientific Python experiments |\n| [scitex-stats](https://github.com/ywatanabe1989/scitex-stats) | `stx.stats` | Py ⭐⭐⭐ · CLI ⭐ · MCP ⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | Publication-ready statistical testing for 23 tests |\n| [scitex-str](https://github.com/ywatanabe1989/scitex-str) | `stx.str` | Py ⭐⭐⭐ · CLI — · MCP — · Skills ⭐⭐ · Hook — · HTTP — | Text-processing utilities for scientific Python |\n| [scitex-types](https://github.com/ywatanabe1989/scitex-types) | `stx.types` | Py ⭐⭐⭐ · CLI — · MCP — · Skills ⭐ · Hook — · HTTP — | Type aliases and runtime type guards for scientific Python |\n\n### CLI-first\n\n| Package | Module | Interfaces | Description |\n|---------|--------|-----------|-------------|\n| [scitex-agent-container](https://github.com/ywatanabe1989/scitex-agent-container) | `stx.agent_container` | Py ⭐⭐ · CLI ⭐⭐⭐ · MCP — · Skills ⭐⭐ · Hook — · HTTP — | Declarative YAML-based AI agent lifecycle management (tmux/screen/SSH) |\n| [scitex-app](https://github.com/ywatanabe1989/scitex-app) | `stx.app` | Py ⭐⭐ · CLI ⭐⭐⭐ · MCP ⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | App-developer SDK for SciTeX workspace apps |\n| [scitex-audit](https://github.com/ywatanabe1989/scitex-audit) | `stx.audit` | Py ⭐ · CLI ⭐⭐⭐ · MCP ⭐ · Skills ⭐ · Hook — · HTTP — | Unified repo security scanner for scientific Python projects |\n| [scitex-clew](https://github.com/ywatanabe1989/scitex-clew) | `stx.clew` | Py ⭐⭐ · CLI ⭐⭐⭐ · MCP ⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | Hash-based reproducibility verification for scientific pipelines |\n| [scitex-container](https://github.com/ywatanabe1989/scitex-container) | `stx.container` | Py ⭐⭐ · CLI ⭐⭐⭐ · MCP ⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | Unified container management for Apptainer/Singularity + Docker |\n| [scitex-dev](https://github.com/ywatanabe1989/scitex-dev) | `stx.dev` | Py ⭐⭐ · CLI ⭐⭐⭐ · MCP ⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | Developer utilities for maintaining the whole SciTeX ecosystem |\n| [scitex-notebook](https://github.com/ywatanabe1989/scitex-notebook) | `stx.notebook` | Py ⭐⭐ · CLI ⭐⭐⭐ · MCP ⭐ · Skills ⭐⭐ · Hook — · HTTP — | Jupyter notebook reproducibility — verify, compile to DAG, convert to script |\n| [scitex-ssh](https://github.com/ywatanabe1989/scitex-ssh) | `stx.tunnel` | Py ⭐ · CLI ⭐⭐⭐ · MCP ⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | SSH primitives (exec/copy/attach) plus gated, auto-reconnecting reverse tunnels for NAT traversal |\n\n### MCP-first\n\n| Package | Module | Interfaces | Description |\n|---------|--------|-----------|-------------|\n| [scitex-audio](https://github.com/ywatanabe1989/scitex-audio) | `stx.audio` | Py ⭐⭐ · CLI ⭐ · MCP ⭐⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | Unified text-to-speech with automatic backend fallback |\n| [socialia](https://github.com/ywatanabe1989/socialia) | `stx.social` | Py ⭐ · CLI ⭐ · MCP ⭐⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | Unified posting + analytics client for 6 social platforms |\n\n### Hook-first\n\n| Package | Module | Interfaces | Description |\n|---------|--------|-----------|-------------|\n| [scitex-linter](https://github.com/ywatanabe1989/scitex-linter) | `stx.linter` | Py ⭐ · CLI ⭐⭐ · MCP ⭐ · Skills ⭐⭐ · Hook ⭐⭐⭐ · HTTP — | AST-based linter for reproducible-research Python (pre-commit hook) |\n\n### Mixed (multiple equally-primary interfaces)\n\n| Package | Module | Interfaces | Description |\n|---------|--------|-----------|-------------|\n| [figrecipe](https://github.com/ywatanabe1989/figrecipe) | `stx.plt` | Py ⭐⭐⭐ · CLI ⭐ · MCP ⭐⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | Publication-ready matplotlib figures with mm-precision layouts |\n| [scitex-cloud](https://github.com/ywatanabe1989/scitex-cloud) | `stx.cloud` | Py ⭐ · CLI ⭐⭐⭐ · MCP ⭐⭐⭐ · Skills ⭐⭐ · Hook — · HTTP ⭐⭐ | SciTeX Cloud operational surface (55 MCP tools) |\n| [scitex-io](https://github.com/ywatanabe1989/scitex-io) | `stx.io` | Py ⭐⭐⭐ · CLI ⭐ · MCP ⭐⭐ · Skills ⭐⭐⭐ · Hook — · HTTP — | Universal one-call file I/O for 30+ scientific formats |\n| [scitex-notification](https://github.com/ywatanabe1989/scitex-notification) | `stx.notification` | Py ⭐⭐ · CLI ⭐ · MCP ⭐⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | One-call alerting across 9 backends (audio/desktop/email/Telegram/...) |\n| [scitex-orochi](https://github.com/ywatanabe1989/scitex-orochi) | `stx.orochi` | Py ⭐⭐ · CLI ⭐⭐ · MCP ⭐⭐ · Skills ⭐⭐ · Hook — · HTTP ⭐⭐ | Agent Communication Hub — real-time WebSocket messaging between agents |\n| [scitex-scholar](https://github.com/ywatanabe1989/scitex-scholar) | `stx.scholar` | Py ⭐⭐⭐ · CLI ⭐⭐⭐ · MCP ⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | End-to-end scientific-literature toolkit |\n| [scitex-ui](https://github.com/ywatanabe1989/scitex-ui) | `stx.ui` | Py ⭐⭐ · CLI ⭐ · MCP ⭐⭐ · Skills ⭐⭐ · Hook — · HTTP ⭐⭐ | Shared frontend framework for SciTeX web apps |\n| [scitex-writer](https://github.com/ywatanabe1989/scitex-writer) | `stx.writer` | Py ⭐ · CLI ⭐⭐⭐ · MCP ⭐⭐⭐ · Skills ⭐⭐ · Hook — · HTTP — | End-to-end LaTeX manuscript toolchain (45 MCP tools) |\n\u003c/details\u003e\n\n\u003eFour Freedoms for Research\n\u003e\n\u003e0. The freedom to **run** your research anywhere -- your machine, your terms.\n\u003e1. The freedom to **study** how every step works -- from raw data to final manuscript.\n\u003e2. The freedom to **redistribute** your workflows, not just your papers.\n\u003e3. The freedom to **modify** any module and share improvements with the community.\n\u003e\n\u003eAGPL-3.0 -- because research infrastructure deserves the same freedoms as the software it runs on.\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://star-history.com/#ywatanabe1989/scitex-python\u0026Date\"\u003e\n    \u003cimg alt=\"Star History\" src=\"https://api.star-history.com/svg?repos=ywatanabe1989/scitex-python\u0026type=Date\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://scitex.ai\"\u003e\u003cimg src=\"docs/assets/images/scitex-icon-navy-inverted.png\" alt=\"SciTeX\" width=\"40\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003c!-- EOF --\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fywatanabe1989%2Fscitex-python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fywatanabe1989%2Fscitex-python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fywatanabe1989%2Fscitex-python/lists"}