runops 2.1.2__tar.gz → 2.1.3__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.
Files changed (131) hide show
  1. {runops-2.1.2 → runops-2.1.3}/PKG-INFO +2 -2
  2. {runops-2.1.2 → runops-2.1.3}/README.md +1 -1
  3. {runops-2.1.2 → runops-2.1.3}/pyproject.toml +1 -1
  4. {runops-2.1.2 → runops-2.1.3}/src/runops/__init__.py +1 -1
  5. {runops-2.1.2 → runops-2.1.3}/src/runops/cli.py +6 -1
  6. {runops-2.1.2 → runops-2.1.3}/src/runops/ops/setup.py +10 -3
  7. {runops-2.1.2 → runops-2.1.3}/tests/test_setup_misc.py +25 -0
  8. {runops-2.1.2 → runops-2.1.3}/uv.lock +1 -1
  9. {runops-2.1.2 → runops-2.1.3}/.agents/skills/check/SKILL.md +0 -0
  10. {runops-2.1.2 → runops-2.1.3}/.agents/skills/improve-harness/SKILL.md +0 -0
  11. {runops-2.1.2 → runops-2.1.3}/.agents/skills/python-package-refactor/SKILL.md +0 -0
  12. {runops-2.1.2 → runops-2.1.3}/.agents/skills/python-package-refactor/agents/openai.yaml +0 -0
  13. {runops-2.1.2 → runops-2.1.3}/.agents/skills/python-package-refactor/examples/refactor-request.md +0 -0
  14. {runops-2.1.2 → runops-2.1.3}/.agents/skills/python-package-refactor/references/anti-patterns.md +0 -0
  15. {runops-2.1.2 → runops-2.1.3}/.agents/skills/python-package-refactor/references/api-compatibility.md +0 -0
  16. {runops-2.1.2 → runops-2.1.3}/.agents/skills/python-package-refactor/references/packaging-modernization.md +0 -0
  17. {runops-2.1.2 → runops-2.1.3}/.agents/skills/python-package-refactor/references/refactor-playbook.md +0 -0
  18. {runops-2.1.2 → runops-2.1.3}/.agents/skills/python-package-refactor/references/verification.md +0 -0
  19. {runops-2.1.2 → runops-2.1.3}/.agents/skills/python-package-refactor/scripts/api_surface_snapshot.py +0 -0
  20. {runops-2.1.2 → runops-2.1.3}/.agents/skills/python-package-refactor/scripts/import_smoke.py +0 -0
  21. {runops-2.1.2 → runops-2.1.3}/.agents/skills/python-package-refactor/scripts/inspect_python_package.py +0 -0
  22. {runops-2.1.2 → runops-2.1.3}/.agents/skills/python-package-refactor/scripts/refactor_quality_gate.py +0 -0
  23. {runops-2.1.2 → runops-2.1.3}/.agents/skills/release/SKILL.md +0 -0
  24. {runops-2.1.2 → runops-2.1.3}/.agents/skills/simulator-adapter/SKILL.md +0 -0
  25. {runops-2.1.2 → runops-2.1.3}/.agents/skills/spec-reviewer/SKILL.md +0 -0
  26. {runops-2.1.2 → runops-2.1.3}/.agents/skills/sync-docs/SKILL.md +0 -0
  27. {runops-2.1.2 → runops-2.1.3}/.claude/agents/spec-reviewer.md +0 -0
  28. {runops-2.1.2 → runops-2.1.3}/.claude/rules/architecture.md +0 -0
  29. {runops-2.1.2 → runops-2.1.3}/.claude/rules/dev-workflow.md +0 -0
  30. {runops-2.1.2 → runops-2.1.3}/.claude/rules/gotchas.md +0 -0
  31. {runops-2.1.2 → runops-2.1.3}/.claude/settings.json +0 -0
  32. {runops-2.1.2 → runops-2.1.3}/.claude/skills/check/SKILL.md +0 -0
  33. {runops-2.1.2 → runops-2.1.3}/.claude/skills/improve-harness/SKILL.md +0 -0
  34. {runops-2.1.2 → runops-2.1.3}/.claude/skills/python-package-refactor/SKILL.md +0 -0
  35. {runops-2.1.2 → runops-2.1.3}/.claude/skills/release/SKILL.md +0 -0
  36. {runops-2.1.2 → runops-2.1.3}/.claude/skills/simulator-adapter/SKILL.md +0 -0
  37. {runops-2.1.2 → runops-2.1.3}/.claude/skills/spec-reviewer/SKILL.md +0 -0
  38. {runops-2.1.2 → runops-2.1.3}/.claude/skills/sync-docs/SKILL.md +0 -0
  39. {runops-2.1.2 → runops-2.1.3}/.codex/README.md +0 -0
  40. {runops-2.1.2 → runops-2.1.3}/.codex/agents/spec-reviewer.toml +0 -0
  41. {runops-2.1.2 → runops-2.1.3}/.codex/config.toml +0 -0
  42. {runops-2.1.2 → runops-2.1.3}/.codex/rules/runops.rules +0 -0
  43. {runops-2.1.2 → runops-2.1.3}/.dockerignore +0 -0
  44. {runops-2.1.2 → runops-2.1.3}/.gitattributes +0 -0
  45. {runops-2.1.2 → runops-2.1.3}/.github/assets/conversation-dark.svg +0 -0
  46. {runops-2.1.2 → runops-2.1.3}/.github/assets/conversation-light.svg +0 -0
  47. {runops-2.1.2 → runops-2.1.3}/.github/assets/hero-dark.svg +0 -0
  48. {runops-2.1.2 → runops-2.1.3}/.github/assets/hero-light.svg +0 -0
  49. {runops-2.1.2 → runops-2.1.3}/.github/assets/make_readme_art.py +0 -0
  50. {runops-2.1.2 → runops-2.1.3}/.github/workflows/ci.yml +0 -0
  51. {runops-2.1.2 → runops-2.1.3}/.github/workflows/publish.yml +0 -0
  52. {runops-2.1.2 → runops-2.1.3}/.gitignore +0 -0
  53. {runops-2.1.2 → runops-2.1.3}/.harness/manifest.toml +0 -0
  54. {runops-2.1.2 → runops-2.1.3}/.pre-commit-config.yaml +0 -0
  55. {runops-2.1.2 → runops-2.1.3}/.vscode/settings.json +0 -0
  56. {runops-2.1.2 → runops-2.1.3}/AGENTS.md +0 -0
  57. {runops-2.1.2 → runops-2.1.3}/CLAUDE.md +0 -0
  58. {runops-2.1.2 → runops-2.1.3}/LICENSE +0 -0
  59. {runops-2.1.2 → runops-2.1.3}/SPEC.md +0 -0
  60. {runops-2.1.2 → runops-2.1.3}/docs/adapter.md +0 -0
  61. {runops-2.1.2 → runops-2.1.3}/docs/reference.md +0 -0
  62. {runops-2.1.2 → runops-2.1.3}/src/runops/adapters/__init__.py +0 -0
  63. {runops-2.1.2 → runops-2.1.3}/src/runops/adapters/base.py +0 -0
  64. {runops-2.1.2 → runops-2.1.3}/src/runops/adapters/generic.py +0 -0
  65. {runops-2.1.2 → runops-2.1.3}/src/runops/adapters/registry.py +0 -0
  66. {runops-2.1.2 → runops-2.1.3}/src/runops/case.py +0 -0
  67. {runops-2.1.2 → runops-2.1.3}/src/runops/config.py +0 -0
  68. {runops-2.1.2 → runops-2.1.3}/src/runops/errors.py +0 -0
  69. {runops-2.1.2 → runops-2.1.3}/src/runops/harness.py +0 -0
  70. {runops-2.1.2 → runops-2.1.3}/src/runops/jobgen.py +0 -0
  71. {runops-2.1.2 → runops-2.1.3}/src/runops/launchers.py +0 -0
  72. {runops-2.1.2 → runops-2.1.3}/src/runops/legacy_adapters/__init__.py +0 -0
  73. {runops-2.1.2 → runops-2.1.3}/src/runops/legacy_adapters/beach.py +0 -0
  74. {runops-2.1.2 → runops-2.1.3}/src/runops/legacy_adapters/emses.py +0 -0
  75. {runops-2.1.2 → runops-2.1.3}/src/runops/manifest.py +0 -0
  76. {runops-2.1.2 → runops-2.1.3}/src/runops/ops/__init__.py +0 -0
  77. {runops-2.1.2 → runops-2.1.3}/src/runops/ops/common.py +0 -0
  78. {runops-2.1.2 → runops-2.1.3}/src/runops/ops/create.py +0 -0
  79. {runops-2.1.2 → runops-2.1.3}/src/runops/ops/listing.py +0 -0
  80. {runops-2.1.2 → runops-2.1.3}/src/runops/ops/migrate.py +0 -0
  81. {runops-2.1.2 → runops-2.1.3}/src/runops/ops/notes.py +0 -0
  82. {runops-2.1.2 → runops-2.1.3}/src/runops/ops/skills.py +0 -0
  83. {runops-2.1.2 → runops-2.1.3}/src/runops/ops/submit.py +0 -0
  84. {runops-2.1.2 → runops-2.1.3}/src/runops/ops/sync.py +0 -0
  85. {runops-2.1.2 → runops-2.1.3}/src/runops/ops/tidy.py +0 -0
  86. {runops-2.1.2 → runops-2.1.3}/src/runops/project.py +0 -0
  87. {runops-2.1.2 → runops-2.1.3}/src/runops/runtime.py +0 -0
  88. {runops-2.1.2 → runops-2.1.3}/src/runops/skills/runops-check-status/SKILL.md +0 -0
  89. {runops-2.1.2 → runops-2.1.3}/src/runops/skills/runops-create-run/SKILL.md +0 -0
  90. {runops-2.1.2 → runops-2.1.3}/src/runops/skills/runops-maintain/SKILL.md +0 -0
  91. {runops-2.1.2 → runops-2.1.3}/src/runops/skills/runops-reference/SKILL.md +0 -0
  92. {runops-2.1.2 → runops-2.1.3}/src/runops/skills/runops-tidy/SKILL.md +0 -0
  93. {runops-2.1.2 → runops-2.1.3}/src/runops/slurm.py +0 -0
  94. {runops-2.1.2 → runops-2.1.3}/src/runops/util.py +0 -0
  95. {runops-2.1.2 → runops-2.1.3}/tests/__init__.py +0 -0
  96. {runops-2.1.2 → runops-2.1.3}/tests/conftest.py +0 -0
  97. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/.codex/rules/a.md +0 -0
  98. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/.runops/test-runs/T20260701-0001/receipt.toml +0 -0
  99. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/.runops/work/beach-x-abc/bin/beach +0 -0
  100. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/AGENTS.md +0 -0
  101. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/CLAUDE.md +0 -0
  102. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/cases/beach/plane/beach.toml +0 -0
  103. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/cases/beach/plane/case.toml +0 -0
  104. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/cases/old/beach.toml +0 -0
  105. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/cases/old/case.toml +0 -0
  106. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/launchers.toml +0 -0
  107. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/research/CURRENT.md +0 -0
  108. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/runops.toml +0 -0
  109. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/runs/AGENTS.md +0 -0
  110. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/runs/_archive/plane/R20260601-0001/manifest.toml +0 -0
  111. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/runs/plane/R20260701-0001--a/input/beach.toml +0 -0
  112. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/runs/plane/R20260701-0001--a/manifest.toml +0 -0
  113. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/runs/plane/R20260702-0001/manifest.toml +0 -0
  114. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/runs/scan/R20260701-0002/manifest.toml +0 -0
  115. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/runs/scan/survey.toml +0 -0
  116. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/simulators.toml +0 -0
  117. {runops-2.1.2 → runops-2.1.3}/tests/fixtures/v1-project/site.toml +0 -0
  118. {runops-2.1.2 → runops-2.1.3}/tests/golden/mpi_standard.sh +0 -0
  119. {runops-2.1.2 → runops-2.1.3}/tests/golden/openmp_rsc.sh +0 -0
  120. {runops-2.1.2 → runops-2.1.3}/tests/test_adapters.py +0 -0
  121. {runops-2.1.2 → runops-2.1.3}/tests/test_build.py +0 -0
  122. {runops-2.1.2 → runops-2.1.3}/tests/test_dev_harness.py +0 -0
  123. {runops-2.1.2 → runops-2.1.3}/tests/test_jobgen.py +0 -0
  124. {runops-2.1.2 → runops-2.1.3}/tests/test_legacy_adapters.py +0 -0
  125. {runops-2.1.2 → runops-2.1.3}/tests/test_lifecycle.py +0 -0
  126. {runops-2.1.2 → runops-2.1.3}/tests/test_manifest_config.py +0 -0
  127. {runops-2.1.2 → runops-2.1.3}/tests/test_migrate.py +0 -0
  128. {runops-2.1.2 → runops-2.1.3}/tests/test_scratch_tidy.py +0 -0
  129. {runops-2.1.2 → runops-2.1.3}/tests/test_skills.py +0 -0
  130. {runops-2.1.2 → runops-2.1.3}/tests/test_sweep.py +0 -0
  131. {runops-2.1.2 → runops-2.1.3}/tests/test_sync_evidence.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: runops
3
- Version: 2.1.2
3
+ Version: 2.1.3
4
4
  Summary: Run ledger and Slurm job submission for HPC simulation projects
5
5
  Project-URL: Homepage, https://github.com/Nkzono99/runops
6
6
  Project-URL: Documentation, https://github.com/Nkzono99/runops/blob/main/docs/reference.md
@@ -111,7 +111,7 @@ run は ID が変わらないので、directory を移動してもエージェ
111
111
  | simulator | package | 状態 |
112
112
  |---|---|---|
113
113
  | MPIEMSES3D | `mpiemses3d-tools` ≥ 4.20 | adapter とエージェント向け skill を同梱 |
114
- | BEACH | `beach-bem` | 次のリリースで同梱。それまでは runops 内蔵の adapter を使用 |
114
+ | BEACH | `beach-bem` ≥ 3.0 | adapter とエージェント向け skill を同梱 |
115
115
  | その他 | 自作の adapter、または `generic` | [adapter ガイド](https://github.com/Nkzono99/runops/blob/main/docs/adapter.md) |
116
116
 
117
117
  ---
@@ -80,7 +80,7 @@ run は ID が変わらないので、directory を移動してもエージェ
80
80
  | simulator | package | 状態 |
81
81
  |---|---|---|
82
82
  | MPIEMSES3D | `mpiemses3d-tools` ≥ 4.20 | adapter とエージェント向け skill を同梱 |
83
- | BEACH | `beach-bem` | 次のリリースで同梱。それまでは runops 内蔵の adapter を使用 |
83
+ | BEACH | `beach-bem` ≥ 3.0 | adapter とエージェント向け skill を同梱 |
84
84
  | その他 | 自作の adapter、または `generic` | [adapter ガイド](https://github.com/Nkzono99/runops/blob/main/docs/adapter.md) |
85
85
 
86
86
  ---
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "runops"
7
- version = "2.1.2"
7
+ version = "2.1.3"
8
8
  description = "Run ledger and Slurm job submission for HPC simulation projects"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -1,3 +1,3 @@
1
1
  """runops: run ledger and Slurm job submission for HPC simulation projects."""
2
2
 
3
- __version__ = "2.1.2"
3
+ __version__ = "2.1.3"
@@ -152,7 +152,12 @@ def init(
152
152
  report = init_project(root, sims, site=site, name=name, install=install)
153
153
  if report.site_detected:
154
154
  out.print(f"site: {report.site} (guessed from host {hostname()}; use --site to change)")
155
- if not install and not no_install:
155
+ if report.install_failed:
156
+ err.print(
157
+ "[yellow]the project is ready, but simulator packages are not installed; "
158
+ "ask your agent to fix the install, or run `runo update` after fixing it[/]"
159
+ )
160
+ elif not install and not no_install:
156
161
  out.print("packages not installed; ask your agent or run `runo update` later")
157
162
  for item in report.created:
158
163
  out.print(f"created {item}")
@@ -30,7 +30,7 @@ from runops.runtime import package_specs, resolve_runtime
30
30
  # Package specs for simulators whose adapter lives in their own package.
31
31
  KNOWN_PACKAGES = {
32
32
  "emses": "MPIEMSES3D @ git+https://github.com/CS12-Laboratory/MPIEMSES3D.git",
33
- "beach": "beach-bem",
33
+ "beach": "beach-bem>=3.0", # 3.0 ships the runops adapter and skills
34
34
  }
35
35
  KNOWN_EXECUTABLES = {"emses": "mpiemses3D", "beach": "beach"}
36
36
 
@@ -109,6 +109,7 @@ class InitReport:
109
109
  root: Path
110
110
  site: str = ""
111
111
  site_detected: bool = False
112
+ install_failed: bool = False
112
113
  created: list[str] = field(default_factory=list)
113
114
  installed: list[str] = field(default_factory=list)
114
115
  warnings: list[str] = field(default_factory=list)
@@ -190,8 +191,14 @@ def init_project(
190
191
 
191
192
  project = Project(load_config(root))
192
193
  if install:
193
- report.installed, warnings = install_packages(project, upgrade=False)
194
- report.warnings += warnings
194
+ # A failed install must not leave a half-made project: runops.toml is
195
+ # already written, so finish the agent files and let `runo update` retry.
196
+ try:
197
+ report.installed, warnings = install_packages(project, upgrade=False)
198
+ report.warnings += warnings
199
+ except RunopsError as exc:
200
+ report.install_failed = True
201
+ report.warnings.append(f"package install failed: {exc}")
195
202
  report.created += add_legacy_adapters(project)
196
203
  report.warnings += refresh_agent_files(project)
197
204
  report.created += ["AGENTS.md", "CLAUDE.md", ".agents/skills/", ".claude/skills/"]
@@ -211,3 +211,28 @@ def test_init_install_needs_yes_off_terminal(
211
211
  res = cli("init", "emses")
212
212
  assert res.code == 2 and "--yes" in res.err
213
213
  assert not (tmp_path / "runops.toml").exists()
214
+
215
+
216
+ def test_init_finishes_when_install_fails(
217
+ tmp_path: Path, monkeypatch: pytest.MonkeyPatch, cli
218
+ ) -> None: # type: ignore[no-untyped-def]
219
+ from runops.errors import RunError
220
+
221
+ def failing_install(project, *, upgrade): # type: ignore[no-untyped-def]
222
+ raise RunError("package install failed:\nerror: fpm not found")
223
+
224
+ monkeypatch.setattr("runops.ops.setup.install_packages", failing_install)
225
+ monkeypatch.chdir(tmp_path)
226
+ res = cli("init", "beach", "-y")
227
+ assert res.code == 0, res.err
228
+ assert "fpm not found" in res.err
229
+ assert "runo update" in res.err
230
+ for name in (
231
+ "runops.toml",
232
+ "AGENTS.md",
233
+ "CLAUDE.md",
234
+ ".agents/skills/runops-maintain/SKILL.md",
235
+ ):
236
+ assert (tmp_path / name).exists(), name
237
+ assert load_toml(tmp_path / "runops.toml")["simulators"]["beach"]["package"] == "beach-bem>=3.0"
238
+ assert (tmp_path / "adapters/beach.py").is_file() # no entry point yet -> bundled port
@@ -525,7 +525,7 @@ wheels = [
525
525
 
526
526
  [[package]]
527
527
  name = "runops"
528
- version = "2.1.2"
528
+ version = "2.1.3"
529
529
  source = { editable = "." }
530
530
  dependencies = [
531
531
  { name = "jinja2" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes