Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
Awing Rules ClaudeCode Mcp
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
awing-mcp
Awing Rules ClaudeCode Mcp
Commits
dd6e1776
Commit
dd6e1776
authored
Feb 02, 2026
by
LongLD
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: ensure global rules always appear in search results regardless of minScore or tag filters
parent
ee42a81a
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
63 additions
and
12 deletions
+63
-12
dist/rules/indexer.js
dist/rules/indexer.js
+30
-6
src/rules/indexer.ts
src/rules/indexer.ts
+33
-6
No files found.
dist/rules/indexer.js
View file @
dd6e1776
...
@@ -33,16 +33,40 @@ export class RuleIndexer {
...
@@ -33,16 +33,40 @@ export class RuleIndexer {
search
(
query
,
options
=
{})
{
search
(
query
,
options
=
{})
{
const
{
openFiles
=
[],
changedFiles
=
[],
tags
=
[],
limit
=
6
,
minScore
=
0.15
}
=
options
;
const
{
openFiles
=
[],
changedFiles
=
[],
tags
=
[],
limit
=
6
,
minScore
=
0.15
}
=
options
;
const
results
=
this
.
cachedRules
.
map
(
rule
=>
this
.
scorer
.
scoreRule
(
rule
,
query
,
openFiles
,
changedFiles
,
tags
));
const
results
=
this
.
cachedRules
.
map
(
rule
=>
this
.
scorer
.
scoreRule
(
rule
,
query
,
openFiles
,
changedFiles
,
tags
));
// Sort by score desc
// Separate global rules from others
const
sorted
=
results
const
globalResults
=
[];
.
filter
(
r
=>
r
.
score
>=
minScore
)
const
regularResults
=
[];
.
sort
((
a
,
b
)
=>
b
.
score
-
a
.
score
);
results
.
forEach
(
r
=>
{
const
isGlobalRule
=
r
.
rule
.
tags
.
includes
(
'
global
'
)
||
r
.
rule
.
tags
.
includes
(
'
base
'
)
||
r
.
rule
.
id
.
includes
(
'
base
'
)
||
r
.
rule
.
relativePath
===
'
base.md
'
;
if
(
isGlobalRule
)
{
globalResults
.
push
(
r
);
}
else
if
(
r
.
score
>=
minScore
)
{
regularResults
.
push
(
r
);
}
});
// Sort both groups by score desc
globalResults
.
sort
((
a
,
b
)
=>
b
.
score
-
a
.
score
);
regularResults
.
sort
((
a
,
b
)
=>
b
.
score
-
a
.
score
);
// Diversification and Deduplication logic
// Diversification and Deduplication logic
const
diversified
=
[];
const
diversified
=
[];
const
categoryCounts
=
{};
const
categoryCounts
=
{};
const
seenIds
=
new
Set
();
const
seenIds
=
new
Set
();
for
(
const
res
of
sorted
)
{
// Always include global rules first (with reduced limit if needed)
// Deduplicate by ID
for
(
const
res
of
globalResults
)
{
if
(
seenIds
.
has
(
res
.
rule
.
id
))
continue
;
diversified
.
push
(
res
);
seenIds
.
add
(
res
.
rule
.
id
);
// Don't count global rules against category limits
if
(
diversified
.
length
>=
limit
)
break
;
}
// Then add regular rules with diversification
for
(
const
res
of
regularResults
)
{
if
(
seenIds
.
has
(
res
.
rule
.
id
))
if
(
seenIds
.
has
(
res
.
rule
.
id
))
continue
;
continue
;
// Determine category from relative path (first dir)
// Determine category from relative path (first dir)
...
...
src/rules/indexer.ts
View file @
dd6e1776
...
@@ -54,18 +54,45 @@ export class RuleIndexer {
...
@@ -54,18 +54,45 @@ export class RuleIndexer {
this
.
scorer
.
scoreRule
(
rule
,
query
,
openFiles
,
changedFiles
,
tags
)
this
.
scorer
.
scoreRule
(
rule
,
query
,
openFiles
,
changedFiles
,
tags
)
);
);
// Sort by score desc
// Separate global rules from others
const
sorted
=
results
const
globalResults
:
SearchResult
[]
=
[];
.
filter
(
r
=>
r
.
score
>=
minScore
)
const
regularResults
:
SearchResult
[]
=
[];
.
sort
((
a
,
b
)
=>
b
.
score
-
a
.
score
);
results
.
forEach
(
r
=>
{
const
isGlobalRule
=
r
.
rule
.
tags
.
includes
(
'
global
'
)
||
r
.
rule
.
tags
.
includes
(
'
base
'
)
||
r
.
rule
.
id
.
includes
(
'
base
'
)
||
r
.
rule
.
relativePath
===
'
base.md
'
;
if
(
isGlobalRule
)
{
globalResults
.
push
(
r
);
}
else
if
(
r
.
score
>=
minScore
)
{
regularResults
.
push
(
r
);
}
});
// Sort both groups by score desc
globalResults
.
sort
((
a
,
b
)
=>
b
.
score
-
a
.
score
);
regularResults
.
sort
((
a
,
b
)
=>
b
.
score
-
a
.
score
);
// Diversification and Deduplication logic
// Diversification and Deduplication logic
const
diversified
:
SearchResult
[]
=
[];
const
diversified
:
SearchResult
[]
=
[];
const
categoryCounts
:
{
[
cat
:
string
]:
number
}
=
{};
const
categoryCounts
:
{
[
cat
:
string
]:
number
}
=
{};
const
seenIds
=
new
Set
<
string
>
();
const
seenIds
=
new
Set
<
string
>
();
for
(
const
res
of
sorted
)
{
// Always include global rules first (with reduced limit if needed)
// Deduplicate by ID
for
(
const
res
of
globalResults
)
{
if
(
seenIds
.
has
(
res
.
rule
.
id
))
continue
;
diversified
.
push
(
res
);
seenIds
.
add
(
res
.
rule
.
id
);
// Don't count global rules against category limits
if
(
diversified
.
length
>=
limit
)
break
;
}
// Then add regular rules with diversification
for
(
const
res
of
regularResults
)
{
if
(
seenIds
.
has
(
res
.
rule
.
id
))
continue
;
if
(
seenIds
.
has
(
res
.
rule
.
id
))
continue
;
// Determine category from relative path (first dir)
// Determine category from relative path (first dir)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment