Twelve scripts retired, three domains registered. `reach` now covers nine. generate: `generate-brands` and `generate-corporations` were the second and third copies of the same 24-line build-if-missing-then-exec bash `tooling/atlas` carried, so they collapsed into `core.process.cargo_binary` rather than being ported. `import_economics` shelled out to the first of those, so it now calls that helper — `generated_brands.toml` comes back byte-identical, and the stamp registry swaps the retired wrapper for `core/process.py`. pr: `watchlist-diff` derives its watched set from `generator_sources.py` instead of restating it, so it cannot drift from the stamp check. dev: the environment scripts split decision from performing, per D-263's guarded-exec rule. `godot_plan()` and `worktree_plan()` decide what would happen; `install_godot()`, `install_rust()` and `setup_worktree()` do it. `tooling/test_environment.py` pins the version pin, both override precedences, the already-current skip, the platform refusal and both worktree refusals — none of them performed. `make setup` now installs reach first, since the targets that install rust and godot are reach verbs. Two live bugs found while porting: - The clerk read its decision index from `decisions/README.md`, a path that stopped existing when the DQR tree moved to `governance/`. Every clerk agent has been grepping blind; its prompt pointed at the same dead directory. - The conformance exec-check matched any `x.system()` regardless of receiver, so `platform.system()` read as `os.system()`. Narrowed and re-proved against a real mutant. `process.run` gains `input=`, `timeout=` and a `ProcessTimeout` subclass so a killed run stays distinguishable from a verdict. The pre-push hook no longer merges the clerk's stderr into its stdout — under streaming the last merged line is a JSONL event, which would read as an unrecognised verdict and block. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
"""Transport for the `generate` domain — args in, delegate, format out."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import typer
|
|
|
|
from tooling.core import cli, console, process
|
|
from tooling.core.command import command
|
|
from tooling.domains.generate import character_manifest, corp_stubs
|
|
|
|
app = cli.domain("generate", "Content generators — brands, corporations, manifests.")
|
|
|
|
|
|
@app.callback()
|
|
def _domain() -> None:
|
|
"""Keeps `generate` a group (Typer collapses a single-command app)."""
|
|
|
|
|
|
@app.command("brands")
|
|
@command
|
|
def brands(args: list[str] = typer.Argument(None, help="Passed to the binary.")) -> None:
|
|
"""Refresh wiki/economics/corporations/generated_brands.toml.
|
|
|
|
Note this is also a SUBROUTINE of import_economics rather than only a
|
|
standalone verb: `make regen-db` shells out to the same binary as its first
|
|
step, which is why changes to its Rust source invalidate the systems.db
|
|
stamp even though no Python changed (.claude/rules/asset-pipeline.md).
|
|
"""
|
|
output = process.cargo_binary("generate_brands", *(args or []))
|
|
if output.strip():
|
|
console.out(output.rstrip())
|
|
|
|
|
|
@app.command("corporations")
|
|
@command
|
|
def corporations(
|
|
args: list[str] = typer.Argument(None, help="Passed to the binary."),
|
|
) -> None:
|
|
"""Generate corporation records."""
|
|
output = process.cargo_binary("generate_corporations", *(args or []))
|
|
if output.strip():
|
|
console.out(output.rstrip())
|
|
|
|
|
|
@app.command("character-manifest")
|
|
@command
|
|
def manifest() -> None:
|
|
"""Regenerate assets/characters/manifest.json from the asset directories."""
|
|
character_manifest.run()
|
|
|
|
|
|
@app.command("corp-stubs")
|
|
@command
|
|
def stubs(
|
|
dry_run: bool = typer.Option(False, "--dry-run", help="Report without writing."),
|
|
) -> None:
|
|
"""Write wiki stub pages for corporations that lack one."""
|
|
corp_stubs.run(dry_run=dry_run)
|