woods 2.0.0.beta2 → 2.0.0.beta3

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 (218) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +262 -1
  3. data/CONTRIBUTING.md +173 -9
  4. data/README.md +7 -3
  5. data/SECURITY.md +9 -6
  6. data/docs/AGENT_GUIDE.md +83 -4
  7. data/docs/AGENT_SETUP.md +82 -1
  8. data/docs/BACKEND_MATRIX.md +20 -0
  9. data/docs/CLIENT_HOOKS.md +111 -0
  10. data/docs/CONFIGURATION_REFERENCE.md +199 -14
  11. data/docs/CONSOLE_MCP_SETUP.md +35 -5
  12. data/docs/DOCKER_SETUP.md +21 -2
  13. data/docs/EVALUATION.md +464 -1
  14. data/docs/EXTRACTOR_REFERENCE.md +36 -5
  15. data/docs/FAQ.md +11 -12
  16. data/docs/GETTING_STARTED.md +17 -5
  17. data/docs/INCREMENTAL_EXTRACTION.md +117 -1
  18. data/docs/INDEX_LAYOUT.md +382 -0
  19. data/docs/INTERNALS.md +7 -2
  20. data/docs/MCP_SERVERS.md +221 -5
  21. data/docs/MCP_TOOL_COOKBOOK.md +33 -18
  22. data/docs/NOTION_INTEGRATION.md +13 -0
  23. data/docs/OBSIDIAN_INTEGRATION.md +57 -9
  24. data/docs/PUBLISHED_INDEX.md +55 -0
  25. data/docs/README.md +7 -0
  26. data/docs/RETRIEVAL_GUIDE.md +253 -11
  27. data/docs/RUNTIME_TRACING.md +71 -0
  28. data/docs/SOURCE_FRESHNESS.md +143 -0
  29. data/docs/TROUBLESHOOTING.md +117 -5
  30. data/docs/UNBLOCKED_INTEGRATION.md +25 -0
  31. data/docs/UPGRADING_TO_2.md +44 -22
  32. data/docs/WATCH_DAEMON.md +259 -59
  33. data/exe/woods-agent-config +6 -0
  34. data/exe/woods-extract +5 -0
  35. data/exe/woods-hook-context +6 -0
  36. data/lib/generators/woods/templates/woods.rb.tt +1 -3
  37. data/lib/tasks/woods.rake +47 -397
  38. data/lib/woods/agent_configuration/applier.rb +133 -0
  39. data/lib/woods/agent_configuration/cli.rb +101 -0
  40. data/lib/woods/agent_configuration/cli_options.rb +29 -0
  41. data/lib/woods/agent_configuration/document.rb +105 -0
  42. data/lib/woods/agent_configuration/error.rb +7 -0
  43. data/lib/woods/agent_configuration/launcher.rb +75 -0
  44. data/lib/woods/agent_configuration/layout.rb +59 -0
  45. data/lib/woods/agent_configuration/managed_section.rb +62 -0
  46. data/lib/woods/agent_configuration/plan.rb +98 -0
  47. data/lib/woods/agent_configuration/plan_diff.rb +38 -0
  48. data/lib/woods/agent_configuration/planned_files.rb +61 -0
  49. data/lib/woods/agent_configuration/planner.rb +63 -0
  50. data/lib/woods/agent_configuration/planner_validation.rb +77 -0
  51. data/lib/woods/agent_configuration/preflight.rb +100 -0
  52. data/lib/woods/agent_configuration/recovery.rb +49 -0
  53. data/lib/woods/ast/node.rb +2 -0
  54. data/lib/woods/ast/parser.rb +38 -5
  55. data/lib/woods/builder.rb +21 -5
  56. data/lib/woods/cache/cache_middleware.rb +28 -7
  57. data/lib/woods/cache/cache_store.rb +4 -5
  58. data/lib/woods/change_set.rb +5 -4
  59. data/lib/woods/console/credential_index.rb +20 -2
  60. data/lib/woods/console/credential_scanner.rb +14 -14
  61. data/lib/woods/console/credential_scanner_registry.rb +36 -0
  62. data/lib/woods/console/embedded_executor.rb +1 -1
  63. data/lib/woods/console/encrypted_credential_snapshot.rb +16 -0
  64. data/lib/woods/console/rack_middleware.rb +22 -13
  65. data/lib/woods/console/server.rb +18 -16
  66. data/lib/woods/dependency_graph.rb +65 -13
  67. data/lib/woods/embedding/corpus.rb +94 -0
  68. data/lib/woods/embedding/indexer.rb +90 -46
  69. data/lib/woods/embedding/openai.rb +17 -6
  70. data/lib/woods/evaluation/ablation_executor.rb +6 -1
  71. data/lib/woods/evaluation/ablation_timed_executor.rb +22 -4
  72. data/lib/woods/export/typed_reader.rb +56 -0
  73. data/lib/woods/extractor.rb +232 -137
  74. data/lib/woods/extractors/action_cable_extractor.rb +3 -1
  75. data/lib/woods/extractors/behavioral_profile.rb +9 -7
  76. data/lib/woods/extractors/caching_extractor.rb +3 -1
  77. data/lib/woods/extractors/concern_extractor.rb +64 -6
  78. data/lib/woods/extractors/configuration_extractor.rb +7 -3
  79. data/lib/woods/extractors/controller_extractor.rb +13 -4
  80. data/lib/woods/extractors/database_view_extractor.rb +3 -1
  81. data/lib/woods/extractors/decorator_extractor.rb +3 -1
  82. data/lib/woods/extractors/engine_extractor.rb +3 -1
  83. data/lib/woods/extractors/event_extractor.rb +4 -2
  84. data/lib/woods/extractors/factory_extractor.rb +3 -1
  85. data/lib/woods/extractors/graphql_extractor.rb +8 -2
  86. data/lib/woods/extractors/i18n_extractor.rb +3 -1
  87. data/lib/woods/extractors/job_extractor.rb +6 -19
  88. data/lib/woods/extractors/lib_extractor.rb +3 -1
  89. data/lib/woods/extractors/mailer_extractor.rb +20 -5
  90. data/lib/woods/extractors/manager_extractor.rb +3 -1
  91. data/lib/woods/extractors/method_parameters.rb +53 -0
  92. data/lib/woods/extractors/middleware_argument.rb +65 -0
  93. data/lib/woods/extractors/middleware_extractor.rb +9 -3
  94. data/lib/woods/extractors/migration_extractor.rb +3 -1
  95. data/lib/woods/extractors/model_extractor.rb +39 -33
  96. data/lib/woods/extractors/package_extractor.rb +24 -4
  97. data/lib/woods/extractors/phlex_extractor.rb +3 -1
  98. data/lib/woods/extractors/policy_extractor.rb +3 -1
  99. data/lib/woods/extractors/poro_extractor.rb +3 -1
  100. data/lib/woods/extractors/pundit_extractor.rb +3 -1
  101. data/lib/woods/extractors/rails_source_extractor.rb +4 -2
  102. data/lib/woods/extractors/rake_task_extractor.rb +4 -2
  103. data/lib/woods/extractors/route_extractor.rb +3 -1
  104. data/lib/woods/extractors/route_helper_resolver.rb +10 -33
  105. data/lib/woods/extractors/scheduled_job_extractor.rb +41 -15
  106. data/lib/woods/extractors/serializer_extractor.rb +4 -2
  107. data/lib/woods/extractors/service_extractor.rb +3 -1
  108. data/lib/woods/extractors/shared_dependency_scanner.rb +2 -2
  109. data/lib/woods/extractors/shared_utility_methods.rb +27 -15
  110. data/lib/woods/extractors/source_nesting.rb +1 -1
  111. data/lib/woods/extractors/state_machine_extractor.rb +3 -1
  112. data/lib/woods/extractors/test_mapping_extractor.rb +3 -1
  113. data/lib/woods/extractors/validator_extractor.rb +3 -1
  114. data/lib/woods/extractors/view_component_extractor.rb +3 -1
  115. data/lib/woods/extractors/view_template_extractor.rb +3 -1
  116. data/lib/woods/gem_mapper.rb +2 -0
  117. data/lib/woods/git_history.rb +116 -0
  118. data/lib/woods/graph_analyzer.rb +35 -6
  119. data/lib/woods/hooks/context_cli.rb +54 -0
  120. data/lib/woods/hooks/context_event.rb +88 -0
  121. data/lib/woods/hooks/context_hint.rb +73 -0
  122. data/lib/woods/hooks/context_impact.rb +77 -0
  123. data/lib/woods/hooks/context_output.rb +47 -0
  124. data/lib/woods/hooks/context_state.rb +102 -0
  125. data/lib/woods/hooks/refresh.rb +79 -0
  126. data/lib/woods/hooks/rule_projection.rb +78 -0
  127. data/lib/woods/input_rules.rb +19 -0
  128. data/lib/woods/mcp/bearer_auth.rb +20 -12
  129. data/lib/woods/mcp/bootstrapper.rb +62 -0
  130. data/lib/woods/mcp/index_reader.rb +323 -160
  131. data/lib/woods/mcp/initialization_guidance.rb +27 -0
  132. data/lib/woods/mcp/origin_guard.rb +17 -9
  133. data/lib/woods/mcp/published_lexical_retriever.rb +115 -0
  134. data/lib/woods/mcp/renderers/markdown_renderer.rb +8 -1
  135. data/lib/woods/mcp/renderers/plain_renderer.rb +7 -1
  136. data/lib/woods/mcp/search_results.rb +74 -0
  137. data/lib/woods/mcp/server.rb +158 -37
  138. data/lib/woods/mcp/tool_contract.rb +2 -0
  139. data/lib/woods/mcp/tool_response_renderer.rb +25 -0
  140. data/lib/woods/mcp/traversal_evidence.rb +113 -0
  141. data/lib/woods/mcp/traversal_evidence_index.rb +100 -0
  142. data/lib/woods/mcp/traversal_evidence_page.rb +41 -0
  143. data/lib/woods/mcp/traversal_evidence_text.rb +52 -0
  144. data/lib/woods/notion/exporter.rb +56 -17
  145. data/lib/woods/obsidian/destination_plan.rb +98 -0
  146. data/lib/woods/obsidian/name_mapper.rb +19 -3
  147. data/lib/woods/obsidian/note_builder.rb +19 -10
  148. data/lib/woods/obsidian/vault_exporter.rb +88 -32
  149. data/lib/woods/operator/pipeline_guard.rb +18 -13
  150. data/lib/woods/path_dispatcher.rb +7 -1
  151. data/lib/woods/payload_store.rb +27 -26
  152. data/lib/woods/railtie.rb +3 -3
  153. data/lib/woods/railtie_support.rb +12 -12
  154. data/lib/woods/rake_helpers.rb +392 -0
  155. data/lib/woods/resilience/graph_invariant_validator/membership_checks.rb +71 -0
  156. data/lib/woods/resilience/graph_invariant_validator/node_checks.rb +61 -0
  157. data/lib/woods/resilience/graph_invariant_validator/reverse_relationship_checks.rb +46 -0
  158. data/lib/woods/resilience/graph_invariant_validator.rb +119 -0
  159. data/lib/woods/resilience/index_validator/graph_checks.rb +80 -0
  160. data/lib/woods/resilience/index_validator.rb +112 -23
  161. data/lib/woods/retrieval/context_assembler.rb +50 -15
  162. data/lib/woods/retrieval/lexical_assembler.rb +73 -0
  163. data/lib/woods/retrieval/lexical_index.rb +119 -0
  164. data/lib/woods/retrieval/ranker.rb +4 -2
  165. data/lib/woods/retrieval/scope.rb +108 -0
  166. data/lib/woods/retrieval/scoped_graph_store.rb +32 -0
  167. data/lib/woods/retrieval/scoped_vector_store.rb +55 -0
  168. data/lib/woods/retrieval/search_executor.rb +86 -27
  169. data/lib/woods/retrieval/source_evidence.rb +200 -0
  170. data/lib/woods/retriever.rb +98 -22
  171. data/lib/woods/ruby_analyzer/trace_enricher.rb +77 -38
  172. data/lib/woods/session_tracer/middleware.rb +10 -12
  173. data/lib/woods/session_tracer/redis_store.rb +22 -6
  174. data/lib/woods/session_tracer/session_flow_assembler.rb +23 -17
  175. data/lib/woods/session_tracer/solid_cache_coordination.rb +6 -4
  176. data/lib/woods/session_tracer/unit_resolver.rb +63 -0
  177. data/lib/woods/source_inputs/consumer_errors.rb +27 -0
  178. data/lib/woods/source_inputs/handoff.rb +102 -0
  179. data/lib/woods/source_inputs/launcher.rb +157 -0
  180. data/lib/woods/source_inputs/manifest.rb +124 -0
  181. data/lib/woods/source_inputs/private_key.rb +55 -0
  182. data/lib/woods/source_inputs/scanner.rb +171 -0
  183. data/lib/woods/source_inputs/scopes.rb +71 -0
  184. data/lib/woods/source_inputs/session.rb +214 -0
  185. data/lib/woods/source_inputs/status.rb +84 -0
  186. data/lib/woods/source_inputs/verifier.rb +107 -0
  187. data/lib/woods/storage/metadata_store.rb +25 -25
  188. data/lib/woods/storage/pgvector.rb +29 -8
  189. data/lib/woods/storage/qdrant.rb +17 -7
  190. data/lib/woods/storage/vector_store.rb +18 -6
  191. data/lib/woods/tasks.rb +3 -2
  192. data/lib/woods/temporal/json_snapshot_store.rb +29 -8
  193. data/lib/woods/unblocked/exporter.rb +59 -70
  194. data/lib/woods/version.rb +1 -1
  195. data/lib/woods/watch/boot_snapshot.rb +52 -0
  196. data/lib/woods/watch/daemon.rb +136 -28
  197. data/lib/woods/watch/listen_watcher.rb +4 -0
  198. data/lib/woods/watch/polling_watcher.rb +5 -1
  199. data/lib/woods/watch/status.rb +20 -15
  200. data/lib/woods/watch/tree_scan.rb +21 -13
  201. data/lib/woods/watch/watcher.rb +4 -1
  202. data/lib/woods.rb +50 -11
  203. data/plugin/.claude-plugin/plugin.json +1 -1
  204. data/plugin/hooks/adapters/normalize.jq +15 -0
  205. data/plugin/hooks/adapters/normalize.rb +63 -0
  206. data/plugin/hooks/hooks.json +20 -0
  207. data/plugin/hooks/woods-context.sh +50 -0
  208. data/plugin/hooks/woods-input-rules.sh +159 -0
  209. data/plugin/hooks/woods-opencode.mjs +65 -0
  210. data/plugin/hooks/woods-post-edit.sh +2 -225
  211. data/plugin/hooks/woods-refresh.sh +260 -0
  212. data/plugin/hooks/woods-session-start.sh +47 -55
  213. data/plugin/skills/woods-agent-enable/SKILL.md +13 -0
  214. data/plugin/skills/woods-diagnose/SKILL.md +288 -1
  215. data/plugin/skills/woods-investigate/SKILL.md +106 -0
  216. data/plugin/skills/woods-mcp-config/SKILL.md +89 -1
  217. data/plugin/skills/woods-setup/SKILL.md +107 -6
  218. metadata +84 -5
@@ -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 unreleased after `2.0.0.beta2`. 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 unreleased; check the installed gem version's
78
+ 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,11 +108,49 @@ 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 unreleased.
116
+ Check the installed gem version against its release notes before offering it;
117
+ do not assume installing this plugin upgrades the gem. For a supporting version,
118
+ follow [cross-host liveness](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#cross-host-liveness)
119
+ and set the opt-in in each task/MCP reader of a shared container index. Explain
120
+ the 15-minute crash-detection delay and preserve one supervisor per daemon.
121
+
122
+ For slow bind mounts, check whether the installed version documents
123
+ `WOODS_WATCH_POLL_INTERVAL` before suggesting it; this setting is unreleased
124
+ in Woods 2.0.0.beta2. Where supported, a positive value such as `2.5` reduces
125
+ polling frequency at the cost of detection latency. Use the installed preflight version to select tagged documentation; the
126
+ [canonical watch guide](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md)
127
+ tracks current source and may describe unreleased behavior.
128
+
129
+ The plugin ships opt-in refresh and session-start hooks. The expanded refresh
130
+ contract (#408) is unreleased after Woods 2.0.0.beta2: first verify the installed
131
+ gem exposes `woods:hook_refresh` through the actual application command. Do not
132
+ infer support from the plugin version. With support, edits to standard services,
133
+ controllers, jobs, views, concerns, locales, supported tests/lib files, routes,
134
+ and packages queue incremental work; boot/config/schema edits request a fresh
135
+ full extraction. A live daemon defers without acknowledging the queue. Failed or
136
+ deferred events remain under `<output>/hook-pending/` and retry on the next
137
+ relevant edit. Inspect `hook.log` before retrying; never delete pending events to
138
+ hide a failure. Prefer `woods:watch` for sustained edits because hook coverage
139
+ increases Rails boot frequency.
140
+
141
+ Both hooks require an existing index and `WOODS_HOOKS_ENABLED=1`; disable with
142
+ `WOODS_HOOKS_DISABLED=1`. Use `WOODS_HOOK_RAKE="docker compose exec -T app bundle
143
+ exec rake"` for a container-only bundle and `WOODS_OUTPUT` for a non-default
144
+ index. The host needs Bash and either jq or Ruby, not the application bundle.
145
+ The refresh worker's deadline starts after the complete event input has been
146
+ collected, validated, and queued; it does not bound input collection. It includes
147
+ subsequent batches, but cancelling Docker exec does not prove its container
148
+ 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).
149
+ Source freshness (#405) is unreleased after beta2: verify the installed command
150
+ exposes `woods:source_status` and `woods-extract` before using it. Supporting
151
+ SessionStart hooks check source content and report missing/failed evidence as
152
+ 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)
153
+ for transport, retry and custom-root limits.
90
154
 
91
155
  ## Ask before expanding scope
92
156
 
@@ -97,3 +161,40 @@ Require explicit approval before adding Ollama/OpenAI, pgvector/Qdrant, secrets,
97
161
  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
162
 
99
163
  Canonical runbook: [AGENT_SETUP.md](https://github.com/lost-in-the/woods/blob/main/docs/AGENT_SETUP.md).
164
+
165
+ ## Lexical retrieval capability check
166
+
167
+ This is a development capability. Before proposing it, verify the installed gem
168
+ exposes `Woods::Configuration#retrieval_mode` and its matching guide documents
169
+ `WOODS_RETRIEVAL_MODE`. Keep the installed-version preflight; do not infer support
170
+ from the plugin version or an unreleased checkout.
171
+
172
+ When supported and authorized, offer explicit lexical mode for ranked discovery
173
+ over extraction output without provider credentials or vectors. Semantic mode
174
+ remains the default; setting up embeddings is a separate choice.
175
+ See the [retrieval guide](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#embedding-free-lexical-retrieval)
176
+ for the supported contract, checked against the installed gem version.
177
+
178
+ ## Explicit edit adapters (unreleased #409)
179
+
180
+ Check the installed gem exposes `woods:hook_refresh` before enabling hooks.
181
+ Claude's registered wrapper covers one documented edit path; OpenCode 1.18.27
182
+ has a separate native `.js` registration wrapper importing Woods' shipped
183
+ adapter. Its verified patch metadata carries all added/updated/deleted/moved
184
+ paths. Keep the complete plugin directory available, preserve opt-in/disable
185
+ settings and pending events, and inspect the generation and hook log before
186
+ claiming refresh. Unsupported tool shapes and symlink paths need watch or an
187
+ explicit extraction. Do not install native client registration without the
188
+ user's setup request. Follow [client hooks](https://github.com/lost-in-the/woods/blob/main/docs/CLIENT_HOOKS.md).
189
+
190
+ ## Optional context hints
191
+
192
+ Check installed `bundle exec woods-hook-context --help` before enabling
193
+ `WOODS_HOOK_CONTEXT_ENABLED=1`; this capability is unreleased after beta2 and the
194
+ plugin does not upgrade the gem. Context and refresh opt-ins are independent;
195
+ `WOODS_HOOKS_DISABLED=1` disables both. Native Claude context is synchronous and
196
+ bounded, with served-generation and pre-refresh/unknown labels. Verify candidate
197
+ dependents and suggested tests manually; silence is not no impact. Do not clear
198
+ refresh queues when optional hints time out. See the canonical
199
+ [context guide](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#optional-bounded-context-hints)
200
+ 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.beta3
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-18 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
@@ -230,6 +257,7 @@ files:
230
257
  - lib/woods/db/migrator.rb
231
258
  - lib/woods/db/schema_version.rb
232
259
  - lib/woods/dependency_graph.rb
260
+ - lib/woods/embedding/corpus.rb
233
261
  - lib/woods/embedding/fake.rb
234
262
  - lib/woods/embedding/indexer.rb
235
263
  - lib/woods/embedding/openai.rb
@@ -252,6 +280,7 @@ files:
252
280
  - lib/woods/evaluation/metrics.rb
253
281
  - lib/woods/evaluation/query_set.rb
254
282
  - lib/woods/evaluation/report_generator.rb
283
+ - lib/woods/export/typed_reader.rb
255
284
  - lib/woods/export/unit_facts.rb
256
285
  - lib/woods/extracted_unit.rb
257
286
  - lib/woods/extractor.rb
@@ -276,6 +305,8 @@ files:
276
305
  - lib/woods/extractors/line_neutralizer.rb
277
306
  - lib/woods/extractors/mailer_extractor.rb
278
307
  - lib/woods/extractors/manager_extractor.rb
308
+ - lib/woods/extractors/method_parameters.rb
309
+ - lib/woods/extractors/middleware_argument.rb
279
310
  - lib/woods/extractors/middleware_extractor.rb
280
311
  - lib/woods/extractors/migration_extractor.rb
281
312
  - lib/woods/extractors/model_extractor.rb
@@ -315,9 +346,19 @@ files:
315
346
  - lib/woods/gem_mapper.rb
316
347
  - lib/woods/generation.rb
317
348
  - lib/woods/git_command.rb
349
+ - lib/woods/git_history.rb
318
350
  - lib/woods/git_provenance.rb
319
351
  - lib/woods/graph_analyzer.rb
352
+ - lib/woods/hooks/context_cli.rb
353
+ - lib/woods/hooks/context_event.rb
354
+ - lib/woods/hooks/context_hint.rb
355
+ - lib/woods/hooks/context_impact.rb
356
+ - lib/woods/hooks/context_output.rb
357
+ - lib/woods/hooks/context_state.rb
358
+ - lib/woods/hooks/refresh.rb
359
+ - lib/woods/hooks/rule_projection.rb
320
360
  - lib/woods/index_artifact.rb
361
+ - lib/woods/input_rules.rb
321
362
  - lib/woods/mcp/bearer_auth.rb
322
363
  - lib/woods/mcp/bootstrap_state.rb
323
364
  - lib/woods/mcp/bootstrapper.rb
@@ -325,19 +366,26 @@ files:
325
366
  - lib/woods/mcp/errors.rb
326
367
  - lib/woods/mcp/index_reader.rb
327
368
  - lib/woods/mcp/index_reader_pinning.rb
369
+ - lib/woods/mcp/initialization_guidance.rb
328
370
  - lib/woods/mcp/origin_guard.rb
329
371
  - lib/woods/mcp/protocol_policy.rb
330
372
  - lib/woods/mcp/provider_probe.rb
373
+ - lib/woods/mcp/published_lexical_retriever.rb
331
374
  - lib/woods/mcp/renderers/claude_renderer.rb
332
375
  - lib/woods/mcp/renderers/json_renderer.rb
333
376
  - lib/woods/mcp/renderers/markdown_renderer.rb
334
377
  - lib/woods/mcp/renderers/plain_renderer.rb
378
+ - lib/woods/mcp/search_results.rb
335
379
  - lib/woods/mcp/server.rb
336
380
  - lib/woods/mcp/tasks/extension.rb
337
381
  - lib/woods/mcp/tasks/request_capture.rb
338
382
  - lib/woods/mcp/tasks/store.rb
339
383
  - lib/woods/mcp/tool_contract.rb
340
384
  - lib/woods/mcp/tool_response_renderer.rb
385
+ - lib/woods/mcp/traversal_evidence.rb
386
+ - lib/woods/mcp/traversal_evidence_index.rb
387
+ - lib/woods/mcp/traversal_evidence_page.rb
388
+ - lib/woods/mcp/traversal_evidence_text.rb
341
389
  - lib/woods/mcp/version_aware_tool_dispatch.rb
342
390
  - lib/woods/model_name_cache.rb
343
391
  - lib/woods/notion/client.rb
@@ -349,6 +397,7 @@ files:
349
397
  - lib/woods/notion/rate_limiter.rb
350
398
  - lib/woods/notion/sync_manifest.rb
351
399
  - lib/woods/observability/structured_logger.rb
400
+ - lib/woods/obsidian/destination_plan.rb
352
401
  - lib/woods/obsidian/errors.rb
353
402
  - lib/woods/obsidian/name_mapper.rb
354
403
  - lib/woods/obsidian/note_builder.rb
@@ -365,16 +414,28 @@ files:
365
414
  - lib/woods/published_index/typed_unit_reader.rb
366
415
  - lib/woods/railtie.rb
367
416
  - lib/woods/railtie_support.rb
417
+ - lib/woods/rake_helpers.rb
368
418
  - lib/woods/release.rb
369
419
  - lib/woods/reload_policy.rb
370
420
  - lib/woods/resilience/circuit_breaker.rb
421
+ - lib/woods/resilience/graph_invariant_validator.rb
422
+ - lib/woods/resilience/graph_invariant_validator/membership_checks.rb
423
+ - lib/woods/resilience/graph_invariant_validator/node_checks.rb
424
+ - lib/woods/resilience/graph_invariant_validator/reverse_relationship_checks.rb
371
425
  - lib/woods/resilience/index_validator.rb
426
+ - lib/woods/resilience/index_validator/graph_checks.rb
372
427
  - lib/woods/resilience/retryable_provider.rb
373
428
  - lib/woods/resolved_config.rb
374
429
  - lib/woods/retrieval/context_assembler.rb
430
+ - lib/woods/retrieval/lexical_assembler.rb
431
+ - lib/woods/retrieval/lexical_index.rb
375
432
  - lib/woods/retrieval/query_classifier.rb
376
433
  - lib/woods/retrieval/ranker.rb
434
+ - lib/woods/retrieval/scope.rb
435
+ - lib/woods/retrieval/scoped_graph_store.rb
436
+ - lib/woods/retrieval/scoped_vector_store.rb
377
437
  - lib/woods/retrieval/search_executor.rb
438
+ - lib/woods/retrieval/source_evidence.rb
378
439
  - lib/woods/retriever.rb
379
440
  - lib/woods/retry_after.rb
380
441
  - lib/woods/ruby_analyzer.rb
@@ -392,6 +453,17 @@ files:
392
453
  - lib/woods/session_tracer/solid_cache_coordination.rb
393
454
  - lib/woods/session_tracer/solid_cache_store.rb
394
455
  - lib/woods/session_tracer/store.rb
456
+ - lib/woods/session_tracer/unit_resolver.rb
457
+ - lib/woods/source_inputs/consumer_errors.rb
458
+ - lib/woods/source_inputs/handoff.rb
459
+ - lib/woods/source_inputs/launcher.rb
460
+ - lib/woods/source_inputs/manifest.rb
461
+ - lib/woods/source_inputs/private_key.rb
462
+ - lib/woods/source_inputs/scanner.rb
463
+ - lib/woods/source_inputs/scopes.rb
464
+ - lib/woods/source_inputs/session.rb
465
+ - lib/woods/source_inputs/status.rb
466
+ - lib/woods/source_inputs/verifier.rb
395
467
  - lib/woods/storage/graph_store.rb
396
468
  - lib/woods/storage/inapplicable_backend.rb
397
469
  - lib/woods/storage/metadata_store.rb
@@ -415,6 +487,7 @@ files:
415
487
  - lib/woods/util/host_guard.rb
416
488
  - lib/woods/util/uuid5.rb
417
489
  - lib/woods/version.rb
490
+ - lib/woods/watch/boot_snapshot.rb
418
491
  - lib/woods/watch/daemon.rb
419
492
  - lib/woods/watch/listen_watcher.rb
420
493
  - lib/woods/watch/polling_watcher.rb
@@ -422,8 +495,14 @@ files:
422
495
  - lib/woods/watch/tree_scan.rb
423
496
  - lib/woods/watch/watcher.rb
424
497
  - plugin/.claude-plugin/plugin.json
498
+ - plugin/hooks/adapters/normalize.jq
499
+ - plugin/hooks/adapters/normalize.rb
425
500
  - plugin/hooks/hooks.json
501
+ - plugin/hooks/woods-context.sh
502
+ - plugin/hooks/woods-input-rules.sh
503
+ - plugin/hooks/woods-opencode.mjs
426
504
  - plugin/hooks/woods-post-edit.sh
505
+ - plugin/hooks/woods-refresh.sh
427
506
  - plugin/hooks/woods-session-start.sh
428
507
  - plugin/skills/woods-agent-enable/SKILL.md
429
508
  - plugin/skills/woods-diagnose/SKILL.md
@@ -435,10 +514,10 @@ licenses:
435
514
  - MIT
436
515
  metadata:
437
516
  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
517
+ source_code_uri: https://github.com/lost-in-the/woods/tree/v2.0.0.beta3
518
+ changelog_uri: https://github.com/lost-in-the/woods/blob/v2.0.0.beta3/CHANGELOG.md
440
519
  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
520
+ documentation_uri: https://github.com/lost-in-the/woods/tree/v2.0.0.beta3/docs
442
521
  rubygems_mfa_required: 'true'
443
522
  post_install_message:
444
523
  rdoc_options: []