woods 2.0.0.beta3 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +77 -0
- data/CONTRIBUTING.md +29 -17
- data/README.md +92 -177
- data/docs/AGENT_GUIDE.md +26 -4
- data/docs/AGENT_SETUP.md +18 -8
- data/docs/BACKEND_MATRIX.md +5 -0
- data/docs/CONFIGURATION_REFERENCE.md +74 -8
- data/docs/CONSOLE_MCP_SETUP.md +45 -2
- data/docs/DOCKER_SETUP.md +1 -1
- data/docs/EXTRACTOR_REFERENCE.md +9 -1
- data/docs/INCREMENTAL_EXTRACTION.md +30 -6
- data/docs/MCP_SERVERS.md +57 -2
- data/docs/MCP_TOOL_COOKBOOK.md +4 -4
- data/docs/MCP_WORKTREE_SETUP.md +43 -83
- data/docs/PUBLISHED_INDEX.md +17 -0
- data/docs/RETRIEVAL_GUIDE.md +24 -5
- data/docs/TROUBLESHOOTING.md +12 -13
- data/docs/UPGRADING_TO_2.md +6 -2
- data/docs/WATCH_DAEMON.md +18 -8
- data/exe/woods-mcp-start +14 -9
- data/lib/generators/woods/pgvector_generator.rb +8 -2
- data/lib/woods/agent_configuration/applier.rb +5 -3
- data/lib/woods/agent_configuration/cli.rb +2 -2
- data/lib/woods/agent_configuration/layout.rb +13 -0
- data/lib/woods/console/credential_scanner.rb +4 -3
- data/lib/woods/console/dispatch_pipeline.rb +7 -0
- data/lib/woods/console/embedded_executor.rb +31 -9
- data/lib/woods/console/sql_noise_stripper.rb +9 -7
- data/lib/woods/console/sql_table_scanner.rb +47 -7
- data/lib/woods/console/sql_validator.rb +49 -9
- data/lib/woods/console/sqlite_read_guard.rb +46 -0
- data/lib/woods/coordination/pipeline_lock.rb +3 -2
- data/lib/woods/embedding/indexer.rb +24 -14
- data/lib/woods/extractor.rb +45 -12
- data/lib/woods/extractors/declared_parent.rb +55 -0
- data/lib/woods/extractors/graphql_extractor.rb +2 -11
- data/lib/woods/extractors/lib_extractor.rb +10 -8
- data/lib/woods/extractors/mailer_extractor.rb +6 -10
- data/lib/woods/extractors/model_extractor.rb +1 -15
- data/lib/woods/extractors/poro_extractor.rb +10 -8
- data/lib/woods/extractors/shared_utility_methods.rb +22 -5
- data/lib/woods/mcp/bearer_auth.rb +2 -1
- data/lib/woods/mcp/bootstrapper.rb +17 -4
- data/lib/woods/mcp/config_resolver.rb +2 -1
- data/lib/woods/mcp/index_reader.rb +11 -2
- data/lib/woods/mcp/renderers/markdown_renderer.rb +14 -8
- data/lib/woods/mcp/renderers/plain_renderer.rb +11 -7
- data/lib/woods/mcp/server.rb +22 -28
- data/lib/woods/mcp/tool_contract.rb +1 -1
- data/lib/woods/mcp/tool_response_renderer.rb +16 -0
- data/lib/woods/mcp/traversal_evidence_text.rb +1 -1
- data/lib/woods/mcp/traversal_response.rb +22 -0
- data/lib/woods/path_dispatcher.rb +6 -5
- data/lib/woods/published_index/typed_unit_reader.rb +40 -3
- data/lib/woods/published_index.rb +2 -2
- data/lib/woods/rake_helpers.rb +2 -12
- data/lib/woods/retrieval/lexical_assembler.rb +14 -3
- data/lib/woods/retrieval/lexical_index.rb +2 -1
- data/lib/woods/session_tracer/file_store.rb +6 -1
- data/lib/woods/source_inputs/consumer_errors.rb +4 -0
- data/lib/woods/storage/pgvector.rb +6 -2
- data/lib/woods/temporal/json_snapshot_store.rb +35 -7
- data/lib/woods/version.rb +1 -1
- data/lib/woods/watch/daemon.rb +18 -4
- data/plugin/.claude-plugin/plugin.json +1 -1
- data/plugin/hooks/woods-input-rules.sh +4 -4
- data/plugin/skills/woods-agent-enable/SKILL.md +7 -1
- data/plugin/skills/woods-diagnose/SKILL.md +64 -33
- data/plugin/skills/woods-investigate/SKILL.md +51 -12
- data/plugin/skills/woods-mcp-config/SKILL.md +11 -11
- data/plugin/skills/woods-setup/SKILL.md +14 -11
- metadata +8 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: eec7697bb9a6d63c1c22b57ceb68fb302083252c8e593b66d9f8f34ca5368536
|
|
4
|
+
data.tar.gz: 472e74cdd65897553bc232c683b49c9028614ec801ad855d3dc85b3bcb581aae
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 21cef2ca233373593a8f431fdbf5ef8cdd77838b7b62eb5785d854a38be6855b5df33c3c966183ea62caa1505223ca7ccc59f3e6cc7ced856788ba40b375e574
|
|
7
|
+
data.tar.gz: d4a38ce584e87434bb0b17a9b8609a1ffc57473a75ee9eeeeb8211d17d9fa5aed3f5a7bf411cf1b6caa3ba16a53f642c94f26b8b382b9195582766ce2dfe9065
|
data/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,64 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.0.0.beta4] - 2026-09-22
|
|
11
|
+
|
|
12
|
+
### Build
|
|
13
|
+
|
|
14
|
+
- Allow the exact 1.6.3 maintenance tag and branch from the released 1.6.2 base while keeping publication disabled until a separately reviewed candidate SHA is pinned. Preserve all CI, immutable-artifact, package-test and protected-environment release gates.
|
|
15
|
+
|
|
16
|
+
### Documentation
|
|
17
|
+
|
|
18
|
+
- Correct watcher retry guidance to include heartbeat-driven recovery, identify
|
|
19
|
+
session identity corrections as available in 2.0.0.beta3, and align the
|
|
20
|
+
coding-agent Docker synopsis with the container-first setup guide.
|
|
21
|
+
- Scope orphan results to recorded relationships, document the limits of artifact
|
|
22
|
+
permission defaults, correct Claude Code worktree registration guidance, and
|
|
23
|
+
expose embedding-free lexical retrieval in the MCP tool cookbook.
|
|
24
|
+
Update the distributed agent guides to identify Woods 2.0.0.beta3 capabilities and plugin 2.3.36 hook recovery accurately, while preserving installed-version and schema checks.
|
|
25
|
+
- Clarify that beta/RC development retains the last prepared version, source
|
|
26
|
+
candidates require Git revision evidence, and development reopening applies
|
|
27
|
+
only after a final release. Release transitions and version ordering are unchanged.
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
Accept ASCII case variants of the HTTP `Bearer` authentication scheme for Index and Console MCP. Token bytes, constant-time comparison, and existing delimiter rules remain unchanged. (#497)
|
|
32
|
+
- Console SQL validation now distinguishes keyword grammar from identically named functions before applying the read-only function allowlist. SQLite application-defined keyword functions are rejected before execution; ordinary window, predicate, and numeric pagination syntax remains supported.
|
|
33
|
+
- Report malformed generation marker shapes during embedded Index MCP startup as an actionable `ArgumentError` with the selected directory and published-layout guidance, matching executable preflight behavior. Preserve legacy flat and payload indexes and leave later generation-refresh error handling unchanged.
|
|
34
|
+
- Make file-backed session clearing idempotent for Unicode and punctuated IDs, and discard expired history before appending or merging legacy and encoded files. This prevents expired events from becoming visible again through record, read, or listing; live history, disabled TTL, and retention limits retain their existing behavior.
|
|
35
|
+
Dependency and dependent responses now disclose that published relationships are not exhaustive source-reference coverage, including compact and empty answers. Human witness labels say “witness types unambiguous” while preserving the JSON `typed_path_complete` contract. Successful traversal responses add `total_is_exact`; budget-limited text reports a root-inclusive lower bound and its cutoff reason, independently of pagination. (#470, #471)
|
|
36
|
+
GraphQL parent metadata and summary chunks now read the selected declaration's superclass, rather than borrowing a nested or sibling class's parent. Compact qualified declarations preserve their explicit parent; implicit, dynamic, or unavailable parents remain unknown. Identifiers and dependency classification are unchanged.
|
|
37
|
+
- Preserve the published generation when incremental extraction or named refresh encounters handled source errors. Failed consumers no longer replace last-good units with empty or partial output; watch retains the complete batch for retry.
|
|
38
|
+
- Make missing-index startup headlines describe an unresolved published index instead of implying that atomic indexes require a root `manifest.json`; retain the examined path, layout explanation and existing-index-first remedy (#482).
|
|
39
|
+
- Make `woods-mcp-start` resolve generation payload symlinks before checking their manifest, matching the library's index-root containment check. Preflight rejects escaping links and avoids manifest probes through broken links; contained links and symlinked index roots remain supported. The library already rejected escaping payloads before serving the index.
|
|
40
|
+
- Clarify lexical retrieval responses with actual included-source and considered-candidate counts alongside the shortlist limit. Charge count text to the existing estimated context budget across full, compact, outline and scoped results, distinguishing no matches from matching candidates whose sources do not fit without changing ranking or MCP response structure.
|
|
41
|
+
Stabilize mailer output across Rails processes by sorting action-name inventories consistently and labeling direct Proc defaults and callback filters by source location and callable kind. Preserve callback order, duplicate registrations and ordinary default value types without executing callables. Run a full extraction after upgrading to refresh retained mailer records; affected source hashes may change once. (#484)
|
|
42
|
+
- Stabilize mailer object callback labels across boots by reusing the model extractor's guarded default-representation formatter. Preserve custom labels, literal hexadecimal text, callback order, duplicates and conditions; do not execute callbacks or change non-Proc defaults. Run a full extraction after upgrading to refresh retained mailer metadata; stored index schemas are unchanged.
|
|
43
|
+
- Accept `WOODS_OUTPUT` after the explicit path and `WOODS_DIR` in Index MCP startup, while preserving the launcher's no-path error. Missing-index diagnostics now name the examined directory, describe atomic and legacy layouts, and suggest pointing at an existing index before re-extracting.
|
|
44
|
+
- Recommend explicit embedding-free lexical mode in no-provider startup and retrieval messages, including the required MCP environment change and restart; semantic defaults and typed errors are unchanged.
|
|
45
|
+
- Reconcile Rake tasks across all contributing files on incremental changes and deletions, retaining surviving definitions and removing obsolete source from shared tasks.
|
|
46
|
+
Scope PORO and lib `parent_class` metadata and source annotations to the selected declaration. Nested or sibling error classes no longer supply an unrelated superclass; implicit parents remain nil and explicit constant-path parents retain their names (#474).
|
|
47
|
+
- Reject pgvector HNSW `vector` widths above 2,000 before database writes, and reject invalid migration dimensions before creating files. Correct the 3,072-dimensional generator example and document explicit provider output sizing; no vector truncation or implicit conversion is performed (#524).
|
|
48
|
+
- Describe prepared prereleases without claiming RubyGems publication from VERSION alone, and retain the published 1.6.2 maintenance changelog so generated stable-version guidance stays accurate.
|
|
49
|
+
- Preserve actual GraphQL and gem-source types in `Woods::PublishedIndex` typed lookup and enumeration while retaining the `graphql` and `rails_source` family aliases (#518).
|
|
50
|
+
- Enforce `graph_analysis`'s advertised default of 20 rows per section and retain total/offset context on last and empty pages in every renderer. Correct the structure glossary: graph nodes include isolated units, and retriever entry counts depend on mode and store coverage (#519).
|
|
51
|
+
- Coordinate agent configuration apply and recovery on shared managed targets across application roots, preventing concurrent user-scoped installations from overwriting each other. Keep application-specific receipts, refuse stale plans, and report/protect every coordination path in previews (#520).
|
|
52
|
+
- Apply JSON temporal history limits after matching the requested unit, preserving access to retained records across gaps and deletions with SQLite parity (#521).
|
|
53
|
+
- Reconcile reused in-memory vector and metadata stores during full embedding rebuilds, removing vanished units and publishing empty corpora without changing incremental purge guards. Failed embedding preserves the previous promoted dump and checkpoint (#522).
|
|
54
|
+
Validate persisted JSON snapshot shapes before reading history or capturing the next snapshot. Unusable nested unit records and summary fields now warn and skip the entire snapshot, preserving valid legacy records, corrupt-file retention, and caller SHA validation (#492).
|
|
55
|
+
- Use the same JSON snapshot validity checks for reads and retention: reject filename/content SHA mismatches before selecting a capture baseline, and prune corrupt files before valid legacy snapshots with missing or null timestamps. Timestamp-less snapshots remain eligible for ordinary oldest-first retention.
|
|
56
|
+
Expose the paginated dependencies/dependents payload in `structuredContent.data` with every renderer, including packaged stdio and HTTP defaults, while preserving rendered text and existing tool arguments (#481).
|
|
57
|
+
- Stabilize direct Proc/lambda model validation option values in extracted and published metadata using callable kind and source-location labels, without executing them. Preserve validation order, duplicates, conditions and non-Proc values; nested containers are not recursively normalized. Run a full extraction to refresh retained validation metadata; index schemas are unchanged.
|
|
58
|
+
- Reconcile registered initializers deleted during watch downtime with a full extraction after a fresh environment boot, preserving whole-application runtime facts.
|
|
59
|
+
- Keep the stable extraction guard and output directory after `woods:clean`, so a concurrent writer can finish acquiring its lock safely.
|
|
60
|
+
|
|
61
|
+
### Security
|
|
62
|
+
|
|
63
|
+
- Redact protected Console fields before serialization, normalize the remaining values to their JSON-compatible representation, and redact and scan again before JSON or Markdown rendering. Symbol values and custom serializers cannot introduce unscanned credentials in the final response, and protected serializers remain uncalled. The direct credential scanner also scans Symbol values while preserving their type.
|
|
64
|
+
- Check resolved relations against the Console blocked-table policy before default model tools fetch records or counts, including association parent lookups; reuse the checked relation so dynamic default scopes are evaluated once.
|
|
65
|
+
- Refuse unsupported SQLite identifier and table-reference syntax before Console SQL execution, preserving blocked-table and function policies; ordinary bare and simple quoted identifiers remain supported.
|
|
66
|
+
- Preserve blocked-table visibility after subqueries and parenthesized JOIN predicates, including quoted aliases, across supported SQL dialects.
|
|
67
|
+
|
|
10
68
|
## [2.0.0.beta3] - 2026-09-18
|
|
11
69
|
|
|
12
70
|
### Added
|
|
@@ -2303,6 +2361,25 @@ derive unit identifiers, which changes the index format's observable contract.
|
|
|
2303
2361
|
- Update Inspector transitive dependencies `fast-uri` and `qs` to patched versions
|
|
2304
2362
|
and audit the pinned Node dependency tree in CI.
|
|
2305
2363
|
|
|
2364
|
+
## [1.6.2] - 2026-09-18
|
|
2365
|
+
|
|
2366
|
+
### Fixed
|
|
2367
|
+
|
|
2368
|
+
- Refresh encrypted Rails credentials from disk when rebuilding the Console credential index, update every live scanner, and preserve the last valid index if refresh fails. Each response uses one consistent index snapshot.
|
|
2369
|
+
Keep credential scanner refresh snapshots limited to live weakly referenced
|
|
2370
|
+
scanners on older Ruby versions, avoiding unsafe receiver access after garbage
|
|
2371
|
+
collection while preserving updates to every live Console server.
|
|
2372
|
+
Keep JSON on `>= 2.19.9, < 3` so supported Rails encoders can serialize metadata after a fresh bundle resolution; JSON 3 removes their `quirks_mode` option. Bound MessagePack below 2 and Railties below 9, retaining their existing minimum versions and the strict package-build gate.
|
|
2373
|
+
- Preserve version-aware missing-tool guidance with MCP 0.23 by installing its dispatch override before the SDK captures request handlers.
|
|
2374
|
+
|
|
2375
|
+
### Build
|
|
2376
|
+
|
|
2377
|
+
- Add a no-publish, one-off 1.6.2 maintenance preparation flow and installed-package CI. Disable the legacy automatic publisher; publication requires the trusted main maintenance profile and its reviewed candidate SHA.
|
|
2378
|
+
|
|
2379
|
+
### Security
|
|
2380
|
+
|
|
2381
|
+
- Require MCP 0.23.0 or newer within the 0.x line for upstream transport security fixes; run `bundle update woods mcp` when upgrading. Ruby 3.0 remains supported. The newer SDK removes the old json-schema/addressable dependency chain. Existing Index and Console HTTP origin settings now reach the SDK Host/Origin guards; cross-origin browser access requires the actual configured port.
|
|
2382
|
+
|
|
2306
2383
|
## [1.6.1] - 2026-07-22
|
|
2307
2384
|
|
|
2308
2385
|
### Fixed
|
data/CONTRIBUTING.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Contributing to Woods
|
|
2
2
|
|
|
3
3
|
<!-- release-state:contributing-intro -->
|
|
4
|
-
Woods welcomes bug fixes, extractor coverage, storage and retrieval improvements, MCP compatibility work, documentation, and focused performance changes. This guide covers the shared contribution contract. Coding agents working from a source checkout should also read the repository's [AGENTS.md](https://github.com/lost-in-the/woods/blob/v2.0.0.
|
|
4
|
+
Woods welcomes bug fixes, extractor coverage, storage and retrieval improvements, MCP compatibility work, documentation, and focused performance changes. This guide covers the shared contribution contract. Coding agents working from a source checkout should also read the repository's [AGENTS.md](https://github.com/lost-in-the/woods/blob/v2.0.0.beta4/AGENTS.md).
|
|
5
5
|
<!-- release-state:end -->
|
|
6
6
|
|
|
7
7
|
## Choose the right channel
|
|
@@ -46,7 +46,7 @@ Create a branch from current `main`. Keep each pull request to one logical chang
|
|
|
46
46
|
| `plugin/skills/` | Distributed Woods skills (setup/upgrade, MCP configuration, investigation, agent enablement, diagnosis) |
|
|
47
47
|
|
|
48
48
|
<!-- release-state:contributing-architecture -->
|
|
49
|
-
Read [CLAUDE.md](https://github.com/lost-in-the/woods/blob/v2.0.0.
|
|
49
|
+
Read [CLAUDE.md](https://github.com/lost-in-the/woods/blob/v2.0.0.beta4/CLAUDE.md) for architecture and implementation gotchas before changing runtime behavior.
|
|
50
50
|
<!-- release-state:end -->
|
|
51
51
|
|
|
52
52
|
### Agent orientation and static self-map
|
|
@@ -263,7 +263,7 @@ By contributing, you agree that your contribution is licensed under the [MIT Lic
|
|
|
263
263
|
|
|
264
264
|
## Release flow
|
|
265
265
|
|
|
266
|
-
`main` is the development branch and
|
|
266
|
+
`main` is the development branch. It carries an alpha marker before the first prerelease of a version line and after reopening development following a final release. During beta/RC iteration, it retains the last prepared prerelease version until the next `release:prepare`. Every published release is identified by its exact tagged commit; later commits on `main` are not that release even if `Woods::VERSION` is unchanged.
|
|
267
267
|
|
|
268
268
|
| State | `Woods::VERSION` | Tagged | On RubyGems | Documentation links point at |
|
|
269
269
|
|---|---|---|---|---|
|
|
@@ -274,7 +274,9 @@ By contributing, you agree that your contribution is licensed under the [MIT Lic
|
|
|
274
274
|
|
|
275
275
|
RubyGems treats any letter in a version as a prerelease, so a `~> 1.6` or `~> 2.0` constraint never resolves a beta or a release candidate. Adopting one is explicit: `gem "woods", "2.0.0.beta1"`.
|
|
276
276
|
|
|
277
|
-
`spec/release_v2/version_state_spec.rb`
|
|
277
|
+
`spec/release_v2/version_state_spec.rb` verifies that VERSION is either an alpha or the changelog carries its dated heading, and that the four `release-state` documentation fences match the state VERSION declares. Those checks do not establish that a checkout is the published release.
|
|
278
|
+
|
|
279
|
+
For Git-sourced candidates, record the locked Git revision, loaded gem path, and working-tree changes alongside `Woods::VERSION`. Version-only preflight establishes the declared version, not whether a particular post-tag fix is present. Match capability claims to the pinned commit or published tag. Generated release-state links continue to describe the prepared version; use the candidate commit when linking evidence about unreleased changes.
|
|
278
280
|
|
|
279
281
|
### During feature work
|
|
280
282
|
|
|
@@ -312,10 +314,12 @@ One command per transition. It never commits, tags, pushes, or publishes.
|
|
|
312
314
|
| Alpha to the first beta | `bin/rake "release:prepare[2.0.0.beta1]"` |
|
|
313
315
|
| Beta to the next beta or a release candidate | `bin/rake "release:prepare[2.0.0.rc1]"` |
|
|
314
316
|
| Release candidate to the release | `bin/rake "release:prepare[2.0.0]"` |
|
|
315
|
-
| After
|
|
317
|
+
| After a final release publishes, reopen development | `bin/rake "release:reopen[2.1.0.alpha]"` |
|
|
316
318
|
|
|
317
319
|
`release:prepare` refuses a dirty working tree, a version that moves backwards, a version whose base is not the line `main` is developing, and an alpha target. It then bumps VERSION, folds `## [Unreleased]` and optional entry files into `## [<version>] - <date>` with one block per `###` heading, restates the fences, regenerates the surface inventory, and prints the tag and dispatch commands. Every rewrite is computed before any of it is written, so a refusal leaves the working tree untouched.
|
|
318
320
|
|
|
321
|
+
`release:reopen` accepts only a final release and a strictly later alpha. It does not reopen a beta/RC or move the same version line backwards to alpha. Continue prerelease development with Unreleased notes or changelog fragments, then use `release:prepare` for the next forward beta, RC, or final when authorized.
|
|
322
|
+
|
|
319
323
|
A final release also absorbs every prerelease section of its own base version. Cutting `2.0.0` folds `## [2.0.0.beta1]` and `## [2.0.0.rc1]` into `## [2.0.0] - <date>` and removes their headings, prerelease entries first and anything written after them second, so the notes a user reads for 2.0.0 are the whole story rather than three fragments. An empty `## [Unreleased]` is therefore legitimate for a final release cut straight from a release candidate. A beta or a release candidate has nothing to absorb, so an empty Unreleased section without entry files refuses: there is nothing new to publish.
|
|
320
324
|
|
|
321
325
|
Review the diff and run the release contracts:
|
|
@@ -391,12 +395,12 @@ short body that links `CHANGELOG.md` at the tag itself (not at `main`) and
|
|
|
391
395
|
anchors straight to that version's dated heading, so the note a reader lands
|
|
392
396
|
on always matches the bytes RubyGems published.
|
|
393
397
|
|
|
394
|
-
### One-off 1.6.
|
|
398
|
+
### One-off 1.6.3 security maintenance release
|
|
395
399
|
|
|
396
400
|
The [security policy](SECURITY.md#supported-versions) supports 1.6.x security
|
|
397
401
|
fixes until 2027-02-20. While main develops v2, the sole maintenance exception
|
|
398
|
-
is `v1.6.
|
|
399
|
-
immutable v1.6.
|
|
402
|
+
is `v1.6.3` from the short-lived `release/1.6.3` branch, descending from the
|
|
403
|
+
immutable v1.6.2 commit `4b40e17fd68122a70ccf00d9d2ffb8af42171d3d`.
|
|
400
404
|
This is a stable patch, separate from the next v2 prerelease; it does not declare
|
|
401
405
|
v2 final or establish a general-purpose maintenance publishing path.
|
|
402
406
|
|
|
@@ -413,15 +417,15 @@ The preparation order is:
|
|
|
413
417
|
1. Merge the main-side maintenance policy/tooling PR. Before creating the remote
|
|
414
418
|
target, confirm its effective branch rules require pull requests and prevent
|
|
415
419
|
force pushes and deletion; configure those rules before creating the target. The GitHub
|
|
416
|
-
rules API can check `release/1.6.
|
|
417
|
-
2. Create that target from the immutable v1.6.
|
|
418
|
-
backport and its legacy preparation adapter against that line.
|
|
419
|
-
inherited automatic tag-push publisher before any maintenance tag exists.
|
|
420
|
-
3. Use the legacy adapter's `release:reopen[1.6.
|
|
421
|
-
`release:prepare[1.6.
|
|
420
|
+
rules API can check `release/1.6.3` before the branch exists.
|
|
421
|
+
2. Create that target from the immutable v1.6.2 commit. Review the narrow security
|
|
422
|
+
backport and its legacy preparation adapter against that line. Confirm the
|
|
423
|
+
inherited automatic tag-push publisher remains disabled before any maintenance tag exists.
|
|
424
|
+
3. Use the legacy adapter's `release:reopen[1.6.3.alpha]` and
|
|
425
|
+
`release:prepare[1.6.3]` transitions in clean, separately reviewed commits.
|
|
422
426
|
The adapter owns the legacy documentation profile; do not copy v2 fences or
|
|
423
427
|
surface claims into v1, and never hand-edit VERSION.
|
|
424
|
-
4. Review and merge the prepared candidate into `release/1.6.
|
|
428
|
+
4. Review and merge the prepared candidate into `release/1.6.3`. Require passing
|
|
425
429
|
unit, booted Rails, installed-package, lint, coverage, security and build
|
|
426
430
|
jobs. Review the complete CI and package-test implementation at that SHA.
|
|
427
431
|
Then pin that **exact final commit** in `MAINTENANCE_APPROVED_SHA` through the
|
|
@@ -431,6 +435,14 @@ The preparation order is:
|
|
|
431
435
|
Every exact maintenance matrix row in the trusted profile must succeed;
|
|
432
436
|
missing, duplicated, skipped or failed rows refuse publication.
|
|
433
437
|
|
|
438
|
+
[Temporary security-advisory forks](https://docs.github.com/en/code-security/tutorials/fix-reported-vulnerabilities/collaborate-in-a-fork)
|
|
439
|
+
do not run CI or enforce destination branch protections when the advisory is
|
|
440
|
+
merged. Review and test those patches privately, then require the upstream CI
|
|
441
|
+
matrix triggered by the push to `release/1.6.3` before pinning its prepared SHA.
|
|
442
|
+
A private test report cannot replace the upstream tag-push run and immutable
|
|
443
|
+
artifact required for publication. Keep the advisory unpublished until the fixed
|
|
444
|
+
gems are available.
|
|
445
|
+
|
|
434
446
|
The validators require the approved SHA to remain reachable from the freshly
|
|
435
447
|
fetched maintenance branch and to descend from the fixed legacy base. They retain
|
|
436
448
|
exact tag/VERSION/changelog checks, the unpublished-version check, one immutable
|
|
@@ -446,11 +458,11 @@ RubyGems credentials; the remote tag is checked again immediately before push.
|
|
|
446
458
|
A candidate fix or changed prepared SHA requires a new reviewed main pin and a
|
|
447
459
|
fresh tag-push CI run. Updating main's tooling alone never authorizes different
|
|
448
460
|
candidate bytes. Main's v2 release contract remains unchanged. Do not create or
|
|
449
|
-
push tags, dispatch, publish, or claim 1.6.
|
|
461
|
+
push tags, dispatch, publish, or claim 1.6.3 is available during preparation.
|
|
450
462
|
|
|
451
463
|
### Stable branches
|
|
452
464
|
|
|
453
|
-
A stable branch is `N-M-stable`, cut from the release tag. Create one only when a released line needs a patch after a newer major has shipped on `main`; until then, `main` is the development branch. The explicitly approved short-lived `release/1.6.
|
|
465
|
+
A stable branch is `N-M-stable`, cut from the release tag. Create one only when a released line needs a patch after a newer major has shipped on `main`; until then, `main` is the development branch. The explicitly approved short-lived `release/1.6.3` security exception above does not establish an `N-M-stable` branch.
|
|
454
466
|
|
|
455
467
|
### What coding agents may do
|
|
456
468
|
|
data/README.md
CHANGED
|
@@ -4,38 +4,23 @@
|
|
|
4
4
|
|
|
5
5
|
# Woods
|
|
6
6
|
|
|
7
|
-
**Give
|
|
7
|
+
**Give coding agents the Rails context that source files alone leave out.**
|
|
8
8
|
|
|
9
9
|
[](https://rubygems.org/gems/woods)
|
|
10
10
|
[](https://github.com/lost-in-the/woods/actions/workflows/ci.yml)
|
|
11
11
|
[](LICENSE.txt)
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
> **This tree documents version 2.0.0.** It is a major update from 1.x: read [what changed and how to upgrade](docs/UPGRADING_TO_2.md) before updating. The full history is in the [CHANGELOG](CHANGELOG.md).
|
|
15
|
-
>
|
|
16
|
-
> `main` is the development branch and can run ahead of the latest published gem. The gem badge above shows the latest published version; documentation for a published version lives on its tag.
|
|
17
|
-
>
|
|
18
|
-
> ### Version: 2.0.0.beta3 is published as a prerelease; `main` documents 2.0.0
|
|
19
|
-
>
|
|
20
|
-
> | Line | Version | Documentation |
|
|
21
|
-
> |---|---|---|
|
|
22
|
-
> | Documented here | **2.0.0**, unreleased | this README and the [documentation index](docs/README.md) |
|
|
23
|
-
> | Latest prerelease | **2.0.0.beta3** | [the v2.0.0.beta3 tag](https://github.com/lost-in-the/woods/tree/v2.0.0.beta3) |
|
|
24
|
-
> | Latest published gem | **1.6.1** | [the v1.6.1 tag](https://github.com/lost-in-the/woods/tree/v1.6.1) |
|
|
25
|
-
>
|
|
26
|
-
> RubyGems treats 2.0.0.beta3 as a prerelease, so `gem "woods", "~> 2.0"` does not resolve it. Install it explicitly with `gem "woods", "2.0.0.beta3"`. The released constraint stays `gem "woods", "~> 1.6"`.
|
|
27
|
-
<!-- release-state:end -->
|
|
13
|
+
Woods boots your Rails application, extracts its resolved structure, and publishes an index that coding agents can query through the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/). It brings together database schema, associations, callbacks, concerns, routes, and source code so an agent can inspect how Rails assembles your application.
|
|
28
14
|
|
|
29
|
-
|
|
15
|
+
Supports **Ruby 3.0+ and Rails 6.0–8.x**, using a Ruby version supported by your Rails release. The application must boot and connect to its database. Structural queries need no embedding provider or vector database.
|
|
30
16
|
|
|
31
|
-
|
|
17
|
+
[Get started](#five-minute-setup) · [Documentation](docs/README.md) · [Agent setup](docs/AGENT_SETUP.md) · [Upgrade from 1.x](docs/UPGRADING_TO_2.md)
|
|
32
18
|
|
|
33
19
|
## What Woods adds
|
|
34
20
|
|
|
35
|
-
|
|
21
|
+
Consider a model whose behavior is spread across Rails, the database, and a concern:
|
|
36
22
|
|
|
37
23
|
```ruby
|
|
38
|
-
# app/models/order.rb
|
|
39
24
|
class Order < ApplicationRecord
|
|
40
25
|
include Auditable
|
|
41
26
|
belongs_to :customer
|
|
@@ -43,44 +28,58 @@ class Order < ApplicationRecord
|
|
|
43
28
|
end
|
|
44
29
|
```
|
|
45
30
|
|
|
46
|
-
Woods
|
|
31
|
+
Woods can give an agent one unit containing its columns and indexes, association metadata, resolved callbacks, and included concern source. Recorded relationships connect that unit to other parts of the application.
|
|
47
32
|
|
|
48
|
-
|
|
49
|
-
- associations, validations, scopes, enums, and resolved callbacks;
|
|
50
|
-
- source from included concerns, kept beside the owning class;
|
|
51
|
-
- callback side effects such as jobs, mailers, and columns written;
|
|
52
|
-
- forward dependencies and reverse dependents;
|
|
53
|
-
- route, controller, view, job, and service relationships.
|
|
33
|
+
An agent can then ask:
|
|
54
34
|
|
|
55
|
-
|
|
35
|
+
> Find the Order model, inspect its callbacks and associations, and show its recorded dependents. Cite the indexed evidence and check source code for callers the graph may miss.
|
|
56
36
|
|
|
57
|
-
|
|
37
|
+
Models are one part of the index: Woods also extracts controllers, routes, jobs, mailers, views, components, GraphQL types, service objects, tests, and more. See the [extractor reference](docs/EXTRACTOR_REFERENCE.md) for coverage and the [agent guide](docs/AGENT_GUIDE.md) for query examples.
|
|
58
38
|
|
|
59
39
|
## Five-minute setup
|
|
60
40
|
|
|
61
|
-
|
|
41
|
+
For agent-led setup, use the [agent installation option](#let-an-agent-install-it) and its runbook. For a new manual installation, follow the steps below.
|
|
62
42
|
|
|
63
|
-
|
|
43
|
+
**Already using Woods?** If you are upgrading from 1.x, follow the [upgrade guide](docs/UPGRADING_TO_2.md). For an existing 2.x installation, go directly to [retrieval modes](#retrieval-with-or-without-embeddings), [MCP configuration](docs/MCP_SERVERS.md), or the [configuration reference](docs/CONFIGURATION_REFERENCE.md). Preserve your initializer, index path, provider settings, and other client entries. Changing only the MCP launch configuration or retrieval mode does not require rerunning the installer or rebuilding the structural index.
|
|
64
44
|
|
|
65
|
-
|
|
66
|
-
The example below requires a stable 2.x release; beta and release-candidate
|
|
67
|
-
installations need an exact published prerelease pin from that guide.
|
|
45
|
+
Run installation and extraction commands from your Rails application root in its normal development environment. **Using Docker?** Follow [Docker setup](docs/DOCKER_SETUP.md) first: run those commands inside the application container and use paths visible to the process that runs MCP.
|
|
68
46
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
47
|
+
### 1. Install and configure
|
|
48
|
+
|
|
49
|
+
These steps are for **Woods 2.x**. Choose a published 2.x version from the release information below and confirm it on [RubyGems](https://rubygems.org/gems/woods/versions). If only prereleases are available, use an exact prerelease pin; `~> 2.0` will not select one. Follow the chosen version's tag documentation rather than assuming every feature on `main` is published. If you choose 1.x, use its tag documentation instead of this quickstart.
|
|
50
|
+
|
|
51
|
+
<details>
|
|
52
|
+
<summary>Release information and Gemfile version constraints</summary>
|
|
53
|
+
|
|
54
|
+
<!-- release-state:version-banner -->
|
|
55
|
+
> **This tree documents version 2.0.0.** It is a major update from 1.x: read [what changed and how to upgrade](docs/UPGRADING_TO_2.md) before updating. The full history is in the [CHANGELOG](CHANGELOG.md).
|
|
56
|
+
>
|
|
57
|
+
> `main` is the development branch and can run ahead of the latest published gem. The gem badge above shows the latest published version; documentation for a published version lives on its tag.
|
|
58
|
+
>
|
|
59
|
+
> ### Version: this tree declares prerelease 2.0.0.beta4; `main` documents 2.0.0
|
|
60
|
+
>
|
|
61
|
+
> | Line | Version | Documentation |
|
|
62
|
+
> |---|---|---|
|
|
63
|
+
> | Documented here | **2.0.0**, unreleased | this README and the [documentation index](docs/README.md) |
|
|
64
|
+
> | Declared prerelease | **2.0.0.beta4** | [the v2.0.0.beta4 tag](https://github.com/lost-in-the/woods/tree/v2.0.0.beta4) |
|
|
65
|
+
> | Latest published gem | **1.6.2** | [the v1.6.2 tag](https://github.com/lost-in-the/woods/tree/v1.6.2) |
|
|
66
|
+
>
|
|
67
|
+
> RubyGems treats 2.0.0.beta4 as a prerelease, so `gem "woods", "~> 2.0"` does not resolve it. Once published, install it explicitly with `gem "woods", "2.0.0.beta4"`. The released constraint stays `gem "woods", "~> 1.6"`.
|
|
68
|
+
<!-- release-state:end -->
|
|
69
|
+
|
|
70
|
+
</details>
|
|
71
|
+
|
|
72
|
+
Expand the release information above, then add its appropriate `gem "woods", …` declaration to your Gemfile's `:development` group and run:
|
|
75
73
|
|
|
76
74
|
```bash
|
|
77
75
|
bundle install
|
|
76
|
+
bundle exec ruby -rwoods/version -e 'puts Woods::VERSION'
|
|
78
77
|
bin/rails generate woods:install
|
|
79
78
|
```
|
|
80
79
|
|
|
81
|
-
**
|
|
80
|
+
**For a new default installation, remove the generated `db/migrate/*_create_woods_tables.rb` migration without running it.** Those legacy application tables are unused by the shipped index and storage backends. Keep the generated `config/initializers/woods.rb`; its defaults are sufficient. Only retain the migration for a deliberate older/custom integration. See [Getting started](docs/GETTING_STARTED.md#2-generate-and-review-configuration).
|
|
82
81
|
|
|
83
|
-
### 2. Extract and
|
|
82
|
+
### 2. Extract and validate
|
|
84
83
|
|
|
85
84
|
```bash
|
|
86
85
|
bin/rails woods:extract
|
|
@@ -88,11 +87,11 @@ bin/rails woods:validate
|
|
|
88
87
|
bin/rails woods:stats
|
|
89
88
|
```
|
|
90
89
|
|
|
91
|
-
|
|
90
|
+
Run these where your Rails application can boot. The default output is `tmp/woods/`; keep this generated directory out of source control.
|
|
92
91
|
|
|
93
|
-
### 3. Connect
|
|
92
|
+
### 3. Connect your MCP client
|
|
94
93
|
|
|
95
|
-
|
|
94
|
+
Adapt this example to your MCP client's project configuration format, using your application path and preserving other server entries. See [client configuration locations](docs/MCP_SERVERS.md#client-configuration-locations) for guidance:
|
|
96
95
|
|
|
97
96
|
```json
|
|
98
97
|
{
|
|
@@ -106,175 +105,91 @@ Add this to your MCP client's project configuration. The configuration location
|
|
|
106
105
|
}
|
|
107
106
|
```
|
|
108
107
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
The Index Server reads the published index from disk. It does not boot Rails or query application records.
|
|
112
|
-
|
|
113
|
-
> **Using Docker?** Run Rails commands inside the application container. If Woods is installed only there, launch the Index Server through that container too; a host-side server requires a host Ruby bundle and host-visible index. Follow [Docker setup](docs/DOCKER_SETUP.md).
|
|
114
|
-
|
|
115
|
-
The complete walkthrough, including expected output and first questions to ask, is in [Getting started](docs/GETTING_STARTED.md).
|
|
116
|
-
|
|
117
|
-
## Let an agent install it
|
|
108
|
+
Reconnect the client and ask it to call `woods_status`. Confirm the index path and non-zero unit counts. Then use `search` to discover a known class and `lookup` with its identifier **and type** to inspect it.
|
|
118
109
|
|
|
119
|
-
|
|
110
|
+
The Index Server reads the published index without booting Rails or querying application records. See [MCP servers](docs/MCP_SERVERS.md) for client-specific configuration and HTTP transport.
|
|
120
111
|
|
|
121
|
-
|
|
122
|
-
/plugin marketplace add lost-in-the/plugins
|
|
123
|
-
/plugin install woods-plugin@lost-in-the-plugins
|
|
124
|
-
```
|
|
112
|
+
If Woods is installed only inside Docker, launch MCP through that container too. Host-side launch needs a host bundle and a host-visible index; see the [Docker process and path rule](docs/MCP_SERVERS.md#docker-process-and-path-rule).
|
|
125
113
|
|
|
126
|
-
|
|
114
|
+
## Retrieval: with or without embeddings
|
|
127
115
|
|
|
128
|
-
|
|
129
|
-
Install or upgrade the woods gem in this Rails application by following
|
|
130
|
-
https://github.com/lost-in-the/woods/blob/main/docs/AGENT_SETUP.md.
|
|
131
|
-
Structural setup only: add the gem to the development group, run the
|
|
132
|
-
installer, extract and validate the index, and register the Index MCP
|
|
133
|
-
server for this app. Do not run the generated legacy migration, and do
|
|
134
|
-
not add embedding providers, vector databases, Console/live-data access,
|
|
135
|
-
or secrets without asking me first. If woods 1.x is already installed,
|
|
136
|
-
follow the upgrade runbook in docs/UPGRADING_TO_2.md instead and plan a
|
|
137
|
-
clean re-index. Finish by reporting the installed version, files
|
|
138
|
-
changed, commands run, and one verified woods_status call through the
|
|
139
|
-
registered MCP server.
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
The runbook holds the agent to the same guardrails the skills enforce: a version preflight, minimal diffs, and explicit approval before anything beyond the structural index. Prefer doing it by hand? The five-minute setup above is the same procedure as commands.
|
|
143
|
-
|
|
144
|
-
## Choose your path
|
|
116
|
+
Exact lookup, pattern search, and graph queries work immediately after extraction. For ranked retrieval through `codebase_retrieve`, choose a mode:
|
|
145
117
|
|
|
146
|
-
|
|
|
147
|
-
|---|---|
|
|
148
|
-
| Install Woods yourself | [Getting started](docs/GETTING_STARTED.md) |
|
|
149
|
-
| Ask a coding agent to install Woods safely | [Agent setup runbook](docs/AGENT_SETUP.md) |
|
|
150
|
-
| Configure an MCP client, Docker, or HTTP | [MCP servers](docs/MCP_SERVERS.md) |
|
|
151
|
-
| Teach an agent how to query Woods effectively | [Agent guide](docs/AGENT_GUIDE.md) |
|
|
152
|
-
| Add semantic search with OpenAI or local Ollama | [Retrieval guide](docs/RETRIEVAL_GUIDE.md) |
|
|
153
|
-
| Query live Rails data through the optional Console Server | [Console MCP setup and security](docs/CONSOLE_MCP_SETUP.md) |
|
|
154
|
-
| Keep the index current automatically while coding | [Watch daemon](docs/WATCH_DAEMON.md) |
|
|
155
|
-
| Upgrade an existing 1.x installation | [Upgrade to Woods 2.0](docs/UPGRADING_TO_2.md) |
|
|
156
|
-
| Diagnose a failure | [Troubleshooting](docs/TROUBLESHOOTING.md) |
|
|
157
|
-
|
|
158
|
-
## Upgrading from 1.x
|
|
159
|
-
|
|
160
|
-
Woods 2.0 is a major release: identifiers, the on-disk layout, the MCP surface, and task failure posture all changed. [Upgrade to Woods 2.0](docs/UPGRADING_TO_2.md) holds the full what-changed table, the step-by-step runbook with backups and rollback, and an agent-operated upgrade prompt.
|
|
161
|
-
|
|
162
|
-
## Optional Claude Code workflows
|
|
163
|
-
|
|
164
|
-
Woods itself is MCP-client and model independent. The separately packaged Woods plugin (install commands under [Let an agent install it](#let-an-agent-install-it)) gives Claude Code five guided skills: setup and upgrade, MCP configuration, index-driven investigation, repository agent enablement, and diagnosis. Other MCP clients do not need it; follow the human or agent runbooks linked above and configure either stdio or Streamable HTTP directly.
|
|
165
|
-
|
|
166
|
-
## Two servers, two trust boundaries
|
|
167
|
-
|
|
168
|
-
Woods ships two MCP servers. Most users only need the Index Server.
|
|
169
|
-
|
|
170
|
-
| | Index Server | Console Server |
|
|
118
|
+
| Mode | Setup | What it searches |
|
|
171
119
|
|---|---|---|
|
|
172
|
-
|
|
|
173
|
-
|
|
|
174
|
-
| Default tools | 14 | 9 |
|
|
175
|
-
| Optional tools | Semantic retrieval activates after embedding; advanced Ruby embeddings can wire more collaborators | `console_sql` and `console_query` raise the total to 11 when explicitly enabled |
|
|
176
|
-
| Default posture | Read-only index | Disabled; live-data access requires deliberate setup |
|
|
177
|
-
|
|
178
|
-
The 14 Index tools cover health, exact lookup, search, dependency traversal, flow tracing, graph analysis, framework source, change recency, and optional semantic retrieval. The Console Server exposes nine supported model/schema tools by default. Nineteen Tier 2/3 Console schemas (9 Tier 2, 10 Tier 3) and `console_eval` exist as source inventory but do not register in any supported mode.
|
|
179
|
-
|
|
180
|
-
See [MCP servers](docs/MCP_SERVERS.md) for the callable tool lists and client configuration.
|
|
120
|
+
| **Lexical** | Set `WOODS_RETRIEVAL_MODE=lexical` in the MCP process environment and restart the server | Published extraction units, ranked by field-aware keyword matching; no provider or embeddings |
|
|
121
|
+
| **Semantic** (default mode) | Configure a local or hosted embedding provider, then run `bin/rails woods:embed` | Embedded code context, ranked by semantic similarity |
|
|
181
122
|
|
|
182
|
-
|
|
123
|
+
For the stdio configuration above, add `"env": {"WOODS_RETRIEVAL_MODE": "lexical"}` inside the `woods` server entry to choose lexical mode. Confirm the active retriever with `woods_status`.
|
|
183
124
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
```ruby
|
|
187
|
-
# config/initializers/woods.rb
|
|
188
|
-
Woods.configure_with_preset(:local)
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
The `:local` preset uses SQLite metadata, in-memory vectors persisted under the index, and a local Ollama service. It needs the `sqlite3` gem in the application bundle plus an installed, running Ollama service, but no cloud API key. Pull the default model before the first embed:
|
|
192
|
-
|
|
193
|
-
```bash
|
|
194
|
-
ollama pull nomic-embed-text
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
MySQL/PostgreSQL applications that do not bundle `sqlite3` can use `:shared_filesystem` for local persisted stores instead. PostgreSQL/OpenAI, Qdrant/OpenAI, and shared-filesystem configurations are documented in the [backend matrix](docs/BACKEND_MATRIX.md) and [configuration reference](docs/CONFIGURATION_REFERENCE.md).
|
|
198
|
-
|
|
199
|
-
For dense Ruby source, add `gem "tokenizers", "~> 0.5"` for exact WordPiece token counting. Without it, Woods uses a character estimate that can over-pack some Ollama chunks.
|
|
200
|
-
|
|
201
|
-
```bash
|
|
202
|
-
bin/rails woods:embed
|
|
203
|
-
```
|
|
125
|
+
To switch back to semantic retrieval, remove the lexical environment override or set `WOODS_RETRIEVAL_MODE=semantic`, configure the provider and embedding artifacts, then restart the MCP server and verify `woods_status`. Switching to lexical does not delete existing vectors or provider configuration.
|
|
204
126
|
|
|
205
|
-
|
|
127
|
+
The [lexical guide](docs/RETRIEVAL_GUIDE.md#embedding-free-lexical-retrieval) and [semantic setup](docs/RETRIEVAL_GUIDE.md#configuring-retrieval) cover configuration, ranking, and response budgets. Lexical matching depends on shared vocabulary; semantic mode requires the configured provider and embedding artifacts.
|
|
206
128
|
|
|
207
129
|
## Keeping the index current
|
|
208
130
|
|
|
209
|
-
Run a
|
|
210
|
-
|
|
211
|
-
```bash
|
|
212
|
-
bin/rails woods:extract
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
For automatic maintenance during development, run the watcher as a dedicated process:
|
|
131
|
+
Run a watcher alongside your development processes:
|
|
216
132
|
|
|
217
133
|
```bash
|
|
218
134
|
bin/rails woods:watch
|
|
219
135
|
```
|
|
220
136
|
|
|
221
|
-
|
|
137
|
+
It catches up on changes, publishes complete generations, and lets the Index Server refresh on later tool calls. Use a process supervisor for changes that require the watcher to restart. Without a watcher, run `bin/rails woods:incremental` after edits or `bin/rails woods:extract` for a full rebuild.
|
|
222
138
|
|
|
223
|
-
|
|
224
|
-
# Procfile.dev
|
|
225
|
-
web: bin/rails server
|
|
226
|
-
woods: bundle exec rake woods:watch
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
The watcher catches up changes made while it was stopped, batches new file changes, reloads Rails code when safe, and publishes complete generations atomically. The Index Server notices a new generation on its next tool call and refreshes itself. **After the initial extraction, ordinary code changes need no manual re-extraction or MCP restart.**
|
|
139
|
+
Incremental cost depends on the affected code and relationships; broad changes can cost as much as a full extraction. Semantic embeddings have a separate update step. See [Watch daemon](docs/WATCH_DAEMON.md), [incremental extraction](docs/INCREMENTAL_EXTRACTION.md), and [source freshness](docs/SOURCE_FRESHNESS.md).
|
|
230
140
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
In CI on Rails 8.1, add one step to `config/ci.rb` so the index the gates read matches the commit under test:
|
|
141
|
+
## Two servers, two trust boundaries
|
|
234
142
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
143
|
+
| | Index Server | Console Server |
|
|
144
|
+
|---|---|---|
|
|
145
|
+
| Purpose | Inspect extracted code context | Query live Rails models and schema |
|
|
146
|
+
| Reads | Published index files | A booted application and its database |
|
|
147
|
+
| Packaged tools | 14; retrieval usable when configured | 9; 11 with embedded read tools enabled |
|
|
148
|
+
| Setup | The workflow above | Optional, disabled by default |
|
|
238
149
|
|
|
239
|
-
|
|
150
|
+
Extraction itself boots and eager-loads your application, so its boot-time behavior still runs. Treat the generated index as confidential application source. Enabling hosted embeddings sends the embedded content to that provider. MCP responses also contain application source, which your client may send to its model provider even when Woods uses lexical retrieval or local embeddings.
|
|
240
151
|
|
|
241
|
-
|
|
152
|
+
The optional Console Server can access live data. Review its [setup and security model](docs/CONSOLE_MCP_SETUP.md) before enabling it. Report vulnerabilities privately through [SECURITY.md](SECURITY.md).
|
|
242
153
|
|
|
243
|
-
## What
|
|
154
|
+
## What the index can and cannot establish
|
|
244
155
|
|
|
245
|
-
|
|
156
|
+
- **It is a snapshot.** Check freshness against your working tree before relying on it for a change.
|
|
157
|
+
- **Relationships are recorded evidence, not a complete call graph.** Arbitrary method-body constant references are not exhaustively indexed. No recorded dependents does not prove that a class has no callers or is safe to delete.
|
|
158
|
+
- **A traced flow is not proof of execution.** Follow the tool's evidence and limits, and verify behavior in the application when it matters.
|
|
246
159
|
|
|
247
|
-
|
|
248
|
-
- services, interactors, commands, jobs, mailers, and scheduled work;
|
|
249
|
-
- ERB views, Phlex components, ViewComponents, and navigation edges;
|
|
250
|
-
- GraphQL types, mutations, resolvers, and fields;
|
|
251
|
-
- policies, serializers, decorators, validators, state machines, and events;
|
|
252
|
-
- migrations, database views, factories, tests, configuration, and installed framework source.
|
|
160
|
+
Use Woods to locate and connect evidence, then confirm the relevant source and tests. The [agent guide](docs/AGENT_GUIDE.md) describes this workflow.
|
|
253
161
|
|
|
254
|
-
|
|
162
|
+
## Let an agent install it
|
|
255
163
|
|
|
256
|
-
|
|
164
|
+
Use the [agent setup runbook](docs/AGENT_SETUP.md) for a copyable installation prompt and verification checklist. Woods works with MCP-capable clients independently of a specific model or editor.
|
|
257
165
|
|
|
258
|
-
|
|
166
|
+
Claude Code users can optionally install the companion workflows:
|
|
259
167
|
|
|
260
|
-
|
|
168
|
+
```text
|
|
169
|
+
/plugin marketplace add lost-in-the/plugins
|
|
170
|
+
/plugin install woods-plugin@lost-in-the-plugins
|
|
171
|
+
```
|
|
261
172
|
|
|
262
|
-
|
|
173
|
+
The plugin guides installation, MCP configuration, investigation, repository agent setup, and diagnosis. It is distributed separately from the gem.
|
|
263
174
|
|
|
264
175
|
## Documentation
|
|
265
176
|
|
|
266
|
-
|
|
177
|
+
| Task | Guide |
|
|
178
|
+
|---|---|
|
|
179
|
+
| Install and verify | [Getting started](docs/GETTING_STARTED.md) |
|
|
180
|
+
| Configure clients, Docker, or HTTP | [MCP servers](docs/MCP_SERVERS.md) |
|
|
181
|
+
| Query effectively | [Agent guide](docs/AGENT_GUIDE.md) and [tool cookbook](docs/MCP_TOOL_COOKBOOK.md) |
|
|
182
|
+
| Configure Woods | [Configuration reference](docs/CONFIGURATION_REFERENCE.md) |
|
|
183
|
+
| Choose retrieval and storage | [Retrieval guide](docs/RETRIEVAL_GUIDE.md) and [backend matrix](docs/BACKEND_MATRIX.md) |
|
|
184
|
+
| Upgrade from 1.x | [Upgrade guide](docs/UPGRADING_TO_2.md) |
|
|
185
|
+
| Diagnose a failure | [Troubleshooting](docs/TROUBLESHOOTING.md) |
|
|
267
186
|
|
|
268
|
-
|
|
269
|
-
- [MCP tool cookbook](docs/MCP_TOOL_COOKBOOK.md)
|
|
270
|
-
- [FAQ](docs/FAQ.md)
|
|
271
|
-
- [Troubleshooting](docs/TROUBLESHOOTING.md)
|
|
272
|
-
- [Upgrade to Woods 2.0](docs/UPGRADING_TO_2.md)
|
|
187
|
+
See the [documentation index](docs/README.md) for all guides and canonical reference pages.
|
|
273
188
|
|
|
274
189
|
## Contributing
|
|
275
190
|
|
|
276
|
-
Read [CONTRIBUTING.md](CONTRIBUTING.md) before
|
|
191
|
+
Use [GitHub issues](https://github.com/lost-in-the/woods/issues) for bugs and feature requests. Read [CONTRIBUTING.md](CONTRIBUTING.md) before submitting a pull request; coding agents should also read [AGENTS.md](https://github.com/lost-in-the/woods/blob/main/AGENTS.md).
|
|
277
192
|
|
|
278
193
|
## License
|
|
279
194
|
|
|
280
|
-
|
|
195
|
+
[MIT](LICENSE.txt).
|