feat(cli): aura nodes new — node-crate scaffold + attach (#241 T5-T6)

- New clap family `aura nodes new <name> [--engine-path] [--namespace]`:
  scaffolds a node crate as a SIBLING of the project root (Cargo.toml
  with the aura-core path-dep, the parameterized Scale starter node,
  roster macro, crate-scoped .gitignore + CLAUDE.md, own git repo) and
  appends the `[nodes] crates = ["../<name>"]` pointer to the project's
  Aura.toml. Refuses outside a project, on any existing [nodes] section
  (incl. an empty crates array), and on an existing destination; joins
  the load-phase bypass beside `aura new` (a scaffolder must work in an
  unbuilt tree).
- The old single-tier scaffold() is gone; the crate templates live on
  in scaffold_node_crate; dead-code bridges removed with their callers.
- tests/project_nodes.rs: attach + refusals + namespace override + the
  full role-2 loop (scaffold, cargo build, vocabulary resolves
  <ns>::Scale end to end).
- tests/project_sweep_campaign.rs fixture reworked to the two-tier
  shape (aura new + aura nodes new --namespace knob_lab); the two
  campaign acceptance tests are byte-unchanged and green.

refs #241
This commit is contained in:
2026-07-12 17:08:47 +02:00
parent 3932333e19
commit 23bb978bf2
5 changed files with 329 additions and 71 deletions
-5
View File
@@ -216,11 +216,6 @@ fn parse_aura_toml(root: &Path) -> Result<AuraToml, ProjectError> {
/// Read a project's `Aura.toml` (for scaffold-side tooling that must not
/// trigger a crate load, e.g. `aura nodes new`).
///
/// `dead_code` is allowed here only until that consumer lands — remove the
/// allow with the first caller, at which point genuine unuse must surface
/// again.
#[allow(dead_code)]
pub fn read_aura_toml(root: &Path) -> Result<AuraToml, ProjectError> {
parse_aura_toml(root)
}