scientific-computing-system 2.2.0__tar.gz → 2.2.1__tar.gz
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.
- scientific_computing_system-2.2.1/.github/workflows/npm-publish.yml +403 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/CHANGELOG.md +271 -0
- scientific_computing_system-2.2.1/CITATION.cff +54 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/CONTRIBUTING.md +1 -1
- scientific_computing_system-2.2.1/PKG-INFO +306 -0
- scientific_computing_system-2.2.1/README.md +210 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/SECURITY.md +32 -6
- scientific_computing_system-2.2.1/codemeta.json +28 -0
- scientific_computing_system-2.2.1/docs/ARCHITECTURE.md +375 -0
- scientific_computing_system-2.2.1/docs/api.md +350 -0
- scientific_computing_system-2.2.1/docs/benchmarks.md +177 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/cookbook.md +18 -3
- scientific_computing_system-2.2.1/docs/getting-started.md +260 -0
- scientific_computing_system-2.2.1/docs/index.md +153 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/ml_reference.md +30 -11
- scientific_computing_system-2.2.1/docs/related.md +22 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/research-workflows.md +41 -9
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/core_demo.md +6 -2
- scientific_computing_system-2.2.1/docs/tutorials/data_analysis_demo.md +85 -0
- scientific_computing_system-2.2.1/docs/tutorials/diffeq_demo.md +66 -0
- scientific_computing_system-2.2.1/docs/tutorials/graph_demo.md +61 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/math_utils_demo.md +7 -3
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/ml_advanced_demo.md +3 -1
- scientific_computing_system-2.2.1/docs/tutorials/montecarlo_demo.md +64 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/nlp_attention_demo.md +48 -14
- scientific_computing_system-2.2.1/docs/why-pure-python.md +67 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/mkdocs.yml +1 -0
- scientific_computing_system-2.2.1/npm.test.js +984 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/package.json +2 -3
- scientific_computing_system-2.2.1/paper.bib +20 -0
- scientific_computing_system-2.2.1/paper.md +55 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/pyproject.toml +8 -1
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/scripts/check_version_lockstep.py +26 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/_version.py +1 -1
- scientific_computing_system-2.2.1/tests/test_codemeta_version_lockstep.py +239 -0
- scientific_computing_system-2.2.1/tests/test_readme_surface.py +142 -0
- scientific_computing_system-2.2.0/.github/workflows/npm-publish.yml +0 -27
- scientific_computing_system-2.2.0/CITATION.cff +0 -29
- scientific_computing_system-2.2.0/PKG-INFO +0 -175
- scientific_computing_system-2.2.0/README.md +0 -79
- scientific_computing_system-2.2.0/docs/ARCHITECTURE.md +0 -252
- scientific_computing_system-2.2.0/docs/api.md +0 -133
- scientific_computing_system-2.2.0/docs/benchmarks.md +0 -62
- scientific_computing_system-2.2.0/docs/getting-started.md +0 -185
- scientific_computing_system-2.2.0/docs/index.md +0 -119
- scientific_computing_system-2.2.0/docs/related.md +0 -14
- scientific_computing_system-2.2.0/docs/tutorials/data_analysis_demo.md +0 -43
- scientific_computing_system-2.2.0/docs/tutorials/diffeq_demo.md +0 -48
- scientific_computing_system-2.2.0/docs/tutorials/graph_demo.md +0 -45
- scientific_computing_system-2.2.0/docs/tutorials/montecarlo_demo.md +0 -42
- scientific_computing_system-2.2.0/docs/why-pure-python.md +0 -19
- scientific_computing_system-2.2.0/npm.test.js +0 -169
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/.github/workflows/benchmarks.yml +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/.github/workflows/bot-reviewer.yml +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/.github/workflows/changelog.yml +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/.github/workflows/cli-package-smoke.yml +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/.github/workflows/codeql.yml +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/.github/workflows/pr-automation.yml +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/.github/workflows/pypi-registry-smoke.yml +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/.github/workflows/release.yml +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/.github/workflows/tests.yml +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/.gitignore +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/LICENSE +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/benchmarks/results.json +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/benchmarks/robust_runner.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/benchmarks/run_benchmarks.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/bin/scs.js +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/dashboard/app.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/CASE_STUDY_HUBBLE.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/CASE_STUDY_QUANTUM_ML.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/assets/icon.svg +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/assets/logo.svg +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/maintenance.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/stylesheets/extra.css +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tour_of_numerical_methods.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/fft2_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/hypothesis_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/hypothesis_tests_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/hypothesis_with_stats_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/knowledge_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/linalg_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/ml_and_viz_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/ml_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/modeling_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/nlp_bpe_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/nlp_mini_gpt_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/nlp_viz.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/numerical_integration_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/optimization_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/pandas_io_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/pca_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/probability_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/quantum_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/quick_start.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/scientific_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/signals_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/stats_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/stiff_ode_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/docs/tutorials/time_series_demo.md +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/core_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/data_analysis_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/diffeq_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/discovery_pipeline_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/ensemble_showcase.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/fft2_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/graph_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/hypothesis_custom_generator.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/hypothesis_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/hypothesis_tests_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/hypothesis_with_stats_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/interpolate_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/knowledge_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/linalg_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/math_utils_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/ml_and_viz_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/modeling_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/montecarlo_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/nlp_attention_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/nlp_bpe_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/nlp_mini_gpt_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/nlp_viz_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/numerical_integration_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/optimization_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/pca_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/pde_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/plot_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/plotting_notebook.ipynb +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/probability_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/quantum_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/scientific_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/signals_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/stats_demo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/examples/tour_of_numerical_methods.ipynb +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/index.js +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/requirements-build.lock +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/requirements-dev.lock +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/requirements.lock +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/scripts/check_version_discipline.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/scripts/publish.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/scripts/verify_cli_install.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/scripts/verify_cookbook.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/scripts/verify_ml_reference.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/scripts/verify_pypi_release.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/scripts/verify_release_integrity.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/__main__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/_paths.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/bayes/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/bayes/conjugate.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/causal.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/cli/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/cli/__main__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/cli/_handlers.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/cli/_parser.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/cli/_style.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/cli/_system_info.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/core/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/core/_numeric.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/core/models.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/data_analysis/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/data_analysis/dataset.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/data_analysis/loader.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/data_analysis/pandas_io.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/data_analysis/transform.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/data_analysis/viz.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/data_io/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/data_io/scientific.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/data_io/streaming.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/diffeq/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/diffeq/_implicit.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/diffeq/solvers.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/diffeq/symplectic.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/fractals/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/fractals/sets.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/genetics/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/genetics/sequence.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/graph/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/graph/algorithms.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/hypothesis/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/hypothesis/evaluator.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/hypothesis/generator.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/hypothesis/mining.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/infotheory/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/infotheory/measures.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/interpolate/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/knowledge/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/knowledge/graph.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/knowledge/notes.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/knowledge/retrieval.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/math_utils/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/math_utils/calculus.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/math_utils/linalg.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/math_utils/special.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/math_utils/svd.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/ml/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/ml/boosting.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/ml/clustering.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/ml/decomposition.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/ml/ensemble.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/ml/linear_models.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/ml/metrics.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/ml/model_selection.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/ml/naive_bayes.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/ml/neighbors.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/ml/neural.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/ml/preprocessing.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/ml/tree.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/ml/voting.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/modeling/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/modeling/_base.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/modeling/_nodes.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/modeling/expression.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/modeling/fitting.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/modeling/model.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/modeling/solver.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/montecarlo/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/montecarlo/markov.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/montecarlo/methods.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/nlp/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/nlp/attention.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/nlp/autograd/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/nlp/autograd/_grad.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/nlp/autograd/ops.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/nlp/autograd/tensor.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/nlp/bpe.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/nlp/data.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/nlp/embed.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/nlp/layers.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/nlp/model.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/nlp/optim.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/nlp/training.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/nlp/viz.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/numerical_integration/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/numerical_integration/quadrature.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/optimization/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/optimization/_metaheuristics.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/optimization/constrained.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/optimization/minimize.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/pde/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/plot/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/plot/_backend.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/plot/charts.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/probability/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/probability/_advanced.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/probability/distributions.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/probability/extra_distributions.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/provenance/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/provenance/manifest.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/py.typed +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/quantum/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/quantum/circuit.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/quantum/multi_qubit.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/quantum/simulator.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/scientific/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/scientific/constants.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/scientific/formulas.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/sensitivity.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/signals/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/signals/filters.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/signals/processing.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/signals/stft.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/signals/wavelet.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/stats/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/stats/_distributions.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/stats/bootstrap.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/stats/descriptive.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/stats/hypothesis_tests.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/stats/multiple_testing.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/stats/nonparametric.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/stats/power.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/stats/regression.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/stats/time_series.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/tools/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/tools/adapters.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/tools/registry.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/uncertainty/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/uncertainty/propagation.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/units/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/units/core.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/validation/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/validation/adequacy.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/validation/checks.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/validation/drift.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/validation/report.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/wavelets/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/wavelets/haar.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/workflow/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/workflow/engine.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/workflow/gates.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/workflow/orchestrator.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/workflow/selection.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/workflow/tooling.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/src/cds/workflow/types.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/__init__.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/conftest.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_advanced_fitting.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_audit_completion_coverage.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_audit_guard_coverage.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_audit_hardening.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_audit_hardening_coverage.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_bayes_v2.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_benchmarks.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_bootstrap.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_causal.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_cli.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_cli_color.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_cli_extended.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_cli_system_info.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_constrained_opt.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_core.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_data_analysis.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_data_analysis_lazy_bridge.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_data_analysis_pandas_io.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_data_io.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_data_io_optional_backends.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_data_io_scientific.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_dataset.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_dev_numpy_pin_contract.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_diffeq.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_diffeq_implicit.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_domain_validation.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_edge_misc_numerical.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_edge_ml_quantum_linalg.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_edge_nlp.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_edge_quantum_evaluator_cli.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_edge_stats_optimization_signals.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_extra_distributions.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_fft2.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_fitting_bootstrap.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_fractals.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_genetics.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_graph.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_hardening_privacy_provenance.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_hypothesis.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_hypothesis_engine.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_hypothesis_mining.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_hypothesis_tests.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_infotheory.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_interpolate.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_knowledge.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_layering.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_linalg_extended.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_linalg_qr_cholesky.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_markov.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_math_utils.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_ml_boosting.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_ml_clustering.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_ml_ensemble.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_ml_knn.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_ml_linreg.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_ml_logreg.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_ml_metrics.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_ml_model_selection.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_ml_naive_bayes.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_ml_pca.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_ml_preprocessing.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_ml_tree.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_ml_viz.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_ml_voting.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_modeling.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_modeling_fit_validation.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_montecarlo.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_multi_qubit.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_nlp_attention.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_nlp_autograd.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_nlp_bpe.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_nlp_embed.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_nlp_layers.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_nlp_model.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_nlp_training.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_nlp_viz.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_numerical_integration.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_numerical_invariants.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_numerical_oracles.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_optimization.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_optimization_metaheuristics.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_path_confinement.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_pde.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_plot_charts.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_plot_lazy.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_power.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_probability.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_probability_advanced.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_property_invariants.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_provenance.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_provenance_audit_hardening.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_public_api.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_quantum.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_readme_badges.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_release_contract.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_retrieval.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_runtime_dependency_graph.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_scientific.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_selection_audit_hardening.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_sensitivity.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_sensitivity_global.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_signals.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_signals_filters.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_special_invariants.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_special_numerics.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_statistical_audit.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_stats.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_stats_audit_coverage.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_stats_multiple_testing.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_stats_nonparametric.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_stats_time_series.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_stft.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_streaming_analytics.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_svd.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_symplectic.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_tool_adapters.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_tools_registry.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_uncertainty.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_units.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_validation.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_validation_adequacy.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_validation_advanced.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_validation_drift.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_wavelet.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_wavelets_v2.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_workflow.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_workflow_gates.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_workflow_orchestrator.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_workflow_orchestrator_blocked_review.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_workflow_selection.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_workflow_selection_coverage.py +0 -0
- {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.1}/tests/test_workflow_tooling.py +0 -0
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
name: npm Publish
|
|
2
|
+
|
|
3
|
+
# Sole npm publish authority for this repository.
|
|
4
|
+
#
|
|
5
|
+
# ## What this package is
|
|
6
|
+
#
|
|
7
|
+
# `scientific-computing-system` on npm is a *launcher shim*: it ships
|
|
8
|
+
# `index.js` and `bin/scs.js` (plus README/CHANGELOG/LICENSE/SECURITY) and
|
|
9
|
+
# nothing else. It contains no Python. `scs` locates a Python interpreter and
|
|
10
|
+
# execs `python -m cds`, which comes from the PyPI distribution. The npm package
|
|
11
|
+
# is therefore only useful alongside `pip install scientific-computing-system`;
|
|
12
|
+
# the launcher exits non-zero with an actionable message when no interpreter or
|
|
13
|
+
# no `cds` package is present. This is stated in package.json's description and
|
|
14
|
+
# asserted by npm.test.js.
|
|
15
|
+
#
|
|
16
|
+
# ## Authentication: two supported modes
|
|
17
|
+
#
|
|
18
|
+
# OIDC trusted publishing (preferred, the default). npm receives this job's
|
|
19
|
+
# OIDC identity token (audience `npm:registry.npmjs.org`) and exchanges it for a
|
|
20
|
+
# short-lived, single-use publish credential scoped to this repository, this
|
|
21
|
+
# workflow file and this environment. No long-lived registry secret is involved,
|
|
22
|
+
# and no `NODE_AUTH_TOKEN` is set on that path: the npm CLI detects the OIDC
|
|
23
|
+
# environment before it ever looks for a token. `--provenance` attaches a
|
|
24
|
+
# Sigstore-signed attestation binding the tarball to this commit. One-time
|
|
25
|
+
# npmjs.com setup: package `scientific-computing-system` -> Settings -> Trusted
|
|
26
|
+
# Publisher -> GitHub Actions -> owner `Furox-Art`, repository
|
|
27
|
+
# `scientific-computing-system`, workflow `npm-publish.yml`, environment `npm`.
|
|
28
|
+
#
|
|
29
|
+
# Token mode (explicit opt-in, `use_token_fallback=true`). Uses the repository's
|
|
30
|
+
# NPM_TOKEN secret through NODE_AUTH_TOKEN. This is the mode in use while the
|
|
31
|
+
# npmjs.com trusted-publisher registration is pending.
|
|
32
|
+
#
|
|
33
|
+
# The token mode deliberately omits `--provenance`. Provenance is an OIDC-only
|
|
34
|
+
# attestation: with a token there is no OIDC identity to attest to, so npm
|
|
35
|
+
# rejects the combination outright. The token mode therefore publishes without
|
|
36
|
+
# provenance and prints a NOTICE saying so, rather than passing a flag that
|
|
37
|
+
# cannot work or pretending an attestation was produced.
|
|
38
|
+
#
|
|
39
|
+
# Both modes are fail-closed. A requested mode with no usable credential exits 1
|
|
40
|
+
# with an actionable message. Token mode never runs automatically, so a broken
|
|
41
|
+
# OIDC configuration cannot silently downgrade to the long-lived credential.
|
|
42
|
+
|
|
43
|
+
on:
|
|
44
|
+
workflow_dispatch:
|
|
45
|
+
inputs:
|
|
46
|
+
use_token_fallback:
|
|
47
|
+
description: >-
|
|
48
|
+
Publish mode. false (default) = OIDC trusted publishing, which mints a
|
|
49
|
+
Sigstore provenance attestation. true = token mode, using the
|
|
50
|
+
repository NPM_TOKEN secret; that mode publishes WITHOUT provenance,
|
|
51
|
+
because a token cannot mint an attestation. Use true while the
|
|
52
|
+
npmjs.com trusted publisher is not yet registered.
|
|
53
|
+
type: boolean
|
|
54
|
+
default: false
|
|
55
|
+
push:
|
|
56
|
+
# `branches` and `tags` in one `push` mapping are OR'd by GitHub.
|
|
57
|
+
#
|
|
58
|
+
# The `v*` tag is the release path: release.yml creates the tag only after
|
|
59
|
+
# the PyPI publish has succeeded, so a single version bump reaches PyPI
|
|
60
|
+
# first and npm second. `paths` narrows *branch* pushes so unrelated merges
|
|
61
|
+
# do not run this job; GitHub does not evaluate `paths` against tag pushes.
|
|
62
|
+
branches: [main]
|
|
63
|
+
tags:
|
|
64
|
+
- "v*"
|
|
65
|
+
paths:
|
|
66
|
+
- "package.json"
|
|
67
|
+
- "index.js"
|
|
68
|
+
- "bin/**"
|
|
69
|
+
- "npm.test.js"
|
|
70
|
+
- ".github/workflows/npm-publish.yml"
|
|
71
|
+
|
|
72
|
+
concurrency:
|
|
73
|
+
group: npm-publish
|
|
74
|
+
cancel-in-progress: false
|
|
75
|
+
|
|
76
|
+
# Default-deny; the publish job below declares exactly what it needs.
|
|
77
|
+
permissions:
|
|
78
|
+
contents: read
|
|
79
|
+
|
|
80
|
+
jobs:
|
|
81
|
+
publish:
|
|
82
|
+
name: Verify and publish to npm with OIDC trusted publishing
|
|
83
|
+
runs-on: ubuntu-latest
|
|
84
|
+
timeout-minutes: 20
|
|
85
|
+
# The `npm` environment is referenced by the trusted-publisher configuration
|
|
86
|
+
# on npmjs.com. Adding a required reviewer here is the other half of that
|
|
87
|
+
# control; it is intentionally left to the maintainer because a required
|
|
88
|
+
# reviewer on a single-maintainer repository would deadlock releases.
|
|
89
|
+
environment: npm
|
|
90
|
+
permissions:
|
|
91
|
+
contents: read
|
|
92
|
+
# Required to mint the OIDC token npm exchanges for a publish credential.
|
|
93
|
+
# This is the entire point of the OIDC path: no long-lived secret.
|
|
94
|
+
id-token: write
|
|
95
|
+
steps:
|
|
96
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
97
|
+
with:
|
|
98
|
+
persist-credentials: false
|
|
99
|
+
|
|
100
|
+
# Node 24 ships npm 11.5.1+, the floor for trusted publishing.
|
|
101
|
+
#
|
|
102
|
+
# `registry-url` is REQUIRED for the token mode and was its missing half.
|
|
103
|
+
# Without it setup-node writes no .npmrc at all, so npm never learns that
|
|
104
|
+
# registry.npmjs.org accepts a token, and NODE_AUTH_TOKEN is exported into
|
|
105
|
+
# the environment but read by nobody. The publish then fails with:
|
|
106
|
+
#
|
|
107
|
+
# npm error code ENEEDAUTH
|
|
108
|
+
# npm error need auth This command requires you to be logged in to
|
|
109
|
+
# https://registry.npmjs.org/
|
|
110
|
+
#
|
|
111
|
+
# ENEEDAUTH means npm did not attempt authentication at all -- as opposed to
|
|
112
|
+
# E401, which means it did and the credential was rejected. Seeing ENEEDAUTH
|
|
113
|
+
# with a populated secret is the signature of "no registry auth entry
|
|
114
|
+
# configured", not "bad token".
|
|
115
|
+
#
|
|
116
|
+
# With registry-url set, setup-node writes a userconfig containing
|
|
117
|
+
# //registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}
|
|
118
|
+
# which is what makes the env var meaningful. Verified locally: with only
|
|
119
|
+
# NODE_AUTH_TOKEN exported and no such entry, npm goes straight to
|
|
120
|
+
# ENEEDAUTH; with the entry present it reaches the registry and fails
|
|
121
|
+
# E401 on a deliberately fake token instead.
|
|
122
|
+
- name: Set up Node
|
|
123
|
+
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
|
|
124
|
+
with:
|
|
125
|
+
node-version: "24"
|
|
126
|
+
registry-url: "https://registry.npmjs.org"
|
|
127
|
+
# Never cache in a publish job: a warm cache is a way to publish bytes
|
|
128
|
+
# this checkout did not produce.
|
|
129
|
+
package-manager-cache: false
|
|
130
|
+
|
|
131
|
+
# Toolchain floor for trusted publishing: npm 11.5.1 and Node 22.14.0.
|
|
132
|
+
#
|
|
133
|
+
# The comparison is an integer semver compare, not a regex. The previous
|
|
134
|
+
# regex here was wrong and rejected the npm that setup-node actually
|
|
135
|
+
# installs:
|
|
136
|
+
#
|
|
137
|
+
# npm --version | grep -Eq '^11\.(5[1-9]|[6-9][0-9])\.|^1[2-9]\.'
|
|
138
|
+
#
|
|
139
|
+
# `[6-9][0-9]` covers 60-99, so `11.19.0` (what Node 24 ships) never
|
|
140
|
+
# matched and the gate failed on a compliant toolchain. Regex cannot
|
|
141
|
+
# express "greater than or equal to" for a dotted version without
|
|
142
|
+
# enumerating every minor, which is exactly the class of bug that shipped
|
|
143
|
+
# here. Numeric major/minor/patch comparison is total and obvious.
|
|
144
|
+
#
|
|
145
|
+
# The Node check that preceded it had the matching defect: it compared
|
|
146
|
+
# only major and minor, so `22.14.0` and `22.9.0` were both accepted even
|
|
147
|
+
# though only the former meets the documented floor.
|
|
148
|
+
- name: Assert the toolchain supports OIDC trusted publishing
|
|
149
|
+
shell: bash
|
|
150
|
+
run: |
|
|
151
|
+
set -euo pipefail
|
|
152
|
+
npm_version="$(npm --version)"
|
|
153
|
+
node_version="$(node --version)"
|
|
154
|
+
echo "npm=$npm_version node=$node_version"
|
|
155
|
+
|
|
156
|
+
# `$npm_version` and `$node_version` are positional arguments, never
|
|
157
|
+
# interpolated into the JS source, so a malformed or hostile value
|
|
158
|
+
# cannot break out into code.
|
|
159
|
+
node -e '
|
|
160
|
+
const REQUIRED_NPM = [11, 5, 1];
|
|
161
|
+
const REQUIRED_NODE = [22, 14, 0];
|
|
162
|
+
|
|
163
|
+
// Strip an optional leading "v" and any pre-release/build suffix,
|
|
164
|
+
// then take the numeric leading components.
|
|
165
|
+
function parse(raw, label) {
|
|
166
|
+
const match = /^[vV]?(\d+)(?:\.(\d+))?(?:\.(\d+))?/.exec(String(raw).trim());
|
|
167
|
+
if (!match) {
|
|
168
|
+
console.error(`::error::could not parse the ${label} version: ${JSON.stringify(raw)}`);
|
|
169
|
+
process.exit(1);
|
|
170
|
+
}
|
|
171
|
+
return [Number(match[1]), Number(match[2] || 0), Number(match[3] || 0)];
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Returns negative if a < b, 0 if equal, positive if a > b.
|
|
175
|
+
function compare(a, b) {
|
|
176
|
+
for (let i = 0; i < 3; i += 1) {
|
|
177
|
+
if (a[i] !== b[i]) return a[i] - b[i];
|
|
178
|
+
}
|
|
179
|
+
return 0;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const npmVersion = parse(process.argv[1], "npm");
|
|
183
|
+
const nodeVersion = parse(process.argv[2], "node");
|
|
184
|
+
|
|
185
|
+
if (compare(npmVersion, REQUIRED_NPM) < 0) {
|
|
186
|
+
console.error(
|
|
187
|
+
`::error::npm ${REQUIRED_NPM.join(".")}+ is required for OIDC trusted publishing, got ${npmVersion.join(".")}`,
|
|
188
|
+
);
|
|
189
|
+
process.exit(1);
|
|
190
|
+
}
|
|
191
|
+
if (compare(nodeVersion, REQUIRED_NODE) < 0) {
|
|
192
|
+
console.error(
|
|
193
|
+
`::error::Node ${REQUIRED_NODE.join(".")}+ is required for trusted publishing, got ${nodeVersion.join(".")}`,
|
|
194
|
+
);
|
|
195
|
+
process.exit(1);
|
|
196
|
+
}
|
|
197
|
+
console.log(
|
|
198
|
+
`PASS: npm ${npmVersion.join(".")} >= ${REQUIRED_NPM.join(".")}, ` +
|
|
199
|
+
`node ${nodeVersion.join(".")} >= ${REQUIRED_NODE.join(".")}`,
|
|
200
|
+
);
|
|
201
|
+
' "$npm_version" "$node_version"
|
|
202
|
+
|
|
203
|
+
# The launcher previously shipped unparseable and pointing at a
|
|
204
|
+
# nonexistent module, and nothing in CI ever invoked Node.
|
|
205
|
+
- name: Syntax-check the launcher and the bin shim
|
|
206
|
+
run: |
|
|
207
|
+
node --check index.js
|
|
208
|
+
node --check bin/scs.js
|
|
209
|
+
|
|
210
|
+
- name: Run the npm entry-point contract suite
|
|
211
|
+
run: npm test
|
|
212
|
+
|
|
213
|
+
# GATE: the published tarball must contain the allowlist and nothing else.
|
|
214
|
+
# Without this, a future edit to package.json could ship the repository
|
|
215
|
+
# (tests, workflows, 10k+ statements of Python) to the public registry.
|
|
216
|
+
- name: Assert the publish tarball contains only the allowlist
|
|
217
|
+
shell: bash
|
|
218
|
+
run: |
|
|
219
|
+
set -euo pipefail
|
|
220
|
+
npm pack --dry-run 2>&1 | tee pack-dry-run.txt
|
|
221
|
+
for forbidden in "src/" "tests/" "docs/" ".github/" "benchmarks/" "assets/"; do
|
|
222
|
+
if grep -q "$forbidden" pack-dry-run.txt; then
|
|
223
|
+
echo "::error::npm tarball would publish $forbidden"
|
|
224
|
+
exit 1
|
|
225
|
+
fi
|
|
226
|
+
done
|
|
227
|
+
|
|
228
|
+
# GATE: package.json must not be private, or `npm publish` refuses to run.
|
|
229
|
+
- name: Assert package.json is publishable
|
|
230
|
+
run: |
|
|
231
|
+
set -euo pipefail
|
|
232
|
+
node -e '
|
|
233
|
+
const pkg = require("./package.json");
|
|
234
|
+
if (pkg.private === true) {
|
|
235
|
+
console.error("::error::package.json sets private:true; npm publish is blocked");
|
|
236
|
+
process.exit(1);
|
|
237
|
+
}
|
|
238
|
+
console.log(`PASS: ${pkg.name}@${pkg.version} is publishable`);
|
|
239
|
+
'
|
|
240
|
+
|
|
241
|
+
# GATE: the repo's own version-lockstep check, which covers package.json.
|
|
242
|
+
# Catches publishing a launcher whose version disagrees with the Python
|
|
243
|
+
# distribution it shells out to.
|
|
244
|
+
- name: Assert npm version tracks the Python distribution
|
|
245
|
+
run: |
|
|
246
|
+
set -euo pipefail
|
|
247
|
+
python3 -m pip install --upgrade pip
|
|
248
|
+
python3 -m pip install .
|
|
249
|
+
node -e '
|
|
250
|
+
const fs = require("node:fs");
|
|
251
|
+
const pkg = JSON.parse(fs.readFileSync("package.json", "utf8"));
|
|
252
|
+
const text = fs.readFileSync("pyproject.toml", "utf8");
|
|
253
|
+
const match = /^version\s*=\s*"([^"]+)"/m.exec(text);
|
|
254
|
+
if (!match) { console.error("::error::pyproject.toml has no static version"); process.exit(1); }
|
|
255
|
+
if (pkg.version !== match[1]) {
|
|
256
|
+
console.error(`::error::npm ${pkg.version} != Python ${match[1]}`);
|
|
257
|
+
process.exit(1);
|
|
258
|
+
}
|
|
259
|
+
console.log(`PASS: npm ${pkg.version} matches Python ${match[1]}`);
|
|
260
|
+
'
|
|
261
|
+
|
|
262
|
+
# GATE: refuse to republish. A version can only be published once, so an
|
|
263
|
+
# already-present version means either a duplicate trigger or a
|
|
264
|
+
# half-finished recovery. Both should stop here rather than fail confusingly
|
|
265
|
+
# inside `npm publish`.
|
|
266
|
+
- name: Assert the version is not already published
|
|
267
|
+
run: |
|
|
268
|
+
set -euo pipefail
|
|
269
|
+
version="$(node -p 'require("./package.json").version')"
|
|
270
|
+
if npm view "scientific-computing-system@${version}" version >/dev/null 2>&1; then
|
|
271
|
+
echo "::error::scientific-computing-system@${version} is already on npm"
|
|
272
|
+
echo "::error::nothing to do; bump package.json (and the locked version surfaces) to publish again"
|
|
273
|
+
exit 1
|
|
274
|
+
fi
|
|
275
|
+
echo "PASS: scientific-computing-system@${version} is unpublished"
|
|
276
|
+
|
|
277
|
+
# Two supported modes, selected by the `use_token_fallback` dispatch input.
|
|
278
|
+
#
|
|
279
|
+
# OIDC (preferred, default): no NODE_AUTH_TOKEN is set. The npm CLI
|
|
280
|
+
# detects the OIDC environment (id-token: write above) and exchanges the
|
|
281
|
+
# runner's identity token for a short-lived publish credential scoped to
|
|
282
|
+
# this repository, workflow and environment. `--provenance` attaches a
|
|
283
|
+
# Sigstore-signed attestation to the tarball binding it to this commit.
|
|
284
|
+
#
|
|
285
|
+
# Token (explicit opt-in): uses the repository's existing NPM_TOKEN secret
|
|
286
|
+
# via NODE_AUTH_TOKEN. This is the mode the maintainer selected while the
|
|
287
|
+
# npmjs.com trusted-publisher registration is still pending.
|
|
288
|
+
#
|
|
289
|
+
# The token mode does NOT pass --provenance, and must not. Provenance is an
|
|
290
|
+
# OIDC-only attestation: without a trusted-publisher configuration npm has
|
|
291
|
+
# no OIDC identity to attest to, so `--provenance` would fail the publish
|
|
292
|
+
# outright. Passing it and catching the error would be worse -- it would
|
|
293
|
+
# print a failure and then publish anyway. The token mode therefore
|
|
294
|
+
# publishes without provenance, and says so, rather than pretending an
|
|
295
|
+
# attestation exists.
|
|
296
|
+
#
|
|
297
|
+
# Both modes are fail-closed: a requested mode with no usable credential
|
|
298
|
+
# exits 1 with an actionable message instead of silently falling through.
|
|
299
|
+
# There is no `continue-on-error` and no `|| true` anywhere in this job.
|
|
300
|
+
#
|
|
301
|
+
# The credential preflight is a SEPARATE STEP, not an inline `if` inside
|
|
302
|
+
# the publish step. Inline, a credential check that prints an error but
|
|
303
|
+
# forgets to exit continues straight into `npm publish` -- which is
|
|
304
|
+
# precisely what the failed run did: the fail-closed branch's own source
|
|
305
|
+
# text appeared in the log and npm was invoked anyway. As its own step, a
|
|
306
|
+
# non-zero exit ends the job before any publish step can run.
|
|
307
|
+
- name: Assert the requested publish mode has a usable credential
|
|
308
|
+
env:
|
|
309
|
+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
310
|
+
run: |
|
|
311
|
+
set -euo pipefail
|
|
312
|
+
if [ "${{ inputs.use_token_fallback }}" = "true" ]; then
|
|
313
|
+
if [ -z "${NPM_TOKEN:-}" ]; then
|
|
314
|
+
echo "::error::token mode was requested (use_token_fallback=true) but the NPM_TOKEN secret is empty or unset"
|
|
315
|
+
echo "::error::add an npm automation token as the NPM_TOKEN secret, or re-run without use_token_fallback once the npmjs.com trusted publisher is registered"
|
|
316
|
+
exit 1
|
|
317
|
+
fi
|
|
318
|
+
echo "mode=token via NPM_TOKEN (no provenance: a long-lived token cannot mint a Sigstore attestation)"
|
|
319
|
+
echo "::warning::Publishing with NPM_TOKEN instead of OIDC. Register the npmjs.com trusted publisher and delete NPM_TOKEN once this release is out."
|
|
320
|
+
else
|
|
321
|
+
if [ -z "${ACTIONS_ID_TOKEN_REQUEST_URL:-}" ] || [ -z "${ACTIONS_ID_TOKEN_REQUEST_TOKEN:-}" ]; then
|
|
322
|
+
echo "::error::OIDC mode was requested but this job cannot mint an OIDC token"
|
|
323
|
+
echo "::error::ACTIONS_ID_TOKEN_REQUEST_URL is unset, so the runner did not grant id-token: write"
|
|
324
|
+
echo "::error::either fix the id-token: write permission, or re-run with use_token_fallback=true to publish with NPM_TOKEN instead"
|
|
325
|
+
exit 1
|
|
326
|
+
fi
|
|
327
|
+
echo "mode=oidc (provenance attestation enabled)"
|
|
328
|
+
fi
|
|
329
|
+
|
|
330
|
+
# GATE: the registry auth entry must actually exist. setup-node's
|
|
331
|
+
# `registry-url` is what writes it; this asserts the outcome rather than
|
|
332
|
+
# trusting the configuration, so a future edit that drops registry-url
|
|
333
|
+
# fails here with a clear cause instead of at `npm publish` with ENEEDAUTH.
|
|
334
|
+
- name: Assert the npm registry auth entry is configured
|
|
335
|
+
shell: bash
|
|
336
|
+
run: |
|
|
337
|
+
set -euo pipefail
|
|
338
|
+
userconfig="$(npm config get userconfig)"
|
|
339
|
+
echo "npm userconfig=$userconfig"
|
|
340
|
+
if [ ! -f "$userconfig" ]; then
|
|
341
|
+
echo "::error::no npm userconfig at $userconfig"
|
|
342
|
+
echo "::error::setup-node writes this file from its registry-url input; without it npm has no registry auth entry"
|
|
343
|
+
exit 1
|
|
344
|
+
fi
|
|
345
|
+
if ! grep -q '_authToken' "$userconfig"; then
|
|
346
|
+
echo "::error::$userconfig has no _authToken entry"
|
|
347
|
+
echo "::error::npm would fail with ENEEDAUTH: NODE_AUTH_TOKEN alone is inert without a registry auth entry"
|
|
348
|
+
exit 1
|
|
349
|
+
fi
|
|
350
|
+
if ! grep -q 'registry.npmjs.org' "$userconfig"; then
|
|
351
|
+
echo "::error::$userconfig does not reference registry.npmjs.org"
|
|
352
|
+
exit 1
|
|
353
|
+
fi
|
|
354
|
+
# The token value itself must never be echoed.
|
|
355
|
+
echo "PASS: npm registry auth entry present (value not shown)"
|
|
356
|
+
echo "PASS: the entry references NODE_AUTH_TOKEN by name, not a literal secret"
|
|
357
|
+
|
|
358
|
+
- name: Publish to npm (OIDC trusted publishing, with provenance)
|
|
359
|
+
if: ${{ !inputs.use_token_fallback }}
|
|
360
|
+
run: npm publish --provenance --access public
|
|
361
|
+
|
|
362
|
+
- name: Publish to npm (token mode, no provenance)
|
|
363
|
+
if: ${{ inputs.use_token_fallback }}
|
|
364
|
+
env:
|
|
365
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
366
|
+
run: |
|
|
367
|
+
set -euo pipefail
|
|
368
|
+
# Deliberately no --provenance: a token-authenticated publish cannot
|
|
369
|
+
# produce a Sigstore attestation. npm will reject the combination.
|
|
370
|
+
echo "NOTICE: publishing with NPM_TOKEN; this release carries no provenance attestation"
|
|
371
|
+
npm publish --access public
|
|
372
|
+
|
|
373
|
+
# Post-publish confirmation that the version is actually readable.
|
|
374
|
+
#
|
|
375
|
+
# This was a single immediate `npm view`, and it produced a false failure
|
|
376
|
+
# on run 37136131220: the upload succeeded and the registry recorded 2.2.0
|
|
377
|
+
# ninety seconds later, but the probe ran within a second of `npm publish`
|
|
378
|
+
# returning and got E404, turning a successful release into a red job.
|
|
379
|
+
# Three sibling repositories hit the same thing.
|
|
380
|
+
#
|
|
381
|
+
# The probe now polls the registry's JSON API with backoff, over a budget
|
|
382
|
+
# of several minutes -- deliberately generous, because npm's propagation
|
|
383
|
+
# gap is not bounded and shortening it to make a test fast would recreate
|
|
384
|
+
# the original false failure. It succeeds on the first match and fails
|
|
385
|
+
# closed if the version never appears, emitting a `::warning::` first so a
|
|
386
|
+
# slow-but-successful publish is never read as a hard failure.
|
|
387
|
+
#
|
|
388
|
+
# `npm view` was dropped as the probe: it reports "absent" and "denied"
|
|
389
|
+
# with the same E404, and it resolves against the userconfig this job
|
|
390
|
+
# created for writing, so a read-only confirmation had no reason to touch
|
|
391
|
+
# publish credentials at all.
|
|
392
|
+
- name: Verify the published version (polling for registry propagation)
|
|
393
|
+
run: |
|
|
394
|
+
set -euo pipefail
|
|
395
|
+
version="$(node -p 'require("./package.json").version')"
|
|
396
|
+
python3 scripts/verify_npm_publication.py \
|
|
397
|
+
--package scientific-computing-system \
|
|
398
|
+
--version "$version" \
|
|
399
|
+
--registry https://registry.npmjs.org \
|
|
400
|
+
--attempts 12 \
|
|
401
|
+
--initial-delay 5 \
|
|
402
|
+
--growth 1.5 \
|
|
403
|
+
--max-delay 30
|