fivocell 4.7.0 → 4.8.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/__tests__/ai-memory-summarizer.test.d.ts +2 -0
- package/dist/__tests__/ai-memory-summarizer.test.d.ts.map +1 -0
- package/dist/__tests__/ai-memory-summarizer.test.js +40 -0
- package/dist/__tests__/ai-memory-summarizer.test.js.map +1 -0
- package/dist/__tests__/memory-search.test.d.ts +2 -0
- package/dist/__tests__/memory-search.test.d.ts.map +1 -0
- package/dist/__tests__/memory-search.test.js +48 -0
- package/dist/__tests__/memory-search.test.js.map +1 -0
- package/dist/__tests__/proactive-insights.test.d.ts +2 -0
- package/dist/__tests__/proactive-insights.test.d.ts.map +1 -0
- package/dist/__tests__/proactive-insights.test.js +50 -0
- package/dist/__tests__/proactive-insights.test.js.map +1 -0
- package/dist/__tests__/weekly-report.test.d.ts +2 -0
- package/dist/__tests__/weekly-report.test.d.ts.map +1 -0
- package/dist/__tests__/weekly-report.test.js +83 -0
- package/dist/__tests__/weekly-report.test.js.map +1 -0
- package/dist/walls/06-memory/database/database.d.ts.map +1 -1
- package/dist/walls/06-memory/database/database.js +28 -1
- package/dist/walls/06-memory/database/database.js.map +1 -1
- package/dist/walls/06-memory/stores/ai-memory-summarizer.d.ts +22 -0
- package/dist/walls/06-memory/stores/ai-memory-summarizer.d.ts.map +1 -0
- package/dist/walls/06-memory/stores/ai-memory-summarizer.js +144 -0
- package/dist/walls/06-memory/stores/ai-memory-summarizer.js.map +1 -0
- package/dist/walls/06-memory/stores/memory-search.d.ts +26 -0
- package/dist/walls/06-memory/stores/memory-search.d.ts.map +1 -0
- package/dist/walls/06-memory/stores/memory-search.js +129 -0
- package/dist/walls/06-memory/stores/memory-search.js.map +1 -0
- package/dist/walls/06-memory/stores/proactive-insights.d.ts +19 -0
- package/dist/walls/06-memory/stores/proactive-insights.d.ts.map +1 -0
- package/dist/walls/06-memory/stores/proactive-insights.js +142 -0
- package/dist/walls/06-memory/stores/proactive-insights.js.map +1 -0
- package/dist/walls/06-memory/stores/weekly-report.d.ts +19 -0
- package/dist/walls/06-memory/stores/weekly-report.d.ts.map +1 -0
- package/dist/walls/06-memory/stores/weekly-report.js +206 -0
- package/dist/walls/06-memory/stores/weekly-report.js.map +1 -0
- package/dist/walls/07-runtime/cli/cli.js +90 -0
- package/dist/walls/07-runtime/cli/cli.js.map +1 -1
- package/dist/walls/07-runtime/daemon/server.d.ts.map +1 -1
- package/dist/walls/07-runtime/daemon/server.js +41 -0
- package/dist/walls/07-runtime/daemon/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-search.d.ts","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/memory-search.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,GAAG,YAAY,GAAG,QAAQ,CAAC;CAChD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,EAAE,CA8DxE;AAmCD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB/E"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fuzzySearchMemory = fuzzySearchMemory;
|
|
4
|
+
exports.getSearchSuggestions = getSearchSuggestions;
|
|
5
|
+
const database_1 = require("../database/database");
|
|
6
|
+
function fuzzySearchMemory(options) {
|
|
7
|
+
const db = (0, database_1.getDb)();
|
|
8
|
+
const { query, project, type, minImportance, maxImportance, topic, days, limit = 20, sortBy = 'relevance' } = options;
|
|
9
|
+
let sql = 'SELECT * FROM memory_events WHERE 1=1';
|
|
10
|
+
const params = [];
|
|
11
|
+
if (project) {
|
|
12
|
+
sql += ' AND project = ?';
|
|
13
|
+
params.push(project);
|
|
14
|
+
}
|
|
15
|
+
if (type) {
|
|
16
|
+
sql += ' AND type = ?';
|
|
17
|
+
params.push(type);
|
|
18
|
+
}
|
|
19
|
+
if (minImportance !== undefined) {
|
|
20
|
+
sql += ' AND importance >= ?';
|
|
21
|
+
params.push(minImportance);
|
|
22
|
+
}
|
|
23
|
+
if (maxImportance !== undefined) {
|
|
24
|
+
sql += ' AND importance <= ?';
|
|
25
|
+
params.push(maxImportance);
|
|
26
|
+
}
|
|
27
|
+
if (topic) {
|
|
28
|
+
sql += ' AND topic = ?';
|
|
29
|
+
params.push(topic);
|
|
30
|
+
}
|
|
31
|
+
if (days) {
|
|
32
|
+
const since = new Date(Date.now() - days * 86400000).toISOString();
|
|
33
|
+
sql += ' AND created_at >= ?';
|
|
34
|
+
params.push(since);
|
|
35
|
+
}
|
|
36
|
+
// Text search with LIKE for fuzzy matching
|
|
37
|
+
if (query) {
|
|
38
|
+
const terms = query.toLowerCase().split(/\s+/).filter(Boolean);
|
|
39
|
+
const conditions = terms.map(() => '(LOWER(summary) LIKE ? OR LOWER(details_json) LIKE ? OR LOWER(topic) LIKE ? OR LOWER(files_json) LIKE ?)');
|
|
40
|
+
sql += ` AND (${conditions.join(' OR ')})`;
|
|
41
|
+
for (const term of terms) {
|
|
42
|
+
const like = `%${term}%`;
|
|
43
|
+
params.push(like, like, like, like);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Sort
|
|
47
|
+
switch (sortBy) {
|
|
48
|
+
case 'importance':
|
|
49
|
+
sql += ' ORDER BY importance DESC, created_at DESC';
|
|
50
|
+
break;
|
|
51
|
+
case 'recent':
|
|
52
|
+
sql += ' ORDER BY created_at DESC';
|
|
53
|
+
break;
|
|
54
|
+
case 'relevance':
|
|
55
|
+
default:
|
|
56
|
+
if (query) {
|
|
57
|
+
// Boost by importance and match quality
|
|
58
|
+
sql += ' ORDER BY importance DESC, created_at DESC';
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
sql += ' ORDER BY created_at DESC';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
sql += ` LIMIT ?`;
|
|
65
|
+
params.push(limit);
|
|
66
|
+
const rows = db.prepare(sql).all(...params);
|
|
67
|
+
// Calculate relevance score
|
|
68
|
+
if (query && sortBy === 'relevance') {
|
|
69
|
+
const terms = query.toLowerCase().split(/\s+/).filter(Boolean);
|
|
70
|
+
for (const row of rows) {
|
|
71
|
+
row.score = calcRelevanceScore(row, terms);
|
|
72
|
+
}
|
|
73
|
+
rows.sort((a, b) => b.score - a.score);
|
|
74
|
+
}
|
|
75
|
+
return rows;
|
|
76
|
+
}
|
|
77
|
+
function calcRelevanceScore(row, terms) {
|
|
78
|
+
let score = 0;
|
|
79
|
+
const summaryLower = (row.summary || '').toLowerCase();
|
|
80
|
+
const detailsLower = (row.details_json || '').toLowerCase();
|
|
81
|
+
const topicLower = (row.topic || '').toLowerCase();
|
|
82
|
+
const filesLower = (row.files_json || '').toLowerCase();
|
|
83
|
+
for (const term of terms) {
|
|
84
|
+
// Exact match in summary = high score
|
|
85
|
+
if (summaryLower.includes(term))
|
|
86
|
+
score += 30;
|
|
87
|
+
// Match in topic
|
|
88
|
+
if (topicLower.includes(term))
|
|
89
|
+
score += 25;
|
|
90
|
+
// Match in details
|
|
91
|
+
if (detailsLower.includes(term))
|
|
92
|
+
score += 20;
|
|
93
|
+
// Match in files
|
|
94
|
+
if (filesLower.includes(term))
|
|
95
|
+
score += 15;
|
|
96
|
+
}
|
|
97
|
+
// Importance boost
|
|
98
|
+
score += row.importance * 3;
|
|
99
|
+
// Recency boost (last 24h = +20, last 7d = +10)
|
|
100
|
+
const ageHours = (Date.now() - new Date(row.created_at).getTime()) / 3600000;
|
|
101
|
+
if (ageHours < 24)
|
|
102
|
+
score += 20;
|
|
103
|
+
else if (ageHours < 168)
|
|
104
|
+
score += 10;
|
|
105
|
+
// Type boost for important types
|
|
106
|
+
const typeBoost = { decision: 15, error: 12, fix: 14, pattern: 13, product_rule: 16 };
|
|
107
|
+
score += typeBoost[row.type] || 0;
|
|
108
|
+
return score;
|
|
109
|
+
}
|
|
110
|
+
function getSearchSuggestions(project, partial) {
|
|
111
|
+
const db = (0, database_1.getDb)();
|
|
112
|
+
const like = `%${partial.toLowerCase()}%`;
|
|
113
|
+
const rows = db.prepare(`
|
|
114
|
+
SELECT DISTINCT topic FROM memory_events
|
|
115
|
+
WHERE project = ? AND topic IS NOT NULL AND LOWER(topic) LIKE ?
|
|
116
|
+
ORDER BY topic LIMIT 10
|
|
117
|
+
`).all(project, like);
|
|
118
|
+
const summaryRows = db.prepare(`
|
|
119
|
+
SELECT DISTINCT summary FROM memory_events
|
|
120
|
+
WHERE project = ? AND LOWER(summary) LIKE ?
|
|
121
|
+
ORDER BY created_at DESC LIMIT 5
|
|
122
|
+
`).all(project, like);
|
|
123
|
+
const suggestions = [
|
|
124
|
+
...rows.map(r => r.topic),
|
|
125
|
+
...summaryRows.map(r => r.summary.slice(0, 60)),
|
|
126
|
+
];
|
|
127
|
+
return [...new Set(suggestions)].slice(0, 10);
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=memory-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-search.js","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/memory-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface ProactiveAlert {
|
|
2
|
+
type: 'repeat_mistake' | 'error_spike' | 'stalled_handoff' | 'low_verification' | 'complexity_grow' | 'decision_gap' | 'file_hotspot';
|
|
3
|
+
severity: 'critical' | 'warning' | 'info';
|
|
4
|
+
title: string;
|
|
5
|
+
description: string;
|
|
6
|
+
suggestion: string;
|
|
7
|
+
confidence: number;
|
|
8
|
+
evidence: string[];
|
|
9
|
+
createdAt: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function generateProactiveAlerts(project: string, days?: number): ProactiveAlert[];
|
|
12
|
+
export declare function getAlertSummary(project: string, days?: number): {
|
|
13
|
+
total: number;
|
|
14
|
+
critical: number;
|
|
15
|
+
warnings: number;
|
|
16
|
+
info: number;
|
|
17
|
+
alerts: ProactiveAlert[];
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=proactive-insights.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proactive-insights.d.ts","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/proactive-insights.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,gBAAgB,GAAG,aAAa,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,cAAc,GAAG,cAAc,CAAC;IACtI,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,cAAc,EAAE,CA+I5F;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B,CASA"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateProactiveAlerts = generateProactiveAlerts;
|
|
4
|
+
exports.getAlertSummary = getAlertSummary;
|
|
5
|
+
const database_1 = require("../database/database");
|
|
6
|
+
function generateProactiveAlerts(project, days = 14) {
|
|
7
|
+
const db = (0, database_1.getDb)();
|
|
8
|
+
const alerts = [];
|
|
9
|
+
const since = new Date(Date.now() - days * 86400000).toISOString();
|
|
10
|
+
// 1. Repeat mistakes — same error summary multiple times
|
|
11
|
+
const repeatErrors = db.prepare(`
|
|
12
|
+
SELECT summary, COUNT(*) as c FROM memory_events
|
|
13
|
+
WHERE project = ? AND type = 'error' AND created_at >= ?
|
|
14
|
+
GROUP BY summary HAVING c >= 3
|
|
15
|
+
ORDER BY c DESC LIMIT 5
|
|
16
|
+
`).all(project, since);
|
|
17
|
+
for (const e of repeatErrors) {
|
|
18
|
+
alerts.push({
|
|
19
|
+
type: 'repeat_mistake',
|
|
20
|
+
severity: e.c >= 5 ? 'critical' : 'warning',
|
|
21
|
+
title: `Repeated error: "${e.summary.slice(0, 60)}"`,
|
|
22
|
+
description: `This error occurred ${e.c} times in ${days} days — systematic fix needed`,
|
|
23
|
+
suggestion: 'Create a fix and log it with cell memory record --type fix',
|
|
24
|
+
confidence: 0.85,
|
|
25
|
+
evidence: [`${e.c} occurrences`],
|
|
26
|
+
createdAt: new Date().toISOString(),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
// 2. Error spike — error rate > 30% of total events
|
|
30
|
+
const statsRow = db.prepare(`
|
|
31
|
+
SELECT
|
|
32
|
+
COUNT(*) as total,
|
|
33
|
+
SUM(CASE WHEN type = 'error' THEN 1 ELSE 0 END) as errors,
|
|
34
|
+
SUM(CASE WHEN type = 'fix' THEN 1 ELSE 0 END) as fixes
|
|
35
|
+
FROM memory_events
|
|
36
|
+
WHERE project = ? AND created_at >= ?
|
|
37
|
+
`).get(project, since);
|
|
38
|
+
if (statsRow.total > 10) {
|
|
39
|
+
const errorRate = statsRow.errors / statsRow.total;
|
|
40
|
+
if (errorRate > 0.3) {
|
|
41
|
+
alerts.push({
|
|
42
|
+
type: 'error_spike',
|
|
43
|
+
severity: 'critical',
|
|
44
|
+
title: `High error rate: ${Math.round(errorRate * 100)}%`,
|
|
45
|
+
description: `${statsRow.errors} errors out of ${statsRow.total} events — code quality dropping`,
|
|
46
|
+
suggestion: 'Pause feature work, focus on fixes and testing',
|
|
47
|
+
confidence: 0.9,
|
|
48
|
+
evidence: [`${statsRow.errors} errors`, `${statsRow.fixes} fixes`, `Rate: ${Math.round(errorRate * 100)}%`],
|
|
49
|
+
createdAt: new Date().toISOString(),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// 3. Stalled handoff — no updates in 3+ days
|
|
54
|
+
const handoffRow = db.prepare(`
|
|
55
|
+
SELECT MAX(created_at) as last_update FROM memory_events
|
|
56
|
+
WHERE project = ? AND type = 'handoff'
|
|
57
|
+
`).get(project);
|
|
58
|
+
if (handoffRow?.last_update) {
|
|
59
|
+
const daysSince = (Date.now() - new Date(handoffRow.last_update).getTime()) / 86400000;
|
|
60
|
+
if (daysSince > 3) {
|
|
61
|
+
alerts.push({
|
|
62
|
+
type: 'stalled_handoff',
|
|
63
|
+
severity: 'warning',
|
|
64
|
+
title: `Handoff stale: ${Math.round(daysSince)} days old`,
|
|
65
|
+
description: 'No handoff updates recently — context may be lost',
|
|
66
|
+
suggestion: 'Run cell handoff --log to update current context',
|
|
67
|
+
confidence: 0.7,
|
|
68
|
+
evidence: [`Last update: ${handoffRow.last_update}`],
|
|
69
|
+
createdAt: new Date().toISOString(),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// 4. Low verification — many edits but no verifications
|
|
74
|
+
const editCount = db.prepare("SELECT COUNT(*) as c FROM memory_events WHERE project = ? AND type = 'edit' AND created_at >= ?").get(project, since);
|
|
75
|
+
const verifCount = db.prepare("SELECT COUNT(*) as c FROM memory_events WHERE project = ? AND type = 'verification' AND created_at >= ?").get(project, since);
|
|
76
|
+
if (editCount.c > 15 && verifCount.c === 0) {
|
|
77
|
+
alerts.push({
|
|
78
|
+
type: 'low_verification',
|
|
79
|
+
severity: 'warning',
|
|
80
|
+
title: `${editCount.c} edits but zero verifications`,
|
|
81
|
+
description: 'No test/lint/build verifications logged — bugs may slip through',
|
|
82
|
+
suggestion: 'Log verifications with cell memory record --type verification',
|
|
83
|
+
confidence: 0.75,
|
|
84
|
+
evidence: [`${editCount.c} edits`, '0 verifications'],
|
|
85
|
+
createdAt: new Date().toISOString(),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
// 5. File hotspot — one file touched > 10 times
|
|
89
|
+
const hotspots = db.prepare(`
|
|
90
|
+
SELECT files_json, COUNT(*) as c FROM memory_events
|
|
91
|
+
WHERE project = ? AND files_json IS NOT NULL AND created_at >= ?
|
|
92
|
+
GROUP BY files_json HAVING c >= 10
|
|
93
|
+
ORDER BY c DESC LIMIT 3
|
|
94
|
+
`).all(project, since);
|
|
95
|
+
for (const h of hotspots) {
|
|
96
|
+
try {
|
|
97
|
+
const files = JSON.parse(h.files_json);
|
|
98
|
+
if (files.length > 0) {
|
|
99
|
+
alerts.push({
|
|
100
|
+
type: 'file_hotspot',
|
|
101
|
+
severity: 'info',
|
|
102
|
+
title: `Hotspot: ${files[0]}`,
|
|
103
|
+
description: `File touched ${h.c} times — may need refactoring or splitting`,
|
|
104
|
+
suggestion: 'Consider extracting a separate module',
|
|
105
|
+
confidence: 0.65,
|
|
106
|
+
evidence: [`${h.c} edits to same file`],
|
|
107
|
+
createdAt: new Date().toISOString(),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch { }
|
|
112
|
+
}
|
|
113
|
+
// 6. Decision gap — many events but no decisions logged
|
|
114
|
+
const decisionCount = db.prepare("SELECT COUNT(*) as c FROM memory_events WHERE project = ? AND type = 'decision' AND created_at >= ?").get(project, since);
|
|
115
|
+
if (statsRow.total > 30 && decisionCount.c === 0) {
|
|
116
|
+
alerts.push({
|
|
117
|
+
type: 'decision_gap',
|
|
118
|
+
severity: 'info',
|
|
119
|
+
title: 'No decisions logged',
|
|
120
|
+
description: `${statsRow.total} events but zero decisions — memory won't capture reasoning`,
|
|
121
|
+
suggestion: 'Log key decisions with cell memory record --type decision',
|
|
122
|
+
confidence: 0.6,
|
|
123
|
+
evidence: [`${statsRow.total} events`, '0 decisions'],
|
|
124
|
+
createdAt: new Date().toISOString(),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return alerts.sort((a, b) => {
|
|
128
|
+
const sevOrder = { critical: 0, warning: 1, info: 2 };
|
|
129
|
+
return sevOrder[a.severity] - sevOrder[b.severity];
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
function getAlertSummary(project, days = 14) {
|
|
133
|
+
const alerts = generateProactiveAlerts(project, days);
|
|
134
|
+
return {
|
|
135
|
+
total: alerts.length,
|
|
136
|
+
critical: alerts.filter(a => a.severity === 'critical').length,
|
|
137
|
+
warnings: alerts.filter(a => a.severity === 'warning').length,
|
|
138
|
+
info: alerts.filter(a => a.severity === 'info').length,
|
|
139
|
+
alerts,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=proactive-insights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proactive-insights.js","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/proactive-insights.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface WeeklyReport {
|
|
2
|
+
project: string;
|
|
3
|
+
weekStart: string;
|
|
4
|
+
weekEnd: string;
|
|
5
|
+
totalEvents: number;
|
|
6
|
+
avgImportance: number;
|
|
7
|
+
byType: Record<string, number>;
|
|
8
|
+
topTopics: string[];
|
|
9
|
+
keyDecisions: string[];
|
|
10
|
+
errors: string[];
|
|
11
|
+
fixes: string[];
|
|
12
|
+
insights: string[];
|
|
13
|
+
handoffSummary: string;
|
|
14
|
+
productivityScore: number;
|
|
15
|
+
markdown: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function generateWeeklyReport(project: string, projectDir?: string): WeeklyReport;
|
|
18
|
+
export declare function saveWeeklyReport(report: WeeklyReport, projectDir?: string): string;
|
|
19
|
+
//# sourceMappingURL=weekly-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weekly-report.d.ts","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/weekly-report.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,CAiFvF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAUlF"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.generateWeeklyReport = generateWeeklyReport;
|
|
37
|
+
exports.saveWeeklyReport = saveWeeklyReport;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const database_1 = require("../database/database");
|
|
41
|
+
function generateWeeklyReport(project, projectDir) {
|
|
42
|
+
const db = (0, database_1.getDb)();
|
|
43
|
+
const now = new Date();
|
|
44
|
+
const weekEnd = now.toISOString().slice(0, 10);
|
|
45
|
+
const weekStart = new Date(now.getTime() - 7 * 86400000).toISOString().slice(0, 10);
|
|
46
|
+
const since = new Date(now.getTime() - 7 * 86400000).toISOString();
|
|
47
|
+
// Events
|
|
48
|
+
const events = db.prepare(`
|
|
49
|
+
SELECT type, summary, importance, topic, created_at FROM memory_events
|
|
50
|
+
WHERE project = ? AND created_at >= ?
|
|
51
|
+
ORDER BY importance DESC
|
|
52
|
+
`).all(project, since);
|
|
53
|
+
const totalEvents = events.length;
|
|
54
|
+
const avgImportance = totalEvents > 0
|
|
55
|
+
? Math.round(events.reduce((s, e) => s + e.importance, 0) / totalEvents * 10) / 10
|
|
56
|
+
: 0;
|
|
57
|
+
// By type
|
|
58
|
+
const byType = {};
|
|
59
|
+
for (const e of events)
|
|
60
|
+
byType[e.type] = (byType[e.type] || 0) + 1;
|
|
61
|
+
// Topics
|
|
62
|
+
const topicMap = new Map();
|
|
63
|
+
for (const e of events) {
|
|
64
|
+
if (e.topic)
|
|
65
|
+
topicMap.set(e.topic, (topicMap.get(e.topic) || 0) + 1);
|
|
66
|
+
}
|
|
67
|
+
const topTopics = [...topicMap.entries()].sort((a, b) => b[1] - a[1]).slice(0, 5).map(([t]) => t);
|
|
68
|
+
// Decisions, errors, fixes
|
|
69
|
+
const keyDecisions = events.filter(e => e.type === 'decision').slice(0, 10).map(e => e.summary);
|
|
70
|
+
const errors = events.filter(e => e.type === 'error').slice(0, 10).map(e => e.summary);
|
|
71
|
+
const fixes = events.filter(e => e.type === 'fix').slice(0, 10).map(e => e.summary);
|
|
72
|
+
// Insights from memory_insights
|
|
73
|
+
let insights = [];
|
|
74
|
+
try {
|
|
75
|
+
const { generateMemoryInsights } = require('./memory-insights');
|
|
76
|
+
const memInsights = generateMemoryInsights(project, 7);
|
|
77
|
+
insights = memInsights.slice(0, 5).map((i) => `${i.title}: ${i.description}`);
|
|
78
|
+
}
|
|
79
|
+
catch { }
|
|
80
|
+
// Handoff summary
|
|
81
|
+
let handoffSummary = 'No handoff data';
|
|
82
|
+
try {
|
|
83
|
+
const handoffPath = projectDir
|
|
84
|
+
? path.join(projectDir, '.cell', 'handoff', 'current.md')
|
|
85
|
+
: path.join(process.cwd(), '.cell', 'handoff', 'current.md');
|
|
86
|
+
if (fs.existsSync(handoffPath)) {
|
|
87
|
+
const content = fs.readFileSync(handoffPath, 'utf-8');
|
|
88
|
+
const lines = content.split('\n').filter(l => l.trim());
|
|
89
|
+
handoffSummary = lines.slice(0, 10).join('\n');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch { }
|
|
93
|
+
// Productivity score (0-10)
|
|
94
|
+
const productivityScore = calcProductivityScore(events, totalEvents, keyDecisions.length, errors.length, fixes.length);
|
|
95
|
+
// Generate markdown
|
|
96
|
+
const markdown = buildMarkdownReport(project, weekStart, weekEnd, totalEvents, avgImportance, byType, topTopics, keyDecisions, errors, fixes, insights, handoffSummary, productivityScore);
|
|
97
|
+
return {
|
|
98
|
+
project,
|
|
99
|
+
weekStart,
|
|
100
|
+
weekEnd,
|
|
101
|
+
totalEvents,
|
|
102
|
+
avgImportance,
|
|
103
|
+
byType,
|
|
104
|
+
topTopics,
|
|
105
|
+
keyDecisions,
|
|
106
|
+
errors,
|
|
107
|
+
fixes,
|
|
108
|
+
insights,
|
|
109
|
+
handoffSummary,
|
|
110
|
+
productivityScore,
|
|
111
|
+
markdown,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function saveWeeklyReport(report, projectDir) {
|
|
115
|
+
const dir = projectDir
|
|
116
|
+
? path.join(projectDir, '.cell', 'memory', 'summaries', 'weekly')
|
|
117
|
+
: path.join(process.cwd(), '.cell', 'memory', 'summaries', 'weekly');
|
|
118
|
+
if (!fs.existsSync(dir))
|
|
119
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
120
|
+
const filePath = path.join(dir, `${report.weekEnd}.md`);
|
|
121
|
+
fs.writeFileSync(filePath, report.markdown, 'utf-8');
|
|
122
|
+
return filePath;
|
|
123
|
+
}
|
|
124
|
+
function calcProductivityScore(events, total, decisions, errors, fixes) {
|
|
125
|
+
if (total === 0)
|
|
126
|
+
return 0;
|
|
127
|
+
let score = 5;
|
|
128
|
+
// Bonus for decisions
|
|
129
|
+
if (decisions > 3)
|
|
130
|
+
score += 1.5;
|
|
131
|
+
else if (decisions > 0)
|
|
132
|
+
score += 0.5;
|
|
133
|
+
// Bonus for fixes after errors
|
|
134
|
+
if (errors > 0 && fixes > 0)
|
|
135
|
+
score += 1;
|
|
136
|
+
// Penalty for high error rate
|
|
137
|
+
if (errors > total * 0.3)
|
|
138
|
+
score -= 2;
|
|
139
|
+
else if (errors > total * 0.15)
|
|
140
|
+
score -= 1;
|
|
141
|
+
// Bonus for high avg importance
|
|
142
|
+
const avgImp = events.reduce((s, e) => s + e.importance, 0) / total;
|
|
143
|
+
if (avgImp > 6)
|
|
144
|
+
score += 1;
|
|
145
|
+
// Bonus for volume
|
|
146
|
+
if (total > 20)
|
|
147
|
+
score += 0.5;
|
|
148
|
+
return Math.max(1, Math.min(10, Math.round(score * 10) / 10));
|
|
149
|
+
}
|
|
150
|
+
function buildMarkdownReport(project, weekStart, weekEnd, totalEvents, avgImportance, byType, topTopics, keyDecisions, errors, fixes, insights, handoffSummary, productivityScore) {
|
|
151
|
+
const lines = [];
|
|
152
|
+
lines.push(`# Weekly Report — ${project}`);
|
|
153
|
+
lines.push(`**${weekStart} → ${weekEnd}**\n`);
|
|
154
|
+
lines.push(`## Overview`);
|
|
155
|
+
lines.push(`| Metric | Value |`);
|
|
156
|
+
lines.push(`|--------|-------|`);
|
|
157
|
+
lines.push(`| Total events | ${totalEvents} |`);
|
|
158
|
+
lines.push(`| Avg importance | ${avgImportance} |`);
|
|
159
|
+
lines.push(`| Productivity score | ${productivityScore}/10 |`);
|
|
160
|
+
lines.push('');
|
|
161
|
+
if (topTopics.length > 0) {
|
|
162
|
+
lines.push(`## Top Topics`);
|
|
163
|
+
for (const t of topTopics)
|
|
164
|
+
lines.push(`- ${t}`);
|
|
165
|
+
lines.push('');
|
|
166
|
+
}
|
|
167
|
+
if (Object.keys(byType).length > 0) {
|
|
168
|
+
lines.push(`## Activity Breakdown`);
|
|
169
|
+
for (const [type, count] of Object.entries(byType).sort((a, b) => b[1] - a[1])) {
|
|
170
|
+
lines.push(`- **${type}**: ${count}`);
|
|
171
|
+
}
|
|
172
|
+
lines.push('');
|
|
173
|
+
}
|
|
174
|
+
if (keyDecisions.length > 0) {
|
|
175
|
+
lines.push(`## Key Decisions`);
|
|
176
|
+
for (const d of keyDecisions)
|
|
177
|
+
lines.push(`- ${d}`);
|
|
178
|
+
lines.push('');
|
|
179
|
+
}
|
|
180
|
+
if (errors.length > 0) {
|
|
181
|
+
lines.push(`## Errors`);
|
|
182
|
+
for (const e of errors)
|
|
183
|
+
lines.push(`- ${e}`);
|
|
184
|
+
lines.push('');
|
|
185
|
+
}
|
|
186
|
+
if (fixes.length > 0) {
|
|
187
|
+
lines.push(`## Fixes Applied`);
|
|
188
|
+
for (const f of fixes)
|
|
189
|
+
lines.push(`- ${f}`);
|
|
190
|
+
lines.push('');
|
|
191
|
+
}
|
|
192
|
+
if (insights.length > 0) {
|
|
193
|
+
lines.push(`## Insights`);
|
|
194
|
+
for (const i of insights)
|
|
195
|
+
lines.push(`- ${i}`);
|
|
196
|
+
lines.push('');
|
|
197
|
+
}
|
|
198
|
+
lines.push(`## Handoff Context`);
|
|
199
|
+
lines.push('```');
|
|
200
|
+
lines.push(handoffSummary);
|
|
201
|
+
lines.push('```\n');
|
|
202
|
+
lines.push(`---`);
|
|
203
|
+
lines.push(`*Generated by FIVO Cell v4.8.0*`);
|
|
204
|
+
return lines.join('\n');
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=weekly-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weekly-report.js","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/weekly-report.ts"],"names":[],"mappings":"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"}
|