woods 2.0.0.beta2 → 2.0.0.beta4

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 (233) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +339 -1
  3. data/CONTRIBUTING.md +188 -12
  4. data/README.md +93 -174
  5. data/SECURITY.md +9 -6
  6. data/docs/AGENT_GUIDE.md +109 -8
  7. data/docs/AGENT_SETUP.md +98 -7
  8. data/docs/BACKEND_MATRIX.md +25 -0
  9. data/docs/CLIENT_HOOKS.md +111 -0
  10. data/docs/CONFIGURATION_REFERENCE.md +267 -16
  11. data/docs/CONSOLE_MCP_SETUP.md +80 -7
  12. data/docs/DOCKER_SETUP.md +22 -3
  13. data/docs/EVALUATION.md +464 -1
  14. data/docs/EXTRACTOR_REFERENCE.md +45 -6
  15. data/docs/FAQ.md +11 -12
  16. data/docs/GETTING_STARTED.md +17 -5
  17. data/docs/INCREMENTAL_EXTRACTION.md +147 -7
  18. data/docs/INDEX_LAYOUT.md +382 -0
  19. data/docs/INTERNALS.md +7 -2
  20. data/docs/MCP_SERVERS.md +276 -5
  21. data/docs/MCP_TOOL_COOKBOOK.md +37 -22
  22. data/docs/MCP_WORKTREE_SETUP.md +43 -83
  23. data/docs/NOTION_INTEGRATION.md +13 -0
  24. data/docs/OBSIDIAN_INTEGRATION.md +57 -9
  25. data/docs/PUBLISHED_INDEX.md +72 -0
  26. data/docs/README.md +7 -0
  27. data/docs/RETRIEVAL_GUIDE.md +273 -12
  28. data/docs/RUNTIME_TRACING.md +71 -0
  29. data/docs/SOURCE_FRESHNESS.md +143 -0
  30. data/docs/TROUBLESHOOTING.md +129 -18
  31. data/docs/UNBLOCKED_INTEGRATION.md +25 -0
  32. data/docs/UPGRADING_TO_2.md +48 -22
  33. data/docs/WATCH_DAEMON.md +277 -67
  34. data/exe/woods-agent-config +6 -0
  35. data/exe/woods-extract +5 -0
  36. data/exe/woods-hook-context +6 -0
  37. data/exe/woods-mcp-start +14 -9
  38. data/lib/generators/woods/pgvector_generator.rb +8 -2
  39. data/lib/generators/woods/templates/woods.rb.tt +1 -3
  40. data/lib/tasks/woods.rake +47 -397
  41. data/lib/woods/agent_configuration/applier.rb +135 -0
  42. data/lib/woods/agent_configuration/cli.rb +101 -0
  43. data/lib/woods/agent_configuration/cli_options.rb +29 -0
  44. data/lib/woods/agent_configuration/document.rb +105 -0
  45. data/lib/woods/agent_configuration/error.rb +7 -0
  46. data/lib/woods/agent_configuration/launcher.rb +75 -0
  47. data/lib/woods/agent_configuration/layout.rb +72 -0
  48. data/lib/woods/agent_configuration/managed_section.rb +62 -0
  49. data/lib/woods/agent_configuration/plan.rb +98 -0
  50. data/lib/woods/agent_configuration/plan_diff.rb +38 -0
  51. data/lib/woods/agent_configuration/planned_files.rb +61 -0
  52. data/lib/woods/agent_configuration/planner.rb +63 -0
  53. data/lib/woods/agent_configuration/planner_validation.rb +77 -0
  54. data/lib/woods/agent_configuration/preflight.rb +100 -0
  55. data/lib/woods/agent_configuration/recovery.rb +49 -0
  56. data/lib/woods/ast/node.rb +2 -0
  57. data/lib/woods/ast/parser.rb +38 -5
  58. data/lib/woods/builder.rb +21 -5
  59. data/lib/woods/cache/cache_middleware.rb +28 -7
  60. data/lib/woods/cache/cache_store.rb +4 -5
  61. data/lib/woods/change_set.rb +5 -4
  62. data/lib/woods/console/credential_index.rb +20 -2
  63. data/lib/woods/console/credential_scanner.rb +18 -17
  64. data/lib/woods/console/credential_scanner_registry.rb +36 -0
  65. data/lib/woods/console/dispatch_pipeline.rb +7 -0
  66. data/lib/woods/console/embedded_executor.rb +32 -10
  67. data/lib/woods/console/encrypted_credential_snapshot.rb +16 -0
  68. data/lib/woods/console/rack_middleware.rb +22 -13
  69. data/lib/woods/console/server.rb +18 -16
  70. data/lib/woods/console/sql_noise_stripper.rb +9 -7
  71. data/lib/woods/console/sql_table_scanner.rb +47 -7
  72. data/lib/woods/console/sql_validator.rb +49 -9
  73. data/lib/woods/console/sqlite_read_guard.rb +46 -0
  74. data/lib/woods/coordination/pipeline_lock.rb +3 -2
  75. data/lib/woods/dependency_graph.rb +65 -13
  76. data/lib/woods/embedding/corpus.rb +94 -0
  77. data/lib/woods/embedding/indexer.rb +114 -60
  78. data/lib/woods/embedding/openai.rb +17 -6
  79. data/lib/woods/evaluation/ablation_executor.rb +6 -1
  80. data/lib/woods/evaluation/ablation_timed_executor.rb +22 -4
  81. data/lib/woods/export/typed_reader.rb +56 -0
  82. data/lib/woods/extractor.rb +277 -149
  83. data/lib/woods/extractors/action_cable_extractor.rb +3 -1
  84. data/lib/woods/extractors/behavioral_profile.rb +9 -7
  85. data/lib/woods/extractors/caching_extractor.rb +3 -1
  86. data/lib/woods/extractors/concern_extractor.rb +64 -6
  87. data/lib/woods/extractors/configuration_extractor.rb +7 -3
  88. data/lib/woods/extractors/controller_extractor.rb +13 -4
  89. data/lib/woods/extractors/database_view_extractor.rb +3 -1
  90. data/lib/woods/extractors/declared_parent.rb +55 -0
  91. data/lib/woods/extractors/decorator_extractor.rb +3 -1
  92. data/lib/woods/extractors/engine_extractor.rb +3 -1
  93. data/lib/woods/extractors/event_extractor.rb +4 -2
  94. data/lib/woods/extractors/factory_extractor.rb +3 -1
  95. data/lib/woods/extractors/graphql_extractor.rb +10 -13
  96. data/lib/woods/extractors/i18n_extractor.rb +3 -1
  97. data/lib/woods/extractors/job_extractor.rb +6 -19
  98. data/lib/woods/extractors/lib_extractor.rb +13 -9
  99. data/lib/woods/extractors/mailer_extractor.rb +26 -15
  100. data/lib/woods/extractors/manager_extractor.rb +3 -1
  101. data/lib/woods/extractors/method_parameters.rb +53 -0
  102. data/lib/woods/extractors/middleware_argument.rb +65 -0
  103. data/lib/woods/extractors/middleware_extractor.rb +9 -3
  104. data/lib/woods/extractors/migration_extractor.rb +3 -1
  105. data/lib/woods/extractors/model_extractor.rb +26 -34
  106. data/lib/woods/extractors/package_extractor.rb +24 -4
  107. data/lib/woods/extractors/phlex_extractor.rb +3 -1
  108. data/lib/woods/extractors/policy_extractor.rb +3 -1
  109. data/lib/woods/extractors/poro_extractor.rb +13 -9
  110. data/lib/woods/extractors/pundit_extractor.rb +3 -1
  111. data/lib/woods/extractors/rails_source_extractor.rb +4 -2
  112. data/lib/woods/extractors/rake_task_extractor.rb +4 -2
  113. data/lib/woods/extractors/route_extractor.rb +3 -1
  114. data/lib/woods/extractors/route_helper_resolver.rb +10 -33
  115. data/lib/woods/extractors/scheduled_job_extractor.rb +41 -15
  116. data/lib/woods/extractors/serializer_extractor.rb +4 -2
  117. data/lib/woods/extractors/service_extractor.rb +3 -1
  118. data/lib/woods/extractors/shared_dependency_scanner.rb +2 -2
  119. data/lib/woods/extractors/shared_utility_methods.rb +48 -19
  120. data/lib/woods/extractors/source_nesting.rb +1 -1
  121. data/lib/woods/extractors/state_machine_extractor.rb +3 -1
  122. data/lib/woods/extractors/test_mapping_extractor.rb +3 -1
  123. data/lib/woods/extractors/validator_extractor.rb +3 -1
  124. data/lib/woods/extractors/view_component_extractor.rb +3 -1
  125. data/lib/woods/extractors/view_template_extractor.rb +3 -1
  126. data/lib/woods/gem_mapper.rb +2 -0
  127. data/lib/woods/git_history.rb +116 -0
  128. data/lib/woods/graph_analyzer.rb +35 -6
  129. data/lib/woods/hooks/context_cli.rb +54 -0
  130. data/lib/woods/hooks/context_event.rb +88 -0
  131. data/lib/woods/hooks/context_hint.rb +73 -0
  132. data/lib/woods/hooks/context_impact.rb +77 -0
  133. data/lib/woods/hooks/context_output.rb +47 -0
  134. data/lib/woods/hooks/context_state.rb +102 -0
  135. data/lib/woods/hooks/refresh.rb +79 -0
  136. data/lib/woods/hooks/rule_projection.rb +78 -0
  137. data/lib/woods/input_rules.rb +19 -0
  138. data/lib/woods/mcp/bearer_auth.rb +22 -13
  139. data/lib/woods/mcp/bootstrapper.rb +79 -4
  140. data/lib/woods/mcp/config_resolver.rb +2 -1
  141. data/lib/woods/mcp/index_reader.rb +334 -162
  142. data/lib/woods/mcp/initialization_guidance.rb +27 -0
  143. data/lib/woods/mcp/origin_guard.rb +17 -9
  144. data/lib/woods/mcp/published_lexical_retriever.rb +115 -0
  145. data/lib/woods/mcp/renderers/markdown_renderer.rb +22 -9
  146. data/lib/woods/mcp/renderers/plain_renderer.rb +18 -8
  147. data/lib/woods/mcp/search_results.rb +74 -0
  148. data/lib/woods/mcp/server.rb +178 -63
  149. data/lib/woods/mcp/tool_contract.rb +3 -1
  150. data/lib/woods/mcp/tool_response_renderer.rb +41 -0
  151. data/lib/woods/mcp/traversal_evidence.rb +113 -0
  152. data/lib/woods/mcp/traversal_evidence_index.rb +100 -0
  153. data/lib/woods/mcp/traversal_evidence_page.rb +41 -0
  154. data/lib/woods/mcp/traversal_evidence_text.rb +52 -0
  155. data/lib/woods/mcp/traversal_response.rb +22 -0
  156. data/lib/woods/notion/exporter.rb +56 -17
  157. data/lib/woods/obsidian/destination_plan.rb +98 -0
  158. data/lib/woods/obsidian/name_mapper.rb +19 -3
  159. data/lib/woods/obsidian/note_builder.rb +19 -10
  160. data/lib/woods/obsidian/vault_exporter.rb +88 -32
  161. data/lib/woods/operator/pipeline_guard.rb +18 -13
  162. data/lib/woods/path_dispatcher.rb +13 -6
  163. data/lib/woods/payload_store.rb +27 -26
  164. data/lib/woods/published_index/typed_unit_reader.rb +40 -3
  165. data/lib/woods/published_index.rb +2 -2
  166. data/lib/woods/railtie.rb +3 -3
  167. data/lib/woods/railtie_support.rb +12 -12
  168. data/lib/woods/rake_helpers.rb +382 -0
  169. data/lib/woods/resilience/graph_invariant_validator/membership_checks.rb +71 -0
  170. data/lib/woods/resilience/graph_invariant_validator/node_checks.rb +61 -0
  171. data/lib/woods/resilience/graph_invariant_validator/reverse_relationship_checks.rb +46 -0
  172. data/lib/woods/resilience/graph_invariant_validator.rb +119 -0
  173. data/lib/woods/resilience/index_validator/graph_checks.rb +80 -0
  174. data/lib/woods/resilience/index_validator.rb +112 -23
  175. data/lib/woods/retrieval/context_assembler.rb +50 -15
  176. data/lib/woods/retrieval/lexical_assembler.rb +84 -0
  177. data/lib/woods/retrieval/lexical_index.rb +120 -0
  178. data/lib/woods/retrieval/ranker.rb +4 -2
  179. data/lib/woods/retrieval/scope.rb +108 -0
  180. data/lib/woods/retrieval/scoped_graph_store.rb +32 -0
  181. data/lib/woods/retrieval/scoped_vector_store.rb +55 -0
  182. data/lib/woods/retrieval/search_executor.rb +86 -27
  183. data/lib/woods/retrieval/source_evidence.rb +200 -0
  184. data/lib/woods/retriever.rb +98 -22
  185. data/lib/woods/ruby_analyzer/trace_enricher.rb +77 -38
  186. data/lib/woods/session_tracer/file_store.rb +6 -1
  187. data/lib/woods/session_tracer/middleware.rb +10 -12
  188. data/lib/woods/session_tracer/redis_store.rb +22 -6
  189. data/lib/woods/session_tracer/session_flow_assembler.rb +23 -17
  190. data/lib/woods/session_tracer/solid_cache_coordination.rb +6 -4
  191. data/lib/woods/session_tracer/unit_resolver.rb +63 -0
  192. data/lib/woods/source_inputs/consumer_errors.rb +31 -0
  193. data/lib/woods/source_inputs/handoff.rb +102 -0
  194. data/lib/woods/source_inputs/launcher.rb +157 -0
  195. data/lib/woods/source_inputs/manifest.rb +124 -0
  196. data/lib/woods/source_inputs/private_key.rb +55 -0
  197. data/lib/woods/source_inputs/scanner.rb +171 -0
  198. data/lib/woods/source_inputs/scopes.rb +71 -0
  199. data/lib/woods/source_inputs/session.rb +214 -0
  200. data/lib/woods/source_inputs/status.rb +84 -0
  201. data/lib/woods/source_inputs/verifier.rb +107 -0
  202. data/lib/woods/storage/metadata_store.rb +25 -25
  203. data/lib/woods/storage/pgvector.rb +35 -10
  204. data/lib/woods/storage/qdrant.rb +17 -7
  205. data/lib/woods/storage/vector_store.rb +18 -6
  206. data/lib/woods/tasks.rb +3 -2
  207. data/lib/woods/temporal/json_snapshot_store.rb +58 -9
  208. data/lib/woods/unblocked/exporter.rb +59 -70
  209. data/lib/woods/version.rb +1 -1
  210. data/lib/woods/watch/boot_snapshot.rb +52 -0
  211. data/lib/woods/watch/daemon.rb +154 -32
  212. data/lib/woods/watch/listen_watcher.rb +4 -0
  213. data/lib/woods/watch/polling_watcher.rb +5 -1
  214. data/lib/woods/watch/status.rb +20 -15
  215. data/lib/woods/watch/tree_scan.rb +21 -13
  216. data/lib/woods/watch/watcher.rb +4 -1
  217. data/lib/woods.rb +50 -11
  218. data/plugin/.claude-plugin/plugin.json +1 -1
  219. data/plugin/hooks/adapters/normalize.jq +15 -0
  220. data/plugin/hooks/adapters/normalize.rb +63 -0
  221. data/plugin/hooks/hooks.json +20 -0
  222. data/plugin/hooks/woods-context.sh +50 -0
  223. data/plugin/hooks/woods-input-rules.sh +159 -0
  224. data/plugin/hooks/woods-opencode.mjs +65 -0
  225. data/plugin/hooks/woods-post-edit.sh +2 -225
  226. data/plugin/hooks/woods-refresh.sh +260 -0
  227. data/plugin/hooks/woods-session-start.sh +47 -55
  228. data/plugin/skills/woods-agent-enable/SKILL.md +19 -0
  229. data/plugin/skills/woods-diagnose/SKILL.md +319 -1
  230. data/plugin/skills/woods-investigate/SKILL.md +145 -0
  231. data/plugin/skills/woods-mcp-config/SKILL.md +90 -2
  232. data/plugin/skills/woods-setup/SKILL.md +110 -6
  233. metadata +87 -5
@@ -5,6 +5,19 @@ description: Configure Woods MCP connections with the exact client JSON shapes a
5
5
 
6
6
  # Woods MCP configuration
7
7
 
8
+ ## Managed configuration availability
9
+
10
+ `woods-agent-config` (#407) is available in Woods `2.0.0.beta3`. First record the
11
+ installed version and test `bundle exec woods-agent-config --help` in the
12
+ selected application bundle. When supported, use its saved setup/update/remove
13
+ plan and explicit client/scope/root selection; apply the reviewed plan within
14
+ the user's existing authorization. Do not infer ownership from a server name
15
+ or repair edited managed sections by overwriting them. Plans and recovery
16
+ journals contain private configuration bytes. See the canonical
17
+ [managed configuration runbook](https://github.com/lost-in-the/woods/blob/main/docs/AGENT_SETUP.md#managed-claude-code-configuration)
18
+ for host/Compose preflight, actual Claude file locations, conflict recovery,
19
+ and removal. Preserve manual setup for older installed versions.
20
+
8
21
  ## Preflight
9
22
 
10
23
  ```bash
@@ -17,6 +30,15 @@ This skill describes the Woods 2.x line; the authoritative minimum version lives
17
30
 
18
31
  Default to Index-only. It reads generated code context and exposes 14 tools. Console MCP boots Rails and reads live data; ask before enabling it.
19
32
 
33
+ Initialization guidance (#402) is available in Woods `2.0.0.beta3`; check the
34
+ installed gem before expecting MCP `instructions`. Supporting servers provide
35
+ a short workflow through initialization or modern discovery; protocol
36
+ `2024-11-05` omits it. Missing instructions alone are not a connection failure.
37
+ Keep normal protocol negotiation and use the
38
+ [agent guide](https://github.com/lost-in-the/woods/blob/main/docs/AGENT_GUIDE.md)
39
+ when unavailable. See the
40
+ [initialization contract](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#initialization-guidance).
41
+
20
42
  ## Shape 1: Index-only
21
43
 
22
44
  ```json
@@ -33,6 +55,11 @@ Default to Index-only. It reads generated code context and exposes 14 tools. Con
33
55
 
34
56
  Use this shape for any stdio-capable MCP client, adapted to the client's configuration location. `woods-mcp-start` validates and launches; it does not install or auto-restart.
35
57
 
58
+ Writer-version provenance (#323) is available in Woods `2.0.0.beta3`; check the installed
59
+ gem version's release notes before expecting `index.woods_version` in `woods_status`. It reports
60
+ the last manifest publisher, independently of `server.version`. Treat missing/null
61
+ as unknown and see [writer provenance](https://github.com/lost-in-the/woods/blob/main/docs/PUBLISHED_INDEX.md#manifest-writer-provenance).
62
+
36
63
  When Woods is installed only in Docker, prefer running the server through the application container:
37
64
 
38
65
  ```json
@@ -47,10 +74,16 @@ When Woods is installed only in Docker, prefer running the server through the ap
47
74
  }
48
75
  ```
49
76
 
50
- Use a host-side bundle only after verifying Ruby, the application bundle, and the index are available on the host. Always pass the path visible to the process that runs `woods-mcp`.
77
+ Use a host-side bundle only after verifying Ruby, the application bundle, and the index are available on the host. Always pass the path visible to the process that runs `woods-mcp`. Prefer an explicit index path on all versions. After `2.0.0.beta3`, an unreleased change adds `WOODS_OUTPUT` as a fallback after the positional path and `WOODS_DIR`; check the installed version's configuration guide before relying on it. `woods-mcp-start` still refuses a missing path rather than selecting its working directory.
51
78
 
52
79
  A read-only index mount is sufficient for structural tools. The `reload` tool for in-memory semantic retrieval also takes Woods' shared on-disk writer lock, so the MCP process needs write access to the index directory. Without it, reload returns a typed degraded error and keeps serving the previous aligned generation. Either grant that access or restart the MCP process after publishing a new embedded index.
53
80
 
81
+ For host MCP reading a container daemon's shared index, foreign heartbeat trust
82
+ (#321) is available in Woods `2.0.0.beta3`. Verify the installed gem version's release notes before
83
+ offering `WOODS_WATCH_TRUST_FOREIGN_HOST=1` in the MCP environment. It makes
84
+ `woods_status.watch.alive` use the same bounded freshness policy as task readers;
85
+ see [cross-host liveness](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#cross-host-liveness).
86
+
54
87
  ## Shape 2: Index plus authorized Console
55
88
 
56
89
  After explicit authorization, enable the live-data master switch in the Rails initializer. The process exits while it remains false:
@@ -62,7 +95,14 @@ Woods.configure do |config|
62
95
  end
63
96
  ```
64
97
 
65
- The token authenticates HTTP requests and is not sent by a stdio client. Production Rails boot still requires `WOODS_CONSOLE_MCP_TOKEN` to contain at least 32 characters whenever Console is enabled, including for a stdio-only setup. Keep it in the application's secret store. Outside production, omitting it warns and leaves the Console HTTP endpoint guarded with 401.
98
+ The token authenticates HTTP requests and is not sent by a stdio client.
99
+ Before suggesting `console_mcp_http_enabled = false`, verify that the installed
100
+ version supports it: the option is available in Woods `2.0.0.beta3`. Supported
101
+ stdio-only hosts can set it to `false` and omit the HTTP token; older
102
+ versions require the token at production boot whenever Console is enabled.
103
+ For HTTP, retain a strong token, allowed origins and TLS. Use installed-version
104
+ tagged documentation; the [canonical Console guide](https://github.com/lost-in-the/woods/blob/main/docs/CONSOLE_MCP_SETUP.md)
105
+ tracks current source.
66
106
 
67
107
  Then add a direct Console process:
68
108
 
@@ -99,3 +139,51 @@ Reconnect through the client so it performs its supported MCP negotiation. Clien
99
139
  Do not use an isolated raw JSON-RPC request as proof of MCP health. Do not claim conditional Index or inventory-only Console schemas are callable.
100
140
 
101
141
  Canonical guide: [MCP_SERVERS.md](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md).
142
+
143
+ ## Lexical retrieval capability check
144
+
145
+ Lexical retrieval is available from `2.0.0.beta3`. Before proposing it, verify the installed gem
146
+ exposes `Woods::Configuration#retrieval_mode` and its matching guide documents
147
+ `WOODS_RETRIEVAL_MODE`. Keep the installed-version preflight; do not infer support
148
+ from the plugin version or an unreleased checkout.
149
+
150
+ When supported, put `WOODS_RETRIEVAL_MODE=lexical` in the environment of the
151
+ process launching Index MCP (stdio or HTTP). A Rails initializer alone is not
152
+ loaded by that process. Restart the MCP server after changing its environment, then confirm `woods_status.retriever.mode` reports `lexical`. A beta3 no-provider error may omit this option; it does not mean embeddings are required for explicit lexical mode.
153
+ See the [retrieval guide](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#embedding-free-lexical-retrieval)
154
+ for the supported contract, checked against the installed gem version.
155
+
156
+ ## Explicit package or path scope
157
+
158
+ Check the connected tool's advertised input schema before sending `packages` or
159
+ `source_paths`; older installed gems may not support them. When present, both
160
+ `search` and `codebase_retrieve` apply explicit scope before candidate limits.
161
+ Use published nearest package names or application-relative directory prefixes,
162
+ then inspect `applied_scope` and search completeness. Unknown packages are argument
163
+ errors; unsupported custom vector adapters degrade instead of running a global
164
+ query. Scoping can hide relevant cross-boundary relationships, so broaden the
165
+ request deliberately when the task needs them. See the
166
+ [scope contract](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#explicit-package-and-source-path-scopes).
167
+
168
+ ## Source-content freshness (Woods 2.0.0.beta3; #405)
169
+
170
+ Check installed-version support before using `woods-extract` or the optional
171
+ `woods_status.source_check` argument. With support, inspect
172
+ `index.source_freshness`: `current`, `drifted` or `unknown`. Repeated edits to an
173
+ already-dirty file can leave the porcelain fingerprint unchanged. A quick scan
174
+ limit may justify one `source_check: "deep"`; unavailable source/private keys or
175
+ unproved boot/consumer coverage remain unknown. A fresh `bundle exec woods-extract full`
176
+ inside the application environment establishes preboot evidence. Never publish
177
+ `.source-inputs.key`, silently change its permissions, or delete queued edits to
178
+ hide diagnostics. Follow [source freshness](https://github.com/lost-in-the/woods/blob/main/docs/SOURCE_FRESHNESS.md).
179
+
180
+ ## Compact evidence capability check
181
+
182
+ Inspect the connected server's installed tool schemas before using `evidence` on
183
+ `lookup` or `codebase_retrieve`; older releases do not provide these controls.
184
+ When available, explicit `compact` selects complete published source spans and
185
+ `outline` lists declared APIs. Read omission/provenance fields and follow the
186
+ returned typed, SHA-guarded `full_evidence` lookup for verification. Published-unit
187
+ coordinates are not physical file offsets; unknown generation remains unknown.
188
+ Keep full-source access available. See the canonical
189
+ [evidence contract](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#compact-published-evidence-and-api-outlines).
@@ -7,6 +7,19 @@ description: Install, upgrade, and first-run-configure the Woods Rails code-inte
7
7
 
8
8
  Install a structural Index Server first. Embeddings and Console MCP are separate opt-ins.
9
9
 
10
+ ## Managed configuration availability
11
+
12
+ `woods-agent-config` (#407) is available in Woods `2.0.0.beta3`. First record the
13
+ installed version and test `bundle exec woods-agent-config --help` in the
14
+ selected application bundle. When supported, use its saved setup/update/remove
15
+ plan and explicit client/scope/root selection; apply the reviewed plan within
16
+ the user's existing authorization. Do not infer ownership from a server name
17
+ or repair edited managed sections by overwriting them. Plans and recovery
18
+ journals contain private configuration bytes. See the canonical
19
+ [managed configuration runbook](https://github.com/lost-in-the/woods/blob/main/docs/AGENT_SETUP.md#managed-claude-code-configuration)
20
+ for host/Compose preflight, actual Claude file locations, conflict recovery,
21
+ and removal. Preserve manual setup for older installed versions.
22
+
10
23
  ## Preflight
11
24
 
12
25
  Read repository instructions and preserve unrelated changes. Record:
@@ -23,7 +36,14 @@ This skill describes the Woods 2.x line; the authoritative minimum version lives
23
36
 
24
37
  ## Install and inspect
25
38
 
26
- Add `gem "woods", "~> 2.0"` to the development group, then:
39
+ Choose the published version using the canonical
40
+ [installation guide](https://github.com/lost-in-the/woods/blob/main/docs/GETTING_STARTED.md#1-install-the-gem)
41
+ and its linked README release table. When only prereleases are published for
42
+ 2.x, add the exact published beta/RC constraint shown there to the development
43
+ group; `~> 2.0` does not select prereleases. Use `gem "woods", "~> 2.0"` only after
44
+ a stable 2.x release is published. Follow the selected version's tag docs and
45
+ verify installed capabilities; installing this plugin does not install `main`
46
+ features. Then run:
27
47
 
28
48
  ```bash
29
49
  bundle install
@@ -54,6 +74,12 @@ bin/rails woods:stats
54
74
 
55
75
  If extraction fails, reproduce Rails boot and eager loading first. Do not inspect internal payload files when Woods tasks provide the check.
56
76
 
77
+ Writer-version provenance (#323) is available in Woods `2.0.0.beta3`; check the installed
78
+ gem version's release notes before expecting `woods_status.index.woods_version`. When present,
79
+ it names the last manifest publisher; `server.version` names the MCP reader.
80
+ Missing/null means unknown. A matching version after an incremental run never
81
+ replaces a required full upgrade extraction. See [writer provenance](https://github.com/lost-in-the/woods/blob/main/docs/PUBLISHED_INDEX.md#manifest-writer-provenance).
82
+
57
83
  Configure the Index Server with the application bundle, absolute app `cwd`, and an index path visible to that process. For a host-installed bundle:
58
84
 
59
85
  ```json
@@ -82,14 +108,55 @@ When Woods is installed only in Docker, launch it through the application servic
82
108
  }
83
109
  ```
84
110
 
85
- Reconnect and call `woods_status`, then `search`, `lookup`, and `dependents` for a known class. The normal Index Server has 14 tools. `codebase_retrieve` requires configured embeddings.
86
-
87
- Offer to add `bundle exec rake woods:watch` to the existing development process manager. When authorized, it catches up missed changes and automatically maintains the structural index; the Index Server refreshes on its next call, so ordinary edits need no manual extraction or MCP restart. State that boot-captured changes require supervisor restart, Docker may need `WOODS_WATCH_POLL=1`, and semantic vectors still need `woods:embed_incremental`.
88
-
89
- The plugin also ships two hooks (Woods 2.3 or later), shipped disabled. A `PostToolUse` hook runs `woods:incremental` in the background when an edit touches models, routes, migrations, schema, or a `package.yml`, reading `cwd` from the hook payload so linked worktrees refresh their own index; it batches paths from overlapping edits instead of dropping them under lock contention. A `SessionStart` hook warns when the published generation predates the last commit, a check scoped to commit timestamps, so it does not cover uncommitted edits or an older checkout. Both do nothing until `tmp/woods/generation.json` exists and until the user sets `WOODS_HOOKS_ENABLED=1`; set `WOODS_HOOK_RAKE="docker compose exec -T app bundle exec rake"` when the bundle lives in a container, `WOODS_OUTPUT` when the index directory is non-default, and `WOODS_HOOKS_DISABLED=1` to turn both back off.
111
+ Reconnect and call `woods_status`, then `search`, `lookup`, and `dependents` for a known class. The normal Index Server has 14 tools. `codebase_retrieve` requires configured embeddings in semantic mode; see the lexical capability check below for the opt-in provider-free mode.
112
+
113
+ Offer to add `bundle exec rake woods:watch` to the existing development process manager. When authorized, it catches up missed changes and automatically maintains the structural index; the Index Server refreshes on its next call, so ordinary edits need no manual extraction or MCP restart. Use the standalone watch command; do not prepend the `environment` task. Check the installed version's watch guide before relying on automatic startup reconciliation. State that live boot-captured changes require supervisor restart, Docker may need `WOODS_WATCH_POLL=1`, and semantic vectors still need `woods:embed_incremental`.
114
+
115
+ Foreign-host heartbeat trust (`WOODS_WATCH_TRUST_FOREIGN_HOST=1`, #321) is available in
116
+ Woods `2.0.0.beta3`.
117
+ Check the installed gem version against its release notes before offering it;
118
+ do not assume installing this plugin upgrades the gem. For a supporting version,
119
+ follow [cross-host liveness](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#cross-host-liveness)
120
+ and set the opt-in in each task/MCP reader of a shared container index. Explain
121
+ the 15-minute crash-detection delay and preserve one supervisor per daemon.
122
+
123
+ For slow bind mounts, check whether the installed version documents
124
+ `WOODS_WATCH_POLL_INTERVAL` before suggesting it; this setting is available in Woods
125
+ `2.0.0.beta3`. Where supported, a positive value such as `2.5` reduces
126
+ polling frequency at the cost of detection latency. Use the installed preflight version to select tagged documentation; the
127
+ [canonical watch guide](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md)
128
+ tracks current source and may describe unreleased behavior.
129
+
130
+ The plugin ships opt-in refresh and session-start hooks. The expanded refresh
131
+ contract (#408) is available in Woods `2.0.0.beta3`: first verify the installed
132
+ gem exposes `woods:hook_refresh` through the actual application command. Do not
133
+ infer support from the plugin version. With support, edits to standard services,
134
+ controllers, jobs, views, concerns, locales, supported tests/lib files, routes,
135
+ and packages queue incremental work; boot/config/schema edits request a fresh
136
+ full extraction. A live daemon defers without acknowledging the queue. Failed or
137
+ deferred events remain under `<output>/hook-pending/` and retry on the next
138
+ relevant edit. Inspect `hook.log` before retrying; never delete pending events to
139
+ hide a failure. Prefer `woods:watch` for sustained edits because hook coverage
140
+ increases Rails boot frequency.
141
+
142
+ Both hooks require an existing index and `WOODS_HOOKS_ENABLED=1`; disable with
143
+ `WOODS_HOOKS_DISABLED=1`. Use `WOODS_HOOK_RAKE="docker compose exec -T app bundle
144
+ exec rake"` for a container-only bundle and `WOODS_OUTPUT` for a non-default
145
+ index. The host needs Bash and either jq or Ruby, not the application bundle.
146
+ The refresh worker's deadline starts after the complete event input has been
147
+ collected, validated, and queued; it does not bound input collection. It includes
148
+ subsequent batches, but cancelling Docker exec does not prove its container
149
+ process stopped. See the [hook deadline and retry contract](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#hooks-for-agent-sessions).
150
+ Source freshness (#405) is available in Woods `2.0.0.beta3`: verify the installed command
151
+ exposes `woods:source_status` and `woods-extract` before using it. Supporting
152
+ SessionStart hooks check source content and report missing/failed evidence as
153
+ unknown; silence does not acknowledge queued refresh work. Follow the [hook guide](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#hooks-for-agent-sessions)
154
+ for transport, retry and custom-root limits.
90
155
 
91
156
  ## Ask before expanding scope
92
157
 
158
+ For pgvector, match the provider output and migration dimensions within 1–2,000. Default `text-embedding-3-large` output (3,072) needs an explicit smaller provider width or another backend; never silently truncate vectors. Early adapter/generator refusal is unreleased after `2.0.0.beta3`, so check the installed revision. See the [dimension contract](https://github.com/lost-in-the/woods/blob/main/docs/CONFIGURATION_REFERENCE.md#pgvector-postgresql).
159
+
93
160
  Require explicit approval before adding Ollama/OpenAI, pgvector/Qdrant, secrets, Console MCP/live-data access, HTTP transport, or purge overrides. The `:local` preset avoids cloud keys but requires the `sqlite3` gem, an installed/running Ollama service, and a pulled model (`ollama pull nomic-embed-text` by default); `:shared_filesystem` avoids sqlite3 but still uses Ollama. Recommend `gem "tokenizers", "~> 0.5"` for exact counting on dense Ruby source, while stating that it is optional.
94
161
 
95
162
  ## Handoff
@@ -97,3 +164,40 @@ Require explicit approval before adding Ollama/OpenAI, pgvector/Qdrant, secrets,
97
164
  Report the Woods version, branch, files changed, commands/results, index path, MCP calls verified, semantic retrieval status, Console status, and unresolved risks. Never infer availability from source schemas alone.
98
165
 
99
166
  Canonical runbook: [AGENT_SETUP.md](https://github.com/lost-in-the/woods/blob/main/docs/AGENT_SETUP.md).
167
+
168
+ ## Lexical retrieval capability check
169
+
170
+ Lexical retrieval is available from `2.0.0.beta3`. Before proposing it, verify the installed gem
171
+ exposes `Woods::Configuration#retrieval_mode` and its matching guide documents
172
+ `WOODS_RETRIEVAL_MODE`. Keep the installed-version preflight; do not infer support
173
+ from the plugin version or an unreleased checkout.
174
+
175
+ When supported and authorized, offer explicit lexical mode for ranked discovery
176
+ over extraction output without provider credentials or vectors. Semantic mode
177
+ remains the default; setting up embeddings is a separate choice.
178
+ See the [retrieval guide](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#embedding-free-lexical-retrieval)
179
+ for the supported contract, checked against the installed gem version.
180
+
181
+ ## Explicit edit adapters (Woods 2.0.0.beta3; #409)
182
+
183
+ Check the installed gem exposes `woods:hook_refresh` before enabling hooks.
184
+ Claude's registered wrapper covers one documented edit path; OpenCode 1.18.27
185
+ has a separate native `.js` registration wrapper importing Woods' shipped
186
+ adapter. Its verified patch metadata carries all added/updated/deleted/moved
187
+ paths. Keep the complete plugin directory available, preserve opt-in/disable
188
+ settings and pending events, and inspect the generation and hook log before
189
+ claiming refresh. Unsupported tool shapes and symlink paths need watch or an
190
+ explicit extraction. Do not install native client registration without the
191
+ user's setup request. Follow [client hooks](https://github.com/lost-in-the/woods/blob/main/docs/CLIENT_HOOKS.md).
192
+
193
+ ## Optional context hints
194
+
195
+ Check installed `bundle exec woods-hook-context --help` before enabling
196
+ `WOODS_HOOK_CONTEXT_ENABLED=1`; this capability is available in Woods `2.0.0.beta3` and the
197
+ plugin does not upgrade the gem. Context and refresh opt-ins are independent;
198
+ `WOODS_HOOKS_DISABLED=1` disables both. Native Claude context is synchronous and
199
+ bounded, with served-generation and pre-refresh/unknown labels. Verify candidate
200
+ dependents and suggested tests manually; silence is not no impact. Do not clear
201
+ refresh queues when optional hints time out. See the canonical
202
+ [context guide](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#optional-bounded-context-hints)
203
+ for output/time limits, container root mapping and emitted-hint suppression.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: woods
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.beta2
4
+ version: 2.0.0.beta4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Leah Armstrong
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-09-10 00:00:00.000000000 Z
11
+ date: 2026-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mcp
@@ -118,6 +118,9 @@ executables:
118
118
  - woods-console-mcp
119
119
  - woods-console
120
120
  - woods-mcp-http
121
+ - woods-agent-config
122
+ - woods-extract
123
+ - woods-hook-context
121
124
  extensions: []
122
125
  extra_rdoc_files: []
123
126
  files:
@@ -131,6 +134,7 @@ files:
131
134
  - docs/AGENT_GUIDE.md
132
135
  - docs/AGENT_SETUP.md
133
136
  - docs/BACKEND_MATRIX.md
137
+ - docs/CLIENT_HOOKS.md
134
138
  - docs/CONFIGURATION_REFERENCE.md
135
139
  - docs/CONSOLE_MCP_SETUP.md
136
140
  - docs/DOCKER_SETUP.md
@@ -140,6 +144,7 @@ files:
140
144
  - docs/FAQ.md
141
145
  - docs/GETTING_STARTED.md
142
146
  - docs/INCREMENTAL_EXTRACTION.md
147
+ - docs/INDEX_LAYOUT.md
143
148
  - docs/INTERNALS.md
144
149
  - docs/MCP_HTTP_TRANSPORT.md
145
150
  - docs/MCP_SERVERS.md
@@ -150,14 +155,19 @@ files:
150
155
  - docs/PUBLISHED_INDEX.md
151
156
  - docs/README.md
152
157
  - docs/RETRIEVAL_GUIDE.md
158
+ - docs/RUNTIME_TRACING.md
159
+ - docs/SOURCE_FRESHNESS.md
153
160
  - docs/TOKEN_BENCHMARK.md
154
161
  - docs/TROUBLESHOOTING.md
155
162
  - docs/UNBLOCKED_INTEGRATION.md
156
163
  - docs/UPGRADING_TO_2.md
157
164
  - docs/WATCH_DAEMON.md
158
165
  - docs/WHY_WOODS.md
166
+ - exe/woods-agent-config
159
167
  - exe/woods-console
160
168
  - exe/woods-console-mcp
169
+ - exe/woods-extract
170
+ - exe/woods-hook-context
161
171
  - exe/woods-mcp
162
172
  - exe/woods-mcp-http
163
173
  - exe/woods-mcp-start
@@ -170,6 +180,21 @@ files:
170
180
  - lib/tasks/woods_checks.rake
171
181
  - lib/tasks/woods_evaluation.rake
172
182
  - lib/woods.rb
183
+ - lib/woods/agent_configuration/applier.rb
184
+ - lib/woods/agent_configuration/cli.rb
185
+ - lib/woods/agent_configuration/cli_options.rb
186
+ - lib/woods/agent_configuration/document.rb
187
+ - lib/woods/agent_configuration/error.rb
188
+ - lib/woods/agent_configuration/launcher.rb
189
+ - lib/woods/agent_configuration/layout.rb
190
+ - lib/woods/agent_configuration/managed_section.rb
191
+ - lib/woods/agent_configuration/plan.rb
192
+ - lib/woods/agent_configuration/plan_diff.rb
193
+ - lib/woods/agent_configuration/planned_files.rb
194
+ - lib/woods/agent_configuration/planner.rb
195
+ - lib/woods/agent_configuration/planner_validation.rb
196
+ - lib/woods/agent_configuration/preflight.rb
197
+ - lib/woods/agent_configuration/recovery.rb
173
198
  - lib/woods/ast.rb
174
199
  - lib/woods/ast/call_site_extractor.rb
175
200
  - lib/woods/ast/method_extractor.rb
@@ -193,8 +218,10 @@ files:
193
218
  - lib/woods/console/console_response_renderer.rb
194
219
  - lib/woods/console/credential_index.rb
195
220
  - lib/woods/console/credential_scanner.rb
221
+ - lib/woods/console/credential_scanner_registry.rb
196
222
  - lib/woods/console/dispatch_pipeline.rb
197
223
  - lib/woods/console/embedded_executor.rb
224
+ - lib/woods/console/encrypted_credential_snapshot.rb
198
225
  - lib/woods/console/eval_guard.rb
199
226
  - lib/woods/console/input_contract.rb
200
227
  - lib/woods/console/model_validator.rb
@@ -207,6 +234,7 @@ files:
207
234
  - lib/woods/console/sql_noise_stripper.rb
208
235
  - lib/woods/console/sql_table_scanner.rb
209
236
  - lib/woods/console/sql_validator.rb
237
+ - lib/woods/console/sqlite_read_guard.rb
210
238
  - lib/woods/console/table_gate.rb
211
239
  - lib/woods/console/tool_specs.rb
212
240
  - lib/woods/console/tools/tier1.rb
@@ -230,6 +258,7 @@ files:
230
258
  - lib/woods/db/migrator.rb
231
259
  - lib/woods/db/schema_version.rb
232
260
  - lib/woods/dependency_graph.rb
261
+ - lib/woods/embedding/corpus.rb
233
262
  - lib/woods/embedding/fake.rb
234
263
  - lib/woods/embedding/indexer.rb
235
264
  - lib/woods/embedding/openai.rb
@@ -252,6 +281,7 @@ files:
252
281
  - lib/woods/evaluation/metrics.rb
253
282
  - lib/woods/evaluation/query_set.rb
254
283
  - lib/woods/evaluation/report_generator.rb
284
+ - lib/woods/export/typed_reader.rb
255
285
  - lib/woods/export/unit_facts.rb
256
286
  - lib/woods/extracted_unit.rb
257
287
  - lib/woods/extractor.rb
@@ -265,6 +295,7 @@ files:
265
295
  - lib/woods/extractors/configuration_extractor.rb
266
296
  - lib/woods/extractors/controller_extractor.rb
267
297
  - lib/woods/extractors/database_view_extractor.rb
298
+ - lib/woods/extractors/declared_parent.rb
268
299
  - lib/woods/extractors/decorator_extractor.rb
269
300
  - lib/woods/extractors/engine_extractor.rb
270
301
  - lib/woods/extractors/event_extractor.rb
@@ -276,6 +307,8 @@ files:
276
307
  - lib/woods/extractors/line_neutralizer.rb
277
308
  - lib/woods/extractors/mailer_extractor.rb
278
309
  - lib/woods/extractors/manager_extractor.rb
310
+ - lib/woods/extractors/method_parameters.rb
311
+ - lib/woods/extractors/middleware_argument.rb
279
312
  - lib/woods/extractors/middleware_extractor.rb
280
313
  - lib/woods/extractors/migration_extractor.rb
281
314
  - lib/woods/extractors/model_extractor.rb
@@ -315,9 +348,19 @@ files:
315
348
  - lib/woods/gem_mapper.rb
316
349
  - lib/woods/generation.rb
317
350
  - lib/woods/git_command.rb
351
+ - lib/woods/git_history.rb
318
352
  - lib/woods/git_provenance.rb
319
353
  - lib/woods/graph_analyzer.rb
354
+ - lib/woods/hooks/context_cli.rb
355
+ - lib/woods/hooks/context_event.rb
356
+ - lib/woods/hooks/context_hint.rb
357
+ - lib/woods/hooks/context_impact.rb
358
+ - lib/woods/hooks/context_output.rb
359
+ - lib/woods/hooks/context_state.rb
360
+ - lib/woods/hooks/refresh.rb
361
+ - lib/woods/hooks/rule_projection.rb
320
362
  - lib/woods/index_artifact.rb
363
+ - lib/woods/input_rules.rb
321
364
  - lib/woods/mcp/bearer_auth.rb
322
365
  - lib/woods/mcp/bootstrap_state.rb
323
366
  - lib/woods/mcp/bootstrapper.rb
@@ -325,19 +368,27 @@ files:
325
368
  - lib/woods/mcp/errors.rb
326
369
  - lib/woods/mcp/index_reader.rb
327
370
  - lib/woods/mcp/index_reader_pinning.rb
371
+ - lib/woods/mcp/initialization_guidance.rb
328
372
  - lib/woods/mcp/origin_guard.rb
329
373
  - lib/woods/mcp/protocol_policy.rb
330
374
  - lib/woods/mcp/provider_probe.rb
375
+ - lib/woods/mcp/published_lexical_retriever.rb
331
376
  - lib/woods/mcp/renderers/claude_renderer.rb
332
377
  - lib/woods/mcp/renderers/json_renderer.rb
333
378
  - lib/woods/mcp/renderers/markdown_renderer.rb
334
379
  - lib/woods/mcp/renderers/plain_renderer.rb
380
+ - lib/woods/mcp/search_results.rb
335
381
  - lib/woods/mcp/server.rb
336
382
  - lib/woods/mcp/tasks/extension.rb
337
383
  - lib/woods/mcp/tasks/request_capture.rb
338
384
  - lib/woods/mcp/tasks/store.rb
339
385
  - lib/woods/mcp/tool_contract.rb
340
386
  - lib/woods/mcp/tool_response_renderer.rb
387
+ - lib/woods/mcp/traversal_evidence.rb
388
+ - lib/woods/mcp/traversal_evidence_index.rb
389
+ - lib/woods/mcp/traversal_evidence_page.rb
390
+ - lib/woods/mcp/traversal_evidence_text.rb
391
+ - lib/woods/mcp/traversal_response.rb
341
392
  - lib/woods/mcp/version_aware_tool_dispatch.rb
342
393
  - lib/woods/model_name_cache.rb
343
394
  - lib/woods/notion/client.rb
@@ -349,6 +400,7 @@ files:
349
400
  - lib/woods/notion/rate_limiter.rb
350
401
  - lib/woods/notion/sync_manifest.rb
351
402
  - lib/woods/observability/structured_logger.rb
403
+ - lib/woods/obsidian/destination_plan.rb
352
404
  - lib/woods/obsidian/errors.rb
353
405
  - lib/woods/obsidian/name_mapper.rb
354
406
  - lib/woods/obsidian/note_builder.rb
@@ -365,16 +417,28 @@ files:
365
417
  - lib/woods/published_index/typed_unit_reader.rb
366
418
  - lib/woods/railtie.rb
367
419
  - lib/woods/railtie_support.rb
420
+ - lib/woods/rake_helpers.rb
368
421
  - lib/woods/release.rb
369
422
  - lib/woods/reload_policy.rb
370
423
  - lib/woods/resilience/circuit_breaker.rb
424
+ - lib/woods/resilience/graph_invariant_validator.rb
425
+ - lib/woods/resilience/graph_invariant_validator/membership_checks.rb
426
+ - lib/woods/resilience/graph_invariant_validator/node_checks.rb
427
+ - lib/woods/resilience/graph_invariant_validator/reverse_relationship_checks.rb
371
428
  - lib/woods/resilience/index_validator.rb
429
+ - lib/woods/resilience/index_validator/graph_checks.rb
372
430
  - lib/woods/resilience/retryable_provider.rb
373
431
  - lib/woods/resolved_config.rb
374
432
  - lib/woods/retrieval/context_assembler.rb
433
+ - lib/woods/retrieval/lexical_assembler.rb
434
+ - lib/woods/retrieval/lexical_index.rb
375
435
  - lib/woods/retrieval/query_classifier.rb
376
436
  - lib/woods/retrieval/ranker.rb
437
+ - lib/woods/retrieval/scope.rb
438
+ - lib/woods/retrieval/scoped_graph_store.rb
439
+ - lib/woods/retrieval/scoped_vector_store.rb
377
440
  - lib/woods/retrieval/search_executor.rb
441
+ - lib/woods/retrieval/source_evidence.rb
378
442
  - lib/woods/retriever.rb
379
443
  - lib/woods/retry_after.rb
380
444
  - lib/woods/ruby_analyzer.rb
@@ -392,6 +456,17 @@ files:
392
456
  - lib/woods/session_tracer/solid_cache_coordination.rb
393
457
  - lib/woods/session_tracer/solid_cache_store.rb
394
458
  - lib/woods/session_tracer/store.rb
459
+ - lib/woods/session_tracer/unit_resolver.rb
460
+ - lib/woods/source_inputs/consumer_errors.rb
461
+ - lib/woods/source_inputs/handoff.rb
462
+ - lib/woods/source_inputs/launcher.rb
463
+ - lib/woods/source_inputs/manifest.rb
464
+ - lib/woods/source_inputs/private_key.rb
465
+ - lib/woods/source_inputs/scanner.rb
466
+ - lib/woods/source_inputs/scopes.rb
467
+ - lib/woods/source_inputs/session.rb
468
+ - lib/woods/source_inputs/status.rb
469
+ - lib/woods/source_inputs/verifier.rb
395
470
  - lib/woods/storage/graph_store.rb
396
471
  - lib/woods/storage/inapplicable_backend.rb
397
472
  - lib/woods/storage/metadata_store.rb
@@ -415,6 +490,7 @@ files:
415
490
  - lib/woods/util/host_guard.rb
416
491
  - lib/woods/util/uuid5.rb
417
492
  - lib/woods/version.rb
493
+ - lib/woods/watch/boot_snapshot.rb
418
494
  - lib/woods/watch/daemon.rb
419
495
  - lib/woods/watch/listen_watcher.rb
420
496
  - lib/woods/watch/polling_watcher.rb
@@ -422,8 +498,14 @@ files:
422
498
  - lib/woods/watch/tree_scan.rb
423
499
  - lib/woods/watch/watcher.rb
424
500
  - plugin/.claude-plugin/plugin.json
501
+ - plugin/hooks/adapters/normalize.jq
502
+ - plugin/hooks/adapters/normalize.rb
425
503
  - plugin/hooks/hooks.json
504
+ - plugin/hooks/woods-context.sh
505
+ - plugin/hooks/woods-input-rules.sh
506
+ - plugin/hooks/woods-opencode.mjs
426
507
  - plugin/hooks/woods-post-edit.sh
508
+ - plugin/hooks/woods-refresh.sh
427
509
  - plugin/hooks/woods-session-start.sh
428
510
  - plugin/skills/woods-agent-enable/SKILL.md
429
511
  - plugin/skills/woods-diagnose/SKILL.md
@@ -435,10 +517,10 @@ licenses:
435
517
  - MIT
436
518
  metadata:
437
519
  homepage_uri: https://github.com/lost-in-the/woods
438
- source_code_uri: https://github.com/lost-in-the/woods/tree/v2.0.0.beta2
439
- changelog_uri: https://github.com/lost-in-the/woods/blob/v2.0.0.beta2/CHANGELOG.md
520
+ source_code_uri: https://github.com/lost-in-the/woods/tree/v2.0.0.beta4
521
+ changelog_uri: https://github.com/lost-in-the/woods/blob/v2.0.0.beta4/CHANGELOG.md
440
522
  bug_tracker_uri: https://github.com/lost-in-the/woods/issues
441
- documentation_uri: https://github.com/lost-in-the/woods/tree/v2.0.0.beta2/docs
523
+ documentation_uri: https://github.com/lost-in-the/woods/tree/v2.0.0.beta4/docs
442
524
  rubygems_mfa_required: 'true'
443
525
  post_install_message:
444
526
  rdoc_options: []