@aefree/pi-file-discovery
Bounded candidate-file discovery for unfamiliar repository research.
Package details
Install @aefree/pi-file-discovery from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@aefree/pi-file-discovery- Package
@aefree/pi-file-discovery- Version
0.1.2- Published
- Aug 27, 2026
- Downloads
- 305/mo · 31/wk
- Author
- aefree
- License
- MIT
- Types
- extension, skill
- Size
- 180.6 KB
- Dependencies
- 1 dependency · 4 peers
Pi manifest JSON
{
"extensions": [
"./extensions/index.ts"
],
"skills": [
"./skills/using-file-discovery/SKILL.md"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
@aefree/pi-file-discovery
discover_candidate_files is bounded, workspace-aware candidate-file discovery for unfamiliar areas of a repository. It tests a small set of hypotheses, ranks files, shows representative excerpts, and recommends a targeted follow-up read.
Install
Requirements:
- Node.js 22.19 or newer
- ripgrep available on
PATH, or an absolute executable path inPI_FILE_DISCOVERY_RG_PATH - Pi 0.83 or newer
pi install npm:@aefree/pi-file-discovery
To try the package for one session without installing it:
pi -e npm:@aefree/pi-file-discovery
Restart or reload Pi after changing package configuration. In TUI/RPC sessions, the package shows one capability warning per Pi runtime when rg cannot be resolved or the explicit override is invalid. The warning never displays the configured path; install rg on PATH or correct PI_FILE_DISCOVERY_RG_PATH, then restart or reload Pi. In non-interactive modes, discover_candidate_files retains its actionable tool-time error when rg is unavailable. The package contributes the discover_candidate_files tool and the using-file-discovery skill.
Choose the right tool
Use this tool when the owning subsystem, implementation path, or several plausible names are unknown:
I do not know where mission cancellation is owned. Test lifecycle, cancellation, and cleanup hypotheses across runtime and tests.
Use read or direct rg instead for a known path, known symbol/directory, post-edit confirmation, or one obvious narrow lookup:
Find references to
MissionRuntime.Disposeinsrc/runtime.Read
src/runtime/MissionRuntime.csaround line 120.
It is not a replacement for rg, read, project_artifact_search, or read_package_reference.
Query and output contract
Each query must explicitly choose mode: "literal" or mode: "regex"; omitted mode is a validation error and never yields absence evidence. Compact output (the default) contains ranked candidates, bounded excerpts, coverage, incomplete hypotheses, and a next read. outputMode: "detailed" adds the bounded query/root status matrix.
{
queries: [
{ id: "lifecycle", pattern: "cancellation", mode: "literal" },
{ id: "cleanup", pattern: "Dispose|Cleanup", mode: "regex" }
],
roots: ["src", "tests"],
maxCandidates: 8,
outputMode: "compact"
}
Candidate ranking is deterministic evidence aggregation: distinct hypotheses, distinct roots, bounded match count, then path order. It is not semantic search. Only fully executed matched and no_matches cells are complete; no_matches is absence evidence only for its completed, actually searched cell. Partial limits, skipped cells, unavailable stale roots, timeouts, invalid regexes, and errors are incomplete. A missing selected-scope root is reported as a scoped diagnostic while other valid roots continue. Normal path resolution plus physical containment keeps a discovery call from accidentally expanding beyond its selected workspace.
Filtering and execution hygiene
filterMode is "recommended" by default and "native-only" when only native ripgrep ignore behavior is wanted. Optional filters reduce incidental generated/cache noise for broad research. The default report states applied, bypassed, skipped, or degraded decisions structurally and in concise text: for example, Unity broad-root filtering discloses its excluded generated/cache directories, while an exact generated root discloses its bypass. A provider returning outcome: "applied" must declare filterDecision: "applied" | "bypassed" on every root; missing or invalid decisions reject that provider result, so native discovery continues with degraded filtering. Applied and bypassed report decisions are derived only from those explicit provider declarations. Filter provider failure, timeout, incompatible registration, or duplicate registration is likewise disclosed as degraded filtering and native search continues. A provider-supplied ignore file is used only when it is a readable, bounded regular file within the provider's filterBoundary; otherwise that provider data is skipped.
This tool is not a sandbox, permission system, or access-control boundary: an agent can use read or Bash instead. Its controls make this discovery call predictable and bounded: it resolves an absolute regular rg executable, uses shell: false and a deterministic minimal child environment, honors cancellation, and bounds process time and output. An explicit absolute PI_FILE_DISCOVERY_RG_PATH is deliberate operator configuration, including one physically inside the workspace. PATH discovery skips workspace-contained candidates to avoid accidental shadowing. Requested workspaces and roots are physically contained in the selected discovery scope after normal path resolution, including symlink or junction resolution, to avoid accidental broad searches.
Contracts and packaging
Import @aefree/pi-file-discovery/contracts/v1 for FileDiscoveryFilterV1 and FileDiscoveryServiceV1. Filters use the registry key @aefree/pi-file-discovery/filters/v1. Contract imports are side-effect free.
npm test
npm pack --dry-run