greprag 0.6.1 → 0.7.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/doctor.d.ts +15 -0
- package/dist/commands/doctor.js +297 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.js +85 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/hook.js +51 -7
- package/dist/hook.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/project-anchor.d.ts +48 -14
- package/dist/project-anchor.js +184 -63
- package/dist/project-anchor.js.map +1 -1
- package/package.json +1 -1
- package/skill/SKILL.md +23 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** greprag doctor — diagnose and repair a project's memory identity.
|
|
2
|
+
*
|
|
3
|
+
* Finds orphan project_ids that belong to the same logical project, detects
|
|
4
|
+
* drift between file-based and git-derived UUIDs, and offers the user one of
|
|
5
|
+
* three repair actions (consolidate, migrate-to-git, dry-run) via the
|
|
6
|
+
* tenant-scoped /v1/projects/merge endpoint.
|
|
7
|
+
*
|
|
8
|
+
* No raw DB access — everything flows through the public API so a user can
|
|
9
|
+
* repair their own state with just an API key. */
|
|
10
|
+
interface DoctorOptions {
|
|
11
|
+
yes?: boolean;
|
|
12
|
+
inspect?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function runDoctor(opts: DoctorOptions): Promise<void>;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** greprag doctor — diagnose and repair a project's memory identity.
|
|
3
|
+
*
|
|
4
|
+
* Finds orphan project_ids that belong to the same logical project, detects
|
|
5
|
+
* drift between file-based and git-derived UUIDs, and offers the user one of
|
|
6
|
+
* three repair actions (consolidate, migrate-to-git, dry-run) via the
|
|
7
|
+
* tenant-scoped /v1/projects/merge endpoint.
|
|
8
|
+
*
|
|
9
|
+
* No raw DB access — everything flows through the public API so a user can
|
|
10
|
+
* repair their own state with just an API key. */
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.runDoctor = runDoctor;
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const readline = __importStar(require("readline"));
|
|
49
|
+
const project_anchor_1 = require("../project-anchor");
|
|
50
|
+
const API_URL_DEFAULT = 'https://api.greprag.com';
|
|
51
|
+
async function runDoctor(opts) {
|
|
52
|
+
const cfg = getConfig();
|
|
53
|
+
if (!cfg.apiKey) {
|
|
54
|
+
console.error('Not configured. Run: greprag init');
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
const cwd = process.cwd();
|
|
58
|
+
const anchor = (0, project_anchor_1.readAnchor)(cwd);
|
|
59
|
+
const gitId = (0, project_anchor_1.computeGitDerivedProjectId)(cwd);
|
|
60
|
+
// --- Diagnosis ---------------------------------------------------------
|
|
61
|
+
console.log('\n[greprag doctor]\n');
|
|
62
|
+
console.log(`Project: ${anchor.projectName}`);
|
|
63
|
+
console.log(`Current ID: ${anchor.projectId}`);
|
|
64
|
+
console.log(`Identity source: ${describeSource(anchor.source, anchor.anchorPath)}`);
|
|
65
|
+
if (gitId) {
|
|
66
|
+
if (gitId === anchor.projectId) {
|
|
67
|
+
console.log(`Git-derived ID: ${gitId} (matches current)`);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
console.log(`Git-derived ID: ${gitId} (DIFFERS from current — drift)`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
console.log(`Git-derived ID: (none — no git repo or no commits yet)`);
|
|
75
|
+
}
|
|
76
|
+
// Query orphans for this profile name.
|
|
77
|
+
const orphansUrl = `${cfg.apiUrl}/v1/projects/orphans?profile=${encodeURIComponent(anchor.projectName)}`;
|
|
78
|
+
const orphansResp = await apiGet(orphansUrl, cfg.apiKey);
|
|
79
|
+
// Filter out the current project_id — that's the active bucket, not an orphan.
|
|
80
|
+
const orphans = orphansResp.candidates.filter(c => c.project_id !== anchor.projectId);
|
|
81
|
+
console.log('');
|
|
82
|
+
if (orphans.length === 0 && gitId === anchor.projectId) {
|
|
83
|
+
console.log('All clean. No orphans, no drift. Nothing to repair.\n');
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (orphans.length > 0) {
|
|
87
|
+
console.log(`Orphan project IDs under profile "${anchor.projectName}":`);
|
|
88
|
+
orphans.forEach((o, i) => {
|
|
89
|
+
const types = Object.entries(o.by_type).map(([k, v]) => `${v} ${k}`).join(', ');
|
|
90
|
+
const range = o.oldest && o.newest
|
|
91
|
+
? `${o.oldest.slice(0, 10)} → ${o.newest.slice(0, 10)}`
|
|
92
|
+
: '(no memory rows)';
|
|
93
|
+
console.log(` [${i + 1}] ${o.project_id} ${o.total} rows (${types || 'registry only'})`);
|
|
94
|
+
console.log(` range: ${range}${o.registered ? ' · registered' : ''}`);
|
|
95
|
+
});
|
|
96
|
+
console.log('');
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
console.log('No orphan project IDs found under this profile.');
|
|
100
|
+
console.log('');
|
|
101
|
+
}
|
|
102
|
+
if (opts.inspect) {
|
|
103
|
+
console.log('Inspect-only mode — no changes made.\n');
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// --- Repair options ---------------------------------------------------
|
|
107
|
+
const driftPresent = gitId !== null && gitId !== anchor.projectId;
|
|
108
|
+
const haveOrphans = orphans.length > 0;
|
|
109
|
+
const orphanIds = orphans.map(o => o.project_id);
|
|
110
|
+
const actions = [];
|
|
111
|
+
if (driftPresent && gitId) {
|
|
112
|
+
// Migrate to git-derived UUID: everything → git UUID, strip file's project_id.
|
|
113
|
+
const migrationSources = [anchor.projectId, ...orphanIds];
|
|
114
|
+
actions.push({
|
|
115
|
+
key: 'm',
|
|
116
|
+
label: `Migrate to git-derived UUID (${gitId})\n — moves current + orphans onto the git UUID\n — strips project_id from .claude/project.json (settings stay)`,
|
|
117
|
+
target: gitId,
|
|
118
|
+
sources: migrationSources,
|
|
119
|
+
stripFileProjectId: true,
|
|
120
|
+
recommended: true,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (haveOrphans) {
|
|
124
|
+
// Consolidate orphans into the current UUID.
|
|
125
|
+
actions.push({
|
|
126
|
+
key: 'c',
|
|
127
|
+
label: `Consolidate orphans into current UUID (${anchor.projectId})\n — moves orphans onto the current UUID\n — keeps the current identity source unchanged`,
|
|
128
|
+
target: anchor.projectId,
|
|
129
|
+
sources: orphanIds,
|
|
130
|
+
stripFileProjectId: false,
|
|
131
|
+
recommended: !driftPresent,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
if (actions.length === 0) {
|
|
135
|
+
console.log('Nothing to repair. (Drift detection saw current = git UUID, no orphans.)\n');
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
// Always offer dry-run and no-op for the most-recommended action.
|
|
139
|
+
console.log('Actions:');
|
|
140
|
+
for (const a of actions) {
|
|
141
|
+
const tag = a.recommended ? ' (recommended)' : '';
|
|
142
|
+
console.log(` [${a.key}] ${a.label}${tag}`);
|
|
143
|
+
}
|
|
144
|
+
console.log(` [d] Dry-run the recommended action above (no writes)`);
|
|
145
|
+
console.log(` [n] No action (exit)\n`);
|
|
146
|
+
let choice;
|
|
147
|
+
if (opts.yes) {
|
|
148
|
+
const rec = actions.find(a => a.recommended) || actions[0];
|
|
149
|
+
choice = rec.key;
|
|
150
|
+
console.log(`--yes given; picking recommended action: [${rec.key}]\n`);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
choice = (await prompt('Choice: ')).trim().toLowerCase();
|
|
154
|
+
}
|
|
155
|
+
let dryRun = false;
|
|
156
|
+
let picked = null;
|
|
157
|
+
if (choice === 'd') {
|
|
158
|
+
picked = actions.find(a => a.recommended) || actions[0];
|
|
159
|
+
dryRun = true;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
picked = actions.find(a => a.key === choice) || null;
|
|
163
|
+
}
|
|
164
|
+
if (!picked) {
|
|
165
|
+
console.log('No action selected.\n');
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
// --- Execute ----------------------------------------------------------
|
|
169
|
+
console.log(`\n${dryRun ? 'Dry-running' : 'Executing'}: merge into ${picked.target}`);
|
|
170
|
+
console.log(`Sources (${picked.sources.length}):`);
|
|
171
|
+
picked.sources.forEach(s => console.log(` - ${s}`));
|
|
172
|
+
if (!dryRun && !opts.yes) {
|
|
173
|
+
const confirm = (await prompt('\nProceed? (yes/no): ')).trim().toLowerCase();
|
|
174
|
+
if (confirm !== 'yes' && confirm !== 'y') {
|
|
175
|
+
console.log('Cancelled.\n');
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const report = await apiPost(`${cfg.apiUrl}/v1/projects/merge`, cfg.apiKey, {
|
|
180
|
+
target_project_id: picked.target,
|
|
181
|
+
source_project_ids: picked.sources,
|
|
182
|
+
target_project_name: anchor.projectName,
|
|
183
|
+
dry_run: dryRun,
|
|
184
|
+
});
|
|
185
|
+
if (!report.ok) {
|
|
186
|
+
console.error(`\nMerge failed: ${report.error}\n`);
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
console.log(`\n${dryRun ? 'Would change' : 'Changed'}:`);
|
|
190
|
+
console.log(` memories: ${report.changes.memories}`);
|
|
191
|
+
console.log(` memory_claims: ${report.changes.memory_claims}`);
|
|
192
|
+
console.log(` inbox_messages (to): ${report.changes.inbox_messages_to}`);
|
|
193
|
+
console.log(` inbox_messages (from): ${report.changes.inbox_messages_from}`);
|
|
194
|
+
console.log(` projects registry rows: ${report.changes.projects_registry_deleted} deleted`);
|
|
195
|
+
if (!dryRun && picked.stripFileProjectId) {
|
|
196
|
+
const stripped = stripFileProjectId(anchor.anchorPath);
|
|
197
|
+
if (stripped) {
|
|
198
|
+
console.log(`\nStripped project_id from ${anchor.anchorPath}`);
|
|
199
|
+
console.log('Identity now flows through git-derived UUID — file holds settings only.');
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
console.log(`\n${dryRun ? 'Dry-run complete. No changes were written.' : 'Repair complete.'}\n`);
|
|
203
|
+
}
|
|
204
|
+
// -- Helpers ----------------------------------------------------------------
|
|
205
|
+
function describeSource(source, anchorPath) {
|
|
206
|
+
switch (source) {
|
|
207
|
+
case 'file': return `.claude/project.json (explicit project_id)`;
|
|
208
|
+
case 'git': return `git root commit SHA (derived, no file needed)`;
|
|
209
|
+
case 'global': return `~/.claude/project.json (global anchor — Cowork-style)`;
|
|
210
|
+
case 'hash': return `path hash (no git, no anchor file — UNSTABLE)`;
|
|
211
|
+
default: return source;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/** Rewrite the anchor file to drop `project_id` and `project_name`, keeping
|
|
215
|
+
* per-project settings. Returns true on write, false if the file is absent or
|
|
216
|
+
* already settings-only. */
|
|
217
|
+
function stripFileProjectId(anchorPath) {
|
|
218
|
+
if (!fs.existsSync(anchorPath))
|
|
219
|
+
return false;
|
|
220
|
+
let raw;
|
|
221
|
+
try {
|
|
222
|
+
raw = JSON.parse(fs.readFileSync(anchorPath, 'utf-8'));
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
if (!('project_id' in raw))
|
|
228
|
+
return false;
|
|
229
|
+
delete raw.project_id;
|
|
230
|
+
fs.writeFileSync(anchorPath, JSON.stringify(raw, null, 2) + '\n');
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
function prompt(question) {
|
|
234
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
235
|
+
return new Promise(resolve => {
|
|
236
|
+
rl.question(question, answer => {
|
|
237
|
+
rl.close();
|
|
238
|
+
resolve(answer);
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
// -- HTTP / env -------------------------------------------------------------
|
|
243
|
+
function loadEnvFile(filePath) {
|
|
244
|
+
try {
|
|
245
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
246
|
+
for (const line of content.split('\n')) {
|
|
247
|
+
const trimmed = line.trim();
|
|
248
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
249
|
+
continue;
|
|
250
|
+
const eqIdx = trimmed.indexOf('=');
|
|
251
|
+
if (eqIdx < 1)
|
|
252
|
+
continue;
|
|
253
|
+
const key = trimmed.slice(0, eqIdx).trim();
|
|
254
|
+
let value = trimmed.slice(eqIdx + 1).trim();
|
|
255
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
256
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
257
|
+
value = value.slice(1, -1);
|
|
258
|
+
}
|
|
259
|
+
if (!process.env[key])
|
|
260
|
+
process.env[key] = value;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch { /* missing — fine */ }
|
|
264
|
+
}
|
|
265
|
+
function ensureEnv() {
|
|
266
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || '';
|
|
267
|
+
if (homeDir)
|
|
268
|
+
loadEnvFile(path.join(homeDir, '.env'));
|
|
269
|
+
if (!process.env.GREPRAG_API_KEY)
|
|
270
|
+
loadEnvFile(path.join(process.cwd(), '.env'));
|
|
271
|
+
}
|
|
272
|
+
function getConfig() {
|
|
273
|
+
ensureEnv();
|
|
274
|
+
return {
|
|
275
|
+
apiUrl: process.env.GREPRAG_API_URL || API_URL_DEFAULT,
|
|
276
|
+
apiKey: process.env.GREPRAG_API_KEY || '',
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
async function apiGet(url, apiKey) {
|
|
280
|
+
const res = await fetch(url, { headers: { 'Authorization': `Bearer ${apiKey}` } });
|
|
281
|
+
if (!res.ok)
|
|
282
|
+
throw new Error(`API ${res.status}: ${await res.text()}`);
|
|
283
|
+
return res.json();
|
|
284
|
+
}
|
|
285
|
+
async function apiPost(url, apiKey, body) {
|
|
286
|
+
const res = await fetch(url, {
|
|
287
|
+
method: 'POST',
|
|
288
|
+
headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
|
|
289
|
+
body: JSON.stringify(body),
|
|
290
|
+
});
|
|
291
|
+
if (!res.ok) {
|
|
292
|
+
// Pass through error JSON for the caller to surface.
|
|
293
|
+
return await res.json();
|
|
294
|
+
}
|
|
295
|
+
return res.json();
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -43,6 +43,7 @@ const fs = __importStar(require("fs"));
|
|
|
43
43
|
const path = __importStar(require("path"));
|
|
44
44
|
const os = __importStar(require("os"));
|
|
45
45
|
const readline = __importStar(require("readline"));
|
|
46
|
+
const child_process_1 = require("child_process");
|
|
46
47
|
const project_anchor_1 = require("../project-anchor");
|
|
47
48
|
const API_URL = 'https://api.greprag.com';
|
|
48
49
|
async function runInit(opts) {
|
|
@@ -86,10 +87,23 @@ async function runInit(opts) {
|
|
|
86
87
|
const settings = readSettings(settingsPath);
|
|
87
88
|
const changes = applySettings(settings, apiKey);
|
|
88
89
|
writeSettings(settingsPath, settings);
|
|
89
|
-
// Step 4: Project anchor
|
|
90
|
-
//
|
|
90
|
+
// Step 4: Project anchor. Behavior depends on cascade source:
|
|
91
|
+
// - source='git' → settings-only file written; identity is git-derived.
|
|
92
|
+
// No gitignore patch needed (file isn't load-bearing).
|
|
93
|
+
// - source='file' → file holds a random project_id (non-git directories).
|
|
94
|
+
// Patch the gitignore so the file survives fresh clones.
|
|
95
|
+
// - source='global' / unchanged → idempotent return, no action.
|
|
91
96
|
const anchor = (0, project_anchor_1.ensureAnchor)(process.cwd());
|
|
92
|
-
|
|
97
|
+
if (anchor.source === 'git') {
|
|
98
|
+
changes.push(`Project anchor: ${anchor.projectName} (${anchor.projectId.slice(0, 8)}) — derived from git history`);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
changes.push(`Project anchor: ${anchor.projectName} (${anchor.projectId.slice(0, 8)}) — stored in .claude/project.json`);
|
|
102
|
+
// Only patch gitignore when the file is load-bearing for identity.
|
|
103
|
+
const gitignoreResult = ensureAnchorTrackable(process.cwd());
|
|
104
|
+
if (gitignoreResult)
|
|
105
|
+
changes.push(gitignoreResult);
|
|
106
|
+
}
|
|
93
107
|
// Step 5: Global anchor — catches Cowork + any session without a repo anchor.
|
|
94
108
|
const globalAnchor = (0, project_anchor_1.ensureGlobalAnchor)();
|
|
95
109
|
changes.push(`Global anchor: ${globalAnchor.projectName} (${globalAnchor.projectId.slice(0, 8)})`);
|
|
@@ -275,6 +289,74 @@ function patchGlobalClaudeMd() {
|
|
|
275
289
|
fs.writeFileSync(claudeMdPath, src.trimEnd() + '\n\n' + INBOX_SECTION_NEW + '\n', 'utf-8');
|
|
276
290
|
return true;
|
|
277
291
|
}
|
|
292
|
+
// -- Anchor trackability ----------------------------------------------------
|
|
293
|
+
/** When a repo gitignores `.claude/`, the anchor file we just wrote won't
|
|
294
|
+
* survive a fresh clone or worktree switch — the deterministic-hash fallback
|
|
295
|
+
* will silently take over, splitting the project_id and breaking inbox
|
|
296
|
+
* addressing. Detect that case at init time and patch the gitignore so the
|
|
297
|
+
* anchor is durably tracked.
|
|
298
|
+
*
|
|
299
|
+
* Common patterns we handle: `.claude/`, `.claude`, `/.claude/`, `/.claude`.
|
|
300
|
+
* Each is rewritten to its `*`-contents form so a `!.claude/project.json`
|
|
301
|
+
* re-include works (git won't descend into an excluded directory, so the
|
|
302
|
+
* trailing-slash directory pattern must become a contents-only pattern).
|
|
303
|
+
*
|
|
304
|
+
* Returns a one-line summary of what was done, or null if no action needed
|
|
305
|
+
* (not a git repo, file already tracked, or pattern unrecognized — in which
|
|
306
|
+
* case we print a manual-fix hint instead). */
|
|
307
|
+
function ensureAnchorTrackable(projectRoot) {
|
|
308
|
+
// Not in a git repo? Nothing to do — the anchor is local-only by definition.
|
|
309
|
+
try {
|
|
310
|
+
(0, child_process_1.execSync)('git rev-parse --git-dir', { cwd: projectRoot, stdio: 'pipe' });
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
return null;
|
|
314
|
+
}
|
|
315
|
+
// Is the anchor file ignored? `git check-ignore` exits 0 when ignored,
|
|
316
|
+
// 1 when not ignored. Either non-zero exit means "no work to do."
|
|
317
|
+
let checkOutput;
|
|
318
|
+
try {
|
|
319
|
+
checkOutput = (0, child_process_1.execSync)('git check-ignore -v .claude/project.json', {
|
|
320
|
+
cwd: projectRoot,
|
|
321
|
+
encoding: 'utf-8',
|
|
322
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
return null; // not ignored — anchor is already trackable
|
|
327
|
+
}
|
|
328
|
+
// Output: `<gitignore-relative-path>:<line>:<pattern>\t<file-path>`
|
|
329
|
+
const m = checkOutput.match(/^(.+?):(\d+):(.+?)\t/);
|
|
330
|
+
if (!m)
|
|
331
|
+
return null;
|
|
332
|
+
const [, gitignoreRel, lineNumStr, pattern] = m;
|
|
333
|
+
const gitignorePath = path.isAbsolute(gitignoreRel)
|
|
334
|
+
? gitignoreRel
|
|
335
|
+
: path.join(projectRoot, gitignoreRel);
|
|
336
|
+
const lineNum = parseInt(lineNumStr, 10);
|
|
337
|
+
const content = fs.readFileSync(gitignorePath, 'utf-8');
|
|
338
|
+
const lines = content.split('\n');
|
|
339
|
+
if (lineNum < 1 || lineNum > lines.length)
|
|
340
|
+
return null;
|
|
341
|
+
const trimmed = pattern.trim();
|
|
342
|
+
const dirPatterns = new Set([
|
|
343
|
+
'.claude/', '.claude', '/.claude/', '/.claude',
|
|
344
|
+
]);
|
|
345
|
+
if (dirPatterns.has(trimmed)) {
|
|
346
|
+
// Preserve leading slash if present in the original pattern.
|
|
347
|
+
const anchored = trimmed.startsWith('/');
|
|
348
|
+
const prefix = anchored ? '/' : '';
|
|
349
|
+
// Replace the single directory-ignore line with the contents-ignore form
|
|
350
|
+
// plus the re-include for project.json. Git evaluates patterns in order
|
|
351
|
+
// and re-includes override later, so the order matters: `*` first, then `!`.
|
|
352
|
+
lines.splice(lineNum - 1, 1, `${prefix}.claude/*`, `!${prefix}.claude/project.json`);
|
|
353
|
+
fs.writeFileSync(gitignorePath, lines.join('\n'));
|
|
354
|
+
return `Patched ${gitignoreRel}: \`${trimmed}\` → \`${prefix}.claude/*\` + \`!${prefix}.claude/project.json\` (anchor now trackable)`;
|
|
355
|
+
}
|
|
356
|
+
// Unrecognized pattern — don't risk breaking the user's other intent. Tell
|
|
357
|
+
// them what to do manually.
|
|
358
|
+
return `WARNING: .claude/project.json is ignored by \`${pattern}\` in ${gitignoreRel}. The anchor won't survive a fresh clone. Add \`!.claude/project.json\` after that line manually, or run \`git add -f .claude/project.json\` to force-track it once.`;
|
|
359
|
+
}
|
|
278
360
|
// -- Input ------------------------------------------------------------------
|
|
279
361
|
function prompt(question) {
|
|
280
362
|
const rl = readline.createInterface({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/hook.js
CHANGED
|
@@ -802,6 +802,36 @@ async function recap(input) {
|
|
|
802
802
|
const anchor = (0, project_anchor_1.readAnchor)(cwd);
|
|
803
803
|
if (!anchor.projectId)
|
|
804
804
|
return;
|
|
805
|
+
// Setup warning — surfaced at session start when the project's identity is
|
|
806
|
+
// either unstable (path-hash fallback) OR drifting (file UUID differs from
|
|
807
|
+
// what git would derive, indicating an old random UUID minted before git
|
|
808
|
+
// was in play). Both cases point the user at the doctor command.
|
|
809
|
+
let setupWarning = null;
|
|
810
|
+
if (anchor.source === 'hash') {
|
|
811
|
+
// No git, no anchor file, no global anchor. The path-hash UUID is stable
|
|
812
|
+
// for this directory but will diverge if the directory ever moves.
|
|
813
|
+
setupWarning =
|
|
814
|
+
`[GrepRAG memory: this project ("${anchor.projectName}") has no stable identity — `
|
|
815
|
+
+ `conversation turns are being captured under an ID derived from the directory path, `
|
|
816
|
+
+ `which can drift if the directory moves or is cloned elsewhere. `
|
|
817
|
+
+ `For permanent stability, run \`git init && git commit\` in the project root `
|
|
818
|
+
+ `(memory then derives its ID from your git history automatically). `
|
|
819
|
+
+ `If you notice memory missing later, run \`greprag doctor\` to find and merge orphan IDs.]`;
|
|
820
|
+
}
|
|
821
|
+
else if (anchor.source === 'file') {
|
|
822
|
+
// File-based identity (legacy). Check whether git would derive a different
|
|
823
|
+
// UUID — if so, the file holds a stale random UUID from before git setup.
|
|
824
|
+
const gitId = (0, project_anchor_1.computeGitDerivedProjectId)(cwd);
|
|
825
|
+
if (gitId && gitId !== anchor.projectId) {
|
|
826
|
+
setupWarning =
|
|
827
|
+
`[GrepRAG memory: identity drift detected for "${anchor.projectName}" — `
|
|
828
|
+
+ `your project's stored ID (${anchor.projectId.slice(0, 8)}) differs from the ID `
|
|
829
|
+
+ `that would be derived from your git history (${gitId.slice(0, 8)}). `
|
|
830
|
+
+ `This usually means the stored ID was created before git was set up; `
|
|
831
|
+
+ `older sessions may have written history under a different UUID. `
|
|
832
|
+
+ `Run \`greprag doctor\` to inspect and merge.]`;
|
|
833
|
+
}
|
|
834
|
+
}
|
|
805
835
|
// Inbox unread count — fires regardless of recap policy (session start is
|
|
806
836
|
// the right moment to surface mail, even if the user opted out of memory
|
|
807
837
|
// recap for this project). Respects inbox_notify=off only.
|
|
@@ -812,12 +842,21 @@ async function recap(input) {
|
|
|
812
842
|
unreadHeader = `[${count} unread in inbox — /greprag to read & send]`;
|
|
813
843
|
}
|
|
814
844
|
}
|
|
845
|
+
const preamble = () => {
|
|
846
|
+
const lines = [];
|
|
847
|
+
if (setupWarning)
|
|
848
|
+
lines.push(setupWarning);
|
|
849
|
+
if (unreadHeader)
|
|
850
|
+
lines.push(unreadHeader);
|
|
851
|
+
return lines.length ? lines.join('\n') + '\n' : '';
|
|
852
|
+
};
|
|
815
853
|
// Per-project opt-out — agent flips session_start_recap=false to suppress
|
|
816
854
|
// the episodic injection for a specific project without disabling the
|
|
817
|
-
// hook globally.
|
|
855
|
+
// hook globally. Setup warning + inbox header still fire above.
|
|
818
856
|
if (!anchor.sessionStartRecap) {
|
|
819
|
-
|
|
820
|
-
|
|
857
|
+
const out = preamble();
|
|
858
|
+
if (out)
|
|
859
|
+
process.stdout.write(out);
|
|
821
860
|
return;
|
|
822
861
|
}
|
|
823
862
|
const now = new Date();
|
|
@@ -864,14 +903,19 @@ async function recap(input) {
|
|
|
864
903
|
const recentHourlies = allHourlies
|
|
865
904
|
.filter(h => h.windowEnd && new Date(h.windowEnd).getTime() >= hourlyCutoffMs)
|
|
866
905
|
.slice(-HOURLY_CAP);
|
|
867
|
-
// Silent no-op when there's truly nothing to say — unless
|
|
868
|
-
// is pending, in which case we still surface
|
|
906
|
+
// Silent no-op when there's truly nothing to say — unless a setup warning
|
|
907
|
+
// or inbox header is pending, in which case we still surface those.
|
|
869
908
|
if (dailies.length === 0 && recentHourlies.length === 0) {
|
|
870
|
-
|
|
871
|
-
|
|
909
|
+
const out = preamble();
|
|
910
|
+
if (out)
|
|
911
|
+
process.stdout.write(out);
|
|
872
912
|
return;
|
|
873
913
|
}
|
|
874
914
|
const parts = [];
|
|
915
|
+
if (setupWarning) {
|
|
916
|
+
parts.push(setupWarning);
|
|
917
|
+
parts.push('');
|
|
918
|
+
}
|
|
875
919
|
if (unreadHeader) {
|
|
876
920
|
parts.push(unreadHeader);
|
|
877
921
|
parts.push('');
|