projd-core 0.6.1

Core project scanning data model and analysis helpers for Projd.
Documentation
# projd-core

`projd-core` is the shared scanning model for Projd CLI and GUI. It detects
project markers, source languages, dependency manifests, tests, CI providers,
repository state, risks, project health, and per-language code line statistics.

The crate also provides project root discovery (`discover_roots`,
`DiscoverOptions`, `DiscoveredRoot`, `RootKind`) for directories that may
contain multiple independent projects with different VCS, build systems,
documentation sites, or datasets. Discovery terminates on detected root kinds
rather than directory depth.

Source control detection covers git, hg, svn, fossil, and bzr. Git, hg, svn,
fossil, and bzr all populate branch / revision / last-commit / dirty fields
by shelling out to the corresponding CLI. Activity metrics
(`commits_last_90d`, `contributors_count`, `first_commit_date`) currently
fill for git only; the other VCS backends leave them as `None`. The `ProjectScan`
field is `vcs: VcsSummary` with `kind: VcsKind` (replaces the previous
`git: GitSummary` field as of 0.3.0).

`render_html(&ProjectScan)` and `render_multi_html(&MultiProjectScan)` produce
self-contained HTML reports with embedded CSS and inline SVG charts. No
JavaScript, no CDN, no external assets — the output is one file you can email,
upload to a static site, or open with a browser. The report respects the
viewer's OS theme via `prefers-color-scheme`.

`VcsSummary.activity` carries history-derived metrics: `days_since_last_commit`,
`commits_last_90d`, `contributors_count`, and `first_commit_date`. Only git
populates these fields in the current release; hg / svn / fossil / bzr leave
them as `None`. Contributor names and emails are not collected by default;
pass `ScanOptions { detailed_contributors: true }` to `scan_path_with` or
`scan_paths_recursive_with` to populate `VcsActivity.contributors`. The
`HealthSignalKind::Activity` signal reflects activity freshness against
thresholds of 90 days (active → pass) and 365 days (stale / dormant → warn).

The crate also exposes `scan_paths_recursive(path, opts) -> MultiProjectScan`,
which runs `discover_roots` on the path and then scans every detected root.
`MultiProjectScan` carries one `ProjectScan` per root plus an aggregated
`MultiProjectSummary` (`by_kind`, `by_grade`, `by_risk_level`,
`files_scanned`). Single-project `scan_path` runs a cheap multi-root check
and emits `RiskCode::MultipleVcsRootsFound` and `RiskCode::NestedVcsRoot` when
the scanned directory actually contains more than one root or a vendored
submodule.

This crate intentionally does not expose repository, homepage, or author metadata
in `Cargo.toml`, so published crates stay decoupled from local hosting details.