@neikyun/ciel 6.10.0 → 6.10.1

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.
@@ -233,8 +233,16 @@ def match_path_pattern(pattern: str, paths) -> bool:
233
233
  return False
234
234
 
235
235
 
236
- def score_memory(mem, paths, symbols, intents, langs) -> int:
237
- """Score a memory's relevance. 0 = exclude. Positive = include, higher first."""
236
+ def score_memory(mem, paths, symbols, intents, langs, prompt_lower="") -> int:
237
+ """Score a memory's relevance. 0 = exclude. Positive = include, higher first.
238
+
239
+ Symbol and intent matching are case-insensitive and fall back to a
240
+ word-boundary search against the raw prompt. This lets a memory tagged
241
+ `symbols: [OkHttp]` fire on a prompt that mentions "okhttp" in prose,
242
+ and lets free-form intent tags (e.g. `intents: [okhttp, diagnostics]`)
243
+ match without being members of the fixed INTENT_KEYWORDS vocabulary.
244
+ Word boundaries prevent "test" intent from firing on "contest".
245
+ """
238
246
  # Hard language gate: if memory is language-specific AND prompt has language
239
247
  # cues AND no overlap → exclude. Avoids Kotlin memories firing on TS edits.
240
248
  mem_langs = mem.get('languages') or []
@@ -245,11 +253,23 @@ def score_memory(mem, paths, symbols, intents, langs) -> int:
245
253
  for pattern in mem.get('path_patterns') or []:
246
254
  if match_path_pattern(pattern, paths):
247
255
  score += 10
256
+
257
+ # Case-insensitive comparison sets — built once per memory call.
258
+ symbols_lower = {s.lower() for s in symbols}
259
+ intents_lower = {i.lower() for i in intents}
260
+
248
261
  for sym in mem.get('symbols') or []:
249
- if sym in symbols:
262
+ sym_lower = sym.lower()
263
+ if sym_lower in symbols_lower or (
264
+ prompt_lower and re.search(r'\b' + re.escape(sym_lower) + r'\b', prompt_lower)
265
+ ):
250
266
  score += 8
267
+
251
268
  for intent in mem.get('intents') or []:
252
- if intent in intents:
269
+ intent_lower = intent.lower()
270
+ if intent_lower in intents_lower or (
271
+ prompt_lower and re.search(r'\b' + re.escape(intent_lower) + r'\b', prompt_lower)
272
+ ):
253
273
  score += 5
254
274
 
255
275
  # No cue match at all → don't include (cued recall, not free recall)
@@ -399,6 +419,7 @@ def cmd_query(args):
399
419
  symbols = extract_symbol_cues(prompt)
400
420
  intents = extract_intent_cues(prompt)
401
421
  langs = extract_language_cues(prompt)
422
+ prompt_lower = prompt.lower()
402
423
  now = datetime.now(timezone.utc)
403
424
  iso_now = now.isoformat().replace('+00:00', 'Z')
404
425
 
@@ -418,7 +439,7 @@ def cmd_query(args):
418
439
  for mid, m in mems.items():
419
440
  if m.get('stale'):
420
441
  continue
421
- s = score_memory(m, paths, symbols, intents, langs)
442
+ s = score_memory(m, paths, symbols, intents, langs, prompt_lower=prompt_lower)
422
443
  if s > 0:
423
444
  scored.append((s, mid, m))
424
445
 
@@ -15,7 +15,7 @@ Usage: `/ciel-status [--check]`
15
15
  ```
16
16
  ## CIEL STATUS
17
17
 
18
- Version: v6.10.0
18
+ Version: v6.10.1
19
19
  Platform: Claude Code
20
20
  Config: .claude/settings.json — OK (4 hooks registered)
21
21
  Skills directory: skills/ — 43 skills loaded
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neikyun/ciel",
3
- "version": "6.10.0",
3
+ "version": "6.10.1",
4
4
  "description": "Ciel — Deep-reasoning pipeline for LLM-assisted development. OpenCode plugin + multi-platform CLI (OpenCode, Claude Code, more).",
5
5
  "main": "./dist/plugin/index.js",
6
6
  "types": "./dist/plugin/index.d.ts",