agent-wiki-cli 0.3.41__tar.gz → 0.5.1__tar.gz

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.
Files changed (113) hide show
  1. {agent_wiki_cli-0.3.41/src/agent_wiki_cli.egg-info → agent_wiki_cli-0.5.1}/PKG-INFO +64 -11
  2. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/README.md +63 -10
  3. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/pyproject.toml +1 -1
  4. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1/src/agent_wiki_cli.egg-info}/PKG-INFO +64 -11
  5. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/agent_wiki_cli.egg-info/SOURCES.txt +9 -0
  6. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/cli.py +56 -0
  7. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/bootstrap_cmd.py +38 -10
  8. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/ci_check_cmd.py +20 -11
  9. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/extract_cmd.py +302 -103
  10. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/generate_prompt_cmd.py +21 -4
  11. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/lint_cmd.py +274 -119
  12. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/migrate_cmd.py +8 -2
  13. agent_wiki_cli-0.5.1/src/llm_wiki_cli/commands/prepare_extractors_cmd.py +66 -0
  14. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/sync_cmd.py +372 -66
  15. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/extractors/go_extractor.py +16 -12
  16. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/extractors/python_extractor.py +7 -6
  17. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/extractors/rust_extractor.py +16 -12
  18. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/extractors/ts_extractor.py +13 -60
  19. agent_wiki_cli-0.5.1/src/llm_wiki_cli/services/extractor_helpers.py +431 -0
  20. agent_wiki_cli-0.5.1/src/llm_wiki_cli/services/imports.py +117 -0
  21. agent_wiki_cli-0.5.1/src/llm_wiki_cli/services/inventory_cache.py +357 -0
  22. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/services/metrics.py +7 -3
  23. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/services/packages.py +30 -6
  24. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/services/schema.py +61 -14
  25. agent_wiki_cli-0.5.1/src/llm_wiki_cli/services/source_snapshot.py +248 -0
  26. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/services/team.py +12 -2
  27. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_bootstrap.py +12 -0
  28. agent_wiki_cli-0.5.1/tests/test_ci_check.py +270 -0
  29. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_docker_extract.py +8 -0
  30. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_extract.py +324 -0
  31. agent_wiki_cli-0.5.1/tests/test_extractor_helpers.py +287 -0
  32. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_generate_prompt.py +11 -0
  33. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_go_extract.py +18 -17
  34. agent_wiki_cli-0.5.1/tests/test_imports.py +56 -0
  35. agent_wiki_cli-0.5.1/tests/test_inventory_cache.py +168 -0
  36. agent_wiki_cli-0.5.1/tests/test_lint.py +702 -0
  37. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_multilanguage_wiki.py +30 -0
  38. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_phase4_quality.py +16 -0
  39. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_rust_extract.py +18 -23
  40. agent_wiki_cli-0.5.1/tests/test_schema.py +54 -0
  41. agent_wiki_cli-0.5.1/tests/test_source_snapshot.py +140 -0
  42. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_sync.py +479 -2
  43. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_ts_extract.py +14 -4
  44. agent_wiki_cli-0.3.41/src/llm_wiki_cli/services/imports.py +0 -77
  45. agent_wiki_cli-0.3.41/tests/test_lint.py +0 -221
  46. agent_wiki_cli-0.3.41/tests/test_schema.py +0 -21
  47. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/LICENSE +0 -0
  48. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/setup.cfg +0 -0
  49. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/agent_wiki_cli.egg-info/dependency_links.txt +0 -0
  50. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/agent_wiki_cli.egg-info/entry_points.txt +0 -0
  51. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/agent_wiki_cli.egg-info/requires.txt +0 -0
  52. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/agent_wiki_cli.egg-info/top_level.txt +0 -0
  53. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/__init__.py +0 -0
  54. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/__init__.py +0 -0
  55. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/bump_cmd.py +0 -0
  56. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/context_cmd.py +0 -0
  57. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/hook_cmd.py +0 -0
  58. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/init_cmd.py +0 -0
  59. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/install_cmd.py +0 -0
  60. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/mcp_cmd.py +0 -0
  61. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/metrics_cmd.py +0 -0
  62. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/obsidian_cmd.py +0 -0
  63. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/plugins_cmd.py +0 -0
  64. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/release_cmd.py +0 -0
  65. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/review_cmd.py +0 -0
  66. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/status_cmd.py +0 -0
  67. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/team_cmd.py +0 -0
  68. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/trigger_cmd.py +0 -0
  69. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/uninstall_cmd.py +0 -0
  70. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/commands/upgrade_cmd.py +0 -0
  71. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/config.py +0 -0
  72. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/extractors/__init__.py +0 -0
  73. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/extractors/common.py +0 -0
  74. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/extractors/go_scripts/go.mod +0 -0
  75. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/extractors/go_scripts/main.go +0 -0
  76. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/extractors/rust_scripts/Cargo.lock +0 -0
  77. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/extractors/rust_scripts/Cargo.toml +0 -0
  78. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/extractors/rust_scripts/src/main.rs +0 -0
  79. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/extractors/ts_scripts/extract.js +0 -0
  80. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/extractors/ts_scripts/package.json +0 -0
  81. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/services/__init__.py +0 -0
  82. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/services/circuit_breaker.py +0 -0
  83. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/services/io.py +0 -0
  84. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/services/lockfile.py +0 -0
  85. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/services/mcp_server.py +0 -0
  86. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/services/obsidian.py +0 -0
  87. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/services/paths.py +0 -0
  88. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/services/plugins.py +0 -0
  89. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/services/secure_file.py +0 -0
  90. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/src/llm_wiki_cli/services/versioning.py +0 -0
  91. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_bump.py +0 -0
  92. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_circuit_breaker.py +0 -0
  93. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_config.py +0 -0
  94. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_context.py +0 -0
  95. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_docker_bootstrap.py +0 -0
  96. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_docker_lint.py +0 -0
  97. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_e2e.py +0 -0
  98. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_hook.py +0 -0
  99. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_init.py +0 -0
  100. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_io.py +0 -0
  101. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_lockfile.py +0 -0
  102. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_mcp.py +0 -0
  103. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_migrate.py +0 -0
  104. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_obsidian.py +0 -0
  105. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_package_metadata.py +0 -0
  106. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_plugins.py +0 -0
  107. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_release.py +0 -0
  108. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_status.py +0 -0
  109. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_team.py +0 -0
  110. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_trigger.py +0 -0
  111. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_uninstall.py +0 -0
  112. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_upgrade.py +0 -0
  113. {agent_wiki_cli-0.3.41 → agent_wiki_cli-0.5.1}/tests/test_versioning.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-wiki-cli
3
- Version: 0.3.41
3
+ Version: 0.5.1
4
4
  Summary: CLI tool to maintain hybrid LLM Wikis for multi-language projects.
5
5
  Author-email: Denis Sivagin <denissvgn@gmail.com>
6
6
  License: MIT
@@ -58,15 +58,16 @@ external tools when they are available on `PATH`.
58
58
  | Area | Implementation | Runtime requirement |
59
59
  |---|---|---|
60
60
  | Python | stdlib `ast` | Python 3.9+ |
61
- | TypeScript / TSX | bundled Node script using `ts-morph` | Node.js and npm |
62
- | Go | bundled Go extractor using `go/ast` | Go toolchain |
63
- | Rust | bundled Rust extractor using `syn` | Cargo / Rust toolchain |
61
+ | TypeScript / TSX | bundled Node script using `ts-morph` | prepared Node.js dependencies |
62
+ | Go | bundled Go extractor using `go/ast` | prepared helper binary |
63
+ | Rust | bundled Rust extractor using `syn` | prepared helper binary |
64
64
  | Docker / Compose | built-in parsers | none |
65
65
  | MCP server | official Python MCP SDK | `agent-wiki-cli[mcp]`, Python 3.10+ |
66
66
 
67
- TypeScript, Go, and Rust extras are metadata-only; the actual toolchains must be
68
- installed separately. The TypeScript extractor runs `npm install` in its bundled
69
- extractor directory on first use if `node_modules` is missing.
67
+ TypeScript, Go, and Rust extras are metadata-only; prepare their helper
68
+ dependencies explicitly with `llm-wiki prepare-extractors`. Lint, CI, and
69
+ extract never run `npm install`, `go build`, `go run`, `cargo build`, or
70
+ `cargo run` automatically.
70
71
 
71
72
  ## Agent Support
72
73
 
@@ -232,16 +233,29 @@ manifest.
232
233
 
233
234
  ```bash
234
235
  llm-wiki sync --src-dir . --wiki-dir docs/llm_wiki
236
+ llm-wiki sync --jobs auto --cache-stats --src-dir . --wiki-dir docs/llm_wiki
235
237
  ```
236
238
 
237
239
  If an older wiki has `index.md` but no manifest, `sync` seeds
238
240
  `.llm-wiki-manifest.json` without modifying pages. If neither a manifest nor an
239
- existing wiki is present, run `bootstrap` first.
241
+ existing wiki is present, run `bootstrap` first. Sync uses the same safe
242
+ persistent inventory cache as lint when a git directory is available. Use
243
+ `--no-cache`, `--rebuild-cache`, `--cache-dir PATH`, and `--cache-stats` to
244
+ control or inspect cache behavior. Use `--jobs N` or `--jobs auto` to opt into
245
+ parallel built-in language extraction. Sync repairs manifests with invalid
246
+ source hashes without touching pages, and stops unusually broad diffs unless
247
+ `--force` is used.
248
+
249
+ `sync` is deterministic: it updates AST/docstring-based page skeletons and does
250
+ not call an LLM. In agent workflows, treat sync as the first step, then inspect
251
+ created or updated pages and replace generic `_Auto-generated from ..._`,
252
+ copied-docstring-only, or knowable `—` placeholders with project-specific
253
+ semantic explanations.
240
254
 
241
255
  ### `extract`
242
256
 
243
257
  Print source inventory as JSON. All registered extractors run; missing optional
244
- toolchains are skipped when there are no matching source files.
258
+ prepared helpers are skipped when there are no matching source files.
245
259
 
246
260
  ```bash
247
261
  llm-wiki extract --src-dir .
@@ -253,6 +267,23 @@ llm-wiki extract --src-dir . --package llm_wiki_cli
253
267
  llm-wiki extract --src-dir . --include-empty
254
268
  ```
255
269
 
270
+ ### `prepare-extractors`
271
+
272
+ Prepare TypeScript dependencies and cached Go/Rust helper binaries outside the
273
+ lint/extract hot path.
274
+
275
+ ```bash
276
+ llm-wiki prepare-extractors --src-dir .
277
+ llm-wiki prepare-extractors --language typescript --language go
278
+ llm-wiki prepare-extractors --cache-dir .cache/llm-wiki
279
+ ```
280
+
281
+ When `--language` is omitted, only helper languages detected in `--src-dir` are
282
+ prepared. Helper cache resolution follows `--cache-dir`, then
283
+ `LLM_WIKI_CACHE_DIR`, then `.git/llm-wiki-extractors/`. If Go is installed in a
284
+ nonstandard location or the `go` on `PATH` cannot run, set
285
+ `LLM_WIKI_GO=/path/to/go` before running `prepare-extractors`.
286
+
256
287
  ### `lint` and `ci-check`
257
288
 
258
289
  Validate wiki links, orphan pages, entities, modules, workflows,
@@ -261,20 +292,40 @@ infrastructure, plugin lint rules, and team policy.
261
292
  ```bash
262
293
  llm-wiki lint --wiki-dir docs/llm_wiki --src-dir .
263
294
  llm-wiki lint --strict --wiki-dir docs/llm_wiki --src-dir .
295
+ llm-wiki lint --profile --wiki-dir docs/llm_wiki --src-dir .
296
+ llm-wiki lint --cache-stats --wiki-dir docs/llm_wiki --src-dir .
297
+ llm-wiki lint --jobs auto --wiki-dir docs/llm_wiki --src-dir .
264
298
  ```
265
299
 
266
300
  Strict mode also requires the core wiki structure and a fresh sync manifest.
301
+ `--profile` suppresses the human-readable lint text and prints one JSON object
302
+ to stdout containing the normal lint report, diagnostics, and phase timings.
303
+ The JSON contract is preserved for extractor failures as well; lint still exits
304
+ nonzero, but stdout remains machine-readable.
305
+ Lint uses a persistent deep-inventory cache by default when a git directory is
306
+ available, storing `.git/llm-wiki-inventory-cache.json`. Override the cache
307
+ directory with `LLM_WIKI_CACHE_DIR` or `--cache-dir PATH`; the CLI flag wins.
308
+ Use `--no-cache` to disable load/save, `--rebuild-cache` to ignore and rewrite
309
+ the cache, and `--cache-stats` to include cache diagnostics. Cache corruption or
310
+ invalid fingerprints fall back to a full extraction without reducing lint
311
+ coverage. With `--profile --cache-stats`, the JSON payload includes a top-level
312
+ `cache` object. Use `--jobs N` or `--jobs auto` to opt into parallel built-in
313
+ language extraction; the default is `--jobs 1`. Plugin extractors remain
314
+ sequential unless future plugin metadata explicitly marks them parallel-safe.
267
315
 
268
316
  For CI:
269
317
 
270
318
  ```bash
271
319
  llm-wiki ci-check --src-dir . --wiki-dir docs/llm_wiki
320
+ llm-wiki ci-check --jobs auto --src-dir . --wiki-dir docs/llm_wiki
272
321
  llm-wiki ci-check --format json --report .git/llm-wiki-ci-report.md
273
322
  llm-wiki ci-check --format markdown
274
323
  ```
275
324
 
276
325
  `ci-check` always runs strict validation, writes a Markdown report, records a
277
- local metrics event, and exits nonzero on validation failure.
326
+ local metrics event, uses the same safe inventory cache when available, and
327
+ exits nonzero on validation failure. `--report` is an output path, so explicit
328
+ absolute paths and relative artifact paths outside the project root are allowed.
278
329
 
279
330
  ### `context`
280
331
 
@@ -323,7 +374,9 @@ llm-wiki generate-prompt --template compact
323
374
  ```
324
375
 
325
376
  The generated prompt includes change-type guidance. Installed prompt templates
326
- can override the default prompt body.
377
+ can override the default prompt body. The default prompt asks agents to run
378
+ `sync` first, then perform a semantic pass on affected pages before accepting a
379
+ lint-clean wiki as complete.
327
380
 
328
381
  ### `mcp`
329
382
 
@@ -28,15 +28,16 @@ external tools when they are available on `PATH`.
28
28
  | Area | Implementation | Runtime requirement |
29
29
  |---|---|---|
30
30
  | Python | stdlib `ast` | Python 3.9+ |
31
- | TypeScript / TSX | bundled Node script using `ts-morph` | Node.js and npm |
32
- | Go | bundled Go extractor using `go/ast` | Go toolchain |
33
- | Rust | bundled Rust extractor using `syn` | Cargo / Rust toolchain |
31
+ | TypeScript / TSX | bundled Node script using `ts-morph` | prepared Node.js dependencies |
32
+ | Go | bundled Go extractor using `go/ast` | prepared helper binary |
33
+ | Rust | bundled Rust extractor using `syn` | prepared helper binary |
34
34
  | Docker / Compose | built-in parsers | none |
35
35
  | MCP server | official Python MCP SDK | `agent-wiki-cli[mcp]`, Python 3.10+ |
36
36
 
37
- TypeScript, Go, and Rust extras are metadata-only; the actual toolchains must be
38
- installed separately. The TypeScript extractor runs `npm install` in its bundled
39
- extractor directory on first use if `node_modules` is missing.
37
+ TypeScript, Go, and Rust extras are metadata-only; prepare their helper
38
+ dependencies explicitly with `llm-wiki prepare-extractors`. Lint, CI, and
39
+ extract never run `npm install`, `go build`, `go run`, `cargo build`, or
40
+ `cargo run` automatically.
40
41
 
41
42
  ## Agent Support
42
43
 
@@ -202,16 +203,29 @@ manifest.
202
203
 
203
204
  ```bash
204
205
  llm-wiki sync --src-dir . --wiki-dir docs/llm_wiki
206
+ llm-wiki sync --jobs auto --cache-stats --src-dir . --wiki-dir docs/llm_wiki
205
207
  ```
206
208
 
207
209
  If an older wiki has `index.md` but no manifest, `sync` seeds
208
210
  `.llm-wiki-manifest.json` without modifying pages. If neither a manifest nor an
209
- existing wiki is present, run `bootstrap` first.
211
+ existing wiki is present, run `bootstrap` first. Sync uses the same safe
212
+ persistent inventory cache as lint when a git directory is available. Use
213
+ `--no-cache`, `--rebuild-cache`, `--cache-dir PATH`, and `--cache-stats` to
214
+ control or inspect cache behavior. Use `--jobs N` or `--jobs auto` to opt into
215
+ parallel built-in language extraction. Sync repairs manifests with invalid
216
+ source hashes without touching pages, and stops unusually broad diffs unless
217
+ `--force` is used.
218
+
219
+ `sync` is deterministic: it updates AST/docstring-based page skeletons and does
220
+ not call an LLM. In agent workflows, treat sync as the first step, then inspect
221
+ created or updated pages and replace generic `_Auto-generated from ..._`,
222
+ copied-docstring-only, or knowable `—` placeholders with project-specific
223
+ semantic explanations.
210
224
 
211
225
  ### `extract`
212
226
 
213
227
  Print source inventory as JSON. All registered extractors run; missing optional
214
- toolchains are skipped when there are no matching source files.
228
+ prepared helpers are skipped when there are no matching source files.
215
229
 
216
230
  ```bash
217
231
  llm-wiki extract --src-dir .
@@ -223,6 +237,23 @@ llm-wiki extract --src-dir . --package llm_wiki_cli
223
237
  llm-wiki extract --src-dir . --include-empty
224
238
  ```
225
239
 
240
+ ### `prepare-extractors`
241
+
242
+ Prepare TypeScript dependencies and cached Go/Rust helper binaries outside the
243
+ lint/extract hot path.
244
+
245
+ ```bash
246
+ llm-wiki prepare-extractors --src-dir .
247
+ llm-wiki prepare-extractors --language typescript --language go
248
+ llm-wiki prepare-extractors --cache-dir .cache/llm-wiki
249
+ ```
250
+
251
+ When `--language` is omitted, only helper languages detected in `--src-dir` are
252
+ prepared. Helper cache resolution follows `--cache-dir`, then
253
+ `LLM_WIKI_CACHE_DIR`, then `.git/llm-wiki-extractors/`. If Go is installed in a
254
+ nonstandard location or the `go` on `PATH` cannot run, set
255
+ `LLM_WIKI_GO=/path/to/go` before running `prepare-extractors`.
256
+
226
257
  ### `lint` and `ci-check`
227
258
 
228
259
  Validate wiki links, orphan pages, entities, modules, workflows,
@@ -231,20 +262,40 @@ infrastructure, plugin lint rules, and team policy.
231
262
  ```bash
232
263
  llm-wiki lint --wiki-dir docs/llm_wiki --src-dir .
233
264
  llm-wiki lint --strict --wiki-dir docs/llm_wiki --src-dir .
265
+ llm-wiki lint --profile --wiki-dir docs/llm_wiki --src-dir .
266
+ llm-wiki lint --cache-stats --wiki-dir docs/llm_wiki --src-dir .
267
+ llm-wiki lint --jobs auto --wiki-dir docs/llm_wiki --src-dir .
234
268
  ```
235
269
 
236
270
  Strict mode also requires the core wiki structure and a fresh sync manifest.
271
+ `--profile` suppresses the human-readable lint text and prints one JSON object
272
+ to stdout containing the normal lint report, diagnostics, and phase timings.
273
+ The JSON contract is preserved for extractor failures as well; lint still exits
274
+ nonzero, but stdout remains machine-readable.
275
+ Lint uses a persistent deep-inventory cache by default when a git directory is
276
+ available, storing `.git/llm-wiki-inventory-cache.json`. Override the cache
277
+ directory with `LLM_WIKI_CACHE_DIR` or `--cache-dir PATH`; the CLI flag wins.
278
+ Use `--no-cache` to disable load/save, `--rebuild-cache` to ignore and rewrite
279
+ the cache, and `--cache-stats` to include cache diagnostics. Cache corruption or
280
+ invalid fingerprints fall back to a full extraction without reducing lint
281
+ coverage. With `--profile --cache-stats`, the JSON payload includes a top-level
282
+ `cache` object. Use `--jobs N` or `--jobs auto` to opt into parallel built-in
283
+ language extraction; the default is `--jobs 1`. Plugin extractors remain
284
+ sequential unless future plugin metadata explicitly marks them parallel-safe.
237
285
 
238
286
  For CI:
239
287
 
240
288
  ```bash
241
289
  llm-wiki ci-check --src-dir . --wiki-dir docs/llm_wiki
290
+ llm-wiki ci-check --jobs auto --src-dir . --wiki-dir docs/llm_wiki
242
291
  llm-wiki ci-check --format json --report .git/llm-wiki-ci-report.md
243
292
  llm-wiki ci-check --format markdown
244
293
  ```
245
294
 
246
295
  `ci-check` always runs strict validation, writes a Markdown report, records a
247
- local metrics event, and exits nonzero on validation failure.
296
+ local metrics event, uses the same safe inventory cache when available, and
297
+ exits nonzero on validation failure. `--report` is an output path, so explicit
298
+ absolute paths and relative artifact paths outside the project root are allowed.
248
299
 
249
300
  ### `context`
250
301
 
@@ -293,7 +344,9 @@ llm-wiki generate-prompt --template compact
293
344
  ```
294
345
 
295
346
  The generated prompt includes change-type guidance. Installed prompt templates
296
- can override the default prompt body.
347
+ can override the default prompt body. The default prompt asks agents to run
348
+ `sync` first, then perform a semantic pass on affected pages before accepting a
349
+ lint-clean wiki as complete.
297
350
 
298
351
  ### `mcp`
299
352
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "agent-wiki-cli"
7
- version = "0.3.41"
7
+ version = "0.5.1"
8
8
  description = "CLI tool to maintain hybrid LLM Wikis for multi-language projects."
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-wiki-cli
3
- Version: 0.3.41
3
+ Version: 0.5.1
4
4
  Summary: CLI tool to maintain hybrid LLM Wikis for multi-language projects.
5
5
  Author-email: Denis Sivagin <denissvgn@gmail.com>
6
6
  License: MIT
@@ -58,15 +58,16 @@ external tools when they are available on `PATH`.
58
58
  | Area | Implementation | Runtime requirement |
59
59
  |---|---|---|
60
60
  | Python | stdlib `ast` | Python 3.9+ |
61
- | TypeScript / TSX | bundled Node script using `ts-morph` | Node.js and npm |
62
- | Go | bundled Go extractor using `go/ast` | Go toolchain |
63
- | Rust | bundled Rust extractor using `syn` | Cargo / Rust toolchain |
61
+ | TypeScript / TSX | bundled Node script using `ts-morph` | prepared Node.js dependencies |
62
+ | Go | bundled Go extractor using `go/ast` | prepared helper binary |
63
+ | Rust | bundled Rust extractor using `syn` | prepared helper binary |
64
64
  | Docker / Compose | built-in parsers | none |
65
65
  | MCP server | official Python MCP SDK | `agent-wiki-cli[mcp]`, Python 3.10+ |
66
66
 
67
- TypeScript, Go, and Rust extras are metadata-only; the actual toolchains must be
68
- installed separately. The TypeScript extractor runs `npm install` in its bundled
69
- extractor directory on first use if `node_modules` is missing.
67
+ TypeScript, Go, and Rust extras are metadata-only; prepare their helper
68
+ dependencies explicitly with `llm-wiki prepare-extractors`. Lint, CI, and
69
+ extract never run `npm install`, `go build`, `go run`, `cargo build`, or
70
+ `cargo run` automatically.
70
71
 
71
72
  ## Agent Support
72
73
 
@@ -232,16 +233,29 @@ manifest.
232
233
 
233
234
  ```bash
234
235
  llm-wiki sync --src-dir . --wiki-dir docs/llm_wiki
236
+ llm-wiki sync --jobs auto --cache-stats --src-dir . --wiki-dir docs/llm_wiki
235
237
  ```
236
238
 
237
239
  If an older wiki has `index.md` but no manifest, `sync` seeds
238
240
  `.llm-wiki-manifest.json` without modifying pages. If neither a manifest nor an
239
- existing wiki is present, run `bootstrap` first.
241
+ existing wiki is present, run `bootstrap` first. Sync uses the same safe
242
+ persistent inventory cache as lint when a git directory is available. Use
243
+ `--no-cache`, `--rebuild-cache`, `--cache-dir PATH`, and `--cache-stats` to
244
+ control or inspect cache behavior. Use `--jobs N` or `--jobs auto` to opt into
245
+ parallel built-in language extraction. Sync repairs manifests with invalid
246
+ source hashes without touching pages, and stops unusually broad diffs unless
247
+ `--force` is used.
248
+
249
+ `sync` is deterministic: it updates AST/docstring-based page skeletons and does
250
+ not call an LLM. In agent workflows, treat sync as the first step, then inspect
251
+ created or updated pages and replace generic `_Auto-generated from ..._`,
252
+ copied-docstring-only, or knowable `—` placeholders with project-specific
253
+ semantic explanations.
240
254
 
241
255
  ### `extract`
242
256
 
243
257
  Print source inventory as JSON. All registered extractors run; missing optional
244
- toolchains are skipped when there are no matching source files.
258
+ prepared helpers are skipped when there are no matching source files.
245
259
 
246
260
  ```bash
247
261
  llm-wiki extract --src-dir .
@@ -253,6 +267,23 @@ llm-wiki extract --src-dir . --package llm_wiki_cli
253
267
  llm-wiki extract --src-dir . --include-empty
254
268
  ```
255
269
 
270
+ ### `prepare-extractors`
271
+
272
+ Prepare TypeScript dependencies and cached Go/Rust helper binaries outside the
273
+ lint/extract hot path.
274
+
275
+ ```bash
276
+ llm-wiki prepare-extractors --src-dir .
277
+ llm-wiki prepare-extractors --language typescript --language go
278
+ llm-wiki prepare-extractors --cache-dir .cache/llm-wiki
279
+ ```
280
+
281
+ When `--language` is omitted, only helper languages detected in `--src-dir` are
282
+ prepared. Helper cache resolution follows `--cache-dir`, then
283
+ `LLM_WIKI_CACHE_DIR`, then `.git/llm-wiki-extractors/`. If Go is installed in a
284
+ nonstandard location or the `go` on `PATH` cannot run, set
285
+ `LLM_WIKI_GO=/path/to/go` before running `prepare-extractors`.
286
+
256
287
  ### `lint` and `ci-check`
257
288
 
258
289
  Validate wiki links, orphan pages, entities, modules, workflows,
@@ -261,20 +292,40 @@ infrastructure, plugin lint rules, and team policy.
261
292
  ```bash
262
293
  llm-wiki lint --wiki-dir docs/llm_wiki --src-dir .
263
294
  llm-wiki lint --strict --wiki-dir docs/llm_wiki --src-dir .
295
+ llm-wiki lint --profile --wiki-dir docs/llm_wiki --src-dir .
296
+ llm-wiki lint --cache-stats --wiki-dir docs/llm_wiki --src-dir .
297
+ llm-wiki lint --jobs auto --wiki-dir docs/llm_wiki --src-dir .
264
298
  ```
265
299
 
266
300
  Strict mode also requires the core wiki structure and a fresh sync manifest.
301
+ `--profile` suppresses the human-readable lint text and prints one JSON object
302
+ to stdout containing the normal lint report, diagnostics, and phase timings.
303
+ The JSON contract is preserved for extractor failures as well; lint still exits
304
+ nonzero, but stdout remains machine-readable.
305
+ Lint uses a persistent deep-inventory cache by default when a git directory is
306
+ available, storing `.git/llm-wiki-inventory-cache.json`. Override the cache
307
+ directory with `LLM_WIKI_CACHE_DIR` or `--cache-dir PATH`; the CLI flag wins.
308
+ Use `--no-cache` to disable load/save, `--rebuild-cache` to ignore and rewrite
309
+ the cache, and `--cache-stats` to include cache diagnostics. Cache corruption or
310
+ invalid fingerprints fall back to a full extraction without reducing lint
311
+ coverage. With `--profile --cache-stats`, the JSON payload includes a top-level
312
+ `cache` object. Use `--jobs N` or `--jobs auto` to opt into parallel built-in
313
+ language extraction; the default is `--jobs 1`. Plugin extractors remain
314
+ sequential unless future plugin metadata explicitly marks them parallel-safe.
267
315
 
268
316
  For CI:
269
317
 
270
318
  ```bash
271
319
  llm-wiki ci-check --src-dir . --wiki-dir docs/llm_wiki
320
+ llm-wiki ci-check --jobs auto --src-dir . --wiki-dir docs/llm_wiki
272
321
  llm-wiki ci-check --format json --report .git/llm-wiki-ci-report.md
273
322
  llm-wiki ci-check --format markdown
274
323
  ```
275
324
 
276
325
  `ci-check` always runs strict validation, writes a Markdown report, records a
277
- local metrics event, and exits nonzero on validation failure.
326
+ local metrics event, uses the same safe inventory cache when available, and
327
+ exits nonzero on validation failure. `--report` is an output path, so explicit
328
+ absolute paths and relative artifact paths outside the project root are allowed.
278
329
 
279
330
  ### `context`
280
331
 
@@ -323,7 +374,9 @@ llm-wiki generate-prompt --template compact
323
374
  ```
324
375
 
325
376
  The generated prompt includes change-type guidance. Installed prompt templates
326
- can override the default prompt body.
377
+ can override the default prompt body. The default prompt asks agents to run
378
+ `sync` first, then perform a semantic pass on affected pages before accepting a
379
+ lint-clean wiki as complete.
327
380
 
328
381
  ### `mcp`
329
382
 
@@ -26,6 +26,7 @@ src/llm_wiki_cli/commands/metrics_cmd.py
26
26
  src/llm_wiki_cli/commands/migrate_cmd.py
27
27
  src/llm_wiki_cli/commands/obsidian_cmd.py
28
28
  src/llm_wiki_cli/commands/plugins_cmd.py
29
+ src/llm_wiki_cli/commands/prepare_extractors_cmd.py
29
30
  src/llm_wiki_cli/commands/release_cmd.py
30
31
  src/llm_wiki_cli/commands/review_cmd.py
31
32
  src/llm_wiki_cli/commands/status_cmd.py
@@ -49,7 +50,9 @@ src/llm_wiki_cli/extractors/ts_scripts/extract.js
49
50
  src/llm_wiki_cli/extractors/ts_scripts/package.json
50
51
  src/llm_wiki_cli/services/__init__.py
51
52
  src/llm_wiki_cli/services/circuit_breaker.py
53
+ src/llm_wiki_cli/services/extractor_helpers.py
52
54
  src/llm_wiki_cli/services/imports.py
55
+ src/llm_wiki_cli/services/inventory_cache.py
53
56
  src/llm_wiki_cli/services/io.py
54
57
  src/llm_wiki_cli/services/lockfile.py
55
58
  src/llm_wiki_cli/services/mcp_server.py
@@ -60,10 +63,12 @@ src/llm_wiki_cli/services/paths.py
60
63
  src/llm_wiki_cli/services/plugins.py
61
64
  src/llm_wiki_cli/services/schema.py
62
65
  src/llm_wiki_cli/services/secure_file.py
66
+ src/llm_wiki_cli/services/source_snapshot.py
63
67
  src/llm_wiki_cli/services/team.py
64
68
  src/llm_wiki_cli/services/versioning.py
65
69
  tests/test_bootstrap.py
66
70
  tests/test_bump.py
71
+ tests/test_ci_check.py
67
72
  tests/test_circuit_breaker.py
68
73
  tests/test_config.py
69
74
  tests/test_context.py
@@ -72,10 +77,13 @@ tests/test_docker_extract.py
72
77
  tests/test_docker_lint.py
73
78
  tests/test_e2e.py
74
79
  tests/test_extract.py
80
+ tests/test_extractor_helpers.py
75
81
  tests/test_generate_prompt.py
76
82
  tests/test_go_extract.py
77
83
  tests/test_hook.py
84
+ tests/test_imports.py
78
85
  tests/test_init.py
86
+ tests/test_inventory_cache.py
79
87
  tests/test_io.py
80
88
  tests/test_lint.py
81
89
  tests/test_lockfile.py
@@ -89,6 +97,7 @@ tests/test_plugins.py
89
97
  tests/test_release.py
90
98
  tests/test_rust_extract.py
91
99
  tests/test_schema.py
100
+ tests/test_source_snapshot.py
92
101
  tests/test_status.py
93
102
  tests/test_sync.py
94
103
  tests/test_team.py
@@ -17,6 +17,7 @@ from .commands import (
17
17
  migrate_cmd,
18
18
  obsidian_cmd,
19
19
  plugins_cmd,
20
+ prepare_extractors_cmd,
20
21
  release_cmd,
21
22
  review_cmd,
22
23
  status_cmd,
@@ -37,6 +38,18 @@ def _positive_int(value: str) -> int:
37
38
  return parsed
38
39
 
39
40
 
41
+ def _jobs_value(value: str) -> int:
42
+ if value == "auto":
43
+ return max(1, os.cpu_count() or 1)
44
+ try:
45
+ parsed = int(value)
46
+ except ValueError as exc:
47
+ raise argparse.ArgumentTypeError("must be a positive integer or 'auto'") from exc
48
+ if parsed < 1:
49
+ raise argparse.ArgumentTypeError("must be greater than zero")
50
+ return parsed
51
+
52
+
40
53
  def main():
41
54
  parser = argparse.ArgumentParser(description="LLM Wiki CLI")
42
55
  parser.add_argument("--version", action="version", version=f"llm-wiki {__version__}")
@@ -72,6 +85,33 @@ def main():
72
85
  lint_parser.add_argument("--src-dir", default=".", help="Source directory to cross-reference against")
73
86
  lint_parser.add_argument("--strict", action="store_true",
74
87
  help="Require core wiki structure and a fresh sync manifest")
88
+ lint_parser.add_argument("--profile", action="store_true",
89
+ help="Print combined lint report and phase timings as JSON")
90
+ lint_parser.add_argument("--no-cache", action="store_true",
91
+ help="Disable persistent inventory cache for this run")
92
+ lint_parser.add_argument("--rebuild-cache", action="store_true",
93
+ help="Ignore existing inventory cache and rewrite it after extraction")
94
+ lint_parser.add_argument("--cache-stats", action="store_true",
95
+ help="Include inventory cache diagnostics in lint output")
96
+ lint_parser.add_argument("--cache-dir", default=None, metavar="PATH",
97
+ help="Directory for llm-wiki-inventory-cache.json")
98
+ lint_parser.add_argument("--jobs", type=_jobs_value, default=1, metavar="JOBS",
99
+ help="Parallel built-in extractor jobs: positive integer or 'auto' (default: 1)")
100
+
101
+ # prepare-extractors command
102
+ prepare_parser = subparsers.add_parser(
103
+ "prepare-extractors",
104
+ help="Prepare TypeScript, Go, and Rust extractor helpers",
105
+ )
106
+ prepare_parser.add_argument("--src-dir", default=".", help="Source directory to inspect")
107
+ prepare_parser.add_argument("--cache-dir", default=None, metavar="PATH",
108
+ help="Directory for extractor helper cache")
109
+ prepare_parser.add_argument(
110
+ "--language",
111
+ action="append",
112
+ choices=["typescript", "go", "rust"],
113
+ help="Helper language to prepare; may be repeated",
114
+ )
75
115
 
76
116
  # ci-check command
77
117
  ci_parser = subparsers.add_parser("ci-check", help="Run strict wiki validation and write a CI report")
@@ -82,6 +122,8 @@ def main():
82
122
  help="Console output format (default: text)")
83
123
  ci_parser.add_argument("--report", default=".git/llm-wiki-ci-report.md",
84
124
  help="Markdown report path (default: .git/llm-wiki-ci-report.md)")
125
+ ci_parser.add_argument("--jobs", type=_jobs_value, default=1, metavar="JOBS",
126
+ help="Parallel built-in extractor jobs: positive integer or 'auto' (default: 1)")
85
127
 
86
128
  # hook command
87
129
  hook_parser = subparsers.add_parser("install-hook", help="Install git hooks for wiki sync")
@@ -306,6 +348,18 @@ def main():
306
348
  sync_parser.add_argument("--src-dir", default=".", help="Source directory to scan (default: .)")
307
349
  sync_parser.add_argument("--wiki-dir", default=DEFAULT_WIKI_DIR,
308
350
  help="Wiki directory (default: docs/llm_wiki)")
351
+ sync_parser.add_argument("--no-cache", action="store_true",
352
+ help="Disable persistent inventory cache for this run")
353
+ sync_parser.add_argument("--rebuild-cache", action="store_true",
354
+ help="Ignore existing inventory cache and rewrite it after extraction")
355
+ sync_parser.add_argument("--cache-stats", action="store_true",
356
+ help="Include inventory cache diagnostics in sync output")
357
+ sync_parser.add_argument("--cache-dir", default=None, metavar="PATH",
358
+ help="Directory for llm-wiki-inventory-cache.json")
359
+ sync_parser.add_argument("--jobs", type=_jobs_value, default=1, metavar="JOBS",
360
+ help="Parallel built-in extractor jobs: positive integer or 'auto' (default: 1)")
361
+ sync_parser.add_argument("--force", action="store_true",
362
+ help="Allow sync to apply unusually broad source diffs")
309
363
 
310
364
  # migrate command
311
365
  migrate_parser = subparsers.add_parser(
@@ -349,6 +403,8 @@ def main():
349
403
  extract_cmd.run(args)
350
404
  elif args.command == "lint":
351
405
  lint_cmd.run(args)
406
+ elif args.command == "prepare-extractors":
407
+ prepare_extractors_cmd.run(args)
352
408
  elif args.command == "ci-check":
353
409
  ci_check_cmd.run(args)
354
410
  elif args.command == "install-hook":