32 Commits

  • Merge pull request #419 from chengyongru/feat/nanobot-support
    feat(install): add Nanobot platform support
  • feat(understand): auto-detect conversation language on first run
    When /understand runs with no --language flag and no stored outputLanguage,
    step 3.6 now infers the conversation language and — only when it is non-English
    — confirms once before generating, then persists the choice to config.json.
    English conversations keep the exact same silent `en` path; --language flag and
    stored config still take priority. README documents the behavior; version
    bumped 2.7.5 -> 2.7.6 across all five manifests (user-visible behavior change).
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
  • Merge pull request #204 from Lum1104/feat/semantic-batching-and-output-chunking
    fix(#159): semantic batching + bundled importMap + Phase 1 speedup
  • chore(release): bump version to 2.7.3
    Ships the fingerprints baseline fix (e7af9ae): every install since
    2.7.0 had a broken Phase 7 step 2.5 that threw TypeError on the first
    /understand run and left fingerprints.json empty/missing, which made
    every subsequent auto-update escalate to FULL_UPDATE. This release
    replaces the LLM-written script with a bundled build-fingerprints.mjs
    and reorders Phase 7 to write fingerprints before meta.json.
    
    Anyone upgrading from 2.7.0–2.7.2 should re-run /understand --full
    to regenerate a valid baseline.
  • chore(release): bump version to 2.7.2
    Ships two auto-update fixes:
    - #153 (5304ff0): apply .understandignore in Phase 0 so user-excluded
      paths don't inflate the structural-change count.
    - #152 (dd8b724): LOAD-PATCH-SAVE template for Phase 3d fingerprints
      merge, with guard against silent load failure.
  • chore(release): bump version to 2.7.1
    Ships the fixes that landed on main after the 2.7.0 cut:
    
    - #139 (f3ea1a3): understand-knowledge — Windows path separators in
      wikilink resolution + omit empty `category` so KnowledgeMetaSchema's
      `z.string().optional()` no longer drops every article node. Closes #151.
    - #147 (fafb888): understand-domain — resolve $PLUGIN_ROOT at runtime
      for symlink installs.
    - f71bad5: understand — persist canonical edge direction during merge,
      fixing the 153k auto-correction cascade. Closes #140.
  • chore(release): bump version to 2.7.0
    Includes since 2.6.3: Hermes (#91), Cline (#116), KIMI CLI (#134)
    platform support; dashboard ACCESS_TOKEN env override; README cleanup
    (slogan rewrite, drop outdated overview gifs, move thanks to footer).
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
  • fix(merge): recover imports edges file-analyzer batches drop
    A controlled-experiment audit on a 1240-file Python project (opensre)
    showed that 27.2% of resolved-internal imports never made it from
    project-scanner's `importMap` into the final knowledge graph. Of the
    404 source files with internal imports, 91 ended up with ZERO imports
    edges in the graph despite their `file:` node being present (consistent
    with main-session orchestrator dropping the entry from `batchImportData`
    during batch construction), and 104 had partial coverage (consistent
    with file-analyzer agent dropping rows during edge enumeration).
    GitHub issue #128 reported the same failure mode at 16-21% on a Go
    monorepo.
    
    The fix has two layers:
    
    1. `merge-batch-graphs.py` now runs a deterministic recovery pass
       after merge: for every `(source, target)` in scan-result.json's
       `importMap` whose source `file:` node exists in the assembled graph
       and whose target `file:` node also exists, emit an `imports` edge
       if the batches didn't already. Recovered edges are tagged
       `recoveredFromImportMap: true` so downstream consumers can audit
       which edges came from the deterministic source vs. agent emission.
       The merge report logs the recovered count plus how many importMap
       entries were skipped because their source/target had no graph node.
    
    2. `file-analyzer.md` rewrites the imports edge rule to demand 1:1
       emission with a self-check: "the number of `imports` edges in your
       output MUST equal `sum(batchImportData[file].length)` across the
       batch's code files". This drives the agent to enumerate every row
       instead of summarizing — recovery should report 0 when this works.
    
    Tests: +6 cases covering the recovery path — drops, no-double-emit,
    missing source/target nodes, missing scan-result.json (incremental
    update), and self-import suppression. 770 passing (was 764).
    
    Bumps version to 2.6.3 across the five tracked manifests.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
  • fix(pipeline): close 12 sources of silent data loss in graph extraction
    A deep audit of the project-scanner → file-analyzer → merge pipeline
    turned up a wide range of silent data-loss bugs. Each one alone is
    small; together they were producing graphs with very few import edges,
    missing sub-file nodes for non-code formats, and inconsistent metrics.
    
    Root-cause fixes (high impact):
    
    - project-scanner.md: extend import-pattern table to resolve absolute
      imports for Python (`from a.b.c import x`), TS/JS (tsconfig.json
      paths/baseUrl aliases), Java/Kotlin (`com.foo.Bar` ↔ file paths),
      Ruby (`require 'foo/bar'` load-path), PHP (composer PSR-4 namespaces),
      and C/C++ (`#include` headers). Was relative-only, which produced
      empty importMap entries for the majority of real projects.
    - project-scanner.md: add `.ps1`, `.bat`, `.cmd`, `.jsonc` to language
      table; require non-null `language` field with an explicit fallback.
    - file-analyzer.md: document `sections`, `definitions`, `services`,
      `endpoints`, `steps`, `resources` in the extraction-output schema and
      spell out the sub-file node-creation rules per category. Was missing,
      so per-table / endpoint / resource nodes were never created from
      SQL / OpenAPI / Terraform / K8s / Dockerfile parser output.
    - file-analyzer.md: add explicit source-reading fallback rules for
      PowerShell, Batch, Bash, Swift, Kotlin (no tree-sitter coverage).
    - yaml-parser: declare `kubernetes`, `docker-compose`, `github-actions`,
      `openapi` languages so files the language-registry tags with those
      ids actually get section extraction. Recognize quoted top-level keys
      (e.g. `"on":` in GitHub Actions). Emit one section per entry for
      array-root YAML documents.
    - json-parser: declare `json-schema`, `openapi`; add `stripJsoncSyntax`
      helper that removes line / block comments and trailing commas before
      parse so `.jsonc` files (wrangler, tsconfig with comments) parse cleanly.
    - shell-parser: declare `jenkinsfile`. Tighten function-detection regex
      to require a reachable `{` brace so `name() echo hi` and patterns
      appearing inside heredocs are no longer false-positives.
    - markdown-parser: track fenced-code-block state and skip headings
      inside ``` / ~~~ blocks (`# install` shell comments were being
      emitted as level-1 sections).
    - merge-batch-graphs.py: add `article`, `entity`, `topic`, `claim`,
      `source` to VALID_NODE_PREFIXES and TYPE_TO_PREFIX so knowledge-base
      node types stop being flagged unknown / coerced to `file:`. Add
      `direction` to the edge dedup key so `forward` and `bidirectional`
      variants of the same (src, tgt, type) don't overwrite each other.
      Use a placeholder in bare-id fallback when `filePath` is missing on
      function/class nodes so unrelated `parse()` functions don't merge.
    - typescript-extractor: actually compute `isDefault` for default
      exports (was always emitted as `false` from buildResult).
    - extract-structure.mjs: match `wc -l` semantics for `totalLines` so
      the scanner's `sizeLines` and the extractor's `totalLines` agree on
      POSIX text files. Filter the parser-imports fallback to relative-only
      so `importCount` semantics stay *internal-import* whether the scanner
      resolved them or not. Drop unused `isCode` local.
    
    Tests: +19 cases covering JSONC parsing, markdown fenced-code skip,
    YAML quoted-keys / array-root, shell function false-positives,
    extract-structure import fallback semantics + totalLines off-by-one.
    764 passing (was 745).
    
    Bumps version to 2.6.2 across the five tracked manifests.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
  • fix(file-analyzer): preserve language and fall back when imports unresolved
    Two bugs surfaced when analyzing Python projects that use absolute imports:
    
    - The dispatch prompt (SKILL.md) and file-analyzer agent omitted the
      per-file `language` field, so `extract-structure.mjs` received null and
      passed it through to the graph.
    - `extract-structure.mjs` used `if (importPaths)` to decide whether to
      trust pre-resolved imports. Empty arrays are truthy, so files where the
      project scanner could not resolve any imports (e.g. Python absolute
      imports) clobbered the parser's import count with 0, never falling
      back to tree-sitter's own analysis.
    
    Bumps plugin version to 2.6.1 across the five tracked manifests and adds
    unit tests for `buildResult` covering language pass-through and the
    importCount fallback paths. To make the script testable, `buildResult` is
    now exported and the CLI invocation is guarded so importing the module
    no longer triggers `main()`.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
  • feat(dashboard): add mobile layout and responsive fixes
    Bumps to 2.6.0.
    
    - MobileLayout activates via useIsMobile at <768px with bottom-tab
      navigation (Graph/Info/Files); panes stay mounted (visibility
      toggle) to preserve ReactFlow dimensions and FileExplorer state.
    - MobileDrawer holds persona, view mode, diff, node-type filters,
      layers, and tool buttons (Filter/Export/Path/Theme/Help).
    - Selecting a node auto-pivots to Info; CodeViewer is always
      fullscreen on mobile; SearchBar collapses to a 🔍 toggle.
    - Homepage Hero/Footer/Install responsive: drop nowrap on title and
      tagline, stack title spans for editorial wrap, full-width CTAs at
      <480px, narrow-width spacing refinements.
    - Desktop dashboard: sidebar telescopes 260/300/360px, header gaps
      tighten, Path button label collapses to icon at narrow widths.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
  • chore: bump to 2.5.1
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
  • chore: bump to 2.5.0
    ELK + lazy container architecture (PR #111) lands as a new minor.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
  • chore: bump version to 2.4.0
    PR #108 ships a new user-visible feature (in-dashboard source code viewer
    with Files tab + double-click navigation), so it warrants a minor bump
    across all 5 version-tracked files.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
  • chore: bump to 2.3.2 and sync version manifest list
    Bumps all five version-carrying manifests to 2.3.2, bringing
    .copilot-plugin/plugin.json back in sync (was stuck at 2.2.0), and
    updates CLAUDE.md to reflect the true set of files that must move
    together: the nested understand-anything-plugin/.claude-plugin/plugin.json
    and .copilot-plugin/plugin.json were missing, and marketplace.json was
    incorrectly listed (its plugins[] entry does not support a version field).
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
  • chore: bump version to 2.3.1
    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
  • fix: include access token in dashboard URL reported to user
    The understand-dashboard skill now instructs agents to capture and
    share the full tokenized URL from the Vite server output, so users
    are not blocked by the token gate.
    
    Bump version to 2.2.1.
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
  • fix: address PR #71 review findings and bump version to 2.2.0
    Fix all actionable code review items: add missing domain/flow/step node
    types, fix batch numeric sorting, align gate thresholds, merge duplicate
    tour steps instead of dropping, add Writing Results section to
    assemble-reviewer, use skill-relative script paths, and add func→function
    type mapping.
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
  • fix: address all code review issues from both reviewers
    - Fix race condition: setGraph no longer wipes domainGraph on parallel fetch
    - Remove workflow/action aliases that conflicted with pipeline type
    - Remove duplicate onNodeDoubleClick handler in DomainGraphView
    - Add clearActiveDomain store action (replaces direct setState call)
    - Remove auto-switch to domain viewMode in setDomainGraph
    - Add DomainMetaSchema Zod validation for domainMeta fields
    - Add Array.isArray guards for domainMeta collections in NodeInfo
    - Remove as-any cast in getDomainMeta (use typed domainMeta directly)
    - Add "domain" filter category for domain/flow/step nodes
    - Keep flow discriminator in step ID normalization to prevent collisions
    - Update SKILL.md Phase 2 to use tool-based scanning (no missing script)
    - Update EDGE_LABELS comment to reflect 29 edge types
    - Bump version to 2.1.0 in all 4 required files
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
  • chore: bump version to 2.0.0
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
  • feat(dashboard): add token gate page for unauthenticated access
    Visiting localhost:5173 without ?token= now shows a clean token input
    page instead of a broken dashboard. Token is persisted in sessionStorage
    so refreshes work within the same browser session.
    
    Bump version to 1.3.1.
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
  • chore: bump version to 1.3.0
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
  • chore: bump version to 1.2.2
    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
  • feat(dashboard): surface graph validation issues and add messy graph fixtures
    Add a --messy mode to the large graph generator so robustness cases can be
      tested with null fields, aliases, dangling refs, and other malformed data.
    
      Update the dashboard to preserve non-fatal validation issues, log
      auto-corrected and dropped items, and show a warning banner with expandable
      details plus copy-to-clipboard support.
  • chore: bump version to 1.2.0 and sync all plugin manifests
    - Sync .claude-plugin/plugin.json (was stuck at 1.1.0) and .cursor-plugin/plugin.json (was 1.0.5) to match main version
    - Update CLAUDE.md versioning section to list all four files that must be kept in sync
    - Document scripts/generate-large-graph.mjs in CLAUDE.md
  • feat: add Cursor and Claude plugin descriptors for auto-discovery
    Add .cursor-plugin/plugin.json with skills/agents paths pointing into
    understand-anything-plugin/. Add .claude-plugin/plugin.json alongside
    existing marketplace.json.
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>