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 +11 -0
- package/README.md +2 -2
- package/docs/api.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/publishing.md +2 -2
- package/docs/quickstart.md +1 -1
- package/package.json +1 -1
- package/src/audit.js +1 -1
- package/src/boundaries.js +15 -3
- package/src/index.d.ts +1 -1
- package/src/spec.js +1 -1
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
|
|
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
|
|
package/docs/architecture.md
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
package/docs/publishing.md
CHANGED
|
@@ -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
|
|
package/docs/quickstart.md
CHANGED
|
@@ -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
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.
|
|
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"]);
|