Changelog¶
All notable changes to this project will be documented here.
This page mirrors the canonical CHANGELOG.md at the repository root. The Chinese mirror at docs/zh/changelog.md carries the same content. Any release commit updates all three together.
Unreleased¶
0.5.0 - 2026-06-16¶
Security¶
- RSS feed parsing now uses
defusedxmlto block XML external entity (XXE) and entity expansion attacks. - CLI downloads are restricted to the current working directory and its subdirectories by default. Use
nber-cli download --restrict falseto override per invocation. Thedownload.restrict_dirconfig key is stored and validated, but the current CLI default remainstrue. - Database
initandmigratepaths on macOS and Linux must reside within the user's home directory. - Synchronous HTTP requests enforce TLS 1.2 as the minimum version.
- Selected info/download failure paths now avoid raw exception text; download-log messages and soft database warnings use sanitized summaries or exception class names.
Added¶
- Added
nber-cli config show/get <key>/set <key> <value>/verifyfor inspecting and editing~/.nber-cli/config.json. - Added
download.concurrencyconfiguration option (default3) and the--concurrency/-cCLI flag to cap concurrent downloads. - Added
--restrict true|falseflag onnber-cli downloadto control directory restriction per invocation. - Added
--yesfornber-cli mcp-server; the existing--portoption now requires explicit confirmation when set to a non-default value. - Added the
ssetransport fornber-cli mcp-server. - Added JSON Schema (
config.schema.json) for validating~/.nber-cli/config.json. - Added strict raw-configuration validation that reports malformed JSON, invalid section/value types, and schema-minimum violations without silently injecting defaults.
- Added plugin manifest and marketplace metadata version synchronization, with the Claude plugin skill path corrected to the case-sensitive tracked
./skills/NBER-CLIdirectory. - Added domain invariant validation in all core dataclasses (
NBER,NBERSearchResults,NBERFeedItem,NBERFeedFetchResult, clean results, and download results). - Added
get_config_value,set_config_value,read_config,write_config, andvalidate_configexports from the package top level. - Added paper ID format validation (
w?\d+) across CLI, download, and MCP entry points. - Added validation of fetched paper titles, positive citation IDs, and response/request paper-ID agreement before metadata is accepted.
Changed¶
- Replaced legacy
typing.Dict,List, andOptionalaliases with modern Python 3.11 syntax. - Added
mypyconfiguration and strengthened type annotations acrosscli.py,config_store.py, andfetcher.py. - Corrected the
mcp-servertransport name tostreamable-http; the existing--portoption now uses--yesconfirmation for non-default values. - Retry loops in
fetcher.pynow use exponential backoff capped at 30 seconds. feed fetchskips malformed individual RSS items instead of failing the entire feed.- Invalid configured or per-call download concurrency values are rejected or fall back to the documented safe default instead of creating an invalid semaphore.
- Database schema-changing and data-writing operations reject databases with a future
PRAGMA user_version; the diagnostic schema-version reader remains read-only. - Feed fetching establishes/validates the local schema before the network request, then writes feed items plus fetch history transactionally after the response is parsed; cleanup operations pair schema validation/upgrade and deletion in one SQLite transaction.
download.pyenablesraise_for_status=TrueonClientSession.- Error handling narrowed to specific network/timeout exception types with preserved exception chains.
- Removed the info cache hit hint that was printed to stderr on cached
infolookups.
Fixed¶
feed fetchnow tolerates unescaped<characters followed by whitespace or a digit in RSS title and description text while keeping strict XML parsing for all other malformed input.- RSS parse failures now report their line and column when available, and
feed fetchreports runtime parse errors with exit code1without printing command usage.
0.4.0 - 2026-06-04¶
Added¶
- Added
nber-cli info --refreshto bypass the localinfo_cacheand re-fetch paper metadata from NBER. The fresh data is written back to the cache when the cache is enabled. - Added
nber-cli info cache --turn-onand--turn-offto toggle theinfo_cachelookup globally. The setting is persisted to~/.nber-cli/config.json. - Added
nber-cli info cache --set-refresh <N>to set the cache refresh interval in days. The value is persisted to~/.nber-cli/config.jsonand applied as the TTL for every subsequentinfocall. Defaults to30days. - Added
nber-cli info cache clearwith the same parameter set asfeed clean:--days,--all,--start-date, and--end-date. Filtering useslast_fetched_atfrom theinfo_cachetable.nber-cli info cache cleanis a convenience alias forclear --all. - Added
nber-cli info cache(no sub-action) to print the current cache state, TTL, and cached row count. - Added
nber_cli.config_storemodule withInfoCacheSettingsand helpers (get_info_cache_settings,set_info_cache_enabled,set_info_cache_ttl_days) for reading and writing~/.nber-cli/config.json. - Added
nber_cli.info_cache.get_paper_with_info_cache_resultasync helper that returns anInfoCacheLookupResultcarrying theNBERpaper and afrom_cacheflag. - Added public Python API exports from the package top level:
InfoCacheSettings,clear_info_cache,count_info_cache,get_info_cache_settings,get_info_cache_ttl_days,is_info_cache_enabled,is_info_cache_expired,set_info_cache_enabled,set_info_cache_ttl_days,NBERInfoCacheClearResult.InfoCacheLookupResultandget_paper_with_info_cache_resultare exposed from thenber_cli.info_cachemodule rather than the package top level; import them asfrom nber_cli.info_cache import ....
Changed¶
~/.nber-cli/config.jsonnow stores aninfosection:info.cache_enabled(defaulttrue) andinfo.cache_ttl_days(default30). Missing or malformed fields fall back to defaults.infonow prints a one-line stderr hint when the paper was served from the local cache, pointing tonber-cli info <id> --refreshfor a fresh fetch.
0.3.1 - 2026-06-03¶
Added¶
- Added
nber-cli db initandnber-cli db migratefor initializing and relocating the local database. These replacefeed initandfeed migrate. - Added
info_cachetable so repeatednber-cli infoand MCPget_paper_infocalls return immediately from cache. - Added
query_log,download_log, andinfo_logtables for recording search keywords, download outcomes, and info lookups. - Added
schema_versionfield in~/.nber-cli/config.jsonfor forward-compatible schema upgrades.
Changed¶
- Renamed default database file from
feed.dbtonber.db. Existing~/.nber-cli/feed.dbinstallations keep working without manual steps. - Upgraded database schema from version 1 to version 2 with automatic upgrade on next invocation.
- Consolidated database code into
nber_cli.db. Oldinit_feed_databaseandmigrate_feed_databasehelpers remain as thin compatibility wrappers.
0.3.0 - 2026-06-03¶
Added¶
- Added
nber-cli feed initfor creating a local SQLite feed cache. - Added
nber-cli feed fetchfor fetching NBER's new working papers RSS feed and showing newly cached items. - Added
nber-cli feed fetch --max-itemsfor limiting displayed feed output. - Added
nber-cli feed migratefor moving the feed cache database and updating user config. - Added
nber-cli feed cleanfor cleaning cached feed database records with confirmation. - Added Python API documentation for feed cache helpers and feed data models.
Changed¶
- Added user config documentation for
~/.nber-cli/config.jsonandfeed.db-path. - Expanded English and Chinese feed cache documentation across CLI, getting started, configuration, and Python API pages.
0.2.0 - 2026-05-31¶
Changed¶
- Reworked the CLI into
nber-cli download ...subcommand syntax. - Added
--file/-fand--save-base/-spath handling behavior. - Added
--batch/-bmulti-ID download mode. - Removed database-backed download state tracking.
- Simplified the downloader to direct async HTTP PDF fetches.
- Updated documentation for the v0.2 command model.
- Removed the legacy web UI module and script entrypoint.
0.1.4 - 2025-08-09¶
Added¶
- Added
--version/-vflag to display current version. - Added comprehensive help message with examples.
- Added
__main__.pysupport forpython -m nber_cli. - Added argument grouping for better CLI organization.
- Added automatic help display when no arguments are provided.