know-cli 0.3.8__tar.gz → 0.3.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. {know_cli-0.3.8 → know_cli-0.3.9}/PKG-INFO +1 -1
  2. {know_cli-0.3.8 → know_cli-0.3.9}/pyproject.toml +1 -1
  3. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/semantic_search.py +22 -13
  4. {know_cli-0.3.8 → know_cli-0.3.9}/.github/actions/know-cli/action.yml +0 -0
  5. {know_cli-0.3.8 → know_cli-0.3.9}/.github/workflows/example-advanced.yml +0 -0
  6. {know_cli-0.3.8 → know_cli-0.3.9}/.github/workflows/example-basic.yml +0 -0
  7. {know_cli-0.3.8 → know_cli-0.3.9}/.gitignore +0 -0
  8. {know_cli-0.3.8 → know_cli-0.3.9}/AGENTS.md +0 -0
  9. {know_cli-0.3.8 → know_cli-0.3.9}/KNOW_SKILL.md +0 -0
  10. {know_cli-0.3.8 → know_cli-0.3.9}/README.md +0 -0
  11. {know_cli-0.3.8 → know_cli-0.3.9}/docs/IMPLEMENTATION_PLAN.md +0 -0
  12. {know_cli-0.3.8 → know_cli-0.3.9}/docs/IMPROVEMENTS.md +0 -0
  13. {know_cli-0.3.8 → know_cli-0.3.9}/docs/STRATEGIC_AUDIT.md +0 -0
  14. {know_cli-0.3.8 → know_cli-0.3.9}/docs/arc.md +0 -0
  15. {know_cli-0.3.8 → know_cli-0.3.9}/docs/architecture-diff.md +0 -0
  16. {know_cli-0.3.8 → know_cli-0.3.9}/docs/architecture.md +0 -0
  17. {know_cli-0.3.8 → know_cli-0.3.9}/docs/dependencies.md +0 -0
  18. {know_cli-0.3.8 → know_cli-0.3.9}/docs/digest-compact.md +0 -0
  19. {know_cli-0.3.8 → know_cli-0.3.9}/docs/digest-llm.md +0 -0
  20. {know_cli-0.3.8 → know_cli-0.3.9}/docs/onboarding-new-devs.md +0 -0
  21. {know_cli-0.3.8 → know_cli-0.3.9}/docs/onboarding-new_devs.md +0 -0
  22. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/__init__.py +0 -0
  23. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/ai.py +0 -0
  24. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/cli.py +0 -0
  25. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/config.py +0 -0
  26. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/context_engine.py +0 -0
  27. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/cost.py +0 -0
  28. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/diff.py +0 -0
  29. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/exceptions.py +0 -0
  30. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/generator.py +0 -0
  31. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/git_hooks.py +0 -0
  32. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/history.py +0 -0
  33. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/import_graph.py +0 -0
  34. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/index.py +0 -0
  35. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/knowledge_base.py +0 -0
  36. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/lexical_index.py +0 -0
  37. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/logger.py +0 -0
  38. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/mcp_server.py +0 -0
  39. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/models.py +0 -0
  40. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/parsers.py +0 -0
  41. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/quality.py +0 -0
  42. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/scanner.py +0 -0
  43. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/state.py +0 -0
  44. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/stats.py +0 -0
  45. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/token_counter.py +0 -0
  46. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/tools.py +0 -0
  47. {know_cli-0.3.8 → know_cli-0.3.9}/src/know/watcher.py +0 -0
  48. {know_cli-0.3.8 → know_cli-0.3.9}/tests/README.md +0 -0
  49. {know_cli-0.3.8 → know_cli-0.3.9}/tests/conftest.py +0 -0
  50. {know_cli-0.3.8 → know_cli-0.3.9}/tests/mcp_stub/mcp/__init__.py +0 -0
  51. {know_cli-0.3.8 → know_cli-0.3.9}/tests/mcp_stub/mcp/server/__init__.py +0 -0
  52. {know_cli-0.3.8 → know_cli-0.3.9}/tests/mcp_stub/mcp/server/fastmcp.py +0 -0
  53. {know_cli-0.3.8 → know_cli-0.3.9}/tests/test_efficiency.py +0 -0
  54. {know_cli-0.3.8 → know_cli-0.3.9}/tests/test_history_cost.py +0 -0
  55. {know_cli-0.3.8 → know_cli-0.3.9}/tests/test_know.py +0 -0
  56. {know_cli-0.3.8 → know_cli-0.3.9}/tests/test_search_hybrid.py +0 -0
  57. {know_cli-0.3.8 → know_cli-0.3.9}/tests/test_state.py +0 -0
  58. {know_cli-0.3.8 → know_cli-0.3.9}/tests/test_unit.py +0 -0
  59. {know_cli-0.3.8 → know_cli-0.3.9}/tests/test_week2.py +0 -0
  60. {know_cli-0.3.8 → know_cli-0.3.9}/tests/test_week3.py +0 -0
  61. {know_cli-0.3.8 → know_cli-0.3.9}/tests/test_week4.py +0 -0
  62. {know_cli-0.3.8 → know_cli-0.3.9}/tests/test_week6_tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: know-cli
3
- Version: 0.3.8
3
+ Version: 0.3.9
4
4
  Summary: Context Intelligence for AI Coding Agents — smart, token-budgeted code context
5
5
  Project-URL: Homepage, https://github.com/vic/know-cli
6
6
  Project-URL: Repository, https://github.com/vic/know-cli
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "know-cli"
7
- version = "0.3.8"
7
+ version = "0.3.9"
8
8
  description = "Context Intelligence for AI Coding Agents — smart, token-budgeted code context"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -708,24 +708,33 @@ class SemanticSearcher:
708
708
  continue
709
709
 
710
710
  text_l = text.lower()
711
- # Prefer exact phrase, fallback to token hits.
711
+ rel_l = rel.lower()
712
+
713
+ # Prefer exact phrase in content.
712
714
  idx = text_l.find(q)
713
- if idx < 0 and q_tokens:
714
- token_positions = [text_l.find(tok) for tok in q_tokens]
715
- token_positions = [pos for pos in token_positions if pos >= 0]
716
- if not token_positions:
717
- continue
718
- idx = min(token_positions)
719
715
 
720
- if idx < 0:
716
+ # Token fallback: allow path OR content match.
717
+ content_positions = []
718
+ path_hits = 0
719
+ if q_tokens:
720
+ content_positions = [text_l.find(tok) for tok in q_tokens]
721
+ content_positions = [pos for pos in content_positions if pos >= 0]
722
+ path_hits = sum(1 for tok in q_tokens if tok in rel_l)
723
+
724
+ if idx < 0 and content_positions:
725
+ idx = min(content_positions)
726
+
727
+ # No phrase/content token hit and no path hit => skip.
728
+ if idx < 0 and path_hits == 0:
721
729
  continue
722
730
 
723
- line_no = text[:idx].count("\n") + 1
731
+ # If only filename/path matched, still return file with top-of-file snippet.
732
+ line_no = text[:idx].count("\n") + 1 if idx >= 0 else 1
724
733
  snippet = _format_snippet(p, line_no, line_no, context=2, include_line_numbers=include_line_numbers)
725
- # crude relevance: token coverage in file text
726
- coverage = 0
727
- if q_tokens:
728
- coverage = sum(1 for tok in q_tokens if tok in text_l)
734
+
735
+ # crude relevance: token coverage in text + filename/path
736
+ coverage_text = sum(1 for tok in q_tokens if tok in text_l) if q_tokens else 0
737
+ coverage = coverage_text + path_hits
729
738
  fallback.append((coverage, rel, line_no, snippet))
730
739
 
731
740
  fallback.sort(key=lambda x: (-x[0], x[1]))
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes