jfl 0.5.0 → 0.6.1
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/context-hub.d.ts +1 -0
- package/dist/commands/context-hub.d.ts.map +1 -1
- package/dist/commands/context-hub.js +246 -2
- package/dist/commands/context-hub.js.map +1 -1
- package/dist/commands/peter.d.ts +2 -0
- package/dist/commands/peter.d.ts.map +1 -1
- package/dist/commands/peter.js +242 -52
- package/dist/commands/peter.js.map +1 -1
- package/dist/commands/setup.d.ts +12 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +322 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/train.d.ts +33 -0
- package/dist/commands/train.d.ts.map +1 -0
- package/dist/commands/train.js +510 -0
- package/dist/commands/train.js.map +1 -0
- package/dist/commands/verify.d.ts +14 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +276 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/dashboard-static/assets/index-CW9ZxqX8.css +1 -0
- package/dist/dashboard-static/assets/index-DNN__p4K.js +121 -0
- package/dist/dashboard-static/index.html +2 -2
- package/dist/index.js +99 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-session.d.ts.map +1 -1
- package/dist/lib/agent-session.js +12 -4
- package/dist/lib/agent-session.js.map +1 -1
- package/dist/lib/eval-snapshot.js +1 -1
- package/dist/lib/eval-snapshot.js.map +1 -1
- package/dist/lib/pi-sky/bridge.d.ts +55 -0
- package/dist/lib/pi-sky/bridge.d.ts.map +1 -0
- package/dist/lib/pi-sky/bridge.js +264 -0
- package/dist/lib/pi-sky/bridge.js.map +1 -0
- package/dist/lib/pi-sky/cost-monitor.d.ts +21 -0
- package/dist/lib/pi-sky/cost-monitor.d.ts.map +1 -0
- package/dist/lib/pi-sky/cost-monitor.js +126 -0
- package/dist/lib/pi-sky/cost-monitor.js.map +1 -0
- package/dist/lib/pi-sky/eval-sweep.d.ts +27 -0
- package/dist/lib/pi-sky/eval-sweep.d.ts.map +1 -0
- package/dist/lib/pi-sky/eval-sweep.js +141 -0
- package/dist/lib/pi-sky/eval-sweep.js.map +1 -0
- package/dist/lib/pi-sky/event-router.d.ts +32 -0
- package/dist/lib/pi-sky/event-router.d.ts.map +1 -0
- package/dist/lib/pi-sky/event-router.js +176 -0
- package/dist/lib/pi-sky/event-router.js.map +1 -0
- package/dist/lib/pi-sky/experiment.d.ts +9 -0
- package/dist/lib/pi-sky/experiment.d.ts.map +1 -0
- package/dist/lib/pi-sky/experiment.js +83 -0
- package/dist/lib/pi-sky/experiment.js.map +1 -0
- package/dist/lib/pi-sky/index.d.ts +16 -0
- package/dist/lib/pi-sky/index.d.ts.map +1 -0
- package/dist/lib/pi-sky/index.js +16 -0
- package/dist/lib/pi-sky/index.js.map +1 -0
- package/dist/lib/pi-sky/stratus-gate.d.ts +28 -0
- package/dist/lib/pi-sky/stratus-gate.d.ts.map +1 -0
- package/dist/lib/pi-sky/stratus-gate.js +61 -0
- package/dist/lib/pi-sky/stratus-gate.js.map +1 -0
- package/dist/lib/pi-sky/swarm.d.ts +28 -0
- package/dist/lib/pi-sky/swarm.d.ts.map +1 -0
- package/dist/lib/pi-sky/swarm.js +208 -0
- package/dist/lib/pi-sky/swarm.js.map +1 -0
- package/dist/lib/pi-sky/types.d.ts +139 -0
- package/dist/lib/pi-sky/types.d.ts.map +1 -0
- package/dist/lib/pi-sky/types.js +2 -0
- package/dist/lib/pi-sky/types.js.map +1 -0
- package/dist/lib/pi-sky/voice-bridge.d.ts +20 -0
- package/dist/lib/pi-sky/voice-bridge.d.ts.map +1 -0
- package/dist/lib/pi-sky/voice-bridge.js +91 -0
- package/dist/lib/pi-sky/voice-bridge.js.map +1 -0
- package/dist/lib/policy-head.d.ts +16 -1
- package/dist/lib/policy-head.d.ts.map +1 -1
- package/dist/lib/policy-head.js +117 -19
- package/dist/lib/policy-head.js.map +1 -1
- package/dist/lib/predictor.d.ts +10 -0
- package/dist/lib/predictor.d.ts.map +1 -1
- package/dist/lib/predictor.js +46 -7
- package/dist/lib/predictor.js.map +1 -1
- package/dist/lib/setup/agent-generator.d.ts +18 -0
- package/dist/lib/setup/agent-generator.d.ts.map +1 -0
- package/dist/lib/setup/agent-generator.js +114 -0
- package/dist/lib/setup/agent-generator.js.map +1 -0
- package/dist/lib/setup/context-analyzer.d.ts +16 -0
- package/dist/lib/setup/context-analyzer.d.ts.map +1 -0
- package/dist/lib/setup/context-analyzer.js +112 -0
- package/dist/lib/setup/context-analyzer.js.map +1 -0
- package/dist/lib/setup/doc-auditor.d.ts +54 -0
- package/dist/lib/setup/doc-auditor.d.ts.map +1 -0
- package/dist/lib/setup/doc-auditor.js +629 -0
- package/dist/lib/setup/doc-auditor.js.map +1 -0
- package/dist/lib/setup/domain-generator.d.ts +7 -0
- package/dist/lib/setup/domain-generator.d.ts.map +1 -0
- package/dist/lib/setup/domain-generator.js +58 -0
- package/dist/lib/setup/domain-generator.js.map +1 -0
- package/dist/lib/setup/smart-eval-generator.d.ts +38 -0
- package/dist/lib/setup/smart-eval-generator.d.ts.map +1 -0
- package/dist/lib/setup/smart-eval-generator.js +378 -0
- package/dist/lib/setup/smart-eval-generator.js.map +1 -0
- package/dist/lib/setup/smart-recommender.d.ts +63 -0
- package/dist/lib/setup/smart-recommender.d.ts.map +1 -0
- package/dist/lib/setup/smart-recommender.js +329 -0
- package/dist/lib/setup/smart-recommender.js.map +1 -0
- package/dist/lib/setup/spec-generator.d.ts +63 -0
- package/dist/lib/setup/spec-generator.d.ts.map +1 -0
- package/dist/lib/setup/spec-generator.js +310 -0
- package/dist/lib/setup/spec-generator.js.map +1 -0
- package/dist/lib/setup/violation-agent-generator.d.ts +32 -0
- package/dist/lib/setup/violation-agent-generator.d.ts.map +1 -0
- package/dist/lib/setup/violation-agent-generator.js +255 -0
- package/dist/lib/setup/violation-agent-generator.js.map +1 -0
- package/package.json +1 -1
- package/packages/pi/extensions/context.ts +88 -55
- package/packages/pi/extensions/hub-resolver.ts +63 -0
- package/packages/pi/extensions/index.ts +16 -3
- package/packages/pi/extensions/memory-tool.ts +9 -4
- package/packages/pi/extensions/session.ts +68 -16
- package/packages/pi/extensions/tool-renderers.ts +23 -8
- package/scripts/train/requirements.txt +5 -0
- package/scripts/train/train-policy-head.py +477 -0
- package/scripts/train/v2/dataset.py +81 -0
- package/scripts/train/v2/domain.json +18 -0
- package/scripts/train/v2/eval.py +196 -0
- package/scripts/train/v2/generate_data.py +219 -0
- package/scripts/train/v2/infer.py +188 -0
- package/scripts/train/v2/model.py +112 -0
- package/scripts/train/v2/precompute.py +132 -0
- package/scripts/train/v2/train.py +302 -0
- package/scripts/train/v2/transform_buffer.py +227 -0
- package/scripts/train/v2/validate_data.py +115 -0
- package/template/.claude/settings.json +2 -15
- package/template/scripts/session/session-cleanup.sh +2 -11
- package/template/scripts/session/session-end-hub.sh +72 -0
- package/template/scripts/session/session-start-hub.sh +105 -0
- package/dist/dashboard-static/assets/index-B6b867Pv.js +0 -121
- package/dist/dashboard-static/assets/index-Y4BrqxV-.css +0 -1
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @purpose Smart agent recommendations using Stratus reasoning model
|
|
3
|
+
* Instead of template matching, analyzes journal patterns and asks an LLM
|
|
4
|
+
* to reason about what agents would actually improve the codebase.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, readFileSync, readdirSync } from "fs";
|
|
7
|
+
import { join } from "path";
|
|
8
|
+
/**
|
|
9
|
+
* Deep-analyze journals to extract patterns that template matching misses
|
|
10
|
+
*/
|
|
11
|
+
export function extractJournalInsights(projectRoot) {
|
|
12
|
+
const insight = {
|
|
13
|
+
totalSessions: 0,
|
|
14
|
+
totalEntries: 0,
|
|
15
|
+
revertRate: 0,
|
|
16
|
+
topReverts: [],
|
|
17
|
+
topImproved: [],
|
|
18
|
+
fileHotspots: [],
|
|
19
|
+
sessionDurations: [],
|
|
20
|
+
entryTypes: {},
|
|
21
|
+
commonPatterns: [],
|
|
22
|
+
evalHistory: [],
|
|
23
|
+
};
|
|
24
|
+
const journalDir = join(projectRoot, ".jfl", "journal");
|
|
25
|
+
if (!existsSync(journalDir))
|
|
26
|
+
return insight;
|
|
27
|
+
const files = readdirSync(journalDir).filter(f => f.endsWith(".jsonl"));
|
|
28
|
+
insight.totalSessions = files.length;
|
|
29
|
+
const fileTouches = {};
|
|
30
|
+
const revertPatterns = {};
|
|
31
|
+
const improvedPatterns = {};
|
|
32
|
+
let totalKept = 0;
|
|
33
|
+
let totalReverted = 0;
|
|
34
|
+
for (const file of files) {
|
|
35
|
+
const content = readFileSync(join(journalDir, file), "utf-8");
|
|
36
|
+
const entries = content.split("\n").filter(l => l.trim());
|
|
37
|
+
insight.totalEntries += entries.length;
|
|
38
|
+
let sessionStart = 0;
|
|
39
|
+
let sessionEnd = 0;
|
|
40
|
+
for (const line of entries) {
|
|
41
|
+
try {
|
|
42
|
+
const entry = JSON.parse(line);
|
|
43
|
+
// Track entry types
|
|
44
|
+
const type = entry.type || "unknown";
|
|
45
|
+
insight.entryTypes[type] = (insight.entryTypes[type] || 0) + 1;
|
|
46
|
+
// Track timestamps for duration
|
|
47
|
+
const ts = entry.ts ? new Date(entry.ts).getTime() : 0;
|
|
48
|
+
if (ts > 0) {
|
|
49
|
+
if (sessionStart === 0)
|
|
50
|
+
sessionStart = ts;
|
|
51
|
+
sessionEnd = ts;
|
|
52
|
+
}
|
|
53
|
+
// Track file touches and reverts
|
|
54
|
+
const files = entry.files || entry.detail?.files_affected || [];
|
|
55
|
+
const status = entry.status || entry.result || "";
|
|
56
|
+
for (const f of files) {
|
|
57
|
+
const dir = f.split("/").slice(0, 2).join("/");
|
|
58
|
+
if (!fileTouches[dir])
|
|
59
|
+
fileTouches[dir] = { touches: 0, reverts: 0 };
|
|
60
|
+
fileTouches[dir].touches++;
|
|
61
|
+
if (status === "reverted" || status === "REVERTED") {
|
|
62
|
+
fileTouches[dir].reverts++;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Track revert vs kept patterns
|
|
66
|
+
if (status === "reverted" || status === "REVERTED") {
|
|
67
|
+
totalReverted++;
|
|
68
|
+
const scope = entry.scope || entry.agent || type;
|
|
69
|
+
revertPatterns[scope] = (revertPatterns[scope] || 0) + 1;
|
|
70
|
+
}
|
|
71
|
+
else if (status === "kept" || status === "KEPT" || status === "complete") {
|
|
72
|
+
totalKept++;
|
|
73
|
+
const scope = entry.scope || entry.agent || type;
|
|
74
|
+
improvedPatterns[scope] = (improvedPatterns[scope] || 0) + 1;
|
|
75
|
+
}
|
|
76
|
+
// Extract learned lessons
|
|
77
|
+
if (entry.learned && Array.isArray(entry.learned)) {
|
|
78
|
+
for (const lesson of entry.learned) {
|
|
79
|
+
if (typeof lesson === "string" && lesson.length > 20) {
|
|
80
|
+
insight.commonPatterns.push(lesson);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch { /* skip */ }
|
|
86
|
+
}
|
|
87
|
+
if (sessionStart > 0 && sessionEnd > sessionStart) {
|
|
88
|
+
insight.sessionDurations.push((sessionEnd - sessionStart) / 1000 / 60); // minutes
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Compute revert rate
|
|
92
|
+
const total = totalKept + totalReverted;
|
|
93
|
+
insight.revertRate = total > 0 ? totalReverted / total : 0;
|
|
94
|
+
// Sort hotspots
|
|
95
|
+
insight.fileHotspots = Object.entries(fileTouches)
|
|
96
|
+
.map(([path, stats]) => ({ path, ...stats }))
|
|
97
|
+
.sort((a, b) => b.touches - a.touches)
|
|
98
|
+
.slice(0, 15);
|
|
99
|
+
insight.topReverts = Object.entries(revertPatterns)
|
|
100
|
+
.map(([pattern, count]) => ({ pattern, count }))
|
|
101
|
+
.sort((a, b) => b.count - a.count)
|
|
102
|
+
.slice(0, 10);
|
|
103
|
+
insight.topImproved = Object.entries(improvedPatterns)
|
|
104
|
+
.map(([pattern, count]) => ({ pattern, count }))
|
|
105
|
+
.sort((a, b) => b.count - a.count)
|
|
106
|
+
.slice(0, 10);
|
|
107
|
+
// Extract eval history from training buffer
|
|
108
|
+
const bufferPath = join(projectRoot, ".jfl", "training-buffer.jsonl");
|
|
109
|
+
if (existsSync(bufferPath)) {
|
|
110
|
+
const agentScores = {};
|
|
111
|
+
const content = readFileSync(bufferPath, "utf-8");
|
|
112
|
+
for (const line of content.split("\n").filter(l => l.trim())) {
|
|
113
|
+
try {
|
|
114
|
+
const entry = JSON.parse(line);
|
|
115
|
+
const agent = entry.agent || entry.agent_name || "unknown";
|
|
116
|
+
const score = entry.reward ?? entry.score ?? entry.eval_score;
|
|
117
|
+
if (typeof score === "number") {
|
|
118
|
+
if (!agentScores[agent])
|
|
119
|
+
agentScores[agent] = [];
|
|
120
|
+
agentScores[agent].push(score);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch { /* skip */ }
|
|
124
|
+
}
|
|
125
|
+
insight.evalHistory = Object.entries(agentScores).map(([agent, scores]) => {
|
|
126
|
+
const half = Math.floor(scores.length / 2);
|
|
127
|
+
const firstHalf = scores.slice(0, half);
|
|
128
|
+
const secondHalf = scores.slice(half);
|
|
129
|
+
const avgFirst = firstHalf.length > 0 ? firstHalf.reduce((a, b) => a + b, 0) / firstHalf.length : 0;
|
|
130
|
+
const avgSecond = secondHalf.length > 0 ? secondHalf.reduce((a, b) => a + b, 0) / secondHalf.length : 0;
|
|
131
|
+
const trend = avgSecond > avgFirst + 0.05 ? "improving"
|
|
132
|
+
: avgSecond < avgFirst - 0.05 ? "degrading"
|
|
133
|
+
: "flat";
|
|
134
|
+
return { agent, scores, trend };
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// Dedupe and limit patterns
|
|
138
|
+
insight.commonPatterns = [...new Set(insight.commonPatterns)].slice(0, 20);
|
|
139
|
+
return insight;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Build the prompt for Stratus to reason about agent recommendations
|
|
143
|
+
*/
|
|
144
|
+
export function buildRecommendationPrompt(insight, existingAgents) {
|
|
145
|
+
let prompt = `You are an expert at designing RL agents for software projects. Based on the following project analysis, recommend specific agents that would improve this codebase.
|
|
146
|
+
|
|
147
|
+
## Project Data
|
|
148
|
+
|
|
149
|
+
Sessions: ${insight.totalSessions}
|
|
150
|
+
Journal entries: ${insight.totalEntries}
|
|
151
|
+
Revert rate: ${(insight.revertRate * 100).toFixed(1)}%
|
|
152
|
+
|
|
153
|
+
### File Hotspots (most-touched directories)
|
|
154
|
+
${insight.fileHotspots.slice(0, 10).map(f => `- ${f.path}: ${f.touches} touches, ${f.reverts} reverts (${f.touches > 0 ? ((f.reverts / f.touches * 100).toFixed(0)) : 0}% revert rate)`).join("\n")}
|
|
155
|
+
|
|
156
|
+
### Top Revert Patterns (what keeps failing)
|
|
157
|
+
${insight.topReverts.map(r => `- ${r.pattern}: ${r.count} reverts`).join("\n") || "None recorded"}
|
|
158
|
+
|
|
159
|
+
### Top Improvement Patterns (what works)
|
|
160
|
+
${insight.topImproved.map(r => `- ${r.pattern}: ${r.count} kept`).join("\n") || "None recorded"}
|
|
161
|
+
|
|
162
|
+
### Entry Types
|
|
163
|
+
${Object.entries(insight.entryTypes).map(([t, c]) => `- ${t}: ${c}`).join("\n")}
|
|
164
|
+
|
|
165
|
+
### Eval History (existing agents)
|
|
166
|
+
${insight.evalHistory.map(e => `- ${e.agent}: ${e.scores.length} evals, trend: ${e.trend}, latest: ${e.scores[e.scores.length - 1]?.toFixed(2) || "n/a"}`).join("\n") || "No eval history"}
|
|
167
|
+
|
|
168
|
+
### Lessons Learned (from journals)
|
|
169
|
+
${insight.commonPatterns.slice(0, 10).map(p => `- ${p}`).join("\n") || "None recorded"}
|
|
170
|
+
|
|
171
|
+
### Existing Agents (already configured)
|
|
172
|
+
${existingAgents.length > 0 ? existingAgents.map(a => `- ${a}`).join("\n") : "None"}
|
|
173
|
+
|
|
174
|
+
## Instructions
|
|
175
|
+
|
|
176
|
+
Recommend 2-5 NEW agents (not already configured). For each, provide:
|
|
177
|
+
1. **name**: kebab-case, descriptive
|
|
178
|
+
2. **scope**: what area it targets
|
|
179
|
+
3. **metric**: what it measures (snake_case)
|
|
180
|
+
4. **direction**: "maximize" or "minimize"
|
|
181
|
+
5. **rationale**: WHY this agent based on the data above (cite specific patterns)
|
|
182
|
+
6. **confidence**: 0-1 how confident you are this will help
|
|
183
|
+
7. **filePatterns**: which directories/files to scope
|
|
184
|
+
8. **evalHint**: what the eval script should check
|
|
185
|
+
9. **priority**: 1-5 (1 = highest)
|
|
186
|
+
|
|
187
|
+
Focus on:
|
|
188
|
+
- High revert rate areas (agents to stabilize them)
|
|
189
|
+
- Files touched often but never improving (agents to break the plateau)
|
|
190
|
+
- Missing coverage (areas with no agents)
|
|
191
|
+
- Degrading trends that need intervention
|
|
192
|
+
|
|
193
|
+
Respond ONLY with valid JSON array of recommendations. No markdown, no explanation outside the JSON.`;
|
|
194
|
+
return prompt;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Call Stratus to get smart recommendations
|
|
198
|
+
*/
|
|
199
|
+
export async function getSmartRecommendations(projectRoot, existingAgents, options = {}) {
|
|
200
|
+
const insight = extractJournalInsights(projectRoot);
|
|
201
|
+
const prompt = buildRecommendationPrompt(insight, existingAgents);
|
|
202
|
+
const apiKey = options.apiKey || process.env.STRATUS_API_KEY;
|
|
203
|
+
const apiUrl = options.apiUrl || process.env.STRATUS_API_URL || "https://api.stratus.run/v1/chat/completions";
|
|
204
|
+
const model = options.model || "stratus-x1ac-base-claude-haiku-4-5";
|
|
205
|
+
if (!apiKey) {
|
|
206
|
+
// Fallback: local heuristic recommendations
|
|
207
|
+
return heuristicRecommendations(insight, existingAgents);
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
const response = await fetch(apiUrl, {
|
|
211
|
+
method: "POST",
|
|
212
|
+
headers: {
|
|
213
|
+
"Content-Type": "application/json",
|
|
214
|
+
"Authorization": `Bearer ${apiKey}`,
|
|
215
|
+
},
|
|
216
|
+
body: JSON.stringify({
|
|
217
|
+
model,
|
|
218
|
+
messages: [{ role: "user", content: prompt }],
|
|
219
|
+
max_tokens: 2000,
|
|
220
|
+
temperature: 0.3,
|
|
221
|
+
}),
|
|
222
|
+
});
|
|
223
|
+
if (!response.ok) {
|
|
224
|
+
const text = await response.text();
|
|
225
|
+
console.error(`Stratus API error: ${response.status} ${text}`);
|
|
226
|
+
return heuristicRecommendations(insight, existingAgents);
|
|
227
|
+
}
|
|
228
|
+
const data = await response.json();
|
|
229
|
+
const content = data.choices?.[0]?.message?.content || "";
|
|
230
|
+
// Parse JSON from response (handle potential markdown wrapping)
|
|
231
|
+
const jsonStr = content.replace(/^```json?\n?/, "").replace(/\n?```$/, "").trim();
|
|
232
|
+
const recs = JSON.parse(jsonStr);
|
|
233
|
+
return recs.filter(r => !existingAgents.includes(r.name)).sort((a, b) => a.priority - b.priority);
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
console.error(`Smart recommendation failed: ${err.message}`);
|
|
237
|
+
return heuristicRecommendations(insight, existingAgents);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Fallback: heuristic recommendations when no API key available
|
|
242
|
+
*/
|
|
243
|
+
function heuristicRecommendations(insight, existingAgents) {
|
|
244
|
+
const recs = [];
|
|
245
|
+
// High revert rate → stability agent
|
|
246
|
+
if (insight.revertRate > 0.3) {
|
|
247
|
+
const worstDir = insight.fileHotspots.find(f => f.reverts > 0);
|
|
248
|
+
if (worstDir && !existingAgents.includes("stability")) {
|
|
249
|
+
recs.push({
|
|
250
|
+
name: "stability",
|
|
251
|
+
scope: "reliability",
|
|
252
|
+
metric: "revert_rate",
|
|
253
|
+
direction: "minimize",
|
|
254
|
+
rationale: `${(insight.revertRate * 100).toFixed(0)}% revert rate — ${worstDir.path} has ${worstDir.reverts}/${worstDir.touches} reverts`,
|
|
255
|
+
confidence: 0.8,
|
|
256
|
+
filePatterns: [worstDir.path + "/**"],
|
|
257
|
+
evalHint: "Count reverted commits in last N rounds, divide by total",
|
|
258
|
+
priority: 1,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// Degrading agents → intervention agent
|
|
263
|
+
for (const eval_ of insight.evalHistory.filter(e => e.trend === "degrading")) {
|
|
264
|
+
const name = `fix-${eval_.agent}`;
|
|
265
|
+
if (!existingAgents.includes(name)) {
|
|
266
|
+
recs.push({
|
|
267
|
+
name,
|
|
268
|
+
scope: "intervention",
|
|
269
|
+
metric: `${eval_.agent}_score`,
|
|
270
|
+
direction: "maximize",
|
|
271
|
+
rationale: `${eval_.agent} is degrading over ${eval_.scores.length} evals`,
|
|
272
|
+
confidence: 0.7,
|
|
273
|
+
filePatterns: ["src/**"],
|
|
274
|
+
evalHint: `Run the same eval as ${eval_.agent} but with a focus on reversing the downward trend`,
|
|
275
|
+
priority: 2,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// Hot files with no agent coverage
|
|
280
|
+
for (const hotspot of insight.fileHotspots.slice(0, 3)) {
|
|
281
|
+
if (hotspot.touches > 10 && hotspot.reverts / hotspot.touches > 0.2) {
|
|
282
|
+
const name = `stabilize-${hotspot.path.replace(/[^a-z0-9]/gi, "-").toLowerCase()}`;
|
|
283
|
+
if (!existingAgents.includes(name) && !recs.find(r => r.filePatterns.some(p => p.startsWith(hotspot.path)))) {
|
|
284
|
+
recs.push({
|
|
285
|
+
name,
|
|
286
|
+
scope: "stability",
|
|
287
|
+
metric: "change_success_rate",
|
|
288
|
+
direction: "maximize",
|
|
289
|
+
rationale: `${hotspot.path} has ${hotspot.touches} touches with ${((hotspot.reverts / hotspot.touches) * 100).toFixed(0)}% revert rate`,
|
|
290
|
+
confidence: 0.6,
|
|
291
|
+
filePatterns: [hotspot.path + "/**"],
|
|
292
|
+
evalHint: "Track ratio of kept vs reverted changes in this directory",
|
|
293
|
+
priority: 3,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return recs.slice(0, 5);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Format insights for human-readable display
|
|
302
|
+
*/
|
|
303
|
+
export function formatInsightsSummary(insight) {
|
|
304
|
+
const lines = [];
|
|
305
|
+
lines.push(` Sessions: ${insight.totalSessions}, Entries: ${insight.totalEntries}`);
|
|
306
|
+
lines.push(` Revert rate: ${(insight.revertRate * 100).toFixed(1)}%`);
|
|
307
|
+
if (insight.fileHotspots.length > 0) {
|
|
308
|
+
lines.push(` Hotspots:`);
|
|
309
|
+
for (const h of insight.fileHotspots.slice(0, 5)) {
|
|
310
|
+
const revertPct = h.touches > 0 ? ((h.reverts / h.touches) * 100).toFixed(0) : "0";
|
|
311
|
+
lines.push(` ${h.path}: ${h.touches} touches, ${revertPct}% reverted`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
if (insight.evalHistory.length > 0) {
|
|
315
|
+
lines.push(` Agent trends:`);
|
|
316
|
+
for (const e of insight.evalHistory) {
|
|
317
|
+
const icon = e.trend === "improving" ? "📈" : e.trend === "degrading" ? "📉" : "➡️";
|
|
318
|
+
lines.push(` ${icon} ${e.agent}: ${e.trend} (${e.scores.length} evals)`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
if (insight.topReverts.length > 0) {
|
|
322
|
+
lines.push(` Top revert patterns:`);
|
|
323
|
+
for (const r of insight.topReverts.slice(0, 3)) {
|
|
324
|
+
lines.push(` ⚠ ${r.pattern}: ${r.count} reverts`);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return lines.join("\n");
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=smart-recommender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-recommender.js","sourceRoot":"","sources":["../../../src/lib/setup/smart-recommender.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @purpose Generate TLA+ specifications from project analysis
|
|
3
|
+
* Scans codebase structure, journal entries, and service configs
|
|
4
|
+
* to produce a formal model that TLC/Apalache can verify.
|
|
5
|
+
*/
|
|
6
|
+
export interface SystemModel {
|
|
7
|
+
services: ServiceDef[];
|
|
8
|
+
stateVariables: StateVariable[];
|
|
9
|
+
actions: ActionDef[];
|
|
10
|
+
invariants: InvariantDef[];
|
|
11
|
+
concurrencyPatterns: ConcurrencyPattern[];
|
|
12
|
+
}
|
|
13
|
+
export interface ServiceDef {
|
|
14
|
+
name: string;
|
|
15
|
+
type: "process" | "cli" | "library";
|
|
16
|
+
port?: number;
|
|
17
|
+
dependencies: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface StateVariable {
|
|
20
|
+
name: string;
|
|
21
|
+
type: string;
|
|
22
|
+
domain: string[];
|
|
23
|
+
source: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ActionDef {
|
|
26
|
+
name: string;
|
|
27
|
+
preconditions: string[];
|
|
28
|
+
effects: string[];
|
|
29
|
+
source: string;
|
|
30
|
+
}
|
|
31
|
+
export interface InvariantDef {
|
|
32
|
+
name: string;
|
|
33
|
+
description: string;
|
|
34
|
+
formula: string;
|
|
35
|
+
severity: "critical" | "warning" | "info";
|
|
36
|
+
source: string;
|
|
37
|
+
}
|
|
38
|
+
export interface ConcurrencyPattern {
|
|
39
|
+
type: "parallel_edit" | "race_condition" | "stale_read" | "cascading_failure";
|
|
40
|
+
description: string;
|
|
41
|
+
actors: string[];
|
|
42
|
+
resource: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Scan project structure and journals to extract a system model
|
|
46
|
+
*/
|
|
47
|
+
export declare function extractSystemModel(projectRoot: string): SystemModel;
|
|
48
|
+
/**
|
|
49
|
+
* Generate a TLA+ specification from a system model
|
|
50
|
+
*/
|
|
51
|
+
export declare function generateTLASpec(model: SystemModel, specName: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Generate TLC config file
|
|
54
|
+
*/
|
|
55
|
+
export declare function generateTLCConfig(model: SystemModel, specName: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* Write spec and config to disk, return paths
|
|
58
|
+
*/
|
|
59
|
+
export declare function writeSpec(projectRoot: string, model: SystemModel, specName?: string): {
|
|
60
|
+
specPath: string;
|
|
61
|
+
cfgPath: string;
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=spec-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-generator.d.ts","sourceRoot":"","sources":["../../../src/lib/setup/spec-generator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,UAAU,EAAE,CAAA;IACtB,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,UAAU,EAAE,YAAY,EAAE,CAAA;IAC1B,mBAAmB,EAAE,kBAAkB,EAAE,CAAA;CAC1C;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,SAAS,GAAG,KAAK,GAAG,SAAS,CAAA;IACnC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAA;IACzC,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,eAAe,GAAG,gBAAgB,GAAG,YAAY,GAAG,mBAAmB,CAAA;IAC7E,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAoInE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA8H5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2B9E;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,WAAW,EAClB,QAAQ,GAAE,MAAqB,GAC9B;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAcvC"}
|