claude-code-workflow 6.3.13 → 6.3.15

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 (69) hide show
  1. package/.claude/agents/issue-plan-agent.md +57 -103
  2. package/.claude/agents/issue-queue-agent.md +69 -120
  3. package/.claude/commands/issue/new.md +217 -473
  4. package/.claude/commands/issue/plan.md +76 -154
  5. package/.claude/commands/issue/queue.md +208 -259
  6. package/.claude/skills/issue-manage/SKILL.md +63 -22
  7. package/.claude/workflows/cli-templates/schemas/discovery-finding-schema.json +3 -3
  8. package/.claude/workflows/cli-templates/schemas/issues-jsonl-schema.json +3 -3
  9. package/.claude/workflows/cli-templates/schemas/queue-schema.json +0 -5
  10. package/.codex/prompts/issue-plan.md +16 -19
  11. package/.codex/prompts/issue-queue.md +0 -1
  12. package/README.md +1 -0
  13. package/ccw/dist/cli.d.ts.map +1 -1
  14. package/ccw/dist/cli.js +3 -1
  15. package/ccw/dist/cli.js.map +1 -1
  16. package/ccw/dist/commands/cli.d.ts.map +1 -1
  17. package/ccw/dist/commands/cli.js +45 -3
  18. package/ccw/dist/commands/cli.js.map +1 -1
  19. package/ccw/dist/commands/issue.d.ts +3 -1
  20. package/ccw/dist/commands/issue.d.ts.map +1 -1
  21. package/ccw/dist/commands/issue.js +383 -30
  22. package/ccw/dist/commands/issue.js.map +1 -1
  23. package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -1
  24. package/ccw/dist/core/routes/issue-routes.js +77 -16
  25. package/ccw/dist/core/routes/issue-routes.js.map +1 -1
  26. package/ccw/dist/tools/cli-executor.d.ts.map +1 -1
  27. package/ccw/dist/tools/cli-executor.js +117 -4
  28. package/ccw/dist/tools/cli-executor.js.map +1 -1
  29. package/ccw/dist/tools/litellm-executor.d.ts +4 -0
  30. package/ccw/dist/tools/litellm-executor.d.ts.map +1 -1
  31. package/ccw/dist/tools/litellm-executor.js +54 -1
  32. package/ccw/dist/tools/litellm-executor.js.map +1 -1
  33. package/ccw/dist/tools/ui-generate-preview.d.ts +18 -0
  34. package/ccw/dist/tools/ui-generate-preview.d.ts.map +1 -1
  35. package/ccw/dist/tools/ui-generate-preview.js +26 -10
  36. package/ccw/dist/tools/ui-generate-preview.js.map +1 -1
  37. package/ccw/src/cli.ts +3 -1
  38. package/ccw/src/commands/cli.ts +47 -3
  39. package/ccw/src/commands/issue.ts +442 -34
  40. package/ccw/src/core/routes/issue-routes.ts +82 -16
  41. package/ccw/src/tools/cli-executor.ts +125 -4
  42. package/ccw/src/tools/litellm-executor.ts +107 -24
  43. package/ccw/src/tools/ui-generate-preview.js +60 -37
  44. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  45. package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
  46. package/codex-lens/src/codexlens/config.py +25 -2
  47. package/codex-lens/src/codexlens/entities.py +5 -1
  48. package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
  49. package/codex-lens/src/codexlens/indexing/symbol_extractor.py +243 -243
  50. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
  51. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
  52. package/codex-lens/src/codexlens/parsers/factory.py +256 -256
  53. package/codex-lens/src/codexlens/parsers/treesitter_parser.py +335 -335
  54. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  55. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  56. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  57. package/codex-lens/src/codexlens/search/chain_search.py +30 -1
  58. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-313.pyc +0 -0
  59. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-313.pyc +0 -0
  60. package/codex-lens/src/codexlens/semantic/__pycache__/reranker.cpython-313.pyc +0 -0
  61. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  62. package/codex-lens/src/codexlens/semantic/embedder.py +6 -9
  63. package/codex-lens/src/codexlens/semantic/vector_store.py +271 -200
  64. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  65. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  66. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  67. package/codex-lens/src/codexlens/storage/sqlite_store.py +184 -108
  68. package/package.json +6 -1
  69. package/.claude/commands/issue/manage.md +0 -113
@@ -337,12 +337,41 @@ class ChainSearchEngine:
337
337
  root_cmp = root_str.lower().rstrip("\\/")
338
338
  dir_cmp = file_dir_str.lower().rstrip("\\/")
339
339
 
340
+ # Guard against Windows cross-drive comparisons (ValueError).
341
+ if os.name == "nt":
342
+ root_drive, _ = os.path.splitdrive(root_cmp)
343
+ dir_drive, _ = os.path.splitdrive(dir_cmp)
344
+ if root_drive and dir_drive and root_drive != dir_drive:
345
+ self.logger.debug(
346
+ "Skipping symbol due to cross-drive path (root=%s file=%s name=%s)",
347
+ root_cmp,
348
+ sym.file,
349
+ sym.name,
350
+ )
351
+ continue
352
+
340
353
  if os.path.commonpath([root_cmp, dir_cmp]) != root_cmp:
341
354
  continue
342
355
 
343
356
  rel = os.path.relpath(dir_cmp, root_cmp)
344
357
  rel_depth = 0 if rel == "." else len(rel.split(os.sep))
345
- except Exception:
358
+ except ValueError as exc:
359
+ self.logger.debug(
360
+ "Skipping symbol due to path operation failure (root=%s file=%s name=%s): %s",
361
+ str(search_root),
362
+ sym.file,
363
+ sym.name,
364
+ exc,
365
+ )
366
+ continue
367
+ except Exception as exc:
368
+ self.logger.debug(
369
+ "Skipping symbol due to unexpected path error (root=%s file=%s name=%s): %s",
370
+ str(search_root),
371
+ sym.file,
372
+ sym.name,
373
+ exc,
374
+ )
346
375
  continue
347
376
 
348
377
  if options.depth >= 0 and rel_depth > options.depth:
@@ -21,7 +21,7 @@ logger = logging.getLogger(__name__)
21
21
 
22
22
  # Global embedder cache for singleton pattern
23
23
  _embedder_cache: Dict[str, "Embedder"] = {}
24
- _cache_lock = threading.Lock()
24
+ _cache_lock = threading.RLock()
25
25
 
26
26
 
27
27
  def get_embedder(profile: str = "code", use_gpu: bool = True) -> "Embedder":
@@ -43,15 +43,12 @@ def get_embedder(profile: str = "code", use_gpu: bool = True) -> "Embedder":
43
43
  # Cache key includes GPU preference to support mixed configurations
44
44
  cache_key = f"{profile}:{'gpu' if use_gpu else 'cpu'}"
45
45
 
46
- # Fast path: check cache without lock
47
- if cache_key in _embedder_cache:
48
- return _embedder_cache[cache_key]
49
-
50
- # Slow path: acquire lock for initialization
46
+ # All cache access is protected by _cache_lock to avoid races with
47
+ # clear_embedder_cache() during concurrent access.
51
48
  with _cache_lock:
52
- # Double-check after acquiring lock
53
- if cache_key in _embedder_cache:
54
- return _embedder_cache[cache_key]
49
+ embedder = _embedder_cache.get(cache_key)
50
+ if embedder is not None:
51
+ return embedder
55
52
 
56
53
  # Create new embedder and cache it
57
54
  embedder = Embedder(profile=profile, use_gpu=use_gpu)