@helmai/cli 1.0.2 → 1.0.4
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.
- package/dist/commands/init.d.ts +5 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +127 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/inject.d.ts.map +1 -1
- package/dist/commands/inject.js +53 -4
- package/dist/commands/inject.js.map +1 -1
- package/dist/commands/save.d.ts +1 -0
- package/dist/commands/save.d.ts.map +1 -1
- package/dist/commands/save.js +17 -4
- package/dist/commands/save.js.map +1 -1
- package/dist/commands/sync.d.ts +6 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +116 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +29 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +13 -1
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +31 -16
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/knowledge.d.ts +6 -0
- package/dist/lib/knowledge.d.ts.map +1 -1
- package/dist/lib/knowledge.js +105 -1
- package/dist/lib/knowledge.js.map +1 -1
- package/dist/lib/local-rules.d.ts +7 -0
- package/dist/lib/local-rules.d.ts.map +1 -1
- package/dist/lib/local-rules.js +142 -15
- package/dist/lib/local-rules.js.map +1 -1
- package/dist/lib/session.d.ts +12 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/session.js +94 -0
- package/dist/lib/session.js.map +1 -0
- package/package.json +1 -1
package/dist/lib/api.d.ts
CHANGED
|
@@ -15,4 +15,33 @@ export declare function me(): Promise<{
|
|
|
15
15
|
slug: string;
|
|
16
16
|
};
|
|
17
17
|
}>;
|
|
18
|
+
export interface SyncResponse {
|
|
19
|
+
organization: {
|
|
20
|
+
ulid: string;
|
|
21
|
+
name: string;
|
|
22
|
+
slug: string;
|
|
23
|
+
};
|
|
24
|
+
projects: Array<{
|
|
25
|
+
ulid: string;
|
|
26
|
+
name: string;
|
|
27
|
+
slug: string;
|
|
28
|
+
stack: string[] | null;
|
|
29
|
+
}>;
|
|
30
|
+
rules: Array<{
|
|
31
|
+
ulid: string;
|
|
32
|
+
title: string;
|
|
33
|
+
description: string | null;
|
|
34
|
+
project_id: number | null;
|
|
35
|
+
priority: number;
|
|
36
|
+
sections: Array<{
|
|
37
|
+
identifier: string;
|
|
38
|
+
title: string;
|
|
39
|
+
keywords: string[];
|
|
40
|
+
content: string;
|
|
41
|
+
position: number;
|
|
42
|
+
}>;
|
|
43
|
+
}>;
|
|
44
|
+
synced_at: string;
|
|
45
|
+
}
|
|
46
|
+
export declare function sync(): Promise<SyncResponse>;
|
|
18
47
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/lib/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAC;AAsDrB,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAU3B;AAED,wBAAsB,KAAK,CACzB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CAKxB;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAKzE;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAK5E;AAED,wBAAsB,EAAE,IAAI,OAAO,CAAC;IAAE,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,YAAY,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAEnJ;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACtF,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,KAAK,CAAC;YACd,UAAU,EAAE,MAAM,CAAC;YACnB,KAAK,EAAE,MAAM,CAAC;YACd,QAAQ,EAAE,MAAM,EAAE,CAAC;YACnB,OAAO,EAAE,MAAM,CAAC;YAChB,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC,CAElD"}
|
package/dist/lib/api.js
CHANGED
|
@@ -5,6 +5,7 @@ exports.login = login;
|
|
|
5
5
|
exports.inject = inject;
|
|
6
6
|
exports.capture = capture;
|
|
7
7
|
exports.me = me;
|
|
8
|
+
exports.sync = sync;
|
|
8
9
|
const config_js_1 = require("./config.js");
|
|
9
10
|
async function request(endpoint, options = {}, useAuth = true) {
|
|
10
11
|
const apiUrl = (0, config_js_1.getApiUrl)();
|
|
@@ -27,7 +28,15 @@ async function request(endpoint, options = {}, useAuth = true) {
|
|
|
27
28
|
const data = await response.json();
|
|
28
29
|
if (!response.ok) {
|
|
29
30
|
const error = data;
|
|
30
|
-
|
|
31
|
+
const messages = [error.message || `Request failed: ${response.status}`];
|
|
32
|
+
if (error.errors) {
|
|
33
|
+
for (const [field, fieldErrors] of Object.entries(error.errors)) {
|
|
34
|
+
for (const msg of fieldErrors) {
|
|
35
|
+
messages.push(` ${field}: ${msg}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
throw new Error(messages.join('\n'));
|
|
31
40
|
}
|
|
32
41
|
return data;
|
|
33
42
|
}
|
|
@@ -63,4 +72,7 @@ async function capture(data) {
|
|
|
63
72
|
async function me() {
|
|
64
73
|
return request('/me');
|
|
65
74
|
}
|
|
75
|
+
async function sync() {
|
|
76
|
+
return request('/sync');
|
|
77
|
+
}
|
|
66
78
|
//# sourceMappingURL=api.js.map
|
package/dist/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AA8BvC,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAU5E;AA6ID,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAoC9E"}
|
package/dist/lib/hooks.js
CHANGED
|
@@ -66,31 +66,42 @@ function installClaudeCodeHooks(home) {
|
|
|
66
66
|
settings = {};
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
+
// Remove old-format hooks if present
|
|
70
|
+
if (settings.hooks) {
|
|
71
|
+
delete settings.hooks['user-prompt-submit'];
|
|
72
|
+
delete settings.hooks['assistant-response'];
|
|
73
|
+
}
|
|
69
74
|
// Initialize hooks if needed
|
|
70
75
|
if (!settings.hooks) {
|
|
71
76
|
settings.hooks = {};
|
|
72
77
|
}
|
|
73
|
-
if (!settings.hooks
|
|
74
|
-
settings.hooks
|
|
78
|
+
if (!settings.hooks.UserPromptSubmit) {
|
|
79
|
+
settings.hooks.UserPromptSubmit = [];
|
|
75
80
|
}
|
|
76
|
-
if (!settings.hooks
|
|
77
|
-
settings.hooks
|
|
81
|
+
if (!settings.hooks.Stop) {
|
|
82
|
+
settings.hooks.Stop = [];
|
|
78
83
|
}
|
|
79
84
|
// Check if helm hooks already exist
|
|
80
|
-
const hasInjectHook = settings.hooks
|
|
81
|
-
const hasCaptureHook = settings.hooks
|
|
85
|
+
const hasInjectHook = settings.hooks.UserPromptSubmit.some(entry => entry.hooks?.some(h => h.command.includes('helm inject')));
|
|
86
|
+
const hasCaptureHook = settings.hooks.Stop.some(entry => entry.hooks?.some(h => h.command.includes('helm capture')));
|
|
82
87
|
// Add inject hook if not present
|
|
83
88
|
if (!hasInjectHook) {
|
|
84
|
-
settings.hooks
|
|
85
|
-
|
|
86
|
-
|
|
89
|
+
settings.hooks.UserPromptSubmit.push({
|
|
90
|
+
hooks: [{
|
|
91
|
+
type: 'command',
|
|
92
|
+
command: 'helm inject',
|
|
93
|
+
timeout: 3,
|
|
94
|
+
}],
|
|
87
95
|
});
|
|
88
96
|
}
|
|
89
97
|
// Add capture hook if not present
|
|
90
98
|
if (!hasCaptureHook) {
|
|
91
|
-
settings.hooks
|
|
92
|
-
|
|
93
|
-
|
|
99
|
+
settings.hooks.Stop.push({
|
|
100
|
+
hooks: [{
|
|
101
|
+
type: 'command',
|
|
102
|
+
command: 'helm capture',
|
|
103
|
+
timeout: 3,
|
|
104
|
+
}],
|
|
94
105
|
});
|
|
95
106
|
}
|
|
96
107
|
// Write settings
|
|
@@ -161,12 +172,16 @@ function uninstallHooks(ide) {
|
|
|
161
172
|
try {
|
|
162
173
|
const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
|
|
163
174
|
if (settings.hooks) {
|
|
164
|
-
|
|
165
|
-
|
|
175
|
+
// Remove new-format hooks
|
|
176
|
+
if (settings.hooks.UserPromptSubmit) {
|
|
177
|
+
settings.hooks.UserPromptSubmit = settings.hooks.UserPromptSubmit.filter(entry => !entry.hooks?.some(h => h.command.includes('helm')));
|
|
166
178
|
}
|
|
167
|
-
if (settings.hooks
|
|
168
|
-
settings.hooks
|
|
179
|
+
if (settings.hooks.Stop) {
|
|
180
|
+
settings.hooks.Stop = settings.hooks.Stop.filter(entry => !entry.hooks?.some(h => h.command.includes('helm')));
|
|
169
181
|
}
|
|
182
|
+
// Clean up old-format hooks if still present
|
|
183
|
+
delete settings.hooks['user-prompt-submit'];
|
|
184
|
+
delete settings.hooks['assistant-response'];
|
|
170
185
|
}
|
|
171
186
|
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
|
|
172
187
|
return { success: true, message: 'Claude Code hooks removed' };
|
package/dist/lib/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/knowledge.d.ts
CHANGED
|
@@ -11,5 +11,11 @@ export declare function saveKnowledgeEntry(input: {
|
|
|
11
11
|
content: string;
|
|
12
12
|
tags?: string[];
|
|
13
13
|
}): KnowledgeEntry;
|
|
14
|
+
export declare function loadProjectKnowledge(cwd: string): KnowledgeEntry[];
|
|
15
|
+
export declare function saveProjectKnowledgeEntry(cwd: string, input: {
|
|
16
|
+
title: string;
|
|
17
|
+
content: string;
|
|
18
|
+
tags?: string[];
|
|
19
|
+
}): KnowledgeEntry;
|
|
14
20
|
export declare function selectRelevantKnowledge(prompt: string, entries: KnowledgeEntry[], maxEntries?: number): KnowledgeEntry[];
|
|
15
21
|
//# sourceMappingURL=knowledge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/lib/knowledge.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/lib/knowledge.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAaD,wBAAgB,aAAa,IAAI,cAAc,EAAE,CAShD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,cAAc,CAoB7G;AAkCD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,EAAE,CAgClE;AAED,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACzD,cAAc,CAyChB;AA4BD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,UAAU,SAAI,GAAG,cAAc,EAAE,CAOnH"}
|
package/dist/lib/knowledge.js
CHANGED
|
@@ -35,6 +35,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.loadKnowledge = loadKnowledge;
|
|
37
37
|
exports.saveKnowledgeEntry = saveKnowledgeEntry;
|
|
38
|
+
exports.loadProjectKnowledge = loadProjectKnowledge;
|
|
39
|
+
exports.saveProjectKnowledgeEntry = saveProjectKnowledgeEntry;
|
|
38
40
|
exports.selectRelevantKnowledge = selectRelevantKnowledge;
|
|
39
41
|
const fs = __importStar(require("fs"));
|
|
40
42
|
const path = __importStar(require("path"));
|
|
@@ -47,6 +49,7 @@ function ensureHelmDir() {
|
|
|
47
49
|
fs.mkdirSync(HELM_DIR, { recursive: true });
|
|
48
50
|
}
|
|
49
51
|
}
|
|
52
|
+
// --- Global knowledge (legacy ~/.helm/knowledge.json) ---
|
|
50
53
|
function loadKnowledge() {
|
|
51
54
|
if (!fs.existsSync(KNOWLEDGE_FILE))
|
|
52
55
|
return [];
|
|
@@ -79,6 +82,108 @@ function saveKnowledgeEntry(input) {
|
|
|
79
82
|
}
|
|
80
83
|
return entry;
|
|
81
84
|
}
|
|
85
|
+
// --- Project-scoped knowledge (.helm/knowledge/*.md) ---
|
|
86
|
+
const FRONTMATTER_RE = /^---\n([\s\S]*?)\n---\n([\s\S]*)$/;
|
|
87
|
+
function parseYamlFrontmatter(raw) {
|
|
88
|
+
const match = raw.match(FRONTMATTER_RE);
|
|
89
|
+
if (!match)
|
|
90
|
+
return null;
|
|
91
|
+
const frontmatter = match[1];
|
|
92
|
+
const content = match[2].trim();
|
|
93
|
+
let title = '';
|
|
94
|
+
let tags = [];
|
|
95
|
+
let created = '';
|
|
96
|
+
for (const line of frontmatter.split('\n')) {
|
|
97
|
+
const [key, ...rest] = line.split(':');
|
|
98
|
+
const value = rest.join(':').trim();
|
|
99
|
+
if (key.trim() === 'title')
|
|
100
|
+
title = value.replace(/^["']|["']$/g, '');
|
|
101
|
+
if (key.trim() === 'tags') {
|
|
102
|
+
tags = value
|
|
103
|
+
.replace(/^\[|\]$/g, '')
|
|
104
|
+
.split(',')
|
|
105
|
+
.map(t => t.trim().replace(/^["']|["']$/g, '').toLowerCase())
|
|
106
|
+
.filter(Boolean);
|
|
107
|
+
}
|
|
108
|
+
if (key.trim() === 'created')
|
|
109
|
+
created = value;
|
|
110
|
+
}
|
|
111
|
+
return { title, tags, created, content };
|
|
112
|
+
}
|
|
113
|
+
function loadProjectKnowledge(cwd) {
|
|
114
|
+
const knowledgeDir = path.join(cwd, '.helm', 'knowledge');
|
|
115
|
+
if (!fs.existsSync(knowledgeDir))
|
|
116
|
+
return [];
|
|
117
|
+
const entries = [];
|
|
118
|
+
try {
|
|
119
|
+
const files = fs.readdirSync(knowledgeDir).filter(f => f.endsWith('.md'));
|
|
120
|
+
for (const file of files) {
|
|
121
|
+
try {
|
|
122
|
+
const raw = fs.readFileSync(path.join(knowledgeDir, file), 'utf-8');
|
|
123
|
+
const parsed = parseYamlFrontmatter(raw);
|
|
124
|
+
if (parsed && parsed.content) {
|
|
125
|
+
entries.push({
|
|
126
|
+
id: path.basename(file, '.md'),
|
|
127
|
+
title: parsed.title || path.basename(file, '.md'),
|
|
128
|
+
content: parsed.content,
|
|
129
|
+
tags: parsed.tags,
|
|
130
|
+
createdAt: parsed.created || '',
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Skip malformed files
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
return entries;
|
|
143
|
+
}
|
|
144
|
+
function saveProjectKnowledgeEntry(cwd, input) {
|
|
145
|
+
const knowledgeDir = path.join(cwd, '.helm', 'knowledge');
|
|
146
|
+
if (!fs.existsSync(knowledgeDir)) {
|
|
147
|
+
fs.mkdirSync(knowledgeDir, { recursive: true });
|
|
148
|
+
}
|
|
149
|
+
const id = slugifyFilename(input.title.trim());
|
|
150
|
+
const tags = (input.tags ?? []).map(t => t.trim().toLowerCase()).filter(Boolean);
|
|
151
|
+
const created = new Date().toISOString();
|
|
152
|
+
const entry = {
|
|
153
|
+
id,
|
|
154
|
+
title: input.title.trim(),
|
|
155
|
+
content: input.content.trim(),
|
|
156
|
+
tags,
|
|
157
|
+
createdAt: created,
|
|
158
|
+
};
|
|
159
|
+
const frontmatter = [
|
|
160
|
+
'---',
|
|
161
|
+
`title: "${entry.title}"`,
|
|
162
|
+
`tags: [${tags.map(t => `"${t}"`).join(', ')}]`,
|
|
163
|
+
`created: ${created}`,
|
|
164
|
+
'---',
|
|
165
|
+
'',
|
|
166
|
+
entry.content,
|
|
167
|
+
].join('\n');
|
|
168
|
+
const filePath = path.join(knowledgeDir, `${id}.md`);
|
|
169
|
+
// Avoid overwriting — append suffix if file exists
|
|
170
|
+
let finalPath = filePath;
|
|
171
|
+
let counter = 1;
|
|
172
|
+
while (fs.existsSync(finalPath)) {
|
|
173
|
+
finalPath = path.join(knowledgeDir, `${id}-${counter}.md`);
|
|
174
|
+
counter++;
|
|
175
|
+
}
|
|
176
|
+
fs.writeFileSync(finalPath, frontmatter);
|
|
177
|
+
return entry;
|
|
178
|
+
}
|
|
179
|
+
function slugifyFilename(text) {
|
|
180
|
+
return text
|
|
181
|
+
.toLowerCase()
|
|
182
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
183
|
+
.replace(/^-+|-+$/g, '')
|
|
184
|
+
.slice(0, 60);
|
|
185
|
+
}
|
|
186
|
+
// --- Scoring (shared between global and project knowledge) ---
|
|
82
187
|
function scoreText(prompt, entry) {
|
|
83
188
|
const p = prompt.toLowerCase();
|
|
84
189
|
let score = 0;
|
|
@@ -88,7 +193,6 @@ function scoreText(prompt, entry) {
|
|
|
88
193
|
if (p.includes(t))
|
|
89
194
|
score += 2;
|
|
90
195
|
}
|
|
91
|
-
// Token-ish match on words from title (cheap heuristic)
|
|
92
196
|
for (const w of entry.title.toLowerCase().split(/\s+/).filter(Boolean)) {
|
|
93
197
|
if (w.length < 4)
|
|
94
198
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/lib/knowledge.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/lib/knowledge.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,13 @@ export interface RuleSection {
|
|
|
5
5
|
}
|
|
6
6
|
export declare function findRulesFile(cwd: string): string | null;
|
|
7
7
|
export declare function parseRuleSections(markdown: string): RuleSection[];
|
|
8
|
+
/**
|
|
9
|
+
* Score a section's relevance to the prompt using weighted matching:
|
|
10
|
+
* - Exact keyword match in prompt: 3 points
|
|
11
|
+
* - Synonym of a keyword found in prompt: 2 points
|
|
12
|
+
* - Content word overlap (4+ char words): 1 point
|
|
13
|
+
*/
|
|
14
|
+
export declare function scoreSectionRelevance(prompt: string, section: RuleSection): number;
|
|
8
15
|
export declare function scoreKeywords(haystack: string, keywords: string[]): number;
|
|
9
16
|
export declare function selectRelevantSections(prompt: string, sections: RuleSection[], maxSections?: number): RuleSection[];
|
|
10
17
|
//# sourceMappingURL=local-rules.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-rules.d.ts","sourceRoot":"","sources":["../../src/lib/local-rules.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"local-rules.d.ts","sourceRoot":"","sources":["../../src/lib/local-rules.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AA8BD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBxD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAMjE;AAqHD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CA4ClF;AAGD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAE1E;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,WAAW,SAAI,GAAG,WAAW,EAAE,CAW9G"}
|
package/dist/lib/local-rules.js
CHANGED
|
@@ -35,11 +35,38 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.findRulesFile = findRulesFile;
|
|
37
37
|
exports.parseRuleSections = parseRuleSections;
|
|
38
|
+
exports.scoreSectionRelevance = scoreSectionRelevance;
|
|
38
39
|
exports.scoreKeywords = scoreKeywords;
|
|
39
40
|
exports.selectRelevantSections = selectRelevantSections;
|
|
40
41
|
const fs = __importStar(require("fs"));
|
|
41
42
|
const path = __importStar(require("path"));
|
|
42
43
|
const SECTION_MARKER_RE = /<!--\s*helm:section:([a-zA-Z0-9_-]+)(?:\s+keywords:([^>]+?))?\s*-->/g;
|
|
44
|
+
const HEADING_RE = /^##\s+(.+)$/;
|
|
45
|
+
// Synonym map: primary keyword → related terms that should partially match
|
|
46
|
+
const SYNONYM_MAP = {
|
|
47
|
+
test: ['tests', 'testing', 'spec', 'tdd', 'pest', 'coverage', 'phpunit', 'vitest', 'jest'],
|
|
48
|
+
api: ['endpoint', 'route', 'controller', 'rest', 'resource'],
|
|
49
|
+
auth: ['authentication', 'authorization', 'login', 'register', 'guard', 'policy', 'permission'],
|
|
50
|
+
database: ['migration', 'model', 'eloquent', 'query', 'schema', 'seed', 'factory'],
|
|
51
|
+
frontend: ['react', 'vue', 'inertia', 'component', 'ui', 'tailwind', 'css', 'blade'],
|
|
52
|
+
deploy: ['deployment', 'ci', 'cd', 'pipeline', 'docker', 'production'],
|
|
53
|
+
queue: ['job', 'dispatch', 'worker', 'async'],
|
|
54
|
+
error: ['exception', 'bug', 'fix', 'debug', 'issue'],
|
|
55
|
+
refactor: ['cleanup', 'improve', 'restructure', 'simplify', 'optimize'],
|
|
56
|
+
cache: ['caching', 'redis', 'memcached', 'store'],
|
|
57
|
+
};
|
|
58
|
+
// Build reverse lookup: synonym → primary keyword
|
|
59
|
+
const REVERSE_SYNONYMS = {};
|
|
60
|
+
for (const [primary, synonyms] of Object.entries(SYNONYM_MAP)) {
|
|
61
|
+
for (const syn of synonyms) {
|
|
62
|
+
if (!REVERSE_SYNONYMS[syn])
|
|
63
|
+
REVERSE_SYNONYMS[syn] = [];
|
|
64
|
+
REVERSE_SYNONYMS[syn].push(primary);
|
|
65
|
+
}
|
|
66
|
+
// Primary is also its own synonym
|
|
67
|
+
if (!REVERSE_SYNONYMS[primary])
|
|
68
|
+
REVERSE_SYNONYMS[primary] = [];
|
|
69
|
+
}
|
|
43
70
|
function findRulesFile(cwd) {
|
|
44
71
|
const helmRules = path.join(cwd, '.helm', 'rules.md');
|
|
45
72
|
if (fs.existsSync(helmRules))
|
|
@@ -59,13 +86,17 @@ function findRulesFile(cwd) {
|
|
|
59
86
|
return null;
|
|
60
87
|
}
|
|
61
88
|
function parseRuleSections(markdown) {
|
|
89
|
+
const sections = parseMarkedSections(markdown);
|
|
90
|
+
if (sections.length > 0)
|
|
91
|
+
return sections;
|
|
92
|
+
// Fallback: split by ## headings when no helm:section markers exist
|
|
93
|
+
return parseHeadingSections(markdown);
|
|
94
|
+
}
|
|
95
|
+
function parseMarkedSections(markdown) {
|
|
62
96
|
const sections = [];
|
|
63
97
|
const matches = [...markdown.matchAll(SECTION_MARKER_RE)];
|
|
64
|
-
if (matches.length === 0)
|
|
65
|
-
// No explicit sections found. In beta/local mode we prefer to inject nothing
|
|
66
|
-
// rather than dumping an entire doc into the prompt.
|
|
98
|
+
if (matches.length === 0)
|
|
67
99
|
return [];
|
|
68
|
-
}
|
|
69
100
|
for (let i = 0; i < matches.length; i++) {
|
|
70
101
|
const m = matches[i];
|
|
71
102
|
const id = (m[1] || '').trim();
|
|
@@ -84,9 +115,69 @@ function parseRuleSections(markdown) {
|
|
|
84
115
|
}
|
|
85
116
|
return sections;
|
|
86
117
|
}
|
|
118
|
+
function parseHeadingSections(markdown) {
|
|
119
|
+
const lines = markdown.split(/\r?\n/);
|
|
120
|
+
const sections = [];
|
|
121
|
+
let currentHeading = '';
|
|
122
|
+
let currentLines = [];
|
|
123
|
+
for (const line of lines) {
|
|
124
|
+
const headingMatch = line.match(HEADING_RE);
|
|
125
|
+
if (headingMatch) {
|
|
126
|
+
// Flush previous section
|
|
127
|
+
if (currentHeading && currentLines.length > 0) {
|
|
128
|
+
const content = currentLines.join('\n').trim();
|
|
129
|
+
if (content) {
|
|
130
|
+
sections.push({
|
|
131
|
+
id: slugify(currentHeading),
|
|
132
|
+
keywords: deriveKeywords(currentHeading),
|
|
133
|
+
content,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
currentHeading = headingMatch[1].trim();
|
|
138
|
+
currentLines = [];
|
|
139
|
+
}
|
|
140
|
+
else if (currentHeading) {
|
|
141
|
+
currentLines.push(line);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Flush last section
|
|
145
|
+
if (currentHeading && currentLines.length > 0) {
|
|
146
|
+
const content = currentLines.join('\n').trim();
|
|
147
|
+
if (content) {
|
|
148
|
+
sections.push({
|
|
149
|
+
id: slugify(currentHeading),
|
|
150
|
+
keywords: deriveKeywords(currentHeading),
|
|
151
|
+
content,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return sections;
|
|
156
|
+
}
|
|
157
|
+
function slugify(text) {
|
|
158
|
+
return text
|
|
159
|
+
.toLowerCase()
|
|
160
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
161
|
+
.replace(/^-+|-+$/g, '');
|
|
162
|
+
}
|
|
163
|
+
function deriveKeywords(heading) {
|
|
164
|
+
const words = heading
|
|
165
|
+
.toLowerCase()
|
|
166
|
+
.split(/[\s/&,]+/)
|
|
167
|
+
.map(w => w.replace(/[^a-z0-9]/g, ''))
|
|
168
|
+
.filter(w => w.length >= 2);
|
|
169
|
+
// Expand with synonyms from the map
|
|
170
|
+
const expanded = new Set(words);
|
|
171
|
+
for (const word of words) {
|
|
172
|
+
if (SYNONYM_MAP[word]) {
|
|
173
|
+
for (const syn of SYNONYM_MAP[word]) {
|
|
174
|
+
expanded.add(syn);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return [...expanded];
|
|
179
|
+
}
|
|
87
180
|
function stripTrailingHeadings(input) {
|
|
88
|
-
// If the next section's markdown heading is included at the end of this slice,
|
|
89
|
-
// drop it to avoid injecting headings for non-matching sections.
|
|
90
181
|
const lines = input.split(/\r?\n/);
|
|
91
182
|
while (lines.length > 0) {
|
|
92
183
|
const last = lines[lines.length - 1];
|
|
@@ -102,27 +193,63 @@ function stripTrailingHeadings(input) {
|
|
|
102
193
|
}
|
|
103
194
|
return lines.join('\n');
|
|
104
195
|
}
|
|
105
|
-
|
|
106
|
-
|
|
196
|
+
/**
|
|
197
|
+
* Score a section's relevance to the prompt using weighted matching:
|
|
198
|
+
* - Exact keyword match in prompt: 3 points
|
|
199
|
+
* - Synonym of a keyword found in prompt: 2 points
|
|
200
|
+
* - Content word overlap (4+ char words): 1 point
|
|
201
|
+
*/
|
|
202
|
+
function scoreSectionRelevance(prompt, section) {
|
|
203
|
+
const promptLower = prompt.toLowerCase();
|
|
204
|
+
const promptWords = new Set(promptLower.split(/\s+/).filter(w => w.length >= 4));
|
|
107
205
|
let score = 0;
|
|
108
|
-
|
|
109
|
-
|
|
206
|
+
const counted = new Set();
|
|
207
|
+
for (const kw of section.keywords) {
|
|
208
|
+
if (!kw || counted.has(kw))
|
|
209
|
+
continue;
|
|
210
|
+
counted.add(kw);
|
|
211
|
+
// Exact keyword match: 3 points
|
|
212
|
+
if (promptLower.includes(kw)) {
|
|
213
|
+
score += 3;
|
|
110
214
|
continue;
|
|
111
|
-
|
|
112
|
-
|
|
215
|
+
}
|
|
216
|
+
// Synonym match: check if any synonym of this keyword appears in prompt
|
|
217
|
+
const synonyms = SYNONYM_MAP[kw] || [];
|
|
218
|
+
const reversePrimaries = REVERSE_SYNONYMS[kw] || [];
|
|
219
|
+
const allRelated = [...synonyms, ...reversePrimaries];
|
|
220
|
+
let synonymFound = false;
|
|
221
|
+
for (const syn of allRelated) {
|
|
222
|
+
if (promptLower.includes(syn)) {
|
|
223
|
+
score += 2;
|
|
224
|
+
synonymFound = true;
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (!synonymFound) {
|
|
229
|
+
// Content word overlap: check if keyword appears as a word fragment
|
|
230
|
+
for (const pw of promptWords) {
|
|
231
|
+
if (pw.includes(kw) || kw.includes(pw)) {
|
|
232
|
+
score += 1;
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
113
237
|
}
|
|
114
238
|
return score;
|
|
115
239
|
}
|
|
240
|
+
// Keep the old function name as alias for backward compat
|
|
241
|
+
function scoreKeywords(haystack, keywords) {
|
|
242
|
+
return scoreSectionRelevance(haystack, { id: '', keywords, content: '' });
|
|
243
|
+
}
|
|
116
244
|
function selectRelevantSections(prompt, sections, maxSections = 3) {
|
|
117
|
-
// If a doc had no keywords, it will score 0; allow 1 fallback section.
|
|
118
245
|
const scored = sections
|
|
119
|
-
.map(s => ({ s, score: s.keywords.length ?
|
|
246
|
+
.map(s => ({ s, score: s.keywords.length ? scoreSectionRelevance(prompt, s) : 0 }))
|
|
120
247
|
.filter(x => x.s.content.trim().length > 0)
|
|
121
248
|
.sort((a, b) => b.score - a.score);
|
|
122
249
|
const positives = scored.filter(x => x.score > 0).map(x => x.s);
|
|
123
250
|
if (positives.length > 0)
|
|
124
251
|
return positives.slice(0, maxSections);
|
|
125
|
-
// Fallback: include first section
|
|
252
|
+
// Fallback: include first section if nothing matches.
|
|
126
253
|
return scored.slice(0, 1).map(x => x.s);
|
|
127
254
|
}
|
|
128
255
|
//# sourceMappingURL=local-rules.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-rules.js","sourceRoot":"","sources":["../../src/lib/local-rules.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"local-rules.js","sourceRoot":"","sources":["../../src/lib/local-rules.ts"],"names":[],"mappings":"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"}
|