src/main.rs defines the CLI entrypoint and Clap command tree. Command implementations live in src/commands/; larger generators use submodules such as src/commands/generate_constraint/ and src/commands/generate_domain/. Shared support code sits in files like src/error.rs, src/output.rs, src/rc.rs, and src/template.rs. Integration tests live in tests/, and scaffold/template assets live in templates/.
solverforge-cli is the default entry point for new SolverForge applications. Treat the CLI as its own versioned product, distinct from the runtime crates and UI assets that generated projects target.
Current scaffold policy:
- generated projects currently target
solverforge 0.8.5,solverforge-ui 0.4.3, andsolverforge-maps 2.1.3as their crate dependency versions solverforge new <name>is the only public scaffold path and produces a neutral shell- users shape the app afterward through facts, entities, variables, constraints, and generated data
- generated docs and CLI version output must distinguish CLI version from scaffold runtime/UI target
When changing templates or scaffold behavior, follow the current repo reality over older starter-template assumptions.
cargo build: compile thesolverforgebinary.cargo run -- --help: run the CLI locally and inspect commands.cargo test: run Rust unit tests, scaffold contract tests, and generated-app runtime pipeline tests.cargo test --test runtime_pipeline_test -- --nocapture --test-threads=1: run the phase-marked runtime pipeline suite directly.make test-runtime: run only the generated-app runtime pipeline tests.make install-e2e: install Playwright Chromium locally.make test-e2e: run Playwright browser tests against ephemeral generated apps.make test-full: run the Rust suite, runtime pipeline suite, and Playwright suite in order.cargo fmt --all: apply Rust formatting.cargo clippy --all-targets -- -D warnings: enforce lint-clean code.pre-commit run --all-files: run the repository hooks, including YAML checks,gitleaks,fmt, andclippy.
Use standard Rust style with 4-space indentation and rustfmt output as the source of truth. Prefer snake_case for modules, files, functions, and test names; use PascalCase for types and enums. Keep CLI flags, generated file names, and module names descriptive and consistent with existing commands such as generate_constraint and sf_config.
Add narrow unit tests close to the code in sibling test files or #[cfg(test)] child modules when validating parsing, rewriting, or template helpers. Put end-to-end CLI behavior in tests/, following existing names like *_test.rs and test_* functions. When changing scaffolding or generated code, cover both file creation and key output content assertions.
Prefer a small number of readable, high-signal end-to-end phases over a large number of narrow tests. The main generated-app suites are:
tests/scaffold_test.rs: scaffold contract and generatedcargo checktests/runtime_pipeline_test.rs: phase-marked generated-app runtime pipelinestests/e2e/*.spec.js: Playwright browser pipelines against ephemeral generated apps
Both runtime and browser suites must:
- scaffold fresh temp apps through the real CLI
- mutate them through the real CLI
- boot generated servers on random ports
- preserve failure artifacts under
target/test-artifacts/ - keep phase boundaries explicit in code and logs
Current end-to-end scenario policy:
- neutral shell is covered as a bootable empty app
- mixed is covered as generated shape plus runtime/browser surface
- seeded solver execution is covered in the standard-only scenario
Do not claim mixed seeded solving is supported until the underlying runtime actually supports that combination.
For scaffold changes, prefer assertions that check the generated contract directly:
- dependency wiring for
solverforge,solverforge-ui, andsolverforge-maps - CLI version vs runtime target messaging
- generated README version/runtime source disclosure
- typed solver SSE payload shape and typed frontend hooks
solverforge generate dataownership boundaries:src/data/mod.rsis a stable wrapper andsrc/generated/data_seed.rsis compiler-owned- scaffolded
cargo checkagainst the current local runtime/UI/maps worktrees when those sibling repos are present, otherwise against the published crate targets
Follow the commit style already used in history: fix: ..., refactor: ..., style: ..., chore: .... Keep commits scoped to one behavior change. PRs should explain user-visible CLI impact, list verification commands run, and link the relevant issue. Include concrete examples when flags, generated files, or template output change.
Do not commit generated projects, secrets, or credentials. The pre-commit config runs gitleaks; keep it enabled. When tests or generated scaffolds touch published SolverForge crate versions, verify Cargo.toml template changes and corresponding integration tests together.
Generated apps should behave like production references, not toy demos.
Keep these rules aligned across the single neutral scaffold and all generated domain shapes that users create afterward:
- backend services track best solution separately from live status telemetry
- status endpoints return
currentScore,bestScore, solver status, and latest snapshot revision - SSE payloads carry typed lifecycle metadata including
eventType,eventSequence,lifecycleState, andsnapshotRevision - retained lifecycle events include
progress,best_solution,pause_requested,paused,resumed,completed,cancelled, andfailed - frontends use lifecycle-aware hooks including
onProgress(meta),onSolution(snapshot, meta),onPaused(snapshot, meta),onResumed(meta),onCancelled(snapshot, meta),onComplete(snapshot, meta), andonFailure(message, meta, snapshot, analysis) - snapshot-bound analysis and retained
/jobs/{id}/snapshotflows stay aligned with the shared UI backend contract - progress-only events update status, not the rendered board
Do not reintroduce:
- raw top-level score-only progress payloads
- starter-specific solve/render lifecycles
- docs that blur CLI version with runtime/UI target
Test harness notes:
- ephemeral generated apps should be the default validation path; do not rely on manually scaffolded directories for routine testing
- runtime/browser failures should leave actionable logs and artifacts under
target/test-artifacts/ - phase output should remain human-readable and ordered, even when tests grow