llmnav 0.6.1 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,17 @@ The npm package follows Semantic Versioning. The `llmnav/N` source protocol is v
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.6.2] — 2026-08-11
10
+
11
+ ### Added
12
+
13
+ * Added generated boundary signals for persistent dotted JSON filename protocols, versioned schema literals, and TypeScript Tauri invoke adapters.
14
+
15
+ ### Fixed
16
+
17
+ * Stopped classifying high-fan-in domain contract hubs as broad utilities solely because they export many declarations.
18
+ * Made tag-driven publication create an idempotent GitHub Release after npm integrity verification or publication succeeds.
19
+
9
20
  ## [0.6.1] — 2026-08-10
10
21
 
11
22
  ### Added
package/README.md CHANGED
@@ -18,7 +18,7 @@ LLMNav is not a documentation generator, an embedding database, or a reason to a
18
18
  * Machine-readable changed-card, affected-boundary, and affected-catalog output
19
19
  * Exported API and effective configuration contract fingerprints
20
20
  * TypeScript and Go declaration enrichment with declaration-level body hashes
21
- * Generated route, event, schema, migration, and command boundaries
21
+ * Generated artifact, route, event, schema, migration, runtime, and command boundaries
22
22
  * SARIF 2.1.0 diagnostic output
23
23
  * Optional deterministic card-range search shards for very large repositories
24
24
  * Strict repository-local imports for generated definition and reference indexes
@@ -250,7 +250,7 @@ Do not annotate trivial getters, generated files, obvious wrappers, every test f
250
250
 
251
251
  ## Current implementation boundary
252
252
 
253
- Version 0.6 adds a deterministic coverage audit that prioritizes root and nested-package entrypoints, structural boundaries, Rust/Tauri runtime signals, and high fan-in modules while suppressing declaration files, dependency caches, test support code, simple barrels, and broad utilities. It suggests narrow coverage rules but never writes cards or invents semantic roles. Use `llmnav audit --summary --json` for a compact automation result or `llmnav audit --json --output .llmnav/audit.json` to keep the full candidate report out of captured stdout.
253
+ Version 0.6 adds a deterministic coverage audit that prioritizes root and nested-package entrypoints, structural boundaries, persistent artifact filename protocols, versioned schema literals, Rust/Tauri runtime signals, TypeScript Tauri invoke adapters, and high fan-in modules. It suppresses declaration files, dependency caches, test support code, simple barrels, and low-fan-in broad utilities. It suggests narrow coverage rules but never writes cards or invents semantic roles. Use `llmnav audit --summary --json` for a compact automation result or `llmnav audit --json --output .llmnav/audit.json` to keep the full candidate report out of captured stdout.
254
254
 
255
255
  LLMNav does not discover sibling repositories automatically and does not ship an MCP server, embedding database, hosted service, SCIP generator, or complete language-aware call graph. External tools may export the documented compact graph-input schema. Generated structure never writes derived edges into source cards.
256
256
 
package/docs/api.md CHANGED
@@ -60,7 +60,7 @@ console.log(stats.parsedFiles, stats.reusedFiles);
60
60
 
61
61
  Stat hints are an optimization, not deterministic output. The returned `fileState` contains only repository-relative generated data.
62
62
 
63
- Attached symbol declarations expose generated `language`, `exported`, `visibility`, optional Go `receiver`, `endOffset`, and declaration `bodyHash` fields. Indexed cards also expose sorted route, event, schema, migration, and command `boundaries` with confidence and evidence.
63
+ Attached symbol declarations expose generated `language`, `exported`, `visibility`, optional Go `receiver`, `endOffset`, and declaration `bodyHash` fields. Indexed cards also expose sorted artifact, route, event, schema, migration, runtime, and command `boundaries` with confidence and evidence.
64
64
 
65
65
  ## Audit annotation coverage
66
66
 
@@ -64,13 +64,13 @@ Each card carries three independent hashes.
64
64
 
65
65
  Symbol attachment records the detected language, public/exported status, visibility, Go receiver when present, declaration span, and a declaration-level body hash. TypeScript and Go use dedicated deterministic declaration patterns; JavaScript, Rust, Python, and generic C-like declarations retain the compatible fallback patterns.
66
66
 
67
- Generated cards may contain a sorted `boundaries` array. LLMNav detects `route`, `event`, `schema`, `migration`, and `command` boundaries from repository-relative paths and controlled semantic effects or risks. Each record includes `confidence` and explicit evidence such as `path`, `effect`, or `risk`. These hints are generated navigation data and are never copied into source comments.
67
+ Generated cards may contain a sorted `boundaries` array. LLMNav detects `artifact`, `route`, `event`, `schema`, `migration`, `runtime`, and `command` boundaries from repository-relative paths, controlled semantic effects or risks, and narrow source evidence. Source evidence includes persistent dotted JSON filename builders, versioned schema literals, Tauri commands and invoke adapters, and platform lifecycle code. Each record includes `confidence` and explicit evidence. These hints are generated navigation data and are never copied into source comments.
68
68
 
69
69
  Generation compares the previous and current primary indexes to emit `affectedBoundaries`. The report preserves the card change and hash dimensions while adding module IDs, structural boundary records, outbound relation targets, and reverse semantic dependents. It is returned through the API and `generate --json`; it is not stored in source cards.
70
70
 
71
71
  ## Annotation coverage audit
72
72
 
73
- The read-only audit combines package entrypoints, public re-export reachability, generated structural boundaries, import fan-in, exported declaration counts, and source size. It lowers the priority of broad utilities, declaration files, non-production support paths, and pure re-export barrels. Every candidate retains its score inputs and deterministic repository-relative path.
73
+ The read-only audit combines package entrypoints, public re-export reachability, generated structural boundaries, import fan-in, exported declaration counts, and source size. It lowers the priority of named utilities and low-fan-in export hubs, declaration files, non-production support paths, and pure re-export barrels. High-fan-in domain contract hubs do not receive the broad-utility penalty merely because they export many declarations. Every candidate retains its score inputs and deterministic repository-relative path.
74
74
 
75
75
  This analyzer deliberately stops before semantic generation. Structure can identify a file worth inspecting, but it cannot safely invent a durable ID, role, ownership statement, invariant, risk, or relation. Accepted boundaries become explicit source cards, path-specific coverage rules, and retrieval regression queries through normal review.
76
76
 
@@ -31,7 +31,7 @@ npm run release:check
31
31
 
32
32
  ## 3. Configure npm authentication
33
33
 
34
- The supplied release workflow uses GitHub's OIDC token through npm Trusted Publishers. The GitHub source repository is private, so the workflow explicitly disables provenance; npm accepts provenance only from public source repositories. If the repository becomes public, enable provenance in both `package.json` and the workflow after a successful release check.
34
+ The supplied release workflow uses GitHub's OIDC token through npm Trusted Publishers. The GitHub source repository is private, so the workflow explicitly disables provenance; npm accepts provenance only from public source repositories. If the repository becomes public, enable provenance in both `package.json` and the workflow after a successful release check. The same tag workflow creates an idempotent GitHub Release only after the npm registry check or publication succeeds.
35
35
 
36
36
  The workflow references a GitHub environment named `npm`. Create that environment for release protection, or remove the `environment` line when no environment gate is desired.
37
37
 
@@ -65,7 +65,7 @@ git tag v0.6.0
65
65
  git push origin v0.6.0
66
66
  ```
67
67
 
68
- The release workflow rejects a tag that does not match `package.json`. If the exact version is already present in npm, the workflow succeeds only when the registry tarball integrity matches the tagged package; a mismatched package fails closed.
68
+ The release workflow rejects a tag that does not match `package.json`. If the exact version is already present in npm, the workflow succeeds only when the registry tarball integrity matches the tagged package; a mismatched package fails closed. It then reuses an existing GitHub Release for the tag or creates one with generated release notes. Registry, GitHub API, and Release creation errors other than an expected missing Release fail the workflow.
69
69
 
70
70
  ## 6. Verify from a clean directory
71
71
 
@@ -19,7 +19,7 @@ Source roots and evaluation files must remain inside the repository. The generat
19
19
  npx llmnav audit
20
20
  ```
21
21
 
22
- Start with high and medium candidates. The audit explains whether a file is a package entrypoint, public API, generated structural boundary, or high fan-in module. It does not write source or invent card contents. Declaration files and common non-production or utility shapes are suppressed so the result is a review queue, not a demand to annotate every file.
22
+ Start with high and medium candidates. The audit explains whether a file is a package entrypoint, public API, generated structural boundary, or high fan-in module. Narrow source signals also identify versioned schema literals, persistent dotted JSON filename protocols, and Tauri invoke adapters. It does not write source or invent card contents. Declaration files and common non-production or low-fan-in utility shapes are suppressed so the result is a review queue, not a demand to annotate every file.
23
23
 
24
24
  After accepting a candidate, write its durable meaning by inspecting the source, add a narrow `coverageRules` entry for that exact boundary, and add a real task-language query to `.llmnav/eval/queries.jsonl`. Use `npx llmnav audit --fail-on high` in CI only after the initial review.
25
25
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "llmnav",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "description": "A deterministic semantic navigation layer for LLM coding agents.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/audit.js CHANGED
@@ -66,7 +66,7 @@ export async function auditProject(root) {
66
66
  const reexportBarrel = isReexportBarrel(record.source ?? "", file);
67
67
  const basename = path.posix.basename(file, path.posix.extname(file)).toLowerCase();
68
68
  const broadUtility = UTILITY_NAME_PATTERN.test(basename) ||
69
- (exportedDeclarations >= 10 && !entrypoint && !publicApi && boundaries.length === 0);
69
+ (exportedDeclarations >= 10 && importers <= 1 && !entrypoint && !publicApi && boundaries.length === 0);
70
70
  const nonProduction = NON_PRODUCTION_PATH_PATTERN.test(file);
71
71
  const largeSource = record.sourceBytes >= LARGE_SOURCE_BYTES;
72
72
  const hasSignal = entrypoint || publicApi || boundaries.length > 0 || importers > 0 || exportedDeclarations > 0 || largeSource;
package/src/boundaries.js CHANGED
@@ -1,9 +1,9 @@
1
1
  /* llmnav/1 module
2
2
  id=llmnav.structure.boundaries
3
- role=Detect route, event, schema, migration, and command boundaries from generated local evidence.
3
+ role=Detect durable artifact, route, event, schema, migration, runtime, and command boundaries from generated local evidence.
4
4
  owns=boundary kinds|confidence assignment|boundary evidence
5
5
  excludes=framework execution|source annotations
6
- search=boundary detection|route schema migration|command event
6
+ search=boundary detection|artifact route schema migration|command event runtime
7
7
  rel=workflow>llmnav.index.generate
8
8
  stability=architecture
9
9
  */
@@ -11,7 +11,7 @@ stability=architecture
11
11
  import path from "node:path";
12
12
  import { compareText, toPosix } from "./util.js";
13
13
 
14
- export const BOUNDARY_KINDS = Object.freeze(["command", "event", "migration", "route", "runtime", "schema"]);
14
+ export const BOUNDARY_KINDS = Object.freeze(["artifact", "command", "event", "migration", "route", "runtime", "schema"]);
15
15
 
16
16
  export function detectBoundaries(record) {
17
17
  const relativePath = toPosix(record.relativePath).toLowerCase();
@@ -40,6 +40,13 @@ export function detectBoundaries(record) {
40
40
  /(?:schema\.(?:json|ya?ml)|\.(?:proto|graphql|gql))$/u.test(relativePath)) {
41
41
  add("schema", "high", "path");
42
42
  }
43
+ if (/\bschemaVersion\s*:\s*["'][^"'\r\n]+\/v\d+(?:\.\d+)*["']/u.test(source)) {
44
+ add("schema", "high", "versioned-schema-literal");
45
+ }
46
+ if (/\bexport\s+(?:async\s+)?function\s+[A-Za-z_$][\w$]*FileName\b/u.test(source) &&
47
+ /["'`][^"'`\r\n]*\.[a-z0-9-]+\.json["'`]/iu.test(source)) {
48
+ add("artifact", "medium", "persistent-json-filename");
49
+ }
43
50
  if (risks.includes("migration") || /(?:^|\/)(?:migrations?|migrate)(?:\/|$)/u.test(relativePath)) {
44
51
  add("migration", "high", risks.includes("migration") ? "risk" : "path");
45
52
  }
@@ -49,6 +56,11 @@ export function detectBoundaries(record) {
49
56
  if (/\.rs$/u.test(relativePath) && /#\[tauri::command\]|tauri::generate_handler!/u.test(source)) {
50
57
  add("command", "high", "tauri-command");
51
58
  }
59
+ if (/\.[cm]?[jt]sx?$/u.test(relativePath) &&
60
+ /\bgetTauriInvoke\s*\(/u.test(source) &&
61
+ /\binvoke(?:\s*<[^;\r\n]+?>)?\s*\(/u.test(source)) {
62
+ add("command", "high", "tauri-invoke");
63
+ }
52
64
  if (/\.rs$/u.test(relativePath) &&
53
65
  /#\[cfg\((?:windows|unix|target_(?:os|family))/u.test(source) &&
54
66
  /\b(?:Drop|shutdown|terminate|kill|process_group|job_object)\b/iu.test(source)) {
package/src/index.d.ts CHANGED
@@ -58,7 +58,7 @@ export interface Declaration {
58
58
  }
59
59
 
60
60
  export interface DetectedBoundary {
61
- kind: "command" | "event" | "migration" | "route" | "schema";
61
+ kind: "artifact" | "command" | "event" | "migration" | "route" | "runtime" | "schema";
62
62
  confidence: "high" | "medium";
63
63
  evidence: string[];
64
64
  }
package/src/spec.js CHANGED
@@ -10,7 +10,7 @@ rel=workflow>llmnav.rules.validate
10
10
  stability=contract
11
11
  */
12
12
 
13
- export const PACKAGE_VERSION = "0.6.1";
13
+ export const PACKAGE_VERSION = "0.6.2";
14
14
  export const SPEC_VERSION = "1";
15
15
 
16
16
  export const SCOPES = Object.freeze(["file", "module", "symbol"]);