Consolidates the 0.7.2.x development cycle. All previously exported functions keep their signatures and defaults. No dependencies were added to Depends or Imports, and the minimum R version is unchanged.
context_manifest(), context_render(),
and context_audit() provide explicit source routing,
native-file suppression, exact deduplication, provenance, and named
character/line budgets. Print methods and audit results expose metadata
without source bodies. Native coverage only suppresses sources when its
audience matches the current consumer. Source metadata retains
requested_path alongside resolved and canonical paths.
Native path aliases are deduplicated by canonical identity, preserving
the first requested spelling.src_symbols(): C, C++, Python, Rust, and JavaScript
symbol index for any repository via tree-sitter (suggested
bonsaisitter runtime + a grammar package per language:
treesitter.c, treesitter.cpp,
treesitter.python, treesitter.rust,
treesitter.javascript). Mirrors symbols() with
a lang column; exported marks definitions
visible beyond their own file (non-static in C/C++, no
leading underscore in Python, pub in Rust,
export-wrapped in JavaScript). New
default_src_exclude() lists directories skipped while
scanning: the default_exclude() opt-outs
(Documents and friends) plus dependency/build trees
(node_modules, __pycache__, venv,
build, dist, renv,
target); hidden and *.Rcheck directories are
always skipped.blast_radius() gains include = "src" to
report C/C++/Python/Rust/JS callers from the target project’s
sources.heartbeat(): cross-project git activity summary.
Scans every repository under scan_dir, reports projects
with commits in the lookback window (busiest first), and writes
briefs/_heartbeat.md. The one-glance complement to
briefing().git_commit_count_since() and
git_log_since(): the git count/log primitives behind
heartbeat(), for downstream tooling that composes its own
activity reports. git_log_since() supports an unbounded
window (since_date = NULL) and an "iso" line
format.skill_manifest() and
skill_read() for package-owned and explicitly configured
personal skills. Support flat and legacy layouts, folded descriptions,
whole-package source precedence, qualified ids, and resource drift
checks without dependencies or namespace loading.inst/skills/saber/.
Registration and stable installed-package snapshots remain explicit
consumer setup work.agent-hygiene skill under
inst/skills/agent-hygiene/: the layout contract for one
shared instruction body and one flat skill hub, how each consumer
deduplicates, and scripts/agent-hygiene.R, which audits
instruction files, hub entries, agent roots, corteza roots, and Claude
plugins, and creates or repairs the symlinks. It never removes a real
file.agent_context() now merges project
CLAUDE.md and AGENTS.md instead of picking
one. The file the consumer autoloads is still left out, and so is any
heading-delimited section whose text the consumer already holds.
Identical copies add nothing, and a drifted copy adds only the sections
that differ, under a (sections not already loaded) heading.
corteza, unknown consumers, and include_project = TRUE used
to receive CLAUDE.md alone when both files existed; they
now also receive the sections only AGENTS.md has. A single
project file is returned as before. The comparison is verbatim, so
differently worded files are both loaded in full.CLAUDE.md for Codex,
AGENTS.md for Claude Code, and CLAUDE.md (else
AGENTS.md) for corteza. Since 0.7.1 the script had passed
include_project = FALSE, so a project with only one of the
two names reached only one agent. Invocations without an agent name are
unchanged.--native-shared flag. It suppresses shared preferences only
when the native global entrypoint resolves to the same readable file,
respecting Codex’s override file. Without the flag, historical injection
is unchanged.argv as well
as Rscript’s command arguments, so explicit consumer names work with
either launcher.Consolidates the 0.7.1.x development cycle.
fn_graph() now accepts cache_dir,
mirroring blast_radius() and symbols(). The
default is unchanged. The example and tinytest pass
tempdir() so R CMD check no longer leaves files under
tools::R_user_dir("saber", "cache") (#32).briefing_git() no longer leaks a system2()
“had status 128” warning when run against a non-repository (e.g. a
worktree, an invalid .git, or a dubious-ownership
directory). It now confirms the working tree with
git rev-parse and suppresses the warning, returning empty
silently (#33).R/
when that package is saber itself, so a same-named function exported by
another project on the load path is no longer picked up in place of
saber’s (#31).briefing() now emits output via message()
instead of cat() for CRAN compliance.agent_context() examples use \donttest{}
instead of \dontrun{}.agent_context() and the SessionStart hook now load
memory reciprocally: Codex receives Claude Code MEMORY.md,
while Claude Code, Corteza, and other non-Codex agents receive Codex
memories.[features].hooks instead
of deprecated [features].codex_hooks.Depends: R (>= 4.4.0) and removed local
%||% definition (now in base R).person("cornball.ai", role = "cph") to
Authors@R.?saber package-level help page.r -e to
Rscript -e for portability.blast_radius() vignette scan crashing on Windows
paths (backslashes were interpreted as regex backreferences).@title lines with colons
to keep the generated Rd files ASCII-clean.agent_context() assembles agent context from memory,
instructions, and identity files.fn_graph(), pkg_graph(), and
graph_svg() render interactive SVG call graphs.blast_radius() gains include parameter for
scanning @examples and vignettes.briefing() gains agent parameter for
multi-agent support.