greprag 0.1.0
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 +11 -0
- package/dist/commands/init.js +208 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/hook.d.ts +14 -0
- package/dist/hook.js +297 -0
- package/dist/hook.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** greprag init — configure Claude Code for GrepRAG memory.
|
|
2
|
+
*
|
|
3
|
+
* 1. Obtain API key (provided or provisioned)
|
|
4
|
+
* 2. Validate key against health endpoint
|
|
5
|
+
* 3. Update ~/.claude/settings.json with env vars + hooks */
|
|
6
|
+
interface InitOptions {
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
tenantId?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function runInit(opts: InitOptions): Promise<void>;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** greprag init — configure Claude Code for GrepRAG memory.
|
|
3
|
+
*
|
|
4
|
+
* 1. Obtain API key (provided or provisioned)
|
|
5
|
+
* 2. Validate key against health endpoint
|
|
6
|
+
* 3. Update ~/.claude/settings.json with env vars + hooks */
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.runInit = runInit;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const readline = __importStar(require("readline"));
|
|
45
|
+
const API_URL = 'https://api.greprag.com';
|
|
46
|
+
async function runInit(opts) {
|
|
47
|
+
console.log('\n greprag init — Setting up agent memory for Claude Code\n');
|
|
48
|
+
// Step 1: Get API key
|
|
49
|
+
let apiKey = opts.apiKey;
|
|
50
|
+
if (!apiKey) {
|
|
51
|
+
let tenantId = opts.tenantId;
|
|
52
|
+
if (!tenantId) {
|
|
53
|
+
tenantId = await prompt(' Enter a tenant ID (alphanumeric + hyphens, 3-32 chars): ');
|
|
54
|
+
}
|
|
55
|
+
tenantId = tenantId.trim().toLowerCase();
|
|
56
|
+
if (!tenantId) {
|
|
57
|
+
console.error(' Error: tenant ID is required');
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
console.log(` Provisioning API key for tenant "${tenantId}"...`);
|
|
61
|
+
const result = await provision(tenantId);
|
|
62
|
+
if (!result.ok) {
|
|
63
|
+
console.error(` Error: ${result.error}`);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
apiKey = result.apiKey;
|
|
67
|
+
console.log(` API key created: ${apiKey.slice(0, 17)}...`);
|
|
68
|
+
}
|
|
69
|
+
// Step 2: Validate key
|
|
70
|
+
console.log(' Validating API key...');
|
|
71
|
+
const valid = await validateKey(apiKey);
|
|
72
|
+
if (!valid) {
|
|
73
|
+
console.error(' Error: API key validation failed. Check the key and try again.');
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
console.log(' Key validated against api.greprag.com');
|
|
77
|
+
// Step 3: Update settings.json
|
|
78
|
+
console.log(' Configuring Claude Code settings...');
|
|
79
|
+
const settingsPath = getSettingsPath();
|
|
80
|
+
const settings = readSettings(settingsPath);
|
|
81
|
+
const changes = applySettings(settings, apiKey);
|
|
82
|
+
writeSettings(settingsPath, settings);
|
|
83
|
+
// Summary
|
|
84
|
+
console.log('\n Setup complete!\n');
|
|
85
|
+
for (const change of changes) {
|
|
86
|
+
console.log(` - ${change}`);
|
|
87
|
+
}
|
|
88
|
+
console.log(`\n Settings file: ${settingsPath}`);
|
|
89
|
+
console.log(' Memory hooks will activate on your next Claude Code session.\n');
|
|
90
|
+
}
|
|
91
|
+
// -- Provisioning -----------------------------------------------------------
|
|
92
|
+
async function provision(tenantId) {
|
|
93
|
+
const res = await fetch(`${API_URL}/v1/keys/provision`, {
|
|
94
|
+
method: 'POST',
|
|
95
|
+
headers: { 'Content-Type': 'application/json' },
|
|
96
|
+
body: JSON.stringify({ tenantId }),
|
|
97
|
+
});
|
|
98
|
+
const body = await res.json();
|
|
99
|
+
if (!res.ok) {
|
|
100
|
+
return { ok: false, error: body.error || `HTTP ${res.status}` };
|
|
101
|
+
}
|
|
102
|
+
return { ok: true, apiKey: body.apiKey };
|
|
103
|
+
}
|
|
104
|
+
// -- Validation -------------------------------------------------------------
|
|
105
|
+
async function validateKey(apiKey) {
|
|
106
|
+
try {
|
|
107
|
+
const res = await fetch(`${API_URL}/health`, {
|
|
108
|
+
headers: { 'Authorization': `Bearer ${apiKey}` },
|
|
109
|
+
});
|
|
110
|
+
const body = await res.json();
|
|
111
|
+
return body.ok === true;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// -- Settings management ----------------------------------------------------
|
|
118
|
+
function getSettingsPath() {
|
|
119
|
+
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
120
|
+
return path.join(home, '.claude', 'settings.json');
|
|
121
|
+
}
|
|
122
|
+
function readSettings(settingsPath) {
|
|
123
|
+
try {
|
|
124
|
+
const raw = fs.readFileSync(settingsPath, 'utf-8');
|
|
125
|
+
return JSON.parse(raw);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return {};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function writeSettings(settingsPath, settings) {
|
|
132
|
+
const dir = path.dirname(settingsPath);
|
|
133
|
+
if (!fs.existsSync(dir)) {
|
|
134
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
135
|
+
}
|
|
136
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
|
|
137
|
+
}
|
|
138
|
+
function applySettings(settings, apiKey) {
|
|
139
|
+
const changes = [];
|
|
140
|
+
// Env vars
|
|
141
|
+
if (!settings.env)
|
|
142
|
+
settings.env = {};
|
|
143
|
+
settings.env.GREPRAG_API_KEY = apiKey;
|
|
144
|
+
changes.push('Set GREPRAG_API_KEY');
|
|
145
|
+
settings.env.MEMORY_HOOK_ENABLED = 'true';
|
|
146
|
+
changes.push('Set MEMORY_HOOK_ENABLED=true');
|
|
147
|
+
// Hooks
|
|
148
|
+
if (!settings.hooks)
|
|
149
|
+
settings.hooks = {};
|
|
150
|
+
// UserPromptSubmit hook (retrieve)
|
|
151
|
+
const retrieveHook = {
|
|
152
|
+
matcher: '',
|
|
153
|
+
hooks: [{
|
|
154
|
+
type: 'command',
|
|
155
|
+
command: 'greprag-hook retrieve',
|
|
156
|
+
timeout: 5000,
|
|
157
|
+
}],
|
|
158
|
+
};
|
|
159
|
+
// Stop hook (store)
|
|
160
|
+
const storeHook = {
|
|
161
|
+
matcher: '',
|
|
162
|
+
hooks: [{
|
|
163
|
+
type: 'command',
|
|
164
|
+
command: 'greprag-hook store',
|
|
165
|
+
timeout: 10000,
|
|
166
|
+
}],
|
|
167
|
+
};
|
|
168
|
+
// Add retrieve hook if not already present
|
|
169
|
+
if (!hasGrepragHook(settings.hooks.UserPromptSubmit, 'retrieve')) {
|
|
170
|
+
if (!settings.hooks.UserPromptSubmit)
|
|
171
|
+
settings.hooks.UserPromptSubmit = [];
|
|
172
|
+
settings.hooks.UserPromptSubmit.push(retrieveHook);
|
|
173
|
+
changes.push('Added UserPromptSubmit hook (memory retrieve)');
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
changes.push('UserPromptSubmit hook already configured (skipped)');
|
|
177
|
+
}
|
|
178
|
+
// Add store hook if not already present
|
|
179
|
+
if (!hasGrepragHook(settings.hooks.Stop, 'store')) {
|
|
180
|
+
if (!settings.hooks.Stop)
|
|
181
|
+
settings.hooks.Stop = [];
|
|
182
|
+
settings.hooks.Stop.push(storeHook);
|
|
183
|
+
changes.push('Added Stop hook (memory store)');
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
changes.push('Stop hook already configured (skipped)');
|
|
187
|
+
}
|
|
188
|
+
return changes;
|
|
189
|
+
}
|
|
190
|
+
function hasGrepragHook(hookConfigs, subcommand) {
|
|
191
|
+
if (!hookConfigs)
|
|
192
|
+
return false;
|
|
193
|
+
return hookConfigs.some(cfg => cfg.hooks?.some(h => h.command?.includes(`greprag-hook ${subcommand}`)));
|
|
194
|
+
}
|
|
195
|
+
// -- Input ------------------------------------------------------------------
|
|
196
|
+
function prompt(question) {
|
|
197
|
+
const rl = readline.createInterface({
|
|
198
|
+
input: process.stdin,
|
|
199
|
+
output: process.stdout,
|
|
200
|
+
});
|
|
201
|
+
return new Promise((resolve) => {
|
|
202
|
+
rl.question(question, (answer) => {
|
|
203
|
+
rl.close();
|
|
204
|
+
resolve(answer);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/hook.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/** GrepRAG Memory Hook — self-contained HTTP client for Claude Code hooks.
|
|
3
|
+
*
|
|
4
|
+
* Two subcommands:
|
|
5
|
+
* retrieve — UserPromptSubmit: inject relevant memory as additionalContext
|
|
6
|
+
* store — Stop: parse transcript, extract last turn, store via API
|
|
7
|
+
*
|
|
8
|
+
* Stdin: JSON from Claude Code hook event
|
|
9
|
+
* Stdout: JSON hookSpecificOutput (retrieve only) or nothing (store)
|
|
10
|
+
* Stderr: diagnostics
|
|
11
|
+
*
|
|
12
|
+
* Env: GREPRAG_API_KEY (required), GREPRAG_API_URL (optional)
|
|
13
|
+
* MEMORY_HOOK_ENABLED=true to activate */
|
|
14
|
+
export {};
|
package/dist/hook.js
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/** GrepRAG Memory Hook — self-contained HTTP client for Claude Code hooks.
|
|
4
|
+
*
|
|
5
|
+
* Two subcommands:
|
|
6
|
+
* retrieve — UserPromptSubmit: inject relevant memory as additionalContext
|
|
7
|
+
* store — Stop: parse transcript, extract last turn, store via API
|
|
8
|
+
*
|
|
9
|
+
* Stdin: JSON from Claude Code hook event
|
|
10
|
+
* Stdout: JSON hookSpecificOutput (retrieve only) or nothing (store)
|
|
11
|
+
* Stderr: diagnostics
|
|
12
|
+
*
|
|
13
|
+
* Env: GREPRAG_API_KEY (required), GREPRAG_API_URL (optional)
|
|
14
|
+
* MEMORY_HOOK_ENABLED=true to activate */
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const fs = __importStar(require("fs"));
|
|
51
|
+
// -- Config ----------------------------------------------------------------
|
|
52
|
+
const API_URL_DEFAULT = 'https://api.greprag.com';
|
|
53
|
+
function getConfig(cwd) {
|
|
54
|
+
ensureEnv(cwd);
|
|
55
|
+
return {
|
|
56
|
+
apiUrl: process.env.GREPRAG_API_URL || API_URL_DEFAULT,
|
|
57
|
+
apiKey: process.env.GREPRAG_API_KEY || '',
|
|
58
|
+
enabled: process.env.MEMORY_HOOK_ENABLED === 'true',
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// -- Agreement filter ------------------------------------------------------
|
|
62
|
+
const AGREEMENT_WORDS = new Set([
|
|
63
|
+
'yes', 'yeah', 'yep', 'yup', 'sure', 'ok', 'okay', 'k',
|
|
64
|
+
'proceed', 'thanks', 'thank you', 'ty', 'thx',
|
|
65
|
+
'agreed', 'correct', 'right', 'exactly', 'indeed',
|
|
66
|
+
'absolutely', 'definitely', 'perfect', 'great', 'nice', 'awesome',
|
|
67
|
+
'lgtm',
|
|
68
|
+
]);
|
|
69
|
+
const AGREEMENT_PHRASES = [
|
|
70
|
+
'go ahead', 'do it', 'sounds good', 'looks good', 'ship it',
|
|
71
|
+
];
|
|
72
|
+
function isShortAgreement(text) {
|
|
73
|
+
if (!text || text.trim().length === 0)
|
|
74
|
+
return true;
|
|
75
|
+
const normalized = text.trim().toLowerCase();
|
|
76
|
+
const wordCount = normalized.split(/\s+/).length;
|
|
77
|
+
if (wordCount > 8)
|
|
78
|
+
return false;
|
|
79
|
+
if (AGREEMENT_WORDS.has(normalized))
|
|
80
|
+
return true;
|
|
81
|
+
for (const phrase of AGREEMENT_PHRASES) {
|
|
82
|
+
if (normalized === phrase || normalized.startsWith(phrase + ' ') || normalized.startsWith(phrase + ',')) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
function extractText(content) {
|
|
89
|
+
if (typeof content === 'string')
|
|
90
|
+
return content.trim();
|
|
91
|
+
if (Array.isArray(content)) {
|
|
92
|
+
const parts = [];
|
|
93
|
+
for (const block of content) {
|
|
94
|
+
if (block && typeof block === 'object' && block.type === 'text') {
|
|
95
|
+
parts.push(String(block.text || ''));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return parts.join('\n').trim();
|
|
99
|
+
}
|
|
100
|
+
return '';
|
|
101
|
+
}
|
|
102
|
+
function parseLastTurn(transcriptPath) {
|
|
103
|
+
let data;
|
|
104
|
+
try {
|
|
105
|
+
data = fs.readFileSync(transcriptPath, 'utf-8');
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
let lastUserMessage = '';
|
|
111
|
+
const agentTextByRequestId = new Map();
|
|
112
|
+
let userMessageCount = 0;
|
|
113
|
+
const lines = data.split('\n');
|
|
114
|
+
for (const line of lines) {
|
|
115
|
+
const trimmed = line.trim();
|
|
116
|
+
if (!trimmed)
|
|
117
|
+
continue;
|
|
118
|
+
let entry;
|
|
119
|
+
try {
|
|
120
|
+
entry = JSON.parse(trimmed);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const message = entry.message || entry;
|
|
126
|
+
const role = String(message.role || entry.type || '');
|
|
127
|
+
const content = message.content;
|
|
128
|
+
const requestId = String(entry.requestId || '');
|
|
129
|
+
if (role === 'user') {
|
|
130
|
+
const text = extractText(content);
|
|
131
|
+
if (text && text.length > 5) {
|
|
132
|
+
if (!text.startsWith('<system') && !text.startsWith('{')) {
|
|
133
|
+
lastUserMessage = text;
|
|
134
|
+
userMessageCount++;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (role === 'assistant') {
|
|
139
|
+
const text = extractText(content);
|
|
140
|
+
if (text && text.trim().length > 20 && requestId) {
|
|
141
|
+
const prev = agentTextByRequestId.get(requestId) || '';
|
|
142
|
+
if (text.length > prev.length) {
|
|
143
|
+
agentTextByRequestId.set(requestId, text);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (!lastUserMessage)
|
|
149
|
+
return null;
|
|
150
|
+
const agentTexts = Array.from(agentTextByRequestId.values());
|
|
151
|
+
const agentProse = agentTexts.length > 0 ? agentTexts[agentTexts.length - 1] : '';
|
|
152
|
+
return { userMessage: lastUserMessage, agentProse, turnIndex: userMessageCount };
|
|
153
|
+
}
|
|
154
|
+
// -- Env loader ------------------------------------------------------------
|
|
155
|
+
function loadEnvFile(filePath) {
|
|
156
|
+
try {
|
|
157
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
158
|
+
for (const line of content.split('\n')) {
|
|
159
|
+
const trimmed = line.trim();
|
|
160
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
161
|
+
continue;
|
|
162
|
+
const eqIdx = trimmed.indexOf('=');
|
|
163
|
+
if (eqIdx < 1)
|
|
164
|
+
continue;
|
|
165
|
+
const key = trimmed.slice(0, eqIdx).trim();
|
|
166
|
+
let value = trimmed.slice(eqIdx + 1).trim();
|
|
167
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
168
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
169
|
+
value = value.slice(1, -1);
|
|
170
|
+
}
|
|
171
|
+
if (!process.env[key]) {
|
|
172
|
+
process.env[key] = value;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// File doesn't exist — fine
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function ensureEnv(cwd) {
|
|
181
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || '';
|
|
182
|
+
if (homeDir)
|
|
183
|
+
loadEnvFile(path.join(homeDir, '.env'));
|
|
184
|
+
if (!process.env.GREPRAG_API_KEY)
|
|
185
|
+
loadEnvFile(path.join(cwd, '.env'));
|
|
186
|
+
}
|
|
187
|
+
// -- HTTP client -----------------------------------------------------------
|
|
188
|
+
async function apiCall(url, apiKey, method, body) {
|
|
189
|
+
const opts = {
|
|
190
|
+
method,
|
|
191
|
+
headers: {
|
|
192
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
193
|
+
'Content-Type': 'application/json',
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
if (body)
|
|
197
|
+
opts.body = JSON.stringify(body);
|
|
198
|
+
const res = await fetch(url, opts);
|
|
199
|
+
if (!res.ok) {
|
|
200
|
+
process.stderr.write(`[greprag-hook] API ${res.status}: ${await res.text()}\n`);
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
return res.json();
|
|
204
|
+
}
|
|
205
|
+
async function retrieve(input) {
|
|
206
|
+
const prompt = input.prompt || '';
|
|
207
|
+
const cwd = input.cwd || process.cwd();
|
|
208
|
+
const cfg = getConfig(cwd);
|
|
209
|
+
if (!cfg.enabled || !cfg.apiKey)
|
|
210
|
+
return;
|
|
211
|
+
if (isShortAgreement(prompt))
|
|
212
|
+
return;
|
|
213
|
+
const profile = path.basename(cwd);
|
|
214
|
+
try {
|
|
215
|
+
const result = await apiCall(`${cfg.apiUrl}/v1/memory/retrieve`, cfg.apiKey, 'POST', {
|
|
216
|
+
query: prompt,
|
|
217
|
+
profileId: profile,
|
|
218
|
+
sessionId: input.session_id,
|
|
219
|
+
});
|
|
220
|
+
if (result?.ok) {
|
|
221
|
+
const r = result.result;
|
|
222
|
+
const totalWords = r?.totalWords;
|
|
223
|
+
const formattedBlock = r?.formattedBlock;
|
|
224
|
+
if (totalWords > 0 && formattedBlock) {
|
|
225
|
+
const output = {
|
|
226
|
+
hookSpecificOutput: {
|
|
227
|
+
hookEventName: 'UserPromptSubmit',
|
|
228
|
+
additionalContext: formattedBlock,
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
process.stdout.write(JSON.stringify(output));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
process.stderr.write(`[greprag-hook:retrieve] Error: ${err.message}\n`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
async function store(input) {
|
|
240
|
+
const transcriptPath = input.transcript_path || '';
|
|
241
|
+
const cwd = input.cwd || process.cwd();
|
|
242
|
+
const sessionId = input.session_id || '';
|
|
243
|
+
const cfg = getConfig(cwd);
|
|
244
|
+
if (!transcriptPath || !cfg.enabled || !cfg.apiKey)
|
|
245
|
+
return;
|
|
246
|
+
const profile = path.basename(cwd);
|
|
247
|
+
try {
|
|
248
|
+
const parsed = parseLastTurn(transcriptPath);
|
|
249
|
+
if (!parsed) {
|
|
250
|
+
process.stderr.write('[greprag-hook:store] No valid turn found in transcript\n');
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
await apiCall(`${cfg.apiUrl}/v1/memory/store`, cfg.apiKey, 'POST', {
|
|
254
|
+
profileId: profile,
|
|
255
|
+
sessionId: sessionId || `hook-${Date.now()}`,
|
|
256
|
+
turnIndex: parsed.turnIndex,
|
|
257
|
+
userMessage: parsed.userMessage,
|
|
258
|
+
agentProse: parsed.agentProse,
|
|
259
|
+
});
|
|
260
|
+
process.stderr.write(`[greprag-hook:store] Stored turn ${parsed.turnIndex} (${profile})\n`);
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
process.stderr.write(`[greprag-hook:store] Error: ${err.message}\n`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// -- Main ------------------------------------------------------------------
|
|
267
|
+
async function main() {
|
|
268
|
+
const subcommand = process.argv[2];
|
|
269
|
+
if (!subcommand || !['retrieve', 'store'].includes(subcommand)) {
|
|
270
|
+
process.stderr.write('Usage: greprag-hook <retrieve|store>\n');
|
|
271
|
+
process.exit(1);
|
|
272
|
+
}
|
|
273
|
+
let input = {};
|
|
274
|
+
try {
|
|
275
|
+
const chunks = [];
|
|
276
|
+
for await (const chunk of process.stdin) {
|
|
277
|
+
chunks.push(chunk);
|
|
278
|
+
}
|
|
279
|
+
const raw = Buffer.concat(chunks).toString('utf-8').trim();
|
|
280
|
+
if (raw)
|
|
281
|
+
input = JSON.parse(raw);
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
process.exit(0);
|
|
285
|
+
}
|
|
286
|
+
if (subcommand === 'retrieve') {
|
|
287
|
+
await retrieve(input);
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
await store(input);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
main().catch(err => {
|
|
294
|
+
process.stderr.write(`[greprag-hook] Fatal: ${err.message}\n`);
|
|
295
|
+
process.exit(0); // never break a session
|
|
296
|
+
});
|
|
297
|
+
//# sourceMappingURL=hook.js.map
|
package/dist/hook.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;gDAWgD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEhD,2CAA6B;AAC7B,uCAAyB;AAEzB,6EAA6E;AAE7E,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAElD,SAAS,SAAS,CAAC,GAAW;IAC5B,SAAS,CAAC,GAAG,CAAC,CAAC;IACf,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,eAAe;QACtD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE;QACzC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,MAAM;KACpD,CAAC;AACJ,CAAC;AAED,6EAA6E;AAE7E,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG;IACtD,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK;IAC7C,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;IACjD,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS;IACjE,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG;IACxB,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS;CAC5D,CAAC;AAEF,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACjD,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;QACvC,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;YACxG,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAUD,SAAS,WAAW,CAAC,OAAgB;IACnC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACvD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAAiC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC7F,KAAK,CAAC,IAAI,CAAC,MAAM,CAAE,KAAiC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,aAAa,CAAC,cAAsB;IAC3C,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvD,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,IAAI,KAA8B,CAAC;QACnC,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAI,KAAK,CAAC,OAAmC,IAAI,KAAK,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAEhD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzD,eAAe,GAAG,IAAI,CAAC;oBACvB,gBAAgB,EAAE,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,IAAI,SAAS,EAAE,CAAC;gBACjD,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBACvD,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC9B,oBAAoB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAElF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AACnF,CAAC;AAED,6EAA6E;AAE7E,SAAS,WAAW,CAAC,QAAgB;IACnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAClD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,KAAK,GAAG,CAAC;gBAAE,SAAS;YACxB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACnD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7B,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4BAA4B;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAClE,IAAI,OAAO;QAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe;QAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,6EAA6E;AAE7E,KAAK,UAAU,OAAO,CACpB,GAAW,EAAE,MAAc,EAAE,MAAc,EAC3C,IAA8B;IAE9B,MAAM,IAAI,GAAgB;QACxB,MAAM;QACN,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,MAAM,EAAE;YACnC,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC;IACF,IAAI,IAAI;QAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAE3C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,GAAG,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAsC,CAAC;AACxD,CAAC;AAYD,KAAK,UAAU,QAAQ,CAAC,KAAgB;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAE3B,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO;IACxC,IAAI,gBAAgB,CAAC,MAAM,CAAC;QAAE,OAAO;IAErC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE;YACnF,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,OAAO;YAClB,SAAS,EAAE,KAAK,CAAC,UAAU;SAC5B,CAAC,CAAC;QAEH,IAAI,MAAM,EAAE,EAAE,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,MAAM,CAAC,MAAiC,CAAC;YACnD,MAAM,UAAU,GAAG,CAAC,EAAE,UAAoB,CAAC;YAC3C,MAAM,cAAc,GAAG,CAAC,EAAE,cAAwB,CAAC;YAEnD,IAAI,UAAU,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC;gBACrC,MAAM,MAAM,GAAG;oBACb,kBAAkB,EAAE;wBAClB,aAAa,EAAE,kBAAkB;wBACjC,iBAAiB,EAAE,cAAc;qBAClC;iBACF,CAAC;gBACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAmC,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,KAAgB;IACnC,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC;IACnD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAE3B,IAAI,CAAC,cAAc,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO;IAE3D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE;YACjE,SAAS,EAAE,OAAO;YAClB,SAAS,EAAE,SAAS,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE;YAC5C,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,MAAM,CAAC,SAAS,KAAK,OAAO,KAAK,CAAC,CAAC;IAC9F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAAgC,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED,6EAA6E;AAE7E,KAAK,UAAU,IAAI;IACjB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,GAAc,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3D,IAAI,GAAG;YAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB;AAC3C,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/** GrepRAG CLI — agent memory for Claude Code.
|
|
4
|
+
* Usage: greprag <command>
|
|
5
|
+
* init [--api-key grp_live_xxx] — configure Claude Code for GrepRAG memory */
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const init_1 = require("./commands/init");
|
|
8
|
+
const HELP = `
|
|
9
|
+
greprag — agent memory for Claude Code
|
|
10
|
+
|
|
11
|
+
Commands:
|
|
12
|
+
init [--api-key <key>] Configure Claude Code hooks + API key
|
|
13
|
+
help Show this message
|
|
14
|
+
|
|
15
|
+
Options:
|
|
16
|
+
--api-key <key> Use an existing API key (skip provisioning)
|
|
17
|
+
--tenant-id <id> Tenant ID for key provisioning (skips prompt)
|
|
18
|
+
|
|
19
|
+
Examples:
|
|
20
|
+
greprag init
|
|
21
|
+
greprag init --api-key grp_live_abc123...
|
|
22
|
+
`.trim();
|
|
23
|
+
async function main() {
|
|
24
|
+
const args = process.argv.slice(2);
|
|
25
|
+
const command = args[0];
|
|
26
|
+
if (!command || command === 'help' || command === '--help' || command === '-h') {
|
|
27
|
+
console.log(HELP);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (command === 'init') {
|
|
31
|
+
const apiKey = getFlag(args, '--api-key');
|
|
32
|
+
const tenantId = getFlag(args, '--tenant-id');
|
|
33
|
+
await (0, init_1.runInit)({ apiKey, tenantId });
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
console.error(`Unknown command: ${command}\n`);
|
|
37
|
+
console.log(HELP);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
function getFlag(args, flag) {
|
|
41
|
+
const idx = args.indexOf(flag);
|
|
42
|
+
if (idx === -1 || idx + 1 >= args.length)
|
|
43
|
+
return undefined;
|
|
44
|
+
return args[idx + 1];
|
|
45
|
+
}
|
|
46
|
+
main().catch((err) => {
|
|
47
|
+
console.error(`Error: ${err.message}`);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AACA;;iFAEiF;;AAEjF,0CAA0C;AAE1C,MAAM,IAAI,GAAG;;;;;;;;;;;;;;CAcZ,CAAC,IAAI,EAAE,CAAC;AAET,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC9C,MAAM,IAAA,cAAO,EAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,IAAI,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,OAAO,CAAC,IAAc,EAAE,IAAY;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC3D,OAAO,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACvB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "greprag",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "GrepRAG — agent memory for Claude Code. 2-command setup.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"greprag": "dist/index.js",
|
|
8
|
+
"greprag-hook": "dist/hook.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"clean": "rimraf dist"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/node": "^20.0.0",
|
|
19
|
+
"typescript": "^5.5.0",
|
|
20
|
+
"rimraf": "^5.0.0"
|
|
21
|
+
},
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=18.0.0"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"greprag",
|
|
27
|
+
"claude",
|
|
28
|
+
"memory",
|
|
29
|
+
"rag",
|
|
30
|
+
"agent"
|
|
31
|
+
],
|
|
32
|
+
"license": "MIT"
|
|
33
|
+
}
|