| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
ci: deploy Pages via Actions, scoped to docs changes (#425) The legacy "Deploy from a branch" Pages build ran Jekyll on every push to main and failed on the planning docs under /docs — Jekyll's Liquid parser hit `Unknown tag 'data'` in EVALUATION_PLAN.md, so the website build went red after nearly every commit. /docs is a hand-written static site (index.html + robots/sitemap/llms.txt), so it never needed Jekyll. Deploy it with a GitHub Actions workflow that uploads /docs as-is and only triggers on docs/** changes, and add a .nojekyll guard. Switch the Pages source to "GitHub Actions" for this to take over from the legacy build. Co-authored-by: DeusData <joerge@datadice.io> | 4 个月前 | |
docs(benchmark): final PHP-LSP numbers — 278 tests, ~10k LoC | 5 个月前 | |
feat(index): the documentation pass follows the index mode by default Doc-section -> code candidates (doc_link_candidates, #2574/#2610) are the documentation-in-the-graph feature of this release. They now run by default for full indexes and not for moderate or fast ones; an explicit `doc_candidates` argument, or a `doc_candidates` setting the user set, overrides the default either way in every mode. - pipeline: the switch is unset/on/off; unset means on only when the effective mode is full. - MCP: forwards only an explicit choice (argument, then a user-set config value) to daemon jobs and workers; daemon auto-index and watcher/UI jobs now carry a user-set value too (their workers have no config, so `doc_candidates false` was ignored there). - fast + doc_candidates on runs the semantic pass's corpus phases and the doc phase only: candidates, and still no SIMILAR_TO or SEMANTICALLY_RELATED edges. - config: `doc_candidates` joins the config key table (default `auto`); `config set doc_candidates ...` was refused as an unknown key before. README, docs/CONFIGURATION.md and the MCP schema describe the default. Proof (macOS arm64, django fb11376): full 11,304 rows · moderate 0 · fast 0 · full+off 0 · moderate+on 1 · fast+on 1 (moderate/fast discovery skips docs/) -- nodes and edges are identical between on and off in every mode; fast+on adds 0 semantic edges. - New tests (RED on the old code): pipeline pipeline_doc_candidates_default_follows_mode, pipeline_doc_candidates_explicit_wins_over_mode, pipeline_doc_candidates_fast_on_legacy_incremental; mcp tool_index_repository_doc_candidates_follow_mode, tool_index_repository_doc_candidates_forwarded_only_when_explicit; daemon_application daemon_application_programmatic_index_forwards_set_doc_candidates. - mcp 374 passed (4 Windows-only skips), daemon_application 73 passed, pipeline/store_arch/cli/runtime_settings/index_policy/pipeline_frozen green on the release tree. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com> | 4 小时前 | |
doc-links: doc-comment references become MENTIONS edges, C# first A reference written in a doc comment is extracted with the definition it documents (internal/cbm/doclink.c; the C# scanner doclink_cs.c) and resolved per file in the pipeline (src/pipeline/doc_links.c, doc_links_cs.c, doc_links_msbuild.c). A reference that names a definition of the repository with certainty becomes a MENTIONS edge from the documented definition (the File node for a file-level comment) with the properties via, syntax, tier, line and count. Any other reference becomes a row of the new doc_link_unresolved table with its reason: missing, ambiguous, external, test_only_target, graph_gap, unparseable or below_bar_tier. Nothing is guessed. index_status reports the layer in a doc_links block. C# binds a cref by the compiler's lookup rule: the first scope with the name decides, a cref never binds an inherited member, System is outside the repository. Assemblies come from project files, and MSBuild global usings (<Using>, ImplicitUsings, Directory.Build.props/.targets, imports, conditions) are evaluated from the project files' content as data the indexer has already read; the layer opens no file. Two declarations of a name in different assemblies make the reference ambiguous. Each file's scope is stored line-free with its LSP surface ("dl"), so an incremental run re-resolves the files a change can reach and falls back to a full run for a change that can re-route references anywhere (a project file, a global using, a deleted file). The scanner and the resolver treat the repository as untrusted input: bounded nesting, no input-driven recursion, work that grows linearly (held by test seams, never by a clock), no silent limits, and a damaged or foreign stored scope fails closed. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com> | 4 天前 | |
feat(index): add opt-in discovery resource limits Indexing accepts whatever a repository contains. A tree carrying a vendored monorepo, a generated dump, or a runaway build directory is discovered in full, and the first sign of trouble is a host under memory pressure with nothing that attributes it to indexing. Add two opt-in limits evaluated during discovery against accepted source files only: index_max_files and index_max_source_mb. Both default to off, so nothing changes until an operator sets one. Crossing a limit fails the whole attempt with a structured resource_limit_exceeded result naming the resource, the observed value and the limit; no partial graph is published, and an existing serving index keeps answering. Limits are read from the CLI-managed _config.db and are not MCP request arguments. A supervised parent replaces any caller-supplied policy before spawning its worker, and the worker rejects a missing or incomplete contract, so the CLI, the daemon and the supervised worker all enforce the same decision. Both keys reach an operator through the existing config get/set/list/reset with no new subcommand. `set` suppresses its own generic message for them because the policy writer names the precise reason -- so that writer speaks on every failure it can return, including a validated value whose write then fails on a database that cannot be written. Exiting non-zero in silence is not an acceptable answer from a CLI. The two shell regressions that hand-roll the supervisor's worker argv carry that contract as well. Without it the worker exits before either guard can observe anything, and the guard would go quietly vacuous. Signed-off-by: 刘冲 <mail@liuchong.dev> | 1 个月前 | |
docs: preserve savings measurement guide Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com> | 1 个月前 | |
docs: define runtime trace observation model Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com> | 1 个月前 | |
docs(security): coordinated-disclosure process + realistic reporting policy Add docs/SECURITY-DISCLOSURE.md describing how vulnerability reports are handled end to end (private fix, cross-platform validation, reporter verification, patched release, then a GitHub Security Advisory with a CVE and credit). Update SECURITY.md: add GitHub private vulnerability reporting as the preferred channel, replace the over-tight 48h/7-day commitment with honest best-effort targets for a solo-maintained project, add a safe-harbor statement, and refresh the stale supported-versions table (0.5.x -> 0.8.x). Signed-off-by: Martin Vogel <martin.vogel@datadice.io> | 3 个月前 | |
fix(discover): skip Laravel's compiled Blade view cache by default (#1735) storage/framework/views/ holds Laravel's compiled Blade templates: generated PHP with no source value. It was excluded only through Laravel's stock .gitignore in that folder; when that file is missing, every compiled view was indexed and reported as parse_partial by the php grammar, burying real coverage gaps under generated noise. Every built-in skip rule matched a directory BASENAME, and "views" is far too common to skip everywhere. Add ALWAYS_SKIP_DIR_SUFFIXES, a built-in rule list matched against the relative path suffix on a '/'-component boundary, so storage/framework/views (at any depth, e.g. backend/storage/framework/views) is skipped while resources/views, app/views, app/framework/views, mystorage/framework/views and storage/framework/views_old stay indexed. The rule is applied in should_skip_directory next to the basename skip list, so it shares its semantics: the subtree is reported as an excluded dir (#411) in the index result and as not_indexed_dir "excluded subtree" in check_index_coverage, and a .cbmignore negation (!storage/framework/views/) can un-skip it like any non-safety-core built-in skip (#500). Test: discover::discover_skips_laravel_compiled_views_issue1735 (RED before, green after, RED on revert) and discover::discover_cbmignore_negates_laravel_compiled_views_issue1735. Docs: docs/cbmignore.md precedence layer 1. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com> | 18 天前 | |
docs: README screenshot shows CodeAtlasWeb The Atlas screenshot the README embeds still showed the previous frontend. This is CodeAtlasWeb from a clean-tree embedded build: the explorer, the Monaco reader on the sample fixture, the twin, the galaxy and the menu row with the [p]rojects entry. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com> | 1 个月前 | |
fix(watcher): show watch state in index_status, correct auto-sync docs (#2167) The background watcher only watches the project an open MCP session is rooted in, and drops the watch when the last session for that project closes. A repository indexed with `cli index_repository` (or from a session rooted elsewhere) is never watched, but README promised "Auto-sync keeps it fresh after that" for every index_repository target and the MCP instructions said "Indexes auto-refresh". Nothing in the status output said which projects were actually watched, so a stale CLI-indexed repo looked like a watcher bug. What gets watched is unchanged. Instead: - index_status gains a `watch` object: `watched`, plus `strategy`, `poll_interval_ms` and `last_scan_at` when watched, or a `reason` (not_session_project, cli_session, auto_watch_off, watcher_disabled, not_registered, no_watcher) and a re-index hint when not. It does not touch the #1561 `freshness` key. - The watcher publishes per-project strategy, cadence and last completed scan time through atomics and exposes them via cbm_watcher_project_info(); the daemon answers index_status through a session-scoped provider. - README, docs/CONFIGURATION.md, docs/index.html, the index_status tool description and the MCP instructions now state the real scope. `watcher_enabled` already shows in `config list` since v0.11.0 (680bc72e). Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com> | 9 天前 | |
feat(lang): add Chialisp support with a first-party tree-sitter grammar Chialisp (.clsp/.clib/.clinc) is the Chia smart-coin language. The only public grammar, Quexington/tree-sitter-chialisp, cannot parse it: on the five reference files from chia-blockchain@main it produced 3-34 ERROR nodes each. Three defects account for all of them, and each desynchronised the rest of the file rather than losing one node: * comments were `/;.*\r\n/` -- CRLF-only, while real files are LF; * `(include foo.clib)` was rejected because of the dot in the filename; * `(defconstant NAME <expr>)` accepted only a primitive after the name. So the grammar is written here instead, in tools/tree-sitter-chialisp/, and files as first-party: its vendored LICENSE is the project's own, byte-identical to the repository root, carrying no third-party copyright. It is deliberately GENERIC -- source_file / list / symbol / string / number / hex / dot / comment, modelling the clvm_tools reader rather than the Chialisp form vocabulary. `mod`, `defun`, `defconstant` and `include` are ordinary head symbols; which lists are definitions is decided in extract_defs.c. A dialect that adds a form (cl-21 -> cl-23 -> cl-26 each added several) therefore needs no regenerated parser. Acceptance: all five reference files parse with zero ERROR and zero MISSING nodes; the three defects above are pinned as tests. Extraction, and the four decisions in it: * `Constant` is admitted to the cross-file name registry (cbm_label_is_registry_symbol). Chialisp's condition codes live as `(defconstant ...)` in a shared .clib and are referenced by name from every puzzle; labelled but unregistered they are seeded nowhere, and roughly half of a Chialisp graph would be present as nodes yet never the target of an edge. All three registry-seeding sites route through that one predicate, so they cannot diverge. No other language emits `Constant`, so the blast radius is exactly Chialisp. Pinned by a two-file graph test that goes red when the label is removed from the predicate. * `export` / `namespace` are NOT definition heads. `(export foo)` names a function already defined in the same file, so treating it as a def head mints a second node for one symbol. They stay in the not-a-call filter. * A parameter list is a `list` too, but it binds rather than invokes. Without that gate `(defun check_conditions (HEIGHTLOCK conditions) ...)` mints a phantom call to HEIGHTLOCK, and real Chialisp is mostly such definitions. * `(include *standard-cl-26*)` is a dialect directive, not a file dependency; recording it would invent a dependency on a file that does not exist. Three helpers that the defs, calls and unified walks all need -- the quote-data gate, comment-skipping named-child access, and the Chialisp def-head set -- live in helpers.c rather than being copied per translation unit. They previously existed as byte-identical duplicates that had already drifted: extract_defs.c skipped comments when reading a def head while its mirror in extract_unified.c did not, so a comment between a head and its name desynchronised defs from call scope. Both now use the same accessor. Ledger: 161 -> 162 grammars across the seven published surfaces, ABI-14 86 -> 87, first-party 13 -> 14, CBM_LANG_COUNT 164 -> 165. Distilled from PR #919 by darkverbito, whose extraction logic -- the CLVM not-a-call vocabulary, the quoted-data gate, the filename-derived `mod` name and the include/embed import handling -- is kept and is the substance of this change. The grammar that PR vendored is not used. Co-authored-by: darkverbito <8049985+darkverbito@users.noreply.github.com> Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com> | 1 个月前 | |
docs: rebuild landing page, update facts and add GEO/SEO + live releases - Update to current capabilities: 158 languages, 11 agents, 14 MCP tools, Hybrid LSP, infrastructure-as-code indexing, single static C binary - Add dedicated Hybrid LSP section and per-language resolution table - Remove the GitNexus comparison - Restructure with answer-first, question-based headings for AI answer engines - Add JSON-LD structured data (SoftwareApplication, Organization, WebSite, BreadcrumbList, FAQPage) with arXiv preprint citation - Add a live GitHub releases widget (client-side, graceful fallback) - Add prominent research-preprint callout under the hero - Centered nav, "by DeusData" subtitle, inline SVG favicon - Welcome AI crawlers in robots.txt, refresh sitemap, add llms.txt - Fix broken benchmark link | 4 个月前 | |
Reword Hybrid LSP description; correct grammar count to 159 Describe the Hybrid LSP layer as a lightweight C implementation structurally inspired by and compatible with major language servers, rather than a clean-room re-implementation of their algorithms, across README, site, and llms.txt. Drop intelephense from the reference list. | 3 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 4 个月前 | ||
| 5 个月前 | ||
| 4 小时前 | ||
| 4 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 3 个月前 | ||
| 18 天前 | ||
| 1 个月前 | ||
| 9 天前 | ||
| 1 个月前 | ||
| 4 个月前 | ||
| 3 个月前 |