reach.catalog¶
Filesystem scanning, discovery, and YAML frontmatter parsing routines.
Load skills from a repository root and compose them into catalogs for evaluation.
DEFAULT_SWEEP_SCALES
module-attribute
¶
CorpusScalingPlan ¶
Bases: BaseModel
Encapsulate precomputed distance geometry and nested catalogs for a scaling sweep.
Source code in src/reach/catalog.py
create
classmethod
¶
create(
skills: Sequence[Skill],
scales: Sequence[int],
anchor_skills: Sequence[str] | None = None,
scorer: Scorer | None = None,
) -> CorpusScalingPlan
Construct a scaling plan by computing distance geometry and k-Center ordering once.
Source code in src/reach/catalog.py
queries_for_scale ¶
queries_for_scale(
catalog: Catalog,
raw_query_set: QuerySet,
anchor_skills: Sequence[str] | None = None,
) -> QuerySet
Slice query set into in-scope reachability probes for catalog.
Source code in src/reach/catalog.py
ResolvedTarget ¶
Bases: BaseModel
Structured resolution of a user-specified skill target and optional catalog.
Source code in src/reach/catalog.py
build_catalogs ¶
build_catalogs(
skills: Sequence[Skill],
mode: CatalogMode,
size: int = 20,
rivals: int = 10,
seed: int = 0,
scorer: Scorer | None = None,
target_skill: str | None = None,
) -> list[Catalog]
Assemble skill catalogs from a corpus using the specified cataloging mode.
Source code in src/reach/catalog.py
build_corpus_scaling_catalogs ¶
build_corpus_scaling_catalogs(
skills: Sequence[Skill],
scales: Sequence[int],
ordered_names: Sequence[str] | None = None,
anchor_skills: Sequence[str] | None = None,
scorer: Scorer | None = None,
) -> list[Catalog]
Generate deterministic nested catalogs for whole-corpus capacity evaluation.
Source code in src/reach/catalog.py
build_corpus_scaling_queries ¶
build_corpus_scaling_queries(
scale_skills: Sequence[str],
raw_query_set: QuerySet,
anchor_skills: Sequence[str] | None = None,
) -> QuerySet
Slice query set into in-scope reachability probes for installed skills.
Source code in src/reach/catalog.py
build_corpus_scaling_sequence ¶
build_corpus_scaling_sequence(
skills: Sequence[Skill],
anchor_skills: Sequence[str] | None = None,
scorer: Scorer | None = None,
) -> tuple[str, ...]
Order skills using Farthest-First Traversal (k-Center) on Cosine-BM25 distance.
Source code in src/reach/catalog.py
build_neighborhood_catalogs ¶
build_neighborhood_catalogs(
skills: Sequence[Skill],
size: int = 20,
rivals: int = 10,
seed: int = 0,
scorer: Scorer | None = None,
) -> list[Catalog]
Generate fixed-size catalogs per skill containing target, rivals, and filler.
Source code in src/reach/catalog.py
build_scaling_catalogs ¶
build_scaling_catalogs(
skills: Sequence[Skill],
target_skill: str,
scales: Sequence[int],
rivals_share: float = 0.5,
seed: int = 0,
scorer: Scorer | None = None,
) -> list[Catalog]
Generate multi-scale catalogs for a target skill across requested scales.
Source code in src/reach/catalog.py
corpus_digest ¶
corpus_digest(skills: Sequence[Skill]) -> str
Compute deterministic 12-char SHA-256 digest of corpus names/descriptions.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
skills
|
Sequence[Skill]
|
Sequence of resident Skill objects. |
required |
Returns:
| Type | Description |
|---|---|
str
|
A 12-character hexadecimal SHA-256 digest identifying the corpus selection surface. |
Source code in src/reach/catalog.py
deduplicate_skills ¶
Filter duplicate skills by name, preserving first insertion order.
Source code in src/reach/catalog.py
determine_min_scale ¶
Determine optimal baseline starting scale based on corpus size.
Source code in src/reach/catalog.py
find_cluster_medoids ¶
find_cluster_medoids(
skills: Sequence[Skill],
k: int,
scorer: Scorer | None = None,
) -> tuple[str, ...]
Find k representative skill medoids across modularity clusters.
Partition skills into communities via modularity optimization, then select the central medoid skill from each cluster (maximizing intra-cluster BM25 similarity). If fewer than k clusters exist, iteratively select the farthest remaining skills from the chosen cohort to ensure maximal vocabulary diversity.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
skills
|
Sequence[Skill]
|
The corpus of skills to partition and select from. |
required |
k
|
int
|
The desired number of anchor medoid skills. |
required |
scorer
|
Scorer | None
|
Optional BM25 scorer for computing skill distances. |
None
|
Returns:
| Type | Description |
|---|---|
tuple[str, ...]
|
Tuple of up to k representative skill names. |
Source code in src/reach/catalog.py
find_skill_manifest ¶
Traverse upward from SKILL.md or directory to locate nearest skills.json or lockfile.
Source code in src/reach/catalog.py
generate_log_scales ¶
Generate human-friendly logarithmic sweep scales up to total_skills.
Source code in src/reach/catalog.py
load_registry_skills ¶
load_registry_skills(
project: str,
location: str = "global",
publisher: str | None = None,
fresh: bool = False,
no_cache: bool = False,
cache_ttl_seconds: int = 300,
cache_root: Path | str | None = None,
) -> list[Skill]
Fetch and load skills from Google Cloud Agent Registry via local cache mirror.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
project
|
str
|
Google Cloud project ID. |
required |
location
|
str
|
Registry location (default: 'global'). |
'global'
|
publisher
|
str | None
|
Optional publisher filter. |
None
|
fresh
|
bool
|
If True, bypass metadata TTL and query live. |
False
|
no_cache
|
bool
|
If True, run in ephemeral memory/tempdir. |
False
|
cache_ttl_seconds
|
int
|
TTL in seconds for metadata cache validity. |
300
|
cache_root
|
Path | str | None
|
Optional custom cache directory. |
None
|
Returns:
| Type | Description |
|---|---|
list[Skill]
|
Sorted list of resident Skill objects. |
Source code in src/reach/catalog.py
load_skills ¶
load_skills(root: Path | str) -> list[Skill]
Load and parse all skills under a directory root, sorted by skill name.
Deduplicates skills sharing the same name by selecting the shortest path.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
root
|
Path | str
|
Directory path containing skill subdirectories or SKILL.md files. |
required |
Returns:
| Type | Description |
|---|---|
list[Skill]
|
Sorted list of resident Skill objects found under the directory. |
Raises:
| Type | Description |
|---|---|
NotADirectoryError
|
If the resolved path does not exist or is not a directory. |
Source code in src/reach/catalog.py
parse_frontmatter ¶
parse_frontmatter(text: str, path: Path) -> Skill | None
Parse a SKILL.md file's YAML frontmatter into a validated Skill model.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
Raw markdown file contents including frontmatter block. |
required |
path
|
Path
|
Filesystem path to the SKILL.md file (used for fallback naming). |
required |
Returns:
| Type | Description |
|---|---|
Skill | None
|
A validated Skill model instance, or None if frontmatter cannot be parsed. |
Source code in src/reach/catalog.py
resident_skills ¶
Retrieve ordered Skill objects resident in the specified catalog.
Source code in src/reach/catalog.py
resolve_catalog ¶
Retrieve a catalog by identifier from a sequence of catalogs.
Source code in src/reach/catalog.py
resolve_skill_target ¶
resolve_skill_target(
target: str | Path | None,
explicit_catalog: Path | str | None = None,
*,
command_name: str = "eval",
) -> ResolvedTarget | None
Resolve a skill name and catalog path from a name, directory, or SKILL.md file.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
target
|
str | Path | None
|
Skill name, directory path, or SKILL.md file path. |
required |
explicit_catalog
|
Path | str | None
|
Explicit catalog path if specified by user flag (e.g. --skills). |
None
|
command_name
|
str
|
CLI command name for formatting multi-skill error remedies. |
'eval'
|
Returns:
| Type | Description |
|---|---|
ResolvedTarget | None
|
ResolvedTarget with canonical skill_name and inferred catalog_path, |
ResolvedTarget | None
|
or None if target is None. |
Raises:
| Type | Description |
|---|---|
FileNotFoundError
|
If target looks like a path but does not exist on disk. |
ValueError
|
If target is a non-SKILL.md file, a directory containing skills, a directory with no SKILL.md, or a SKILL.md with invalid frontmatter. |
Source code in src/reach/catalog.py
1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 | |
resolve_sweep_scales ¶
resolve_sweep_scales(
total_skills: int,
requested: Sequence[int] | None = None,
) -> tuple[int, ...]
Resolve and clamp catalog sweep scales against available corpus size.
Source code in src/reach/catalog.py
split_frontmatter ¶
Split raw markdown text into frontmatter YAML and markdown body content.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
Raw content of a markdown skill file. |
required |
Returns:
| Type | Description |
|---|---|
tuple[str, str] | None
|
A tuple of (frontmatter_yaml, markdown_body) if valid delimiter lines are found, |
tuple[str, str] | None
|
or None if the file lacks valid frontmatter delimiters. |