@monoes/monograph 1.2.6 → 1.2.8
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/__tests__/search/embed-batch-config.test.ts +28 -18
- package/__tests__/wiki/providers.test.ts +21 -9
- package/__tests__/wiki/wiki-generator.test.ts +19 -9
- package/dist/src/analysis/file-classifier.d.ts +1 -1
- package/dist/src/analysis/file-classifier.d.ts.map +1 -1
- package/dist/src/analysis/file-classifier.js +4 -1
- package/dist/src/analysis/file-classifier.js.map +1 -1
- package/dist/src/pipeline/orchestrator.d.ts.map +1 -1
- package/dist/src/pipeline/orchestrator.js +61 -1
- package/dist/src/pipeline/orchestrator.js.map +1 -1
- package/dist/src/pipeline/phases/god-nodes.d.ts.map +1 -1
- package/dist/src/pipeline/phases/god-nodes.js +9 -2
- package/dist/src/pipeline/phases/god-nodes.js.map +1 -1
- package/dist/src/pipeline/phases/scan.d.ts.map +1 -1
- package/dist/src/pipeline/phases/scan.js +3 -0
- package/dist/src/pipeline/phases/scan.js.map +1 -1
- package/dist/src/pipeline/phases/surprises.js +1 -1
- package/dist/src/pipeline/phases/surprises.js.map +1 -1
- package/dist/src/storage/db.d.ts.map +1 -1
- package/dist/src/storage/db.js +8 -0
- package/dist/src/storage/db.js.map +1 -1
- package/dist/src/watch/watcher.d.ts.map +1 -1
- package/dist/src/watch/watcher.js +24 -5
- package/dist/src/watch/watcher.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/src/__tests__/analysis/file-classifier.test.ts +2 -2
- package/src/analysis/file-classifier.ts +5 -2
- package/src/pipeline/orchestrator.ts +46 -1
- package/src/pipeline/phases/god-nodes.ts +10 -2
- package/src/pipeline/phases/scan.ts +2 -0
- package/src/pipeline/phases/surprises.ts +1 -1
- package/src/storage/db.ts +8 -0
- package/src/watch/watcher.ts +20 -5
- package/vitest.config.ts +1 -0
- package/.monomind/data/ranked-context.json +0 -5
- package/.monomind/loops/mastermind-review-1782162423447.json +0 -16
- package/.monomind/sessions/session-1777578175215.json +0 -15
- package/.monomind/sessions/session-1777823684507.json +0 -15
- package/.monomind/sessions/session-1777928944749.json +0 -15
- package/.monomind/sessions/session-1778052902210.json +0 -15
- package/.monomind/sessions/session-1778056744636.json +0 -15
- package/.monomind/sessions/session-1778061077599.json +0 -15
- package/.monomind/sessions/session-1778102154764.json +0 -15
- package/dist/src/claude-cli.d.ts +0 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@monoes/monograph",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Native TypeScript code intelligence engine for monomind",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -15,10 +15,6 @@
|
|
|
15
15
|
"access": "public",
|
|
16
16
|
"tag": "latest"
|
|
17
17
|
},
|
|
18
|
-
"scripts": {
|
|
19
|
-
"build": "tsc",
|
|
20
|
-
"test": "vitest run"
|
|
21
|
-
},
|
|
22
18
|
"dependencies": {
|
|
23
19
|
"better-sqlite3": "^12.0.0",
|
|
24
20
|
"chokidar": "^3.6.0",
|
|
@@ -55,5 +51,9 @@
|
|
|
55
51
|
"@types/node": "^20.0.0",
|
|
56
52
|
"typescript": "^5.3.0",
|
|
57
53
|
"vitest": "^4.1.4"
|
|
54
|
+
},
|
|
55
|
+
"scripts": {
|
|
56
|
+
"build": "tsc",
|
|
57
|
+
"test": "vitest run"
|
|
58
58
|
}
|
|
59
|
-
}
|
|
59
|
+
}
|
|
@@ -23,8 +23,8 @@ describe('classifyFile', () => {
|
|
|
23
23
|
it('classifies arxiv URL as PAPER', () => {
|
|
24
24
|
expect(classifyFile('https://arxiv.org/abs/2401.00001')).toBe('PAPER');
|
|
25
25
|
});
|
|
26
|
-
it('returns
|
|
27
|
-
expect(classifyFile('Makefile')).toBe('
|
|
26
|
+
it('returns UNKNOWN for unrecognized extension', () => {
|
|
27
|
+
expect(classifyFile('Makefile')).toBe('UNKNOWN');
|
|
28
28
|
});
|
|
29
29
|
it('detects paper signals in filename', () => {
|
|
30
30
|
expect(classifyFile('attention_is_all_you_need.pdf')).toBe('PAPER');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { extname } from 'path';
|
|
2
2
|
|
|
3
|
-
export type FileType = 'CODE' | 'DOCUMENT' | 'PAPER' | 'IMAGE' | 'VIDEO';
|
|
3
|
+
export type FileType = 'CODE' | 'DOCUMENT' | 'PAPER' | 'IMAGE' | 'VIDEO' | 'AUDIO' | 'DATA' | 'UNKNOWN';
|
|
4
4
|
|
|
5
5
|
const CODE_EXTENSIONS = new Set([
|
|
6
6
|
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
@@ -28,6 +28,8 @@ const VIDEO_EXTENSIONS = new Set([
|
|
|
28
28
|
'.wmv', '.m4v',
|
|
29
29
|
]);
|
|
30
30
|
|
|
31
|
+
const AUDIO_EXTENSIONS = new Set(['.mp3', '.wav', '.flac', '.aac', '.ogg', '.m4a', '.wma']);
|
|
32
|
+
|
|
31
33
|
const PAPER_URL_PATTERNS = [
|
|
32
34
|
/arxiv\.org/,
|
|
33
35
|
/semanticscholar\.org/,
|
|
@@ -49,6 +51,7 @@ export function classifyFile(pathOrUrl: string): FileType {
|
|
|
49
51
|
|
|
50
52
|
if (IMAGE_EXTENSIONS.has(ext)) return 'IMAGE';
|
|
51
53
|
if (VIDEO_EXTENSIONS.has(ext)) return 'VIDEO';
|
|
54
|
+
if (AUDIO_EXTENSIONS.has(ext)) return 'AUDIO';
|
|
52
55
|
|
|
53
56
|
if (DOCUMENT_EXTENSIONS.has(ext)) {
|
|
54
57
|
if (ext === '.pdf' && PAPER_FILENAME_SIGNALS.some(p => p.test(pathOrUrl))) return 'PAPER';
|
|
@@ -57,7 +60,7 @@ export function classifyFile(pathOrUrl: string): FileType {
|
|
|
57
60
|
|
|
58
61
|
if (CODE_EXTENSIONS.has(ext)) return 'CODE';
|
|
59
62
|
|
|
60
|
-
return '
|
|
63
|
+
return 'UNKNOWN';
|
|
61
64
|
}
|
|
62
65
|
|
|
63
66
|
const PAPER_CONTENT_SIGNALS: RegExp[] = [
|
|
@@ -42,10 +42,55 @@ export interface BuildOptions extends Partial<PipelineOptions> {
|
|
|
42
42
|
incremental?: boolean;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
// Cross-process build mutex. Callers arrive from several independent entry points
|
|
46
|
+
// (session-start hook, MCP staleness auto-build, CLI, watcher), each with its own
|
|
47
|
+
// ad-hoc lock file that the others don't know about — concurrent builds then fail
|
|
48
|
+
// with "database is locked". Serialize here, the one place all builders pass through.
|
|
49
|
+
async function acquireBuildLock(dbPath: string): Promise<(() => void) | null> {
|
|
50
|
+
const { writeFileSync, readFileSync, statSync, unlinkSync } = await import('fs');
|
|
51
|
+
const lockPath = dbPath + '.build-lock';
|
|
52
|
+
const tryAcquire = (): boolean => {
|
|
53
|
+
try { writeFileSync(lockPath, String(process.pid), { flag: 'wx' }); return true; }
|
|
54
|
+
catch { return false; }
|
|
55
|
+
};
|
|
56
|
+
if (!tryAcquire()) {
|
|
57
|
+
// Reclaim if the holder is dead or the lock is older than 30 minutes
|
|
58
|
+
let stale = false;
|
|
59
|
+
try {
|
|
60
|
+
const pid = parseInt(readFileSync(lockPath, 'utf8'), 10);
|
|
61
|
+
try { process.kill(pid, 0); } catch { stale = true; }
|
|
62
|
+
if (!stale && Date.now() - statSync(lockPath).mtimeMs > 30 * 60 * 1000) stale = true;
|
|
63
|
+
} catch { stale = true; }
|
|
64
|
+
if (!stale) return null;
|
|
65
|
+
try { unlinkSync(lockPath); } catch { /* raced with another reclaimer */ }
|
|
66
|
+
if (!tryAcquire()) return null;
|
|
67
|
+
}
|
|
68
|
+
return () => { try { unlinkSync(lockPath); } catch { /* already gone */ } };
|
|
69
|
+
}
|
|
70
|
+
|
|
45
71
|
export async function buildAsync(repoPath: string, options: BuildOptions = {}): Promise<void> {
|
|
46
72
|
const dbPath = resolve(join(repoPath, '.monomind', 'monograph.db'));
|
|
47
73
|
const fullOptions: PipelineOptions = { ...DEFAULT_OPTIONS, ...options };
|
|
48
74
|
|
|
75
|
+
const releaseLock = await acquireBuildLock(dbPath);
|
|
76
|
+
if (!releaseLock) {
|
|
77
|
+
options.onProgress?.({ phase: 'skip', message: 'Another build is in progress — skipping' });
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
await buildAsyncLocked(repoPath, dbPath, fullOptions, options);
|
|
82
|
+
} finally {
|
|
83
|
+
releaseLock();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function buildAsyncLocked(
|
|
88
|
+
repoPath: string,
|
|
89
|
+
dbPath: string,
|
|
90
|
+
fullOptions: PipelineOptions,
|
|
91
|
+
options: BuildOptions,
|
|
92
|
+
): Promise<void> {
|
|
93
|
+
|
|
49
94
|
// Incremental guard: if the caller requested skip-when-fresh and force is
|
|
50
95
|
// not set, check staleness before opening the DB for a full write cycle.
|
|
51
96
|
if (options.incremental && !options.force) {
|
|
@@ -97,7 +142,7 @@ export async function buildAsync(repoPath: string, options: BuildOptions = {}):
|
|
|
97
142
|
db.prepare('SELECT DISTINCT file_path FROM nodes WHERE file_path IS NOT NULL').all() as { file_path: string }[]
|
|
98
143
|
)
|
|
99
144
|
.map((r) => r.file_path)
|
|
100
|
-
.filter((f) => !liveFiles.has(resolve(f)));
|
|
145
|
+
.filter((f) => !liveFiles.has(resolve(ctx.repoPath, f)));
|
|
101
146
|
if (staleFiles.length > 0) {
|
|
102
147
|
const deleteStale = db.transaction((files: string[]) => {
|
|
103
148
|
// Edges FK-reference nodes with no ON DELETE CASCADE, and a stale node
|
|
@@ -5,6 +5,13 @@ import type { CrossFileOutput } from './cross-file.js';
|
|
|
5
5
|
|
|
6
6
|
const EXCLUDED_LABELS = new Set(['File', 'Folder', 'Community', 'Concept']);
|
|
7
7
|
|
|
8
|
+
// Test files stay in the graph (useful for impact/navigation) but are excluded
|
|
9
|
+
// from centrality rankings — a heavily-importing test suite is not a god node.
|
|
10
|
+
const TEST_PATH_RE = /(\.test\.|\.spec\.|__tests__|__mocks__)/;
|
|
11
|
+
function isTestNode(n: { filePath?: string | null }): boolean {
|
|
12
|
+
return !!(n.filePath && TEST_PATH_RE.test(n.filePath));
|
|
13
|
+
}
|
|
14
|
+
|
|
8
15
|
export type GodNodeCategory =
|
|
9
16
|
| 'HIGH_CENTRALITY'
|
|
10
17
|
| 'BRIDGE_NODE'
|
|
@@ -58,7 +65,7 @@ export const godNodesPhase: PipelinePhase<GodNodesOutput> = {
|
|
|
58
65
|
const allFanIn: number[] = [];
|
|
59
66
|
const allFanOut: number[] = [];
|
|
60
67
|
for (const n of symbolNodes) {
|
|
61
|
-
if (EXCLUDED_LABELS.has(n.label)) continue;
|
|
68
|
+
if (EXCLUDED_LABELS.has(n.label) || isTestNode(n)) continue;
|
|
62
69
|
allFanIn.push(inDeg.get(n.id) ?? 0);
|
|
63
70
|
allFanOut.push(outDeg.get(n.id) ?? 0);
|
|
64
71
|
}
|
|
@@ -78,7 +85,8 @@ export const godNodesPhase: PipelinePhase<GodNodesOutput> = {
|
|
|
78
85
|
const p75FanOut = thresholds.p75FanOut;
|
|
79
86
|
|
|
80
87
|
const godNodes = symbolNodes
|
|
81
|
-
.filter(n => !EXCLUDED_LABELS.has(n.label) && (
|
|
88
|
+
.filter(n => !EXCLUDED_LABELS.has(n.label) && !isTestNode(n)
|
|
89
|
+
&& (inDeg.get(n.id) ?? 0) + (outDeg.get(n.id) ?? 0) > p95FanIn)
|
|
82
90
|
.map(n => {
|
|
83
91
|
const fanIn = inDeg.get(n.id) ?? 0;
|
|
84
92
|
const fanOut = outDeg.get(n.id) ?? 0;
|
|
@@ -55,6 +55,8 @@ export const scanPhase: PipelinePhase<ScanOutput> = {
|
|
|
55
55
|
|
|
56
56
|
for (const entry of entries) {
|
|
57
57
|
if (ignoreDirs.has(entry)) continue;
|
|
58
|
+
// Skip macOS AppleDouble resource fork files (._*) — common on ExFAT/network volumes
|
|
59
|
+
if (entry.startsWith('._')) continue;
|
|
58
60
|
const fullPath = join(dir, entry);
|
|
59
61
|
let stat: ReturnType<typeof statSync>;
|
|
60
62
|
try { stat = statSync(fullPath); } catch { continue; }
|
|
@@ -62,7 +62,7 @@ export const surprisesPhase: PipelinePhase<SurprisesOutput> = {
|
|
|
62
62
|
if (srcFilePath && tgtFilePath) {
|
|
63
63
|
const srcFileType = classifyFile(srcFilePath);
|
|
64
64
|
const tgtFileType = classifyFile(tgtFilePath);
|
|
65
|
-
if (srcFileType !== tgtFileType) {
|
|
65
|
+
if (srcFileType !== tgtFileType && srcFileType !== 'UNKNOWN' && tgtFileType !== 'UNKNOWN') {
|
|
66
66
|
score += WEIGHTS.crossRepo; // reuse unused crossRepo weight (0.15)
|
|
67
67
|
reasons.push(`cross-filetype (${srcFileType}→${tgtFileType})`);
|
|
68
68
|
}
|
package/src/storage/db.ts
CHANGED
|
@@ -16,6 +16,14 @@ export function openDb(dbPath: string): MonographDb {
|
|
|
16
16
|
const db = new Database(dbPath);
|
|
17
17
|
db.pragma('journal_mode = WAL');
|
|
18
18
|
db.pragma('foreign_keys = ON');
|
|
19
|
+
// Concurrent pipeline phases + long-lived MCP connections share this DB —
|
|
20
|
+
// without a busy timeout, writers fail immediately with "database is locked".
|
|
21
|
+
db.pragma('busy_timeout = 10000');
|
|
22
|
+
db.pragma('synchronous = NORMAL');
|
|
23
|
+
// node-store uses INSERT OR REPLACE; without recursive_triggers the implicit
|
|
24
|
+
// DELETE never fires the nodes_fts delete trigger, leaving ghost FTS rows that
|
|
25
|
+
// corrupt queries ("missing row N from content table") and bloat the index.
|
|
26
|
+
db.pragma('recursive_triggers = ON');
|
|
19
27
|
applyMigrations(db);
|
|
20
28
|
return db;
|
|
21
29
|
} catch (err) {
|
package/src/watch/watcher.ts
CHANGED
|
@@ -3,7 +3,6 @@ import { EventEmitter } from 'events';
|
|
|
3
3
|
import { isSupportedExtension } from '../parsers/loader.js';
|
|
4
4
|
import type { PipelineProgress } from '../types.js';
|
|
5
5
|
import { extname } from 'path';
|
|
6
|
-
import { platform } from 'os';
|
|
7
6
|
|
|
8
7
|
export interface WatcherOptions {
|
|
9
8
|
debounceMs?: number; // default 3000ms
|
|
@@ -24,10 +23,23 @@ export async function watchAsync(
|
|
|
24
23
|
const { buildAsync } = await import('../pipeline/orchestrator.js');
|
|
25
24
|
const watcher = new MonographWatcher(repoPath, { debounceMs: opts.debounceMs ?? 3000 });
|
|
26
25
|
|
|
26
|
+
// monolean: full rebuild per change-batch, serialized — true incremental rebuild
|
|
27
|
+
// (re-parse only changed files) requires restructuring the phase pipeline.
|
|
28
|
+
let building = false;
|
|
29
|
+
let rerun = false;
|
|
27
30
|
watcher.on('monograph:updated', async (files: string[]) => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
if (building) { rerun = true; return; } // coalesce saves that land mid-build
|
|
32
|
+
building = true;
|
|
33
|
+
try {
|
|
34
|
+
do {
|
|
35
|
+
rerun = false;
|
|
36
|
+
opts.onProgress?.({ phase: 'watch', message: `Changed: ${files.slice(0, 3).join(', ')}` });
|
|
37
|
+
await buildAsync(repoPath, { onProgress: opts.onProgress, force: opts.force, codeOnly: opts.codeOnly, llmMaxSections: opts.llmMaxSections ?? 0 });
|
|
38
|
+
opts.onProgress?.({ phase: 'watch', message: 'Graph rebuilt.' });
|
|
39
|
+
} while (rerun);
|
|
40
|
+
} finally {
|
|
41
|
+
building = false;
|
|
42
|
+
}
|
|
31
43
|
});
|
|
32
44
|
|
|
33
45
|
await watcher.start();
|
|
@@ -46,7 +58,10 @@ export class MonographWatcher extends EventEmitter {
|
|
|
46
58
|
}
|
|
47
59
|
|
|
48
60
|
async start(): Promise<void> {
|
|
49
|
-
|
|
61
|
+
// FSEvents works natively on macOS — polling the whole tree every second is
|
|
62
|
+
// far more expensive (especially on external/exFAT volumes). Poll only when
|
|
63
|
+
// explicitly requested via env (e.g. network mounts where events don't fire).
|
|
64
|
+
const usePolling = process.env.MONOGRAPH_WATCH_POLL === '1';
|
|
50
65
|
|
|
51
66
|
this.watcher = chokidar.watch(this.repoPath, {
|
|
52
67
|
ignored: [
|
package/vitest.config.ts
CHANGED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "mastermind-review-1782162423447",
|
|
3
|
-
"sessionId": "mastermind-review-1782162423447",
|
|
4
|
-
"type": "tillend",
|
|
5
|
-
"command": "/mastermind:review",
|
|
6
|
-
"prompt": "check the updates on monograph and monoplaybook",
|
|
7
|
-
"maxReps": 50,
|
|
8
|
-
"interval": 1,
|
|
9
|
-
"wait": 60,
|
|
10
|
-
"currentRep": 1,
|
|
11
|
-
"startedAt": 1782162423447,
|
|
12
|
-
"lastRunAt": 1782162423447,
|
|
13
|
-
"nextRunAt": 1782162423447,
|
|
14
|
-
"status": "running",
|
|
15
|
-
"source": "_repeat.md"
|
|
16
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "session-1777578175215",
|
|
3
|
-
"startedAt": "2026-04-30T19:42:55.215Z",
|
|
4
|
-
"platform": "darwin",
|
|
5
|
-
"cwd": "/Users/morteza/Desktop/tools/monomind/packages/@monomind/monograph",
|
|
6
|
-
"context": {},
|
|
7
|
-
"metrics": {
|
|
8
|
-
"edits": 42,
|
|
9
|
-
"commands": 0,
|
|
10
|
-
"tasks": 10,
|
|
11
|
-
"errors": 0
|
|
12
|
-
},
|
|
13
|
-
"endedAt": "2026-05-03T15:52:50.959Z",
|
|
14
|
-
"duration": 245395745
|
|
15
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "session-1777823684507",
|
|
3
|
-
"startedAt": "2026-05-03T15:54:44.507Z",
|
|
4
|
-
"platform": "darwin",
|
|
5
|
-
"cwd": "/Users/morteza/Desktop/tools/monomind/packages/@monomind/monograph",
|
|
6
|
-
"context": {},
|
|
7
|
-
"metrics": {
|
|
8
|
-
"edits": 34,
|
|
9
|
-
"commands": 0,
|
|
10
|
-
"tasks": 0,
|
|
11
|
-
"errors": 0
|
|
12
|
-
},
|
|
13
|
-
"endedAt": "2026-05-04T21:07:59.511Z",
|
|
14
|
-
"duration": 105195004
|
|
15
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "session-1777928944749",
|
|
3
|
-
"startedAt": "2026-05-04T21:09:04.749Z",
|
|
4
|
-
"platform": "darwin",
|
|
5
|
-
"cwd": "/Users/morteza/Desktop/tools/monomind/packages/@monomind/monograph",
|
|
6
|
-
"context": {},
|
|
7
|
-
"metrics": {
|
|
8
|
-
"edits": 18,
|
|
9
|
-
"commands": 0,
|
|
10
|
-
"tasks": 3,
|
|
11
|
-
"errors": 0
|
|
12
|
-
},
|
|
13
|
-
"endedAt": "2026-05-06T07:32:36.650Z",
|
|
14
|
-
"duration": 123811901
|
|
15
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "session-1778052902210",
|
|
3
|
-
"startedAt": "2026-05-06T07:35:02.210Z",
|
|
4
|
-
"platform": "darwin",
|
|
5
|
-
"cwd": "/Users/morteza/Desktop/tools/monomind/packages/@monomind/monograph",
|
|
6
|
-
"context": {},
|
|
7
|
-
"metrics": {
|
|
8
|
-
"edits": 29,
|
|
9
|
-
"commands": 0,
|
|
10
|
-
"tasks": 2,
|
|
11
|
-
"errors": 0
|
|
12
|
-
},
|
|
13
|
-
"endedAt": "2026-05-06T08:37:15.370Z",
|
|
14
|
-
"duration": 3733161
|
|
15
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "session-1778056744636",
|
|
3
|
-
"startedAt": "2026-05-06T08:39:04.636Z",
|
|
4
|
-
"platform": "darwin",
|
|
5
|
-
"cwd": "/Users/morteza/Desktop/tools/monomind/packages/@monomind/monograph",
|
|
6
|
-
"context": {},
|
|
7
|
-
"metrics": {
|
|
8
|
-
"edits": 30,
|
|
9
|
-
"commands": 0,
|
|
10
|
-
"tasks": 2,
|
|
11
|
-
"errors": 0
|
|
12
|
-
},
|
|
13
|
-
"endedAt": "2026-05-06T09:49:21.825Z",
|
|
14
|
-
"duration": 4217190
|
|
15
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "session-1778061077599",
|
|
3
|
-
"startedAt": "2026-05-06T09:51:17.599Z",
|
|
4
|
-
"platform": "darwin",
|
|
5
|
-
"cwd": "/Users/morteza/Desktop/tools/monomind/packages/@monomind/monograph",
|
|
6
|
-
"context": {},
|
|
7
|
-
"metrics": {
|
|
8
|
-
"edits": 11,
|
|
9
|
-
"commands": 0,
|
|
10
|
-
"tasks": 0,
|
|
11
|
-
"errors": 0
|
|
12
|
-
},
|
|
13
|
-
"endedAt": "2026-05-06T21:13:36.832Z",
|
|
14
|
-
"duration": 40939234
|
|
15
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "session-1778102154764",
|
|
3
|
-
"startedAt": "2026-05-06T21:15:54.764Z",
|
|
4
|
-
"platform": "darwin",
|
|
5
|
-
"cwd": "/Users/morteza/Desktop/tools/monomind/packages/@monomind/monograph",
|
|
6
|
-
"context": {},
|
|
7
|
-
"metrics": {
|
|
8
|
-
"edits": 12,
|
|
9
|
-
"commands": 0,
|
|
10
|
-
"tasks": 0,
|
|
11
|
-
"errors": 0
|
|
12
|
-
},
|
|
13
|
-
"endedAt": "2026-05-09T05:42:40.302Z",
|
|
14
|
-
"duration": 203205539
|
|
15
|
-
}
|
package/dist/src/claude-cli.d.ts
DELETED