43 Commits
Author SHA1 Message Date
Suliman Abdulrazzaq 7432f19bc7 fix: ignore generated artifacts during auto-update 2026-08-09 14:51:39 +03:00
KumamuKuma 21a7fbb16f test(hooks): cover PostToolUse trigger guards 2026-07-28 11:09:18 +08:00
KumamuKuma 10842f1168 fix(hooks): emit PostToolUse additional context 2026-07-28 11:08:03 +08:00
KumamuKuma 20f88686e4 refactor(hooks): extract post-tool auto-update handler 2026-07-28 11:06:45 +08:00
Yuxiang Lin a698bb2176 Merge pull request #587 from KumamuKuma/perf/large-monorepo-benchmark
perf(bench): add reproducible large-monorepo benchmark and scale report
2026-07-18 22:04:28 +08:00
KumamuKuma 48b4fe474b fix(bench): correct unsupported outcomes and add sample report 2026-07-17 22:35:44 +08:00
jiang4wqy 48c5450937 Merge origin/main into feat-stale-graph-warning 2026-07-17 16:57:21 +08:00
KumamuKuma c6fa9bc791 merge: integrate latest main into benchmark branch 2026-07-17 11:33:40 +08:00
KumamuKuma 051e751085 fix(bench): harden deterministic scale reports 2026-07-17 04:26:37 +08:00
KumamuKuma c5e482f41d feat(bench): add deterministic large-repo scale reports 2026-07-17 03:51:38 +08:00
KumamuKuma c4bdcf26b9 fix(bench): isolate reproducible benchmark inputs 2026-07-17 02:38:20 +08:00
KumamuKuma 876faa9b97 feat(bench): support isolated batch artifacts 2026-07-17 02:38:19 +08:00
ZebangCheng 27d76845bd Merge pull request #564 from Egonex-AI/fix/batch-existing-incremental-546
Fix incremental baseline batch merging
2026-07-11 09:07:24 +08:00
ZebangCheng c18fdfda04 fix: merge incremental baseline batch 2026-07-10 20:58:23 +08:00
Lum1104 d876e4f2b3 feat(dashboard-skill): try the prebuilt release viewer before building from source
On top of the placeholder fix: step 4 now launches the self-contained
viewer tarball pinned to the installed plugin version via npx — no
pnpm install, no core build, no Vite. The hardened install/build/vite
path becomes the fallback for offline runs or versions whose release
predates the viewer asset (< v2.9.0). Hardening test extended to cover
the quoted, version-pinned fast-path invocation.

Verified end-to-end against the real v2.9.0 release asset.
2026-07-10 20:44:43 +08:00
MERChallenge fddd5c88f9 fix: resolve dashboard skill placeholders 2026-07-10 19:47:39 +08:00
Lum1104 0c247317a0 feat(viewer): standalone dashboard viewer runnable via npx from release assets
New zero-dependency package understand-anything-viewer: a small Node
http server with the prebuilt dashboard embedded, replicating the dev
server's endpoints and security model (127.0.0.1 bind, one-time access
token on every data endpoint, graph filePath sanitisation, file-content
allowlist / 1MB cap / binary rejection, .ua with legacy
.understand-anything fallback). npm-packed and attached to each GitHub
release as understand-anything-viewer.tgz, so teammates without Claude
Code open a committed graph with:

  npx https://github.com/Egonex-AI/Understand-Anything/releases/latest/download/understand-anything-viewer.tgz <project>

No npm registry publishing involved. End-to-end tests spawn the real
server and cover the token gate, sanitisation, allowlist, traversal
guards, and both data-directory layouts.
2026-07-10 17:57:06 +08:00
Lum1104 6d811c68ab feat(skills): resolve .ua data directory in helper scripts
Every bundled script now honors the shared rule (.understand-anything/
wins when it already exists, .ua/ otherwise): scripts importing
@understand-anything/core use the exported resolveUaDir; standalone
figma/dev scripts inline a two-line helper; Python merge/parse scripts
inline resolve_ua_dir mirroring core. extract-domain-context skips both
directory names when walking, and eslint ignores both. Tests cover
fresh-project .ua, legacy .understand-anything, and legacy-wins-when-
both for each script family.
2026-07-10 17:23:39 +08:00
Lum1104 e3bc337d92 fix(knowledge): resolve title-case infra files and article-root-prefixed wiki links
Two narrow Karpathy-parser path-resolution gaps degraded valid wikis:

Index.md/Log.md were only detected in lowercase — detect_format,
parse_wiki's index/log selection, and merge-knowledge-graph's
project-name detection now resolve known infra filenames
case-insensitively within their directory (exact lowercase still wins
when both casings exist; no recursive fuzzy matching).

Root index files that link with the article-root prefix included
([[wiki/concepts/Index]] when wiki/ is the detected article root) never
matched article ids relative to that root, so category membership
missed and every node landed in the Other layer. Category lookup and
wikilink resolution now try such targets both as written and with the
root prefix stripped; links outside the article root stay unresolved.

Fixes #342
2026-07-10 17:04:14 +08:00
Lum1104 afa1d51cb7 fix(merge): flag batch files that load but contribute zero nodes and edges
A batch file that parses cleanly but adds nothing to the merge is
indistinguishable from a silent partial merge (the #484 report: a
79-node part vanished from one run and was only caught because the
Phase 3 LLM reviewer happened to notice). Emit a Warning: on stderr per
empty file and re-emit the list in the phase report so the data-loss
signal survives to the review step, without hard-failing legitimate
empty batches.

Fixes #484
2026-07-10 17:00:15 +08:00
Lum1104 f71224446e fix(merge): warn, persist, and retry dropped structural subdomain edges
merge-subdomain-graphs.py silently dropped contains_flow/flow_step/
cross_domain edges whenever an endpoint node wasn't in the merged set,
and the drop detail lived only in the in-process report — since
subdomain graph files are cleaned up after assembly, those hierarchy
edges were gone permanently with no trace.

Structural drops now emit Warning: lines in the merge report, every
dropped edge is persisted to .understand-anything/merge-report.json,
and the next merge run re-injects previously dropped structural edges
so they resolve once the missing endpoint's subdomain has arrived.

Fixes #529
2026-07-10 16:58:22 +08:00
jiang4wqy e82fe96ffa fix: harden graph freshness reporting 2026-07-10 15:59:57 +08:00
jiang4wqy ecff2a77f4 Merge remote-tracking branch 'origin/main' into publish/pr-558 2026-07-10 15:59:46 +08:00
ZebangCheng b42e40d658 Merge pull request #557 from jiang4wqy/fix/harden-skill-injection-redos
fix: harden understand skill command snippets
2026-07-10 14:52:50 +08:00
ZebangCheng b9741e6551 Merge pull request #553 from KumamuKuma/pr493-scala-support-kuma
feat: add hardened Scala graph support
2026-07-10 14:16:05 +08:00
ZebangCheng 71d3b79e34 Merge pull request #550 from KumamuKuma/fix/install-ps1-vibe-support
fix(install): add missing vibe support to PowerShell installer
2026-07-09 15:22:40 +08:00
jiang4wqy 0bae36ebcf feat: warn when knowledge graphs are stale 2026-07-08 17:37:56 +08:00
Yuxiang Lin 267fe13036 Merge pull request #551 from KumamuKuma/fix/windows-skill-test-failures
fix(skills): limit changed-file batches to changed targets
2026-07-08 15:50:42 +08:00
jiang4wqy db92777634 fix: harden understand skill command snippets 2026-07-08 11:42:14 +08:00
KumamuKuma bcb5a0ddb2 feat: add hardened Scala graph support 2026-07-06 22:55:03 +08:00
KumamuKuma 80c756fd9a fix(skills): limit changed-file batches to changed targets 2026-07-06 15:40:00 +08:00
KumamuKuma b7137c23df fix(install): add missing vibe support to PowerShell installer
install.sh and the README already list `vibe` as a supported install target, but the PowerShell installer did not include it in `$Platforms`. As a result, `install.ps1 vibe` would fail with `Unknown platform: vibe`, and the interactive Windows installer menu would not show Vibe CLI.

Add `vibe` to the PowerShell platform table, keep the order aligned with install.sh, and add a regression test that checks installer platform ids, link styles, target directories, and README references stay in sync.
2026-07-06 15:01:10 +08:00
Yuxiang Lin 3867693173 Merge pull request #524 from multimail-dev/fix/domain-context-utf8-encoding
fix(skills): force explicit UTF-8 on locale-default Python file reads
2026-07-05 17:49:28 +08:00
Codex Local bbbd6db40b feat(core): add Swift tree-sitter support 2026-07-03 14:48:32 +08:00
KumamuKuma 65ad0238eb test: make Windows test runs portable 2026-07-01 14:48:56 +08:00
H179922andClaude Opus 4.8 1f96b9affe fix(skills): force explicit UTF-8 on locale-default Python file reads
The domain-context scanner and a merge test read files via
Path.read_text(errors="replace") with no explicit encoding. pathlib's
read_text/write_text fall back to locale.getpreferredencoding(False) when
encoding is omitted; on Windows, absent Python UTF-8 mode (PEP 540), that is
the ANSI codepage (cp1252 / cp936 / cp932), not UTF-8.

extract-domain-context.py (lines 126, 211, 270, 315, 418) reads source files,
.gitignore, and metadata, then writes domain-context.json. On Windows the
reads decode UTF-8 source against the wrong codepage, silently mojibaking CJK
comments, accented identifiers, em-dashes, and translated README text into the
context fed to the domain-analyzer agent. errors="replace" does not catch
this: legacy codepages decode nearly every byte to a *wrong* character rather
than raising, so corruption is silent.

test_merge_batch_graphs.py (lines 986, 1105) reads assembled-graph.json back
for assertions; merge-batch-graphs.py writes it with ensure_ascii=False, so it
can contain raw non-ASCII that the unencoded read would mojibake on Windows.

Both now pass encoding="utf-8", matching every other Python script in the repo
(merge-batch-graphs.py, merge-subdomain-graphs.py, parse-knowledge-base.py,
merge-knowledge-graph.py). No behavior change on Linux/macOS, where the locale
default is already UTF-8.

Relates to the Windows-compat reports #262, #340.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 21:07:35 -04:00
Yuxiang Lin 13a39c01cb Merge pull request #359 from tirth8205/fix/import-resolver-nodenext-rewrite
fix(extract-import-map): apply NodeNext .js→.ts rewrite (#294)
2026-06-09 13:23:21 +08:00
ZebangCheng 3281fd15e0 Merge pull request #346 from tirth8205/perf/understand-pipeline
perf(understand): parallelise file I/O in compute-batches + extract-import-map (#76)
2026-06-06 16:25:49 +08:00
Tirth KananiandClaude Opus 4.7 1f8d165f86 fix(extract-import-map): preserve deterministic stderr order across concurrent loaders
Addresses the regression flagged by ZebangCheng on #346: under the
parallelised `buildResolutionContext`, `loadTsConfigs` /
`loadGoModules` / `loadPhpAutoloads` ran concurrently but each wrote
warnings to stderr inline as it iterated read results, so a fixture
with both a malformed `tsconfig.json` and a malformed `composer.json`
could emit `composer, tsconfig` instead of the pre-PR `tsconfig,
composer` depending on I/O timing.

Each loader now buffers its warnings into a returned array and the
caller drains them in canonical order (tsconfig → go → php) after
`Promise.all`, restoring byte-identical stderr output. Added a
regression test that fixtures both malformed configs and asserts the
tsconfig warning precedes the composer warning in stderr.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-05 16:19:31 +01:00
Tirth KananiandClaude Opus 4.7 143b4e492f Merge branch 'main' into fix/import-resolver-nodenext-rewrite
Resolve conflict in tests/skill/understand/test_extract_import_map.test.mjs
by keeping both new test groups — they cover independent fixes that should
coexist:
  - upstream #214: tsconfig path-alias targets with leading "./"
  - this PR  #294: NodeNext .js → .ts rewrite for ESM TypeScript imports

The extract-import-map.mjs script auto-merged cleanly; both fixes are
already present in the merged source.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-01 10:25:37 +01:00
Tirth Kanani a6c653e36b fix(extract-import-map): apply NodeNext .js→.ts rewrite (#294)
Fixes the silent near-edgeless-graph regression on any modern ESM
TypeScript project. Reported in #294 with full repro + root-cause
analysis.

### Why this matters

Under `moduleResolution: NodeNext` (or `Node16` / `Bundler` with
explicit extensions — the default for new TS-ESM projects since 2023),
TypeScript does NOT rewrite import specifiers during compilation:

  // src/index.ts — real, idiomatic NodeNext source
  import { x } from './config.js';   // on disk: config.ts

Before this fix, `probeWithExtensions` only tried APPENDING extensions
to the import specifier:

  './config.js' → not in fileSet
  './config.js.ts', './config.js.tsx', './config.js.js', ... → all miss
  → returns null → edge dropped at merge as dangling

Net result on the reporter's repro: a knowledge graph with hundreds of
file nodes and almost no `imports` edges between them — silently
removing exactly the dependency structure the graph is meant to show.

### Fix

New `NODENEXT_REWRITES` table maps each compiled-output extension to
the TypeScript source extensions that could have produced it:

  .js   → [.ts, .tsx, .js, .jsx]
  .jsx  → [.tsx, .jsx]
  .mjs  → [.mts, .mjs, .ts]
  .cjs  → [.cts, .cjs, .ts]

`probeWithExtensions` now applies the rewrite when the import already
ends with one of these extensions and no such file exists on disk. The
rewrite runs BEFORE the legacy append-extensions loop — otherwise
`./foo.js` would generate the nonsense candidate `foo.js.ts` and the
append loop would never reach the actual `foo.ts`.

### Disambiguation

If both `config.ts` and `config.js` exist on disk (rare, but possible
during a partial migration), `import './config.js'` still resolves to
the .js — that's an exact-disk match and what NodeNext compilation
actually does. The rewrite only kicks in when the .js doesn't exist.

### Tests

6 new tests in `test_extract_import_map.test.mjs`:
- The main #294 case (`.js → .ts`)
- `.jsx → .tsx` and `.mjs → .mts` rewrites
- Disambiguation when both `.ts` and `.js` exist on disk
- Pure-JS projects still work (real `.js → .js` imports)
- Historical no-extension probes unaffected
- Missing files still return null (rewrite can't invent targets)

Total: 202 tests passing (was 196).

Closes #294
2026-05-31 22:31:23 +01:00
Zebang Cheng d9ae3c290c fix(extract-import-map): normalize tsconfig path-alias candidates with leading "./" (#214) 2026-05-25 14:02:01 +00:00
Yuxiang Lin a59a573a1d Merge pull request #204 from Lum1104/feat/semantic-batching-and-output-chunking
fix(#159): semantic batching + bundled importMap + Phase 1 speedup
2026-05-24 20:12:14 +08:00