diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..7b952c1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,96 @@ + + +# Changelog + +## 1.0.0 — 2026-05-01 + +The first stable release. Single binary, single crate, vendored C dependency, +flag-based CLI, live UI. + +### Highlights + +- **One tool, flag options.** `raysense [PATH]` runs a health report by default. + Top-level flags select the mode: `--json`, `--check`, `--watch`, `--ui`, + `--mcp`. Power-user operations (`baseline`, `plugin`, `policy`, `trend`, + `whatif`) live as subcommands so their multi-arg shapes don't pollute the + simple path. +- **Live UI.** `raysense . --ui` starts a tokio + axum HTTP server with SSE + push. The page reloads only when the new scan's content hash differs — + interactive state (filter selections, scroll, click highlights) survives + idle periods. +- **Zero-setup builds.** The C library is vendored under `vendor/rayforce/` + and compiled by `build.rs` via `cc::Build`. No external checkout, no + submodule, no env var. +- **Single crate.** Five workspace crates collapsed into one, with modules + under `src/` and a single `[[bin]]`. + +### Metrics & analysis + +- Coupling, cohesion, instability (Robert Martin), blast radius, + main-sequence distance, attack surface, coupling entropy, file size + entropy, complexity entropy, structural uniformity. +- Cyclomatic and cognitive complexity, body-hash duplication, dead code, + comment ratio. +- Six A–F dimensions: modularity, acyclicity, depth, equality, redundancy, + structural uniformity. One 0–100 quality signal. +- Evolution: bus factor, file ownership, change-coupling pairs, temporal + hotspots (churn × complexity), file age. +- Type facts with base-class extraction (Python and TypeScript via + tree-sitter; line-based fallback for other languages). Inheritance edges + surfaced as their own memory table. +- Test gap analysis with risk-weighted candidates. +- Per-language rule constraint overrides for the per-file rule thresholds. + +### What-if + +- Single-step actions: `remove_file`, `move_file`, `add_edge`, + `remove_edge`, `break_cycle`, plus `break_cycle_recommendations`. +- Typed `Action` enum and `simulate_sequence` for chained simulations, + with indexed `SequenceError` so callers know which step failed. + +### Visualization + +- Color modes: language, mono, lines, churn, age, risk, instability. +- Focus modes: language, directory, entry points, impact radius. +- Edge filter: imports, calls, inherits. +- File-level edge overlay rendered as SVG, color-coded by edge type. +- Click-to-highlight upstream / downstream routes. + +### MCP + +- 43 tools spanning scan, edges, hotspots, architecture, coupling, cycles, + blast radius, level, evolution, dsm, test gaps, what-if simulation + (typed action chain), break-cycle recommendations, baseline save / diff + / table read, plugin lifecycle, policy presets, trend record / show, + visualize, sarif, memory summary. +- Health cache with declarative invalidation: mutating tools clear it + before they run; read tools consult it first. + +### Build & distribution + +- Single `Cargo.toml` with `[[bin]] name = "raysense"`. +- `build.rs` compiles the vendored C library on every fresh build. +- `RAYFORCE_DIR` env var still honored for C-side development. +- CI workflow: `cargo fmt --check` + `cargo test`. Publish workflow: a + single `cargo publish raysense`. diff --git a/Cargo.toml b/Cargo.toml index 3f5d72a..4b3a34a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,13 +21,18 @@ [package] name = "raysense" -version = "0.2.0" +version = "1.0.0" edition = "2021" license = "MIT" repository = "https://github.com/RayforceDB/raysense" +homepage = "https://github.com/RayforceDB/raysense" +documentation = "https://docs.rs/raysense" description = "Architectural X-ray for your codebase. Live, local, agent-ready." readme = "README.md" +keywords = ["architecture", "metrics", "static-analysis", "mcp", "telemetry"] +categories = ["development-tools", "command-line-utilities", "visualization"] links = "rayforce" +rust-version = "1.75" [[bin]] name = "raysense" diff --git a/src/cli.rs b/src/cli.rs index a89a61a..601a335 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -2513,7 +2513,7 @@ mod tests { .duration_since(UNIX_EPOCH) .unwrap() .as_nanos(); - std::env::temp_dir().join(format!("raysense-cli-{name}-{nanos}")) + std::env::temp_dir().join(format!("raysense-{name}-{nanos}")) } #[test] diff --git a/src/memory.rs b/src/memory.rs index 07f6bcf..7cec07b 100644 --- a/src/memory.rs +++ b/src/memory.rs @@ -2010,7 +2010,7 @@ mod tests { .unwrap() .as_nanos(); std::env::temp_dir().join(format!( - "raysense-memory-{name}-{}-{suffix}", + "raysense-{name}-{}-{suffix}", std::process::id() )) }