codebeacon 0.1.5__tar.gz → 0.1.7__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 (107) hide show
  1. {codebeacon-0.1.5 → codebeacon-0.1.7}/PKG-INFO +1 -1
  2. codebeacon-0.1.7/codebeacon/__init__.py +1 -0
  3. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/contextmap/generator.py +24 -28
  4. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/discover/detector.py +11 -1
  5. {codebeacon-0.1.5 → codebeacon-0.1.7}/pyproject.toml +1 -1
  6. codebeacon-0.1.5/codebeacon/__init__.py +0 -1
  7. {codebeacon-0.1.5 → codebeacon-0.1.7}/.cursorrules +0 -0
  8. {codebeacon-0.1.5 → codebeacon-0.1.7}/.github/CODEOWNERS +0 -0
  9. {codebeacon-0.1.5 → codebeacon-0.1.7}/.github/dependabot.yml +0 -0
  10. {codebeacon-0.1.5 → codebeacon-0.1.7}/.github/workflows/ci.yml +0 -0
  11. {codebeacon-0.1.5 → codebeacon-0.1.7}/.github/workflows/release.yml +0 -0
  12. {codebeacon-0.1.5 → codebeacon-0.1.7}/.gitignore +0 -0
  13. {codebeacon-0.1.5 → codebeacon-0.1.7}/AGENTS.md +0 -0
  14. {codebeacon-0.1.5 → codebeacon-0.1.7}/CLAUDE.md +0 -0
  15. {codebeacon-0.1.5 → codebeacon-0.1.7}/LICENSE +0 -0
  16. {codebeacon-0.1.5 → codebeacon-0.1.7}/README.de.md +0 -0
  17. {codebeacon-0.1.5 → codebeacon-0.1.7}/README.es.md +0 -0
  18. {codebeacon-0.1.5 → codebeacon-0.1.7}/README.fr.md +0 -0
  19. {codebeacon-0.1.5 → codebeacon-0.1.7}/README.ja.md +0 -0
  20. {codebeacon-0.1.5 → codebeacon-0.1.7}/README.ko.md +0 -0
  21. {codebeacon-0.1.5 → codebeacon-0.1.7}/README.md +0 -0
  22. {codebeacon-0.1.5 → codebeacon-0.1.7}/README.pt-BR.md +0 -0
  23. {codebeacon-0.1.5 → codebeacon-0.1.7}/README.zh-CN.md +0 -0
  24. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/__main__.py +0 -0
  25. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/cache.py +0 -0
  26. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/cli.py +0 -0
  27. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/common/__init__.py +0 -0
  28. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/common/filters.py +0 -0
  29. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/common/symbols.py +0 -0
  30. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/common/types.py +0 -0
  31. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/config.py +0 -0
  32. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/contextmap/__init__.py +0 -0
  33. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/discover/__init__.py +0 -0
  34. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/discover/scanner.py +0 -0
  35. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/export/__init__.py +0 -0
  36. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/export/mcp.py +0 -0
  37. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/export/obsidian.py +0 -0
  38. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/__init__.py +0 -0
  39. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/base.py +0 -0
  40. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/components.py +0 -0
  41. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/dependencies.py +0 -0
  42. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/entities.py +0 -0
  43. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/README.md +0 -0
  44. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/actix.scm +0 -0
  45. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/angular.scm +0 -0
  46. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/aspnet.scm +0 -0
  47. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/django.scm +0 -0
  48. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/express.scm +0 -0
  49. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/fastapi.scm +0 -0
  50. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/flask.scm +0 -0
  51. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/gin.scm +0 -0
  52. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/ktor.scm +0 -0
  53. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/laravel.scm +0 -0
  54. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/nestjs.scm +0 -0
  55. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/rails.scm +0 -0
  56. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/react.scm +0 -0
  57. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/spring_boot.scm +0 -0
  58. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/svelte.scm +0 -0
  59. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/tauri.scm +0 -0
  60. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/vapor.scm +0 -0
  61. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/queries/vue.scm +0 -0
  62. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/routes.py +0 -0
  63. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/semantic.py +0 -0
  64. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/extract/services.py +0 -0
  65. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/graph/__init__.py +0 -0
  66. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/graph/analyze.py +0 -0
  67. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/graph/build.py +0 -0
  68. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/graph/cluster.py +0 -0
  69. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/graph/enrich.py +0 -0
  70. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/skill/SKILL.md +0 -0
  71. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/wave.py +0 -0
  72. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/wiki/__init__.py +0 -0
  73. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/wiki/generator.py +0 -0
  74. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/wiki/index.py +0 -0
  75. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon/wiki/templates.py +0 -0
  76. {codebeacon-0.1.5 → codebeacon-0.1.7}/codebeacon.yaml.example +0 -0
  77. {codebeacon-0.1.5 → codebeacon-0.1.7}/docs/TRANSLATION_STATUS.md +0 -0
  78. {codebeacon-0.1.5 → codebeacon-0.1.7}/public-plan.md +0 -0
  79. {codebeacon-0.1.5 → codebeacon-0.1.7}/skill/SKILL.md +0 -0
  80. {codebeacon-0.1.5 → codebeacon-0.1.7}/skill/install.py +0 -0
  81. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/__init__.py +0 -0
  82. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/conftest.py +0 -0
  83. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/actix/main.rs +0 -0
  84. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/angular/app.component.ts +0 -0
  85. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/aspnet/UserController.cs +0 -0
  86. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/django/views.py +0 -0
  87. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/express/userRouter.js +0 -0
  88. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/fastapi/main.py +0 -0
  89. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/flask/app.py +0 -0
  90. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/gin/main.go +0 -0
  91. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/ktor/UserRoutes.kt +0 -0
  92. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/laravel/UserController.php +0 -0
  93. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/nestjs/user.controller.ts +0 -0
  94. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/rails/users_controller.rb +0 -0
  95. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/react/UserPage.tsx +0 -0
  96. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/spring_boot/UserController.java +0 -0
  97. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/sveltekit/+page.svelte +0 -0
  98. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/vapor/routes.swift +0 -0
  99. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/fixtures/vue/UserList.vue +0 -0
  100. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/test_discover.py +0 -0
  101. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/test_entities.py +0 -0
  102. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/test_filters.py +0 -0
  103. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/test_graph.py +0 -0
  104. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/test_resolve.py +0 -0
  105. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/test_routes.py +0 -0
  106. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/test_services.py +0 -0
  107. {codebeacon-0.1.5 → codebeacon-0.1.7}/tests/test_wiki.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codebeacon
3
- Version: 0.1.5
3
+ Version: 0.1.7
4
4
  Summary: Source code AST analysis tool for AI context generation — unified multi-framework knowledge graph
5
5
  Project-URL: Homepage, https://github.com/codebeacon/codebeacon
6
6
  Project-URL: Repository, https://github.com/codebeacon/codebeacon
@@ -0,0 +1 @@
1
+ __version__ = "0.1.7"
@@ -273,40 +273,42 @@ def _build_content(
273
273
  lines = [
274
274
  "# CLAUDE.md",
275
275
  "",
276
- "## MANDATORY: Lookup Strategy",
276
+ "## Lookup strategy",
277
277
  "",
278
- "> **Read these before ANY code exploration. No exceptions.**",
279
- ">",
280
- "> Skipping these steps and reading source files directly is a rule violation.",
278
+ "> This repo ships a pre-built index in `.codebeacon/`. Check it first —",
279
+ "> most \"where is X\" questions resolve in one read without a full-repo search.",
281
280
  "",
282
281
  ]
283
282
  elif tool == "cursor":
284
283
  lines = [
285
284
  "# Project Context",
286
285
  "",
287
- "## Lookup Strategy",
286
+ "## Lookup strategy",
288
287
  "",
289
- "> Always follow this 3-step lookup before editing code.",
288
+ "> A pre-built index lives in `.codebeacon/`. Use the 3-step lookup below",
289
+ "> before reaching for Glob or Grep.",
290
290
  "",
291
291
  ]
292
292
  else: # agents
293
293
  lines = [
294
294
  "# AGENTS.md",
295
295
  "",
296
- "## Context Lookup Protocol",
296
+ "## Lookup strategy",
297
297
  "",
298
- "> All agents MUST follow this 3-step lookup before writing or modifying code.",
298
+ "> A pre-built index lives in `.codebeacon/`. Follow the 3-step lookup below",
299
+ "> so parallel agents converge on the same answer.",
299
300
  "",
300
301
  ]
301
302
 
302
303
  # ── Step 1: wiki ──
303
304
  lines += [
304
- "### Step 1 codebeacon wiki (routes, controllers, services, entities) — ALWAYS",
305
+ "### Step 1 codebeacon wiki",
306
+ "Routes, controllers, services, entities.",
305
307
  "```",
306
- f"{codebeacon_dir}/wiki/index.md ← MUST read at session start",
307
- f"{codebeacon_dir}/wiki/{{project}}/controllers/{{Name}}.md ← for controller logic",
308
- f"{codebeacon_dir}/wiki/{{project}}/services/{{Name}}.md ← for service methods",
309
- f"{codebeacon_dir}/wiki/{{project}}/entities/{{Name}}.md ← for data models",
308
+ f"{codebeacon_dir}/wiki/index.md ← global index",
309
+ f"{codebeacon_dir}/wiki/{{project}}/controllers/{{Name}}.md ← controller logic",
310
+ f"{codebeacon_dir}/wiki/{{project}}/services/{{Name}}.md ← service methods",
311
+ f"{codebeacon_dir}/wiki/{{project}}/entities/{{Name}}.md ← data models",
310
312
  f"{codebeacon_dir}/wiki/routes.md ← all API routes across projects",
311
313
  "```",
312
314
  "",
@@ -314,11 +316,9 @@ def _build_content(
314
316
 
315
317
  # ── Step 2: obsidian ──
316
318
  lines += [
317
- "### Step 2 codebeacon obsidian (methods, fields, connections) — ALWAYS",
318
- "**MUST read even if Step 1 found results.** Obsidian notes contain method lists,",
319
- "field definitions, and class-level connections that wiki articles do not have.",
320
- "",
321
- f"Look up by class name — replace `{{project}}` with the relevant folder:",
319
+ "### Step 2 obsidian notes",
320
+ "Class-level detail (methods, fields, incoming/outgoing edges) the wiki omits.",
321
+ "Look up by class name replace `{project}` with the relevant folder:",
322
322
  "```",
323
323
  f"{obsidian_path}/{{project}}/{{ClassName}}.md",
324
324
  "```",
@@ -351,21 +351,17 @@ def _build_content(
351
351
 
352
352
  # ── Step 3 ──
353
353
  lines += [
354
- "### Step 3 source file (ONLY files identified in Steps 1-2)",
355
- "Read only the specific source files whose paths were found in Steps 1-2.",
356
- "No directory exploration, no Glob scans, no broad Grep searches.",
354
+ "### Step 3 source file",
355
+ "Open the paths surfaced by Steps 12.",
357
356
  "",
358
357
  ]
359
358
 
360
359
  if tool == "claude":
361
360
  lines += [
362
- "### Prohibited actions (before completing Steps 1-2)",
363
- "- **DO NOT use Explore agent**",
364
- "- **DO NOT use Glob for directory scans**",
365
- "- **DO NOT use Grep for broad searches**",
366
- "- **DO NOT Read source files directly without checking Steps 1-2 first**",
367
- "",
368
- "Proceed to Step 3 only when Steps 1-2 are insufficient.",
361
+ "### Fall back to direct search",
362
+ "Reach for Glob, Grep, or the Explore agent when the index does not cover",
363
+ "what you need new files, deep implementation details, or cross-cutting",
364
+ "searches that span projects.",
369
365
  "",
370
366
  ]
371
367
 
@@ -228,6 +228,7 @@ _SKIP_DIRS = {
228
228
  }
229
229
 
230
230
 
231
+
231
232
  def _iter_subdirs(directory: Path) -> list[Path]:
232
233
  """Return immediate subdirectories, skipping common non-project dirs."""
233
234
  try:
@@ -268,13 +269,22 @@ def discover_projects(paths: list[str]) -> list[ProjectInfo]:
268
269
  # Level 2: if a subdir has no signature itself, scan its children
269
270
  # (e.g. WaveLog/server, aptscore/frontend, murmur/landing)
270
271
  subprojects: list[ProjectInfo] = []
272
+ seen_paths: set[str] = set()
271
273
  for subdir in _iter_subdirs(single_path):
272
274
  if _has_project_signature(subdir):
273
275
  subprojects.append(_build_project_info(subdir, multi=True))
276
+ seen_paths.add(str(subdir))
277
+ # Scan children for embedded sub-projects with their own signature
278
+ # (e.g. Tauri: desktop/ has svelte.config.js + desktop/src-tauri/ has Cargo.toml)
279
+ for nested in _iter_subdirs(subdir):
280
+ if str(nested) not in seen_paths and _has_project_signature(nested):
281
+ subprojects.append(_build_project_info(nested, multi=True))
282
+ seen_paths.add(str(nested))
274
283
  else:
275
284
  for nested in _iter_subdirs(subdir):
276
- if _has_project_signature(nested):
285
+ if str(nested) not in seen_paths and _has_project_signature(nested):
277
286
  subprojects.append(_build_project_info(nested, multi=True))
287
+ seen_paths.add(str(nested))
278
288
 
279
289
  if subprojects:
280
290
  return subprojects
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "codebeacon"
7
- version = "0.1.5"
7
+ version = "0.1.7"
8
8
  description = "Source code AST analysis tool for AI context generation — unified multi-framework knowledge graph"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -1 +0,0 @@
1
- __version__ = "0.1.5"
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