runops 1.2.0__tar.gz → 2.0.0__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.
- runops-2.0.0/.agents/skills/check/SKILL.md +34 -0
- runops-2.0.0/.agents/skills/improve-harness/SKILL.md +34 -0
- {runops-1.2.0/.claude → runops-2.0.0/.agents}/skills/release/SKILL.md +8 -6
- runops-2.0.0/.agents/skills/simulator-adapter/SKILL.md +35 -0
- runops-2.0.0/.agents/skills/spec-reviewer/SKILL.md +29 -0
- runops-2.0.0/.agents/skills/sync-docs/SKILL.md +34 -0
- runops-2.0.0/.claude/agents/spec-reviewer.md +7 -0
- runops-2.0.0/.claude/rules/architecture.md +29 -0
- runops-2.0.0/.claude/rules/dev-workflow.md +32 -0
- runops-2.0.0/.claude/rules/gotchas.md +37 -0
- runops-2.0.0/.claude/skills/check/SKILL.md +6 -0
- runops-2.0.0/.claude/skills/improve-harness/SKILL.md +6 -0
- runops-2.0.0/.claude/skills/python-package-refactor/SKILL.md +6 -0
- runops-2.0.0/.claude/skills/release/SKILL.md +6 -0
- runops-2.0.0/.claude/skills/simulator-adapter/SKILL.md +6 -0
- runops-2.0.0/.claude/skills/spec-reviewer/SKILL.md +6 -0
- runops-2.0.0/.claude/skills/sync-docs/SKILL.md +6 -0
- runops-2.0.0/.codex/README.md +25 -0
- runops-2.0.0/.codex/agents/spec-reviewer.toml +6 -0
- runops-2.0.0/.codex/rules/runops.rules +67 -0
- runops-2.0.0/.github/assets/conversation-dark.svg +4584 -0
- runops-2.0.0/.github/assets/conversation-light.svg +4584 -0
- runops-2.0.0/.github/assets/hero-dark.svg +3060 -0
- runops-2.0.0/.github/assets/hero-light.svg +3060 -0
- runops-2.0.0/.github/assets/make_readme_art.py +171 -0
- {runops-1.2.0 → runops-2.0.0}/.github/workflows/ci.yml +1 -2
- {runops-1.2.0 → runops-2.0.0}/.github/workflows/publish.yml +1 -2
- {runops-1.2.0 → runops-2.0.0}/.harness/manifest.toml +4 -5
- runops-2.0.0/AGENTS.md +59 -0
- runops-2.0.0/CLAUDE.md +1 -0
- runops-2.0.0/PKG-INFO +121 -0
- runops-2.0.0/README.md +90 -0
- runops-2.0.0/SPEC.md +913 -0
- runops-2.0.0/docs/adapter.md +96 -0
- runops-2.0.0/docs/reference.md +171 -0
- runops-2.0.0/pyproject.toml +103 -0
- runops-2.0.0/src/runops/__init__.py +3 -0
- runops-2.0.0/src/runops/adapters/__init__.py +17 -0
- runops-2.0.0/src/runops/adapters/base.py +161 -0
- runops-2.0.0/src/runops/adapters/generic.py +72 -0
- runops-2.0.0/src/runops/adapters/registry.py +149 -0
- runops-2.0.0/src/runops/case.py +166 -0
- runops-2.0.0/src/runops/cli.py +870 -0
- runops-2.0.0/src/runops/config.py +290 -0
- runops-2.0.0/src/runops/errors.py +21 -0
- runops-2.0.0/src/runops/harness.py +106 -0
- runops-2.0.0/src/runops/jobgen.py +132 -0
- runops-2.0.0/src/runops/launchers.py +29 -0
- runops-2.0.0/src/runops/legacy_adapters/__init__.py +6 -0
- runops-2.0.0/src/runops/legacy_adapters/beach.py +145 -0
- runops-2.0.0/src/runops/legacy_adapters/emses.py +158 -0
- runops-2.0.0/src/runops/manifest.py +192 -0
- runops-2.0.0/src/runops/ops/__init__.py +1 -0
- runops-2.0.0/src/runops/ops/common.py +39 -0
- runops-2.0.0/src/runops/ops/create.py +495 -0
- runops-2.0.0/src/runops/ops/listing.py +76 -0
- runops-2.0.0/src/runops/ops/migrate.py +630 -0
- runops-2.0.0/src/runops/ops/notes.py +94 -0
- runops-2.0.0/src/runops/ops/setup.py +367 -0
- runops-2.0.0/src/runops/ops/skills.py +160 -0
- runops-2.0.0/src/runops/ops/submit.py +191 -0
- runops-2.0.0/src/runops/ops/sync.py +177 -0
- runops-2.0.0/src/runops/ops/tidy.py +259 -0
- runops-2.0.0/src/runops/project.py +172 -0
- runops-2.0.0/src/runops/runtime.py +197 -0
- runops-2.0.0/src/runops/skills/runops-check-status/SKILL.md +34 -0
- runops-2.0.0/src/runops/skills/runops-create-run/SKILL.md +26 -0
- runops-2.0.0/src/runops/skills/runops-maintain/SKILL.md +44 -0
- runops-2.0.0/src/runops/skills/runops-reference/SKILL.md +49 -0
- runops-2.0.0/src/runops/skills/runops-tidy/SKILL.md +25 -0
- runops-2.0.0/src/runops/slurm.py +138 -0
- runops-2.0.0/src/runops/util.py +180 -0
- runops-2.0.0/tests/conftest.py +127 -0
- runops-2.0.0/tests/fixtures/v1-project/.codex/rules/a.md +1 -0
- runops-2.0.0/tests/fixtures/v1-project/.runops/test-runs/T20260701-0001/receipt.toml +1 -0
- runops-2.0.0/tests/fixtures/v1-project/.runops/work/beach-x-abc/bin/beach +1 -0
- runops-2.0.0/tests/fixtures/v1-project/AGENTS.md +1 -0
- runops-2.0.0/tests/fixtures/v1-project/CLAUDE.md +1 -0
- runops-2.0.0/tests/fixtures/v1-project/cases/beach/plane/beach.toml +2 -0
- runops-2.0.0/tests/fixtures/v1-project/cases/beach/plane/case.toml +19 -0
- runops-2.0.0/tests/fixtures/v1-project/cases/old/beach.toml +1 -0
- runops-2.0.0/tests/fixtures/v1-project/cases/old/case.toml +6 -0
- runops-2.0.0/tests/fixtures/v1-project/launchers.toml +3 -0
- runops-2.0.0/tests/fixtures/v1-project/research/CURRENT.md +1 -0
- runops-2.0.0/tests/fixtures/v1-project/runops.toml +5 -0
- runops-2.0.0/tests/fixtures/v1-project/runs/AGENTS.md +1 -0
- runops-2.0.0/tests/fixtures/v1-project/runs/_archive/plane/R20260601-0001/manifest.toml +19 -0
- runops-2.0.0/tests/fixtures/v1-project/runs/plane/R20260701-0001--a/input/beach.toml +2 -0
- runops-2.0.0/tests/fixtures/v1-project/runs/plane/R20260701-0001--a/manifest.toml +59 -0
- runops-2.0.0/tests/fixtures/v1-project/runs/plane/R20260702-0001/manifest.toml +18 -0
- runops-2.0.0/tests/fixtures/v1-project/runs/scan/R20260701-0002/manifest.toml +24 -0
- runops-2.0.0/tests/fixtures/v1-project/runs/scan/survey.toml +3 -0
- runops-2.0.0/tests/fixtures/v1-project/simulators.toml +12 -0
- runops-2.0.0/tests/fixtures/v1-project/site.toml +12 -0
- runops-2.0.0/tests/golden/mpi_standard.sh +22 -0
- runops-2.0.0/tests/golden/openmp_rsc.sh +21 -0
- runops-2.0.0/tests/test_adapters.py +89 -0
- runops-2.0.0/tests/test_build.py +93 -0
- runops-2.0.0/tests/test_dev_harness.py +76 -0
- runops-2.0.0/tests/test_jobgen.py +87 -0
- runops-2.0.0/tests/test_legacy_adapters.py +98 -0
- runops-2.0.0/tests/test_lifecycle.py +206 -0
- runops-2.0.0/tests/test_manifest_config.py +114 -0
- runops-2.0.0/tests/test_migrate.py +169 -0
- runops-2.0.0/tests/test_scratch_tidy.py +142 -0
- runops-2.0.0/tests/test_setup_misc.py +83 -0
- runops-2.0.0/tests/test_skills.py +119 -0
- runops-2.0.0/tests/test_sweep.py +65 -0
- runops-2.0.0/tests/test_sync_evidence.py +139 -0
- runops-2.0.0/uv.lock +684 -0
- runops-1.2.0/.agents/skills/beach/SKILL.md +0 -54
- runops-1.2.0/.agents/skills/check/SKILL.md +0 -19
- runops-1.2.0/.agents/skills/emses/SKILL.md +0 -56
- runops-1.2.0/.agents/skills/implement-adapter/SKILL.md +0 -113
- runops-1.2.0/.agents/skills/implement-cli/SKILL.md +0 -33
- runops-1.2.0/.agents/skills/implement-core/SKILL.md +0 -45
- runops-1.2.0/.agents/skills/implement-launcher/SKILL.md +0 -130
- runops-1.2.0/.agents/skills/implement-slurm/SKILL.md +0 -104
- runops-1.2.0/.agents/skills/improve-harness/SKILL.md +0 -84
- runops-1.2.0/.agents/skills/release/SKILL.md +0 -175
- runops-1.2.0/.agents/skills/scaffold/SKILL.md +0 -104
- runops-1.2.0/.agents/skills/spec-reviewer/SKILL.md +0 -30
- runops-1.2.0/.agents/skills/test-module/SKILL.md +0 -20
- runops-1.2.0/.agents/skills/test-writer/SKILL.md +0 -31
- runops-1.2.0/.agents/skills/update-docs/SKILL.md +0 -76
- runops-1.2.0/.claude/agents/beach.md +0 -45
- runops-1.2.0/.claude/agents/emses.md +0 -46
- runops-1.2.0/.claude/agents/implement-adapter.md +0 -114
- runops-1.2.0/.claude/agents/implement-cli.md +0 -33
- runops-1.2.0/.claude/agents/implement-core.md +0 -44
- runops-1.2.0/.claude/agents/implement-launcher.md +0 -131
- runops-1.2.0/.claude/agents/implement-slurm.md +0 -105
- runops-1.2.0/.claude/agents/scaffold.md +0 -106
- runops-1.2.0/.claude/agents/spec-reviewer.md +0 -30
- runops-1.2.0/.claude/agents/test-writer.md +0 -31
- runops-1.2.0/.claude/rules/architecture.md +0 -73
- runops-1.2.0/.claude/rules/commands.md +0 -107
- runops-1.2.0/.claude/rules/dev-workflow.md +0 -60
- runops-1.2.0/.claude/rules/gotchas.md +0 -66
- runops-1.2.0/.claude/rules/knowledge-layer.md +0 -24
- runops-1.2.0/.claude/skills/check/SKILL.md +0 -19
- runops-1.2.0/.claude/skills/improve-harness/SKILL.md +0 -92
- runops-1.2.0/.claude/skills/python-package-refactor/SKILL.md +0 -128
- runops-1.2.0/.claude/skills/python-package-refactor/agents/openai.yaml +0 -3
- runops-1.2.0/.claude/skills/python-package-refactor/examples/refactor-request.md +0 -19
- runops-1.2.0/.claude/skills/python-package-refactor/references/anti-patterns.md +0 -14
- runops-1.2.0/.claude/skills/python-package-refactor/references/api-compatibility.md +0 -92
- runops-1.2.0/.claude/skills/python-package-refactor/references/packaging-modernization.md +0 -37
- runops-1.2.0/.claude/skills/python-package-refactor/references/refactor-playbook.md +0 -80
- runops-1.2.0/.claude/skills/python-package-refactor/references/verification.md +0 -65
- runops-1.2.0/.claude/skills/python-package-refactor/scripts/api_surface_snapshot.py +0 -506
- runops-1.2.0/.claude/skills/python-package-refactor/scripts/import_smoke.py +0 -179
- runops-1.2.0/.claude/skills/python-package-refactor/scripts/inspect_python_package.py +0 -681
- runops-1.2.0/.claude/skills/python-package-refactor/scripts/refactor_quality_gate.py +0 -453
- runops-1.2.0/.claude/skills/test-module/SKILL.md +0 -20
- runops-1.2.0/.claude/skills/update-docs/SKILL.md +0 -76
- runops-1.2.0/.codex/README.md +0 -137
- runops-1.2.0/.codex/agents/beach.toml +0 -61
- runops-1.2.0/.codex/agents/emses.toml +0 -62
- runops-1.2.0/.codex/agents/implement-adapter.toml +0 -111
- runops-1.2.0/.codex/agents/implement-cli.toml +0 -32
- runops-1.2.0/.codex/agents/implement-core.toml +0 -43
- runops-1.2.0/.codex/agents/implement-launcher.toml +0 -128
- runops-1.2.0/.codex/agents/implement-slurm.toml +0 -102
- runops-1.2.0/.codex/agents/scaffold.toml +0 -102
- runops-1.2.0/.codex/agents/spec-reviewer.toml +0 -29
- runops-1.2.0/.codex/agents/test-writer.toml +0 -30
- runops-1.2.0/.codex/rules/architecture.md +0 -73
- runops-1.2.0/.codex/rules/commands.md +0 -107
- runops-1.2.0/.codex/rules/dev-workflow.md +0 -60
- runops-1.2.0/.codex/rules/gotchas.md +0 -69
- runops-1.2.0/.codex/rules/knowledge-layer.md +0 -36
- runops-1.2.0/.codex/rules/runops.rules +0 -169
- runops-1.2.0/AGENTS.md +0 -140
- runops-1.2.0/CLAUDE.md +0 -146
- runops-1.2.0/PKG-INFO +0 -211
- runops-1.2.0/README.md +0 -194
- runops-1.2.0/SKILLS.md +0 -250
- runops-1.2.0/SPEC.md +0 -1487
- runops-1.2.0/docs/agent-user-guide.md +0 -110
- runops-1.2.0/docs/architecture.md +0 -770
- runops-1.2.0/docs/demo-replay.md +0 -143
- runops-1.2.0/docs/extending.md +0 -963
- runops-1.2.0/docs/figures/layers/overview.png +0 -0
- runops-1.2.0/docs/get-started-with-agent.md +0 -204
- runops-1.2.0/docs/layers/README.md +0 -59
- runops-1.2.0/docs/layers/analysis.md +0 -26
- runops-1.2.0/docs/layers/execution-kernel.md +0 -119
- runops-1.2.0/docs/layers/experiment.md +0 -78
- runops-1.2.0/docs/layers/harness.md +0 -116
- runops-1.2.0/docs/layers/interface.md +0 -235
- runops-1.2.0/docs/layers/knowledge.md +0 -78
- runops-1.2.0/docs/layers/research.md +0 -37
- runops-1.2.0/docs/layers/upstream.md +0 -21
- runops-1.2.0/docs/local-runops-patches.md +0 -4
- runops-1.2.0/docs/mcp.md +0 -265
- runops-1.2.0/docs/migrations/README.md +0 -129
- runops-1.2.0/docs/migrations/v0.md +0 -268
- runops-1.2.0/docs/paper-requests.md +0 -13
- runops-1.2.0/docs/project-health.md +0 -80
- runops-1.2.0/docs/runops-intro.pdf +0 -0
- runops-1.2.0/docs/runops-intro.tex +0 -514
- runops-1.2.0/docs/simulator-kb-spec.md +0 -579
- runops-1.2.0/docs/toml-reference.md +0 -1361
- runops-1.2.0/entrypoints.toml +0 -1
- runops-1.2.0/examples/beach/campaign.toml +0 -16
- runops-1.2.0/examples/beach/cases/periodic2_basic/beach_template.toml +0 -62
- runops-1.2.0/examples/beach/cases/periodic2_basic/case.toml +0 -26
- runops-1.2.0/examples/beach/launchers.toml +0 -7
- runops-1.2.0/examples/beach/simulators.toml +0 -5
- runops-1.2.0/examples/beach/surveys/density_scan/survey.toml +0 -27
- runops-1.2.0/examples/emses/campaign.toml +0 -18
- runops-1.2.0/examples/emses/cases/flat_surface/case.toml +0 -28
- runops-1.2.0/examples/emses/cases/flat_surface/plasma.toml +0 -81
- runops-1.2.0/examples/emses/launchers.toml +0 -7
- runops-1.2.0/examples/emses/simulators.toml +0 -5
- runops-1.2.0/examples/emses/surveys/mag_angle_scan/survey.toml +0 -27
- runops-1.2.0/pyproject.toml +0 -109
- runops-1.2.0/schemas/campaign.json +0 -106
- runops-1.2.0/schemas/case.json +0 -80
- runops-1.2.0/schemas/codex-plugin-check-result.json +0 -58
- runops-1.2.0/schemas/codex-plugin-inventory.json +0 -122
- runops-1.2.0/schemas/codex-plugin-recommendation.json +0 -41
- runops-1.2.0/schemas/launchers.json +0 -78
- runops-1.2.0/schemas/manifest.json +0 -170
- runops-1.2.0/schemas/runops.json +0 -132
- runops-1.2.0/schemas/simulators.json +0 -51
- runops-1.2.0/schemas/site.json +0 -80
- runops-1.2.0/schemas/survey.json +0 -157
- runops-1.2.0/src/runops/__init__.py +0 -5
- runops-1.2.0/src/runops/adapters/__init__.py +0 -37
- runops-1.2.0/src/runops/adapters/_provenance.py +0 -93
- runops-1.2.0/src/runops/adapters/_runtime.py +0 -112
- runops-1.2.0/src/runops/adapters/_utils/__init__.py +0 -36
- runops-1.2.0/src/runops/adapters/_utils/toml_utils.py +0 -81
- runops-1.2.0/src/runops/adapters/base.py +0 -380
- runops-1.2.0/src/runops/adapters/bundled.py +0 -28
- runops-1.2.0/src/runops/adapters/contrib/__init__.py +0 -5
- runops-1.2.0/src/runops/adapters/contrib/_paths.py +0 -10
- runops-1.2.0/src/runops/adapters/contrib/beach/__init__.py +0 -17
- runops-1.2.0/src/runops/adapters/contrib/beach/adapter.py +0 -549
- runops-1.2.0/src/runops/adapters/contrib/beach/constants.py +0 -19
- runops-1.2.0/src/runops/adapters/contrib/beach/diagnostics.py +0 -306
- runops-1.2.0/src/runops/adapters/contrib/beach/metadata.py +0 -256
- runops-1.2.0/src/runops/adapters/contrib/beach/validation.py +0 -126
- runops-1.2.0/src/runops/adapters/contrib/emses/__init__.py +0 -23
- runops-1.2.0/src/runops/adapters/contrib/emses/adapter.py +0 -465
- runops-1.2.0/src/runops/adapters/contrib/emses/constants.py +0 -11
- runops-1.2.0/src/runops/adapters/contrib/emses/diagnostics.py +0 -274
- runops-1.2.0/src/runops/adapters/contrib/emses/metadata.py +0 -327
- runops-1.2.0/src/runops/adapters/contrib/emses/validation.py +0 -157
- runops-1.2.0/src/runops/adapters/generic.py +0 -327
- runops-1.2.0/src/runops/adapters/registry.py +0 -338
- runops-1.2.0/src/runops/application/__init__.py +0 -1
- runops-1.2.0/src/runops/application/actions/__init__.py +0 -118
- runops-1.2.0/src/runops/application/actions/admin.py +0 -541
- runops-1.2.0/src/runops/application/actions/analysis.py +0 -196
- runops-1.2.0/src/runops/application/actions/helpers.py +0 -57
- runops-1.2.0/src/runops/application/actions/knowledge.py +0 -142
- runops-1.2.0/src/runops/application/actions/registry.py +0 -94
- runops-1.2.0/src/runops/application/actions/result.py +0 -52
- runops-1.2.0/src/runops/application/actions/run_lifecycle.py +0 -480
- runops-1.2.0/src/runops/application/actions/specs.py +0 -327
- runops-1.2.0/src/runops/application/analysis/__init__.py +0 -67
- runops-1.2.0/src/runops/application/analysis/artifacts.py +0 -270
- runops-1.2.0/src/runops/application/analysis/collection.py +0 -528
- runops-1.2.0/src/runops/application/analysis/comparison.py +0 -232
- runops-1.2.0/src/runops/application/analysis/plotting.py +0 -248
- runops-1.2.0/src/runops/application/analysis/report.py +0 -103
- runops-1.2.0/src/runops/application/analysis/story/__init__.py +0 -19
- runops-1.2.0/src/runops/application/analysis/story/audit.py +0 -127
- runops-1.2.0/src/runops/application/analysis/story/models.py +0 -132
- runops-1.2.0/src/runops/application/analysis/story/render.py +0 -73
- runops-1.2.0/src/runops/application/analysis/story/schema.py +0 -172
- runops-1.2.0/src/runops/application/analysis/story/sources.py +0 -289
- runops-1.2.0/src/runops/application/analysis/story/workspace.py +0 -180
- runops-1.2.0/src/runops/application/analysis/workflow.py +0 -373
- runops-1.2.0/src/runops/application/context.py +0 -604
- runops-1.2.0/src/runops/application/execution/__init__.py +0 -55
- runops-1.2.0/src/runops/application/execution/readiness.py +0 -598
- runops-1.2.0/src/runops/application/execution/retry.py +0 -347
- runops-1.2.0/src/runops/application/execution/submission/__init__.py +0 -79
- runops-1.2.0/src/runops/application/execution/submission/apply.py +0 -265
- runops-1.2.0/src/runops/application/execution/submission/claim.py +0 -191
- runops-1.2.0/src/runops/application/execution/submission/models.py +0 -198
- runops-1.2.0/src/runops/application/execution/submission/planning.py +0 -188
- runops-1.2.0/src/runops/application/gateway/__init__.py +0 -1
- runops-1.2.0/src/runops/application/gateway/plugins/__init__.py +0 -41
- runops-1.2.0/src/runops/application/gateway/plugins/discovery.py +0 -415
- runops-1.2.0/src/runops/application/gateway/plugins/inventory.py +0 -66
- runops-1.2.0/src/runops/application/gateway/plugins/models.py +0 -123
- runops-1.2.0/src/runops/application/gateway/plugins/validation.py +0 -146
- runops-1.2.0/src/runops/application/operator/__init__.py +0 -1
- runops-1.2.0/src/runops/application/operator/coverage_policy.py +0 -140
- runops-1.2.0/src/runops/application/operator/harness_upgrade.py +0 -257
- runops-1.2.0/src/runops/application/operator/lint/__init__.py +0 -18
- runops-1.2.0/src/runops/application/operator/lint/analysis.py +0 -127
- runops-1.2.0/src/runops/application/operator/lint/knowledge.py +0 -114
- runops-1.2.0/src/runops/application/operator/lint/models.py +0 -123
- runops-1.2.0/src/runops/application/operator/lint/plugins.py +0 -52
- runops-1.2.0/src/runops/application/operator/lint/registry.py +0 -131
- runops-1.2.0/src/runops/application/operator/lint/runs.py +0 -284
- runops-1.2.0/src/runops/application/operator/lint/structure.py +0 -87
- runops-1.2.0/src/runops/application/operator/migrations/__init__.py +0 -33
- runops-1.2.0/src/runops/application/operator/migrations/models.py +0 -79
- runops-1.2.0/src/runops/application/operator/migrations/registry.py +0 -139
- runops-1.2.0/src/runops/application/operator/migrations/v0.py +0 -386
- runops-1.2.0/src/runops/application/ports/__init__.py +0 -15
- runops-1.2.0/src/runops/application/ports/scheduler.py +0 -22
- runops-1.2.0/src/runops/application/publication/__init__.py +0 -17
- runops-1.2.0/src/runops/application/publication/files.py +0 -127
- runops-1.2.0/src/runops/application/publication/sources.py +0 -389
- runops-1.2.0/src/runops/application/publication/workflow.py +0 -371
- runops-1.2.0/src/runops/application/research/__init__.py +0 -37
- runops-1.2.0/src/runops/application/research/workspace.py +0 -898
- runops-1.2.0/src/runops/application/run_creation/__init__.py +0 -70
- runops-1.2.0/src/runops/application/run_creation/manifest.py +0 -215
- runops-1.2.0/src/runops/application/run_creation/merge.py +0 -84
- runops-1.2.0/src/runops/application/run_creation/plan.py +0 -61
- runops-1.2.0/src/runops/application/run_creation/regenerate.py +0 -119
- runops-1.2.0/src/runops/application/run_creation/resolve.py +0 -71
- runops-1.2.0/src/runops/application/run_creation/staging.py +0 -45
- runops-1.2.0/src/runops/application/run_creation/workflow.py +0 -404
- runops-1.2.0/src/runops/cli/__init__.py +0 -3
- runops-1.2.0/src/runops/cli/analyze.py +0 -471
- runops-1.2.0/src/runops/cli/clone.py +0 -204
- runops-1.2.0/src/runops/cli/config.py +0 -217
- runops-1.2.0/src/runops/cli/context.py +0 -80
- runops-1.2.0/src/runops/cli/create.py +0 -284
- runops-1.2.0/src/runops/cli/dashboard.py +0 -233
- runops-1.2.0/src/runops/cli/demo.py +0 -212
- runops-1.2.0/src/runops/cli/extend.py +0 -217
- runops-1.2.0/src/runops/cli/groups/__init__.py +0 -15
- runops-1.2.0/src/runops/cli/groups/analyze.py +0 -29
- runops-1.2.0/src/runops/cli/groups/case.py +0 -12
- runops-1.2.0/src/runops/cli/groups/research.py +0 -31
- runops-1.2.0/src/runops/cli/groups/runs.py +0 -45
- runops-1.2.0/src/runops/cli/history.py +0 -105
- runops-1.2.0/src/runops/cli/init/__init__.py +0 -42
- runops-1.2.0/src/runops/cli/init/bootstrap.py +0 -138
- runops-1.2.0/src/runops/cli/init/command.py +0 -9
- runops-1.2.0/src/runops/cli/init/doctor.py +0 -227
- runops-1.2.0/src/runops/cli/init/github_auth.py +0 -121
- runops-1.2.0/src/runops/cli/init/knowledge.py +0 -147
- runops-1.2.0/src/runops/cli/init/prompting.py +0 -321
- runops-1.2.0/src/runops/cli/init/scaffold.py +0 -165
- runops-1.2.0/src/runops/cli/init/serialization.py +0 -126
- runops-1.2.0/src/runops/cli/init/workflow.py +0 -471
- runops-1.2.0/src/runops/cli/jobs.py +0 -145
- runops-1.2.0/src/runops/cli/knowledge/__init__.py +0 -46
- runops-1.2.0/src/runops/cli/knowledge/command.py +0 -475
- runops-1.2.0/src/runops/cli/knowledge/common.py +0 -21
- runops-1.2.0/src/runops/cli/knowledge/sources.py +0 -521
- runops-1.2.0/src/runops/cli/lint.py +0 -100
- runops-1.2.0/src/runops/cli/list.py +0 -128
- runops-1.2.0/src/runops/cli/log.py +0 -163
- runops-1.2.0/src/runops/cli/main.py +0 -132
- runops-1.2.0/src/runops/cli/manage.py +0 -446
- runops-1.2.0/src/runops/cli/mcp.py +0 -153
- runops-1.2.0/src/runops/cli/migrate.py +0 -177
- runops-1.2.0/src/runops/cli/new.py +0 -388
- runops-1.2.0/src/runops/cli/operations.py +0 -95
- runops-1.2.0/src/runops/cli/plugins.py +0 -151
- runops-1.2.0/src/runops/cli/regenerate.py +0 -89
- runops-1.2.0/src/runops/cli/research.py +0 -245
- runops-1.2.0/src/runops/cli/retry.py +0 -140
- runops-1.2.0/src/runops/cli/run_lookup.py +0 -148
- runops-1.2.0/src/runops/cli/setup.py +0 -264
- runops-1.2.0/src/runops/cli/status.py +0 -373
- runops-1.2.0/src/runops/cli/submit.py +0 -399
- runops-1.2.0/src/runops/cli/update.py +0 -354
- runops-1.2.0/src/runops/cli/update_harness.py +0 -657
- runops-1.2.0/src/runops/cli/update_notice.py +0 -303
- runops-1.2.0/src/runops/cli/update_refs.py +0 -372
- runops-1.2.0/src/runops/core/__init__.py +0 -3
- runops-1.2.0/src/runops/core/campaign.py +0 -156
- runops-1.2.0/src/runops/core/case.py +0 -310
- runops-1.2.0/src/runops/core/codex_plugin.py +0 -203
- runops-1.2.0/src/runops/core/demo/__init__.py +0 -31
- runops-1.2.0/src/runops/core/demo/importer.py +0 -676
- runops-1.2.0/src/runops/core/demo/replay.py +0 -382
- runops-1.2.0/src/runops/core/demo/sanitize.py +0 -184
- runops-1.2.0/src/runops/core/discovery.py +0 -199
- runops-1.2.0/src/runops/core/environment/__init__.py +0 -19
- runops-1.2.0/src/runops/core/environment/runtime.py +0 -291
- runops-1.2.0/src/runops/core/event_log.py +0 -445
- runops-1.2.0/src/runops/core/exceptions.py +0 -101
- runops-1.2.0/src/runops/core/knowledge/__init__.py +0 -32
- runops-1.2.0/src/runops/core/knowledge/facts.py +0 -307
- runops-1.2.0/src/runops/core/knowledge/insights.py +0 -131
- runops-1.2.0/src/runops/core/knowledge/paths.py +0 -39
- runops-1.2.0/src/runops/core/knowledge_source/__init__.py +0 -85
- runops-1.2.0/src/runops/core/knowledge_source/config.py +0 -284
- runops-1.2.0/src/runops/core/knowledge_source/discovery.py +0 -50
- runops-1.2.0/src/runops/core/knowledge_source/entrypoints.py +0 -162
- runops-1.2.0/src/runops/core/knowledge_source/imports.py +0 -126
- runops-1.2.0/src/runops/core/knowledge_source/paths.py +0 -103
- runops-1.2.0/src/runops/core/knowledge_source/render.py +0 -115
- runops-1.2.0/src/runops/core/knowledge_source/sync.py +0 -150
- runops-1.2.0/src/runops/core/knowledge_source/validation.py +0 -205
- runops-1.2.0/src/runops/core/manifest.py +0 -300
- runops-1.2.0/src/runops/core/models/__init__.py +0 -1
- runops-1.2.0/src/runops/core/models/analysis.py +0 -113
- runops-1.2.0/src/runops/core/models/knowledge.py +0 -76
- runops-1.2.0/src/runops/core/models/knowledge_source.py +0 -92
- runops-1.2.0/src/runops/core/models/publication.py +0 -47
- runops-1.2.0/src/runops/core/models/run_creation.py +0 -46
- runops-1.2.0/src/runops/core/project.py +0 -174
- runops-1.2.0/src/runops/core/project_files.py +0 -6
- runops-1.2.0/src/runops/core/provenance.py +0 -147
- runops-1.2.0/src/runops/core/repository.py +0 -11
- runops-1.2.0/src/runops/core/research/__init__.py +0 -10
- runops-1.2.0/src/runops/core/research/workspace.py +0 -76
- runops-1.2.0/src/runops/core/run/__init__.py +0 -25
- runops-1.2.0/src/runops/core/run/derivation.py +0 -130
- runops-1.2.0/src/runops/core/run/records.py +0 -170
- runops-1.2.0/src/runops/core/site/__init__.py +0 -19
- runops-1.2.0/src/runops/core/site/profile.py +0 -374
- runops-1.2.0/src/runops/core/state.py +0 -300
- runops-1.2.0/src/runops/core/survey/__init__.py +0 -31
- runops-1.2.0/src/runops/core/survey/config.py +0 -513
- runops-1.2.0/src/runops/core/survey/naming.py +0 -157
- runops-1.2.0/src/runops/core/upgrade_chain.py +0 -167
- runops-1.2.0/src/runops/core/validation/__init__.py +0 -40
- runops-1.2.0/src/runops/harness/__init__.py +0 -47
- runops-1.2.0/src/runops/harness/_adapters.py +0 -62
- runops-1.2.0/src/runops/harness/_plugins.py +0 -65
- runops-1.2.0/src/runops/harness/_skills.py +0 -67
- runops-1.2.0/src/runops/harness/builder.py +0 -460
- runops-1.2.0/src/runops/harness/claude.py +0 -231
- runops-1.2.0/src/runops/harness/codex.py +0 -48
- runops-1.2.0/src/runops/jobgen/__init__.py +0 -3
- runops-1.2.0/src/runops/jobgen/generator.py +0 -324
- runops-1.2.0/src/runops/launchers/__init__.py +0 -17
- runops-1.2.0/src/runops/launchers/base.py +0 -313
- runops-1.2.0/src/runops/launchers/mpiexec.py +0 -131
- runops-1.2.0/src/runops/launchers/mpirun.py +0 -132
- runops-1.2.0/src/runops/launchers/srun.py +0 -126
- runops-1.2.0/src/runops/mcp/__init__.py +0 -7
- runops-1.2.0/src/runops/mcp/_tools/__init__.py +0 -1
- runops-1.2.0/src/runops/mcp/_tools/analysis.py +0 -327
- runops-1.2.0/src/runops/mcp/_tools/common.py +0 -366
- runops-1.2.0/src/runops/mcp/_tools/project.py +0 -338
- runops-1.2.0/src/runops/mcp/_tools/provider.py +0 -74
- runops-1.2.0/src/runops/mcp/_tools/publication.py +0 -235
- runops-1.2.0/src/runops/mcp/_tools/runs.py +0 -241
- runops-1.2.0/src/runops/mcp/_tools/scheduler.py +0 -239
- runops-1.2.0/src/runops/mcp/registry.py +0 -422
- runops-1.2.0/src/runops/mcp/safety.py +0 -71
- runops-1.2.0/src/runops/mcp/schemas.py +0 -152
- runops-1.2.0/src/runops/mcp/server.py +0 -287
- runops-1.2.0/src/runops/mcp/tools.py +0 -49
- runops-1.2.0/src/runops/sites/camphor.md +0 -123
- runops-1.2.0/src/runops/sites/camphor.toml +0 -47
- runops-1.2.0/src/runops/slurm/__init__.py +0 -3
- runops-1.2.0/src/runops/slurm/query.py +0 -384
- runops-1.2.0/src/runops/slurm/submit.py +0 -239
- runops-1.2.0/src/runops/templates/README.md +0 -38
- runops-1.2.0/src/runops/templates/__init__.py +0 -29
- runops-1.2.0/src/runops/templates/adapters/beach/agent_guide.md +0 -39
- runops-1.2.0/src/runops/templates/adapters/beach/beach.toml +0 -19
- runops-1.2.0/src/runops/templates/adapters/beach/case.toml +0 -16
- runops-1.2.0/src/runops/templates/adapters/beach/summarize.py +0 -272
- runops-1.2.0/src/runops/templates/adapters/emses/agent_guide.md +0 -42
- runops-1.2.0/src/runops/templates/adapters/emses/case.toml +0 -18
- runops-1.2.0/src/runops/templates/adapters/emses/plasma.toml +0 -118
- runops-1.2.0/src/runops/templates/adapters/emses/summarize.py +0 -413
- runops-1.2.0/src/runops/templates/adapters/generic/case.toml.j2 +0 -13
- runops-1.2.0/src/runops/templates/adapters/generic/summarize.py +0 -21
- runops-1.2.0/src/runops/templates/demo/replay.html.j2 +0 -1593
- runops-1.2.0/src/runops/templates/harness/claude/CLAUDE.md.j2 +0 -7
- runops-1.2.0/src/runops/templates/harness/claude/rules/cookbook.md.j2 +0 -6
- runops-1.2.0/src/runops/templates/harness/claude/rules/plan-before-act.md +0 -16
- runops-1.2.0/src/runops/templates/harness/claude/rules/runops-workflow.md +0 -53
- runops-1.2.0/src/runops/templates/harness/codex/AGENTS.md.j2 +0 -21
- runops-1.2.0/src/runops/templates/harness/codex/README.md.j2 +0 -127
- runops-1.2.0/src/runops/templates/harness/codex/config.toml.j2 +0 -21
- runops-1.2.0/src/runops/templates/harness/codex/rules/runops.rules +0 -160
- runops-1.2.0/src/runops/templates/harness/shared/cases.md +0 -22
- runops-1.2.0/src/runops/templates/harness/shared/partials/agent-body.md.j2 +0 -155
- runops-1.2.0/src/runops/templates/harness/shared/rules/cookbook.md.j2 +0 -19
- runops-1.2.0/src/runops/templates/harness/shared/runs.md +0 -25
- runops-1.2.0/src/runops/templates/knowledge/runops/agent-user-guide.md +0 -60
- runops-1.2.0/src/runops/templates/scaffold/campaign.toml.j2 +0 -10
- runops-1.2.0/src/runops/templates/scaffold/facts.toml +0 -2
- runops-1.2.0/src/runops/templates/scaffold/gitignore.txt +0 -43
- runops-1.2.0/src/runops/templates/scaffold/materials/README.md +0 -38
- runops-1.2.0/src/runops/templates/scaffold/materials/index.toml +0 -12
- runops-1.2.0/src/runops/templates/scaffold/research/CURRENT.md +0 -29
- runops-1.2.0/src/runops/templates/scaffold/research/journal/active.md +0 -2
- runops-1.2.0/src/runops/templates/scaffold/vscode_settings.json +0 -57
- runops-1.2.0/src/runops/templates/skills/analyze/SKILL.md +0 -39
- runops-1.2.0/src/runops/templates/skills/check-status/SKILL.md +0 -52
- runops-1.2.0/src/runops/templates/skills/cleanup/SKILL.md +0 -38
- runops-1.2.0/src/runops/templates/skills/create-run/SKILL.md +0 -49
- runops-1.2.0/src/runops/templates/skills/debug-failed/SKILL.md +0 -35
- runops-1.2.0/src/runops/templates/skills/learn/SKILL.md +0 -26
- runops-1.2.0/src/runops/templates/skills/migrate-runops/SKILL.md +0 -55
- runops-1.2.0/src/runops/templates/skills/new-case/SKILL.md +0 -40
- runops-1.2.0/src/runops/templates/skills/patch-runops/SKILL.md +0 -47
- runops-1.2.0/src/runops/templates/skills/release/SKILL.md +0 -39
- runops-1.2.0/src/runops/templates/skills/research-workspace/SKILL.md +0 -30
- runops-1.2.0/src/runops/templates/skills/run-all/SKILL.md +0 -58
- runops-1.2.0/src/runops/templates/skills/runops-reference/SKILL.md +0 -55
- runops-1.2.0/src/runops/templates/skills/setup-campaign/SKILL.md +0 -47
- runops-1.2.0/src/runops/templates/skills/setup-env/SKILL.md +0 -28
- runops-1.2.0/src/runops/templates/skills/setup-plugins/SKILL.md +0 -58
- runops-1.2.0/src/runops/templates/skills/setup-runops/SKILL.md +0 -80
- runops-1.2.0/src/runops/templates/skills/summarize-script/SKILL.md +0 -51
- runops-1.2.0/src/runops/templates/skills/survey-design/SKILL.md +0 -48
- runops-1.2.0/src/runops/templates/skills/update-runops/SKILL.md +0 -51
- runops-1.2.0/src/runops/templates/survey.toml.j2 +0 -36
- runops-1.2.0/tests/__init__.py +0 -0
- runops-1.2.0/tests/conftest.py +0 -105
- runops-1.2.0/tests/factories.py +0 -121
- runops-1.2.0/tests/fixtures/sample_case.toml +0 -25
- runops-1.2.0/tests/fixtures/sample_launchers.toml +0 -16
- runops-1.2.0/tests/fixtures/sample_manifest.toml +0 -40
- runops-1.2.0/tests/fixtures/sample_runops.toml +0 -3
- runops-1.2.0/tests/fixtures/sample_simulators.toml +0 -6
- runops-1.2.0/tests/fixtures/sample_survey.toml +0 -25
- runops-1.2.0/tests/test_adapters/__init__.py +0 -0
- runops-1.2.0/tests/test_adapters/test_beach.py +0 -543
- runops-1.2.0/tests/test_adapters/test_contract.py +0 -293
- runops-1.2.0/tests/test_adapters/test_emses.py +0 -499
- runops-1.2.0/tests/test_adapters/test_generic.py +0 -574
- runops-1.2.0/tests/test_adapters/test_provenance.py +0 -127
- runops-1.2.0/tests/test_adapters/test_registry.py +0 -328
- runops-1.2.0/tests/test_adapters/test_runtime.py +0 -196
- runops-1.2.0/tests/test_adapters/test_toml_utils.py +0 -83
- runops-1.2.0/tests/test_application/__init__.py +0 -1
- runops-1.2.0/tests/test_application/test_action_contract.py +0 -310
- runops-1.2.0/tests/test_application/test_actions.py +0 -1337
- runops-1.2.0/tests/test_application/test_analysis.py +0 -215
- runops-1.2.0/tests/test_application/test_analysis_comparison.py +0 -93
- runops-1.2.0/tests/test_application/test_analysis_story.py +0 -547
- runops-1.2.0/tests/test_application/test_capability_facades.py +0 -19
- runops-1.2.0/tests/test_application/test_context.py +0 -608
- runops-1.2.0/tests/test_application/test_coverage_policy.py +0 -177
- runops-1.2.0/tests/test_application/test_harness_upgrade.py +0 -166
- runops-1.2.0/tests/test_application/test_lint.py +0 -443
- runops-1.2.0/tests/test_application/test_migrations.py +0 -169
- runops-1.2.0/tests/test_application/test_plugins.py +0 -724
- runops-1.2.0/tests/test_application/test_publication.py +0 -239
- runops-1.2.0/tests/test_application/test_readiness.py +0 -181
- runops-1.2.0/tests/test_application/test_research_workspace.py +0 -198
- runops-1.2.0/tests/test_application/test_retry.py +0 -136
- runops-1.2.0/tests/test_application/test_run_creation.py +0 -719
- runops-1.2.0/tests/test_application/test_story_audit.py +0 -128
- runops-1.2.0/tests/test_application/test_story_render.py +0 -113
- runops-1.2.0/tests/test_application/test_story_schema.py +0 -279
- runops-1.2.0/tests/test_application/test_story_sources.py +0 -261
- runops-1.2.0/tests/test_application/test_submission.py +0 -1057
- runops-1.2.0/tests/test_application/test_submission_parity.py +0 -252
- runops-1.2.0/tests/test_architecture/test_core_import_boundaries.py +0 -105
- runops-1.2.0/tests/test_cli/__init__.py +0 -0
- runops-1.2.0/tests/test_cli/test_analyze.py +0 -1105
- runops-1.2.0/tests/test_cli/test_clone.py +0 -241
- runops-1.2.0/tests/test_cli/test_config.py +0 -183
- runops-1.2.0/tests/test_cli/test_context_cli.py +0 -75
- runops-1.2.0/tests/test_cli/test_create.py +0 -560
- runops-1.2.0/tests/test_cli/test_dashboard.py +0 -233
- runops-1.2.0/tests/test_cli/test_demo.py +0 -297
- runops-1.2.0/tests/test_cli/test_event_log.py +0 -143
- runops-1.2.0/tests/test_cli/test_extend.py +0 -344
- runops-1.2.0/tests/test_cli/test_history.py +0 -103
- runops-1.2.0/tests/test_cli/test_init.py +0 -950
- runops-1.2.0/tests/test_cli/test_init_bootstrap.py +0 -192
- runops-1.2.0/tests/test_cli/test_init_github_auth.py +0 -131
- runops-1.2.0/tests/test_cli/test_init_helpers.py +0 -245
- runops-1.2.0/tests/test_cli/test_init_scaffold.py +0 -119
- runops-1.2.0/tests/test_cli/test_jobs.py +0 -150
- runops-1.2.0/tests/test_cli/test_knowledge.py +0 -828
- runops-1.2.0/tests/test_cli/test_knowledge_source_helpers.py +0 -133
- runops-1.2.0/tests/test_cli/test_lint.py +0 -97
- runops-1.2.0/tests/test_cli/test_list.py +0 -216
- runops-1.2.0/tests/test_cli/test_log.py +0 -191
- runops-1.2.0/tests/test_cli/test_main.py +0 -249
- runops-1.2.0/tests/test_cli/test_manage.py +0 -558
- runops-1.2.0/tests/test_cli/test_mcp.py +0 -54
- runops-1.2.0/tests/test_cli/test_migrate.py +0 -80
- runops-1.2.0/tests/test_cli/test_new.py +0 -220
- runops-1.2.0/tests/test_cli/test_plugins.py +0 -362
- runops-1.2.0/tests/test_cli/test_regenerate.py +0 -157
- runops-1.2.0/tests/test_cli/test_research.py +0 -139
- runops-1.2.0/tests/test_cli/test_retry.py +0 -175
- runops-1.2.0/tests/test_cli/test_setup.py +0 -287
- runops-1.2.0/tests/test_cli/test_status.py +0 -532
- runops-1.2.0/tests/test_cli/test_submit.py +0 -511
- runops-1.2.0/tests/test_cli/test_update.py +0 -413
- runops-1.2.0/tests/test_cli/test_update_harness.py +0 -634
- runops-1.2.0/tests/test_cli/test_update_notice.py +0 -139
- runops-1.2.0/tests/test_cli/test_update_refs.py +0 -198
- runops-1.2.0/tests/test_core/__init__.py +0 -0
- runops-1.2.0/tests/test_core/test_case.py +0 -90
- runops-1.2.0/tests/test_core/test_demo_import.py +0 -289
- runops-1.2.0/tests/test_core/test_demo_replay.py +0 -218
- runops-1.2.0/tests/test_core/test_discovery.py +0 -153
- runops-1.2.0/tests/test_core/test_environment.py +0 -215
- runops-1.2.0/tests/test_core/test_event_log.py +0 -208
- runops-1.2.0/tests/test_core/test_knowledge_source.py +0 -786
- runops-1.2.0/tests/test_core/test_knowledge_source_render.py +0 -212
- runops-1.2.0/tests/test_core/test_knowledge_source_validation.py +0 -157
- runops-1.2.0/tests/test_core/test_manifest.py +0 -302
- runops-1.2.0/tests/test_core/test_project.py +0 -113
- runops-1.2.0/tests/test_core/test_provenance.py +0 -96
- runops-1.2.0/tests/test_core/test_repository.py +0 -11
- runops-1.2.0/tests/test_core/test_research_workspace.py +0 -77
- runops-1.2.0/tests/test_core/test_run.py +0 -112
- runops-1.2.0/tests/test_core/test_schemas.py +0 -179
- runops-1.2.0/tests/test_core/test_site.py +0 -319
- runops-1.2.0/tests/test_core/test_state.py +0 -217
- runops-1.2.0/tests/test_core/test_survey.py +0 -386
- runops-1.2.0/tests/test_core/test_upgrade_chain.py +0 -50
- runops-1.2.0/tests/test_e2e/test_bootstrap.py +0 -479
- runops-1.2.0/tests/test_e2e/test_golden_path.py +0 -181
- runops-1.2.0/tests/test_harness/test_claude.py +0 -61
- runops-1.2.0/tests/test_harness/test_codex.py +0 -360
- runops-1.2.0/tests/test_harness/test_development_guidance.py +0 -253
- runops-1.2.0/tests/test_launchers/__init__.py +0 -0
- runops-1.2.0/tests/test_launchers/test_launcher_base.py +0 -184
- runops-1.2.0/tests/test_launchers/test_mpiexec.py +0 -83
- runops-1.2.0/tests/test_launchers/test_mpirun.py +0 -85
- runops-1.2.0/tests/test_launchers/test_srun.py +0 -99
- runops-1.2.0/tests/test_mcp/__init__.py +0 -1
- runops-1.2.0/tests/test_mcp/test_registry.py +0 -78
- runops-1.2.0/tests/test_mcp/test_server.py +0 -369
- runops-1.2.0/tests/test_mcp/test_tools.py +0 -579
- runops-1.2.0/tests/test_slurm/__init__.py +0 -0
- runops-1.2.0/tests/test_slurm/test_jobgen.py +0 -603
- runops-1.2.0/tests/test_slurm/test_slurm_query.py +0 -339
- runops-1.2.0/tests/test_slurm/test_slurm_submit.py +0 -279
- runops-1.2.0/uv.lock +0 -1375
- {runops-1.2.0 → runops-2.0.0}/.agents/skills/python-package-refactor/SKILL.md +0 -0
- {runops-1.2.0 → runops-2.0.0}/.agents/skills/python-package-refactor/agents/openai.yaml +0 -0
- {runops-1.2.0 → runops-2.0.0}/.agents/skills/python-package-refactor/examples/refactor-request.md +0 -0
- {runops-1.2.0 → runops-2.0.0}/.agents/skills/python-package-refactor/references/anti-patterns.md +0 -0
- {runops-1.2.0 → runops-2.0.0}/.agents/skills/python-package-refactor/references/api-compatibility.md +0 -0
- {runops-1.2.0 → runops-2.0.0}/.agents/skills/python-package-refactor/references/packaging-modernization.md +0 -0
- {runops-1.2.0 → runops-2.0.0}/.agents/skills/python-package-refactor/references/refactor-playbook.md +0 -0
- {runops-1.2.0 → runops-2.0.0}/.agents/skills/python-package-refactor/references/verification.md +0 -0
- {runops-1.2.0 → runops-2.0.0}/.agents/skills/python-package-refactor/scripts/api_surface_snapshot.py +0 -0
- {runops-1.2.0 → runops-2.0.0}/.agents/skills/python-package-refactor/scripts/import_smoke.py +0 -0
- {runops-1.2.0 → runops-2.0.0}/.agents/skills/python-package-refactor/scripts/inspect_python_package.py +0 -0
- {runops-1.2.0 → runops-2.0.0}/.agents/skills/python-package-refactor/scripts/refactor_quality_gate.py +0 -0
- {runops-1.2.0 → runops-2.0.0}/.claude/settings.json +0 -0
- {runops-1.2.0 → runops-2.0.0}/.codex/config.toml +0 -0
- {runops-1.2.0 → runops-2.0.0}/.dockerignore +0 -0
- {runops-1.2.0 → runops-2.0.0}/.gitattributes +0 -0
- {runops-1.2.0 → runops-2.0.0}/.gitignore +0 -0
- {runops-1.2.0 → runops-2.0.0}/.pre-commit-config.yaml +0 -0
- {runops-1.2.0 → runops-2.0.0}/.vscode/settings.json +0 -0
- {runops-1.2.0 → runops-2.0.0}/LICENSE +0 -0
- {runops-1.2.0/src/runops/sites → runops-2.0.0/tests}/__init__.py +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: check
|
|
3
|
+
description: "Run runops quality gates (ruff format, ruff check, mypy, pytest with branch coverage) after code changes, and the extra checks for filesystem, adapter, or migration changes. Report pass/fail per step and fix failures."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 品質チェック
|
|
7
|
+
|
|
8
|
+
## 常に実行する
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
uv run ruff format --check src/ tests/
|
|
12
|
+
uv run ruff check src/ tests/
|
|
13
|
+
uv run mypy src/
|
|
14
|
+
uv run pytest -q --cov=runops --cov-branch --cov-fail-under=80
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
pytest は 60 秒以内が目標(SPEC §13.1)。Slurm は `tests/conftest.py` の `FakeSlurm` で
|
|
18
|
+
mock する。実際の `sbatch` を呼ぶテストを書かない。
|
|
19
|
+
|
|
20
|
+
## 変更内容に応じて追加する
|
|
21
|
+
|
|
22
|
+
| 変更 | 追加の確認 |
|
|
23
|
+
|---|---|
|
|
24
|
+
| rename / move / archive / 作成など filesystem 操作 | `uv run pytest -q -p no:cacheprovider --basetemp=/LARGE0/gr20001/b36291/claude_scratch/pytest-lustre` で Lustre 上でも通す(`RENAME_NOREPLACE` が EINVAL になる経路) |
|
|
25
|
+
| adapter 解決、`.venv` の entry point、skill 展開 | `tests/test_skills.py` と `tests/test_adapters.py`。必要なら scratch project で `uv venv` + `uv pip install -e <simulator>` して `runo doctor` |
|
|
26
|
+
| `migrate-v1` | `tests/test_migrate.py`。実 project には `runo migrate-v1 --dry-run` だけを実行し、適用は `work/` を除いたコピーで行う |
|
|
27
|
+
| job.sh 生成 | `tests/golden/*.sh` との差分を目視し、意図した変更なら `UPDATE_GOLDEN=1 uv run pytest tests/test_jobgen.py` |
|
|
28
|
+
| project に展開する skill / AGENTS.md block | `tests/test_skills.py`(行数上限)と `sync-docs` skill |
|
|
29
|
+
| 開発ハーネス | `tests/test_dev_harness.py` |
|
|
30
|
+
|
|
31
|
+
## 報告
|
|
32
|
+
|
|
33
|
+
各ステップの pass / fail を示し、失敗はエラー出力と修正内容を添える。
|
|
34
|
+
`ruff format` の違反は `uv run ruff format src/ tests/` で直してよい。
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: improve-harness
|
|
3
|
+
description: "Audit or improve the runops agent harnesses: the development harness of this repository (AGENTS.md, .agents/skills, .claude, .codex) and the project harness runops generates (src/runops/harness.py, src/runops/skills). Use when instructions drift from the code, repeat friction appears, or a new workflow needs a skill."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ハーネスの改善
|
|
7
|
+
|
|
8
|
+
runops には 2 つのハーネスがある。どちらを直すかを先に決める。
|
|
9
|
+
|
|
10
|
+
| ハーネス | 正本 | 読む人 |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| 開発ハーネス | `AGENTS.md`、`.agents/skills/*/SKILL.md`、`.claude/rules/*.md`、`.codex/rules/runops.rules`、`.claude/settings.json`、`.codex/config.toml` | runops を開発するエージェント |
|
|
13
|
+
| project ハーネス | `src/runops/harness.py`(AGENTS.md の管理 block)、`src/runops/skills/*/SKILL.md` | runops を使う project のエージェント |
|
|
14
|
+
|
|
15
|
+
## 開発ハーネスの構造
|
|
16
|
+
|
|
17
|
+
- skill の正本は `.agents/skills/<name>/SKILL.md`(Codex が読む)。`.claude/skills/<name>/SKILL.md`
|
|
18
|
+
は同じ `name` / `description` の frontmatter と、正本を読むよう指示する 1 文だけを持つ。
|
|
19
|
+
- 専門 agent(`spec-reviewer`)も同様に、`.claude/agents/*.md` と `.codex/agents/*.toml` は
|
|
20
|
+
`.agents/skills/<name>/SKILL.md` を指す入口に留める。
|
|
21
|
+
- 規約の正本は `.claude/rules/*.md`(Claude Code が自動で読む)。Codex 向けには `AGENTS.md` の表から
|
|
22
|
+
同じ file を参照する。`.codex/rules/` には execpolicy の `runops.rules` だけを置く。
|
|
23
|
+
- `AGENTS.md` は 80 行程度の入口に保つ。`CLAUDE.md` は `@AGENTS.md` だけ。
|
|
24
|
+
- `tests/test_dev_harness.py` が、入口と正本の対応、参照先の存在、AGENTS.md の長さを検査する。
|
|
25
|
+
|
|
26
|
+
## 進め方
|
|
27
|
+
|
|
28
|
+
1. 摩擦を具体的に特定する(どの作業で、何を誤り、何を読み直したか)。
|
|
29
|
+
2. 直す場所を 1 か所に決める。恒久規約は rules、繰り返す手順は skill、project の利用者向けは
|
|
30
|
+
project ハーネス。同じ内容を 2 か所に書かない。
|
|
31
|
+
3. skill を足すときは description に発火条件を書き、手順は判断に必要な分だけにする。
|
|
32
|
+
`.claude/skills/` に入口を作る。
|
|
33
|
+
4. project ハーネスを変えたら `sync-docs` に従い、SPEC §8.3 / §10 と README も確認する。
|
|
34
|
+
5. `uv run pytest -q tests/test_dev_harness.py tests/test_skills.py` を通す。
|
|
@@ -5,7 +5,7 @@ description: "Prepare and publish a new runops release from main. Bump version,
|
|
|
5
5
|
|
|
6
6
|
# runops リリース
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
新しいバージョンの runops をリリースするスキル(Codex では `$release`、Claude Code では `/release`)。
|
|
9
9
|
|
|
10
10
|
## リリースノート方針
|
|
11
11
|
|
|
@@ -17,16 +17,17 @@ description: "Prepare and publish a new runops release from main. Bump version,
|
|
|
17
17
|
## 使い方
|
|
18
18
|
|
|
19
19
|
```
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
release patch # 0.2.1 -> 0.2.2
|
|
21
|
+
release minor # 0.2.1 -> 0.3.0
|
|
22
|
+
release major # 0.2.1 -> 1.0.0
|
|
23
|
+
release 0.3.0 # 明示的にバージョン指定
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
引数なしで呼んだ場合は、変更内容から bump レベルを自動判定し、
|
|
27
27
|
main release commit → main push → CI 確認 → tag → GitHub Release → publish 確認まで一気通貫で実行する。
|
|
28
28
|
|
|
29
|
-
現在は個人開発のため main-first。
|
|
29
|
+
現在は個人開発のため main-first。v2 の作業 branch(`v2`)は、最初の 2.0.0 リリース前に
|
|
30
|
+
`main` へ fast-forward または merge しておく。release commit は `main` 上で作り、
|
|
30
31
|
品質ゲートと CI green を確認してから、その release commit に tag を切る。
|
|
31
32
|
`--force`、non-fast-forward push、`--no-verify` は使わない。
|
|
32
33
|
|
|
@@ -42,6 +43,7 @@ git status --porcelain
|
|
|
42
43
|
uv run pytest tests/ -x -q
|
|
43
44
|
|
|
44
45
|
# lint / type check
|
|
46
|
+
uv run ruff format --check src/ tests/
|
|
45
47
|
uv run ruff check src/ tests/
|
|
46
48
|
uv run mypy src/
|
|
47
49
|
```
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: simulator-adapter
|
|
3
|
+
description: "Add or update runops v2 support in a simulator's own Python package (runops.adapters entry point, agent_context_dir packaging, tests), or adjust runops.legacy_adapters. Use when a simulator such as MPIEMSES3D, BEACH, or a new code needs to work with runops."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# simulator 側の adapter
|
|
7
|
+
|
|
8
|
+
runops 本体には simulator 固有の adapter を置かない(SPEC §8.1)。adapter は simulator の
|
|
9
|
+
Python package に置き、`runops.adapters` entry point で公開する。
|
|
10
|
+
|
|
11
|
+
## 手順
|
|
12
|
+
|
|
13
|
+
1. simulator repo の規約(AGENTS.md、テスト、ログインノードでの実行可否)を読み、作業中の branch を
|
|
14
|
+
壊さないよう `git worktree add -b <branch> <scratch> main` で作業する。
|
|
15
|
+
2. `<package>/runops_adapter.py` に `Adapter` を書く。runops は関数内で遅延 import し、
|
|
16
|
+
module の import 時に runops を要求しない。契約は `docs/adapter.md`。
|
|
17
|
+
- `render_inputs` は `runops.adapters.toml_override` で dotted key を適用する
|
|
18
|
+
- `build_command` は run_dir を cwd とした argv、`detect_status` は job 終了後の判定
|
|
19
|
+
- 既存の移植元は `src/runops/legacy_adapters/<name>.py`
|
|
20
|
+
3. `pyproject.toml` に entry point を足す:
|
|
21
|
+
`[project.entry-points."runops.adapters"] <name> = "<package>.runops_adapter:Adapter"`
|
|
22
|
+
4. skill と reference を wheel に入れ、`agent_context_dir()` で返す。候補は
|
|
23
|
+
`<package>/agent_context`(wheel)→ repo の `plugins/<name>-context`(source checkout)の順。
|
|
24
|
+
- package dir の外にある場合: setuptools の `package-dir` で data-only package に対応付ける
|
|
25
|
+
(BEACH: `"beach.agent_context" = "plugins/beach-context"`)
|
|
26
|
+
- 配布 workflow が package をコピーして build する場合: build 前に stage する script
|
|
27
|
+
(MPIEMSES3D: `tools/stage_agent_context.py`)
|
|
28
|
+
5. テスト: `build_command`、`detect_status`、`summarize`、`agent_context_dir` は runops 無しで、
|
|
29
|
+
`render_inputs` は runops があるときだけ(skip)。wheel の中身を確認できるなら
|
|
30
|
+
`agent_context/skills/*/SKILL.md` と `entry_points.txt` の `[runops.adapters]` を見る。
|
|
31
|
+
6. E2E: scratch project で `uv venv` → `uv pip install --no-deps <wheel or -e path>` →
|
|
32
|
+
`runo init <name> --no-install` → `runo doctor`(`resolved via entry-point`)→ skill 展開と
|
|
33
|
+
`runo new` の job.sh を確認する。
|
|
34
|
+
7. entry point を持つ版が出たら、runops 側の `legacy_adapters/<name>.py` と
|
|
35
|
+
`ops/setup.py` の `KNOWN_PACKAGES` を見直す。
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec-reviewer
|
|
3
|
+
description: "Review runops changes against SPEC.md: design principles, command budget, manifest/state semantics, adapter contract, filesystem safety, and missing acceptance tests. Use before merging non-trivial changes."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SPEC レビュー
|
|
7
|
+
|
|
8
|
+
毎回 `SPEC.md` を読み直す。正本は SPEC 本文と §14、実装、テストの順。
|
|
9
|
+
|
|
10
|
+
## 観点
|
|
11
|
+
|
|
12
|
+
- **原則(§1.2)**: 作成をゲートしていないか。case / run / sweep 以外の永続 entity、ID 空間、
|
|
13
|
+
ledger を足していないか。simulator 固有の知識を runops 本体に入れていないか。
|
|
14
|
+
- **command(§7.3, §13.1)**: 数が 25 を超えないか。read-only と状態変更を同じ名前で兼ねていないか。
|
|
15
|
+
破壊的操作が確認(`-y` 以外)を経るか。exit code が 0 / 1 / 2 の規約通りか。
|
|
16
|
+
- **manifest(§6)**: runops だけが書き、atomic write か。未知 field を落とさないか
|
|
17
|
+
(`Manifest` は dict を保持する)。状態遷移が `_TRANSITIONS` に沿うか。`run_dir` は project 相対か。
|
|
18
|
+
- **filesystem**: run の公開・移動は `move_noreplace`。別 filesystem へ黙ってコピーしない。
|
|
19
|
+
`runs/` 外や pinned を消さない。Lustre(NOREPLACE 非対応)でも正しいか。
|
|
20
|
+
- **adapter(§8)**: Protocol だけに依存し、任意 hook は `optional()` で呼ぶか。解決順
|
|
21
|
+
(entry point → `adapters/X.py` → generic)を変えていないか。
|
|
22
|
+
- **ops / cli 境界**: `ops/` は print / prompt せず、Slurm は runner 引数で注入されるか。
|
|
23
|
+
- **テスト**: SPEC §13.2 の受け入れ基準に対応するテストがあるか。失敗系(不正入力、既存 path、
|
|
24
|
+
Slurm 失敗、状態違い)も見ているか。
|
|
25
|
+
|
|
26
|
+
## 報告
|
|
27
|
+
|
|
28
|
+
finding ごとに severity(Critical / Important / Minor)、file:line、根拠(SPEC の節か再現手順)、
|
|
29
|
+
修正案を書く。推測だけで blocker にしない。style の好みは報告しない。
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sync-docs
|
|
3
|
+
description: "Keep runops specs, user docs, and agent-facing text consistent after a change to commands, options, config fields, manifest fields, adapter contract, or project layout. Use before committing such a change."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 仕様と文書の同期
|
|
7
|
+
|
|
8
|
+
runops の挙動は複数の場所に書かれている。変更の種類から直す場所を決め、正本から順に直す。
|
|
9
|
+
|
|
10
|
+
| 変更 | 正本 | 追随させる場所 |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| command / option の追加・変更 | `SPEC.md` §7.3(先に更新。§13.1 の上限 25 を確認) | `docs/reference.md` の command 表、`src/runops/skills/runops-reference/SKILL.md`、`src/runops/harness.py` の `COMMANDS` |
|
|
13
|
+
| `runops.toml` / `case.toml` の field | `SPEC.md` §4, §5 | `docs/reference.md`、`config.py` / `case.py` の既知 key 集合 |
|
|
14
|
+
| manifest の field | `SPEC.md` §6.2 | `docs/reference.md` の manifest 表、`ops/migrate.py` の変換 |
|
|
15
|
+
| adapter 契約・skill 同梱 | `SPEC.md` §8 | `docs/adapter.md`、`adapters/base.py` の docstring、`legacy_adapters/` |
|
|
16
|
+
| エージェントの使い方・規則 | `src/runops/harness.py`(project の AGENTS.md block) | `src/runops/skills/*/SKILL.md`、README の依頼例 |
|
|
17
|
+
| 実装中の判断で SPEC 本文と違う結論になった | `SPEC.md` 本文を直し、§14 に理由を 1 行追加 | — |
|
|
18
|
+
|
|
19
|
+
## 規則
|
|
20
|
+
|
|
21
|
+
- README は利用者向けで、人が覚えるコマンドは `runo init` だけという前提で書く。それ以外は
|
|
22
|
+
エージェントへの依頼例として書く。
|
|
23
|
+
- `docs/` は `reference.md` と `adapter.md` の 2 本だけ。ページを増やす前に既存ページの節で収める。
|
|
24
|
+
- project に展開する skill は各 60 行以内、AGENTS.md block は 120 行以内(テストあり)。
|
|
25
|
+
- 経緯は書かない(commit message と SPEC §14 に残す)。現在の挙動だけを書く。
|
|
26
|
+
|
|
27
|
+
## 確認
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
uv run pytest -q tests/test_skills.py tests/test_dev_harness.py
|
|
31
|
+
uv run runo --help
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`--help` の command 一覧と SPEC §7.3、`docs/reference.md` の表が一致することを確認する。
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec-reviewer
|
|
3
|
+
description: "Review runops changes against SPEC.md: design principles, command budget, manifest/state semantics, adapter contract, filesystem safety, and missing acceptance tests. Use before merging non-trivial changes."
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Read `.agents/skills/spec-reviewer/SKILL.md` and review the requested change as it instructs. Do not edit files; report findings only.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# アーキテクチャ(runops v2)
|
|
2
|
+
|
|
3
|
+
正本は `SPEC.md`。ここには実装時に守る境界だけを書く。
|
|
4
|
+
|
|
5
|
+
## 層
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
cli.py ──> ops/* ──> config / project / manifest / case / runtime / jobgen / launchers / slurm / util
|
|
9
|
+
└─> adapters/ (base, registry, generic)
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
- `cli.py`: 引数の解釈、確認 prompt、表示だけ。処理は `ops/` を呼ぶ。`RunopsError` の
|
|
13
|
+
`exit_code`(1: 実行時エラー、2: 使い方・設定)を `main()` が終了コードにする。
|
|
14
|
+
- `ops/`: command ごとの処理。print / prompt をしない。Slurm を呼ぶ関数は `runner` 引数を取り、
|
|
15
|
+
CLI は `slurm.default_runner` を呼び出し時に参照して渡す(テストは monkeypatch で差し替える)。
|
|
16
|
+
- 基盤 module は `ops/` と `cli.py` を import しない。`adapters/` は runops の他 module に依存しない
|
|
17
|
+
(`base.py` は `util.load_toml` のみ)。
|
|
18
|
+
- `legacy_adapters/` は registry に登録しない。`ops/migrate.py` と `ops/setup.py` がファイルとして
|
|
19
|
+
project にコピーするだけ。
|
|
20
|
+
|
|
21
|
+
## 不変条件
|
|
22
|
+
|
|
23
|
+
- run directory が主単位、`manifest.toml` が正本。書き込みは `Manifest.save()`(atomic)。
|
|
24
|
+
`Manifest` は dict を保持し、知らない field を落とさない。
|
|
25
|
+
- run の発見は `runs/` 配下の走査。`.runops/index.toml` は捨ててよい cache。
|
|
26
|
+
- run の公開・移動は `util.move_noreplace`。`shutil.move` で別 filesystem へコピーしない。
|
|
27
|
+
- run id の採番と作成は `Project.id_lock()` の中で行い、staging は対象と同じ親 directory に置く。
|
|
28
|
+
- adapter の任意 hook は `registry.optional()` 経由で呼ぶ(Protocol を満たすだけの class も動く)。
|
|
29
|
+
- simulator 固有の知識(入力形式、完了判定、skill)を runops 本体に足さない。
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# 開発ワークフロー
|
|
2
|
+
|
|
3
|
+
## 品質ゲート
|
|
4
|
+
|
|
5
|
+
コミット前に `check` skill の手順を通す。CI(`.github/workflows/ci.yml`)も同じ
|
|
6
|
+
ruff format / ruff check / mypy / pytest(branch coverage 80%)を Python 3.10–3.13 で実行する。
|
|
7
|
+
|
|
8
|
+
## コーディング
|
|
9
|
+
|
|
10
|
+
- Python 3.10+。`tomllib` は `runops.util.tomllib` を使う(3.10 は `tomli`)。
|
|
11
|
+
- 型ヒントを付ける(mypy は `disallow_untyped_defs`)。line length 100。
|
|
12
|
+
- 新しい command / option / field は先に `SPEC.md` を更新し、`sync-docs` skill の表に沿って
|
|
13
|
+
文書と skill を揃える。command は合計 25 を超えない。
|
|
14
|
+
- 新しい永続 entity、ID 空間、ledger、作成前のゲートを足さない(SPEC §1.2)。
|
|
15
|
+
|
|
16
|
+
## テスト
|
|
17
|
+
|
|
18
|
+
- 受け入れ基準(SPEC §13.2)ごとにテストがある。挙動を変えたら対応するテストを直す。
|
|
19
|
+
- CLI は `tests/conftest.py` の `cli` fixture(`runops.cli.main` を呼び exit code と出力を返す)、
|
|
20
|
+
Slurm は `fake_slurm`、project は `project_dir`(generic simulator と `demo` case)を使う。
|
|
21
|
+
- job.sh は `tests/golden/`、v1 移行は `tests/fixtures/v1-project/` を使う。
|
|
22
|
+
- 実際の Slurm、ネットワーク、計算ノードを必要とするテストを書かない。
|
|
23
|
+
|
|
24
|
+
## Git
|
|
25
|
+
|
|
26
|
+
- 1 コミット 1 論理変更。message は英語の Conventional Commits(`feat:`, `fix:`, `docs:` ...)。
|
|
27
|
+
- main-first。大きな変更だけ branch を切る。`--no-verify`、`--force`、`git reset --hard` は使わない。
|
|
28
|
+
- コミットや push はユーザーの依頼があるときだけ行う。
|
|
29
|
+
|
|
30
|
+
## リリース
|
|
31
|
+
|
|
32
|
+
`release` skill に従う。`pyproject.toml` と `src/runops/__init__.py` の version を同時に更新する。
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Gotchas
|
|
2
|
+
|
|
3
|
+
## KUDPC の Lustre は RENAME_NOREPLACE に未対応
|
|
4
|
+
|
|
5
|
+
`/LARGE0`、`/LARGE1` では `renameat2(RENAME_NOREPLACE)` が EINVAL を返す。
|
|
6
|
+
`util.move_noreplace` は存在確認 + `rename` に落とす。`/tmp` 上のテストだけでは
|
|
7
|
+
この経路を通らないので、filesystem を触る変更は `--basetemp=/LARGE0/...` でも確認する。
|
|
8
|
+
|
|
9
|
+
## importlib.metadata のキャッシュ
|
|
10
|
+
|
|
11
|
+
`.venv` の dist-info 一覧は directory の mtime でキャッシュされる。Lustre の mtime は秒単位のため、
|
|
12
|
+
同じ秒に入れ替えた package を見落とす。`registry._entry_point` は探索前に
|
|
13
|
+
`importlib.invalidate_caches()` と `MetadataPathFinder.invalidate_caches()` を呼ぶ
|
|
14
|
+
(Python 3.10 では前者だけでは metadata のキャッシュが消えない)。`.pth`(editable install)を効かせるため
|
|
15
|
+
`sys.path.append` ではなく `site.addsitedir` を使う。
|
|
16
|
+
|
|
17
|
+
## project ローカル adapter の module 名
|
|
18
|
+
|
|
19
|
+
`adapters/X.py` は `runops_project_adapters.X` として読み込まれる。同じ process で別 project を
|
|
20
|
+
開くと `sys.modules` が上書きされる(テストでは問題にならないが、長寿命 process では注意)。
|
|
21
|
+
|
|
22
|
+
## typer の `standalone_mode=False`
|
|
23
|
+
|
|
24
|
+
`main()` は `app(..., standalone_mode=False)` で呼ぶため、`typer.Exit` は例外ではなく戻り値の
|
|
25
|
+
終了コードになる。`--version` の callback も同じ経路を通る。
|
|
26
|
+
|
|
27
|
+
## ログインノードでの実行
|
|
28
|
+
|
|
29
|
+
pytest は軽量なのでログインノードで実行してよい。simulator の build(`runo build`、
|
|
30
|
+
`local_source`)や他 repo の重いテストは、各 repo の規約に従い計算ノード(`tssrun`)で行う。
|
|
31
|
+
|
|
32
|
+
## v1 project を触るとき
|
|
33
|
+
|
|
34
|
+
実運用の v1 project(例: `~/large1/project_dust_release`)には `runo migrate-v1 --dry-run` だけを
|
|
35
|
+
実行する。適用は `work/`、`.venv`、`refs/`、`materials/` を除いたコピーで行う。v1 の
|
|
36
|
+
`.runops/work/<build>/src` は simulator repo の git worktree のことがある(migrate が
|
|
37
|
+
`git worktree repair` する)。
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: check
|
|
3
|
+
description: "Run runops quality gates (ruff format, ruff check, mypy, pytest with branch coverage) after code changes, and the extra checks for filesystem, adapter, or migration changes. Report pass/fail per step and fix failures."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Read `.agents/skills/check/SKILL.md` and follow it. That file is the single source for this skill; files it references are relative to `.agents/skills/check/`.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: improve-harness
|
|
3
|
+
description: "Audit or improve the runops agent harnesses: the development harness of this repository (AGENTS.md, .agents/skills, .claude, .codex) and the project harness runops generates (src/runops/harness.py, src/runops/skills). Use when instructions drift from the code, repeat friction appears, or a new workflow needs a skill."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Read `.agents/skills/improve-harness/SKILL.md` and follow it. That file is the single source for this skill; files it references are relative to `.agents/skills/improve-harness/`.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: python-package-refactor
|
|
3
|
+
description: Safely refactor Python packages and libraries with repository inspection, public API preservation, import-boundary cleanup, packaging modernization, tests, typing, linting, and behavior-preserving code changes. Use when working on Python package architecture, module layout, pyproject/setup configuration, dependency boundaries, circular imports, API compatibility, large-module decomposition, or refactoring pull requests. Do not use for isolated Python snippets or unrelated bug fixes unless the user asks for package-level refactoring.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Read `.agents/skills/python-package-refactor/SKILL.md` and follow it. That file is the single source for this skill; files it references are relative to `.agents/skills/python-package-refactor/`.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release
|
|
3
|
+
description: "Prepare and publish a new runops release from main. Bump version, sync __init__.py, draft Japanese release notes, push main, tag the release commit, create GitHub Release, and verify PyPI publish."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Read `.agents/skills/release/SKILL.md` and follow it. That file is the single source for this skill; files it references are relative to `.agents/skills/release/`.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: simulator-adapter
|
|
3
|
+
description: "Add or update runops v2 support in a simulator's own Python package (runops.adapters entry point, agent_context_dir packaging, tests), or adjust runops.legacy_adapters. Use when a simulator such as MPIEMSES3D, BEACH, or a new code needs to work with runops."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Read `.agents/skills/simulator-adapter/SKILL.md` and follow it. That file is the single source for this skill; files it references are relative to `.agents/skills/simulator-adapter/`.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec-reviewer
|
|
3
|
+
description: "Review runops changes against SPEC.md: design principles, command budget, manifest/state semantics, adapter contract, filesystem safety, and missing acceptance tests. Use before merging non-trivial changes."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Read `.agents/skills/spec-reviewer/SKILL.md` and follow it. That file is the single source for this skill; files it references are relative to `.agents/skills/spec-reviewer/`.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sync-docs
|
|
3
|
+
description: "Keep runops specs, user docs, and agent-facing text consistent after a change to commands, options, config fields, manifest fields, adapter contract, or project layout. Use before committing such a change."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Read `.agents/skills/sync-docs/SKILL.md` and follow it. That file is the single source for this skill; files it references are relative to `.agents/skills/sync-docs/`.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Codex CLI harness — runops
|
|
2
|
+
|
|
3
|
+
runops 開発リポジトリ用の Codex 設定。Claude Code と同じ正本を共有する。
|
|
4
|
+
|
|
5
|
+
| 目的 | 正本 | Codex の入口 | Claude Code の入口 |
|
|
6
|
+
|---|---|---|---|
|
|
7
|
+
| project doc | `AGENTS.md` | `AGENTS.md` | `CLAUDE.md`(`@AGENTS.md`) |
|
|
8
|
+
| 規約 | `.claude/rules/*.md` | `AGENTS.md` の表から参照 | 自動で読まれる |
|
|
9
|
+
| 定型作業 | `.agents/skills/<name>/SKILL.md` | `$name` / 自動発火 | `.claude/skills/<name>/SKILL.md`(正本を指す入口) |
|
|
10
|
+
| 専門 agent | `.agents/skills/spec-reviewer/SKILL.md` | `.codex/agents/spec-reviewer.toml` | `.claude/agents/spec-reviewer.md` |
|
|
11
|
+
| 実行 policy | — | `.codex/config.toml`、`.codex/rules/runops.rules` | `.claude/settings.json` |
|
|
12
|
+
|
|
13
|
+
`tests/test_dev_harness.py` が入口と正本の対応を検査する。skill を足すときは
|
|
14
|
+
`.agents/skills/` に書き、`.claude/skills/` には同じ frontmatter の入口だけを置く。
|
|
15
|
+
|
|
16
|
+
`.codex/config.toml` は project を trusted に登録したときだけ読まれる:
|
|
17
|
+
|
|
18
|
+
```toml
|
|
19
|
+
[projects."<このリポジトリの絶対パス>"]
|
|
20
|
+
trust_level = "trusted"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
この repository では unattended な保守作業を優先し、`sandbox_mode = "danger-full-access"`、
|
|
24
|
+
`approval_policy = "never"` を共有設定にしている。高コスト・不可逆な command は
|
|
25
|
+
`.codex/rules/runops.rules` で prompt / forbidden にする。
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
name = "spec-reviewer"
|
|
2
|
+
description = "Review runops changes against SPEC.md: design principles, command budget, manifest/state semantics, adapter contract, filesystem safety, and missing acceptance tests. Use before merging non-trivial changes."
|
|
3
|
+
developer_instructions = """
|
|
4
|
+
Read `.agents/skills/spec-reviewer/SKILL.md` and review the requested change as it instructs.
|
|
5
|
+
Do not edit files; report findings only.
|
|
6
|
+
"""
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Codex execpolicy rules for the runops development repository.
|
|
2
|
+
#
|
|
3
|
+
# Only high-cost or irreversible command prefixes live here. Workflow guidance is
|
|
4
|
+
# in AGENTS.md, .claude/rules/*.md and .agents/skills/.
|
|
5
|
+
|
|
6
|
+
prefix_rule(
|
|
7
|
+
pattern = ["runo", "submit"],
|
|
8
|
+
decision = "prompt",
|
|
9
|
+
justification = "Submitting spends HPC allocation; confirm targets and resources first.",
|
|
10
|
+
match = ["runo submit R20261015-0001", "runo submit --all runs/case"],
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
prefix_rule(
|
|
14
|
+
pattern = ["uv", "run", "runo", "submit"],
|
|
15
|
+
decision = "prompt",
|
|
16
|
+
justification = "Submitting spends HPC allocation; confirm targets and resources first.",
|
|
17
|
+
match = ["uv run runo submit R20261015-0001"],
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
prefix_rule(
|
|
21
|
+
pattern = ["runo", "delete"],
|
|
22
|
+
decision = "prompt",
|
|
23
|
+
justification = "Deleting a run removes its directory.",
|
|
24
|
+
match = ["runo delete R20261015-0001"],
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
prefix_rule(
|
|
28
|
+
pattern = ["runo", "tidy", "--apply"],
|
|
29
|
+
decision = "prompt",
|
|
30
|
+
justification = "tidy --apply deletes or archives runs.",
|
|
31
|
+
match = ["runo tidy --apply", "runo tidy --apply --only expired-scratch"],
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
prefix_rule(
|
|
35
|
+
pattern = ["runo", "migrate-v1"],
|
|
36
|
+
decision = "prompt",
|
|
37
|
+
justification = "Migration rewrites a project; run --dry-run and review first.",
|
|
38
|
+
match = ["runo migrate-v1 -y"],
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
prefix_rule(
|
|
42
|
+
pattern = ["rm", "-rf"],
|
|
43
|
+
decision = "forbidden",
|
|
44
|
+
justification = "Avoid broad recursive deletion; use runo delete / tidy.",
|
|
45
|
+
match = ["rm -rf runs/case"],
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
prefix_rule(
|
|
49
|
+
pattern = ["git", "push", "origin", "main"],
|
|
50
|
+
decision = "allow",
|
|
51
|
+
justification = "runops is main-first; push only after local quality gates and when the user asked.",
|
|
52
|
+
match = ["git push origin main"],
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
prefix_rule(
|
|
56
|
+
pattern = ["git", "push", "--force"],
|
|
57
|
+
decision = "forbidden",
|
|
58
|
+
justification = "Force-pushing rewrites shared history.",
|
|
59
|
+
match = ["git push --force", "git push --force origin main"],
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
prefix_rule(
|
|
63
|
+
pattern = ["git", "reset", "--hard"],
|
|
64
|
+
decision = "forbidden",
|
|
65
|
+
justification = "Hard reset discards local work.",
|
|
66
|
+
match = ["git reset --hard", "git reset --hard HEAD~1"],
|
|
67
|
+
)
|