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.
Files changed (135) hide show
  1. package/dist/commands/context-hub.d.ts +1 -0
  2. package/dist/commands/context-hub.d.ts.map +1 -1
  3. package/dist/commands/context-hub.js +246 -2
  4. package/dist/commands/context-hub.js.map +1 -1
  5. package/dist/commands/peter.d.ts +2 -0
  6. package/dist/commands/peter.d.ts.map +1 -1
  7. package/dist/commands/peter.js +242 -52
  8. package/dist/commands/peter.js.map +1 -1
  9. package/dist/commands/setup.d.ts +12 -0
  10. package/dist/commands/setup.d.ts.map +1 -0
  11. package/dist/commands/setup.js +322 -0
  12. package/dist/commands/setup.js.map +1 -0
  13. package/dist/commands/train.d.ts +33 -0
  14. package/dist/commands/train.d.ts.map +1 -0
  15. package/dist/commands/train.js +510 -0
  16. package/dist/commands/train.js.map +1 -0
  17. package/dist/commands/verify.d.ts +14 -0
  18. package/dist/commands/verify.d.ts.map +1 -0
  19. package/dist/commands/verify.js +276 -0
  20. package/dist/commands/verify.js.map +1 -0
  21. package/dist/dashboard-static/assets/index-CW9ZxqX8.css +1 -0
  22. package/dist/dashboard-static/assets/index-DNN__p4K.js +121 -0
  23. package/dist/dashboard-static/index.html +2 -2
  24. package/dist/index.js +99 -3
  25. package/dist/index.js.map +1 -1
  26. package/dist/lib/agent-session.d.ts.map +1 -1
  27. package/dist/lib/agent-session.js +12 -4
  28. package/dist/lib/agent-session.js.map +1 -1
  29. package/dist/lib/eval-snapshot.js +1 -1
  30. package/dist/lib/eval-snapshot.js.map +1 -1
  31. package/dist/lib/pi-sky/bridge.d.ts +55 -0
  32. package/dist/lib/pi-sky/bridge.d.ts.map +1 -0
  33. package/dist/lib/pi-sky/bridge.js +264 -0
  34. package/dist/lib/pi-sky/bridge.js.map +1 -0
  35. package/dist/lib/pi-sky/cost-monitor.d.ts +21 -0
  36. package/dist/lib/pi-sky/cost-monitor.d.ts.map +1 -0
  37. package/dist/lib/pi-sky/cost-monitor.js +126 -0
  38. package/dist/lib/pi-sky/cost-monitor.js.map +1 -0
  39. package/dist/lib/pi-sky/eval-sweep.d.ts +27 -0
  40. package/dist/lib/pi-sky/eval-sweep.d.ts.map +1 -0
  41. package/dist/lib/pi-sky/eval-sweep.js +141 -0
  42. package/dist/lib/pi-sky/eval-sweep.js.map +1 -0
  43. package/dist/lib/pi-sky/event-router.d.ts +32 -0
  44. package/dist/lib/pi-sky/event-router.d.ts.map +1 -0
  45. package/dist/lib/pi-sky/event-router.js +176 -0
  46. package/dist/lib/pi-sky/event-router.js.map +1 -0
  47. package/dist/lib/pi-sky/experiment.d.ts +9 -0
  48. package/dist/lib/pi-sky/experiment.d.ts.map +1 -0
  49. package/dist/lib/pi-sky/experiment.js +83 -0
  50. package/dist/lib/pi-sky/experiment.js.map +1 -0
  51. package/dist/lib/pi-sky/index.d.ts +16 -0
  52. package/dist/lib/pi-sky/index.d.ts.map +1 -0
  53. package/dist/lib/pi-sky/index.js +16 -0
  54. package/dist/lib/pi-sky/index.js.map +1 -0
  55. package/dist/lib/pi-sky/stratus-gate.d.ts +28 -0
  56. package/dist/lib/pi-sky/stratus-gate.d.ts.map +1 -0
  57. package/dist/lib/pi-sky/stratus-gate.js +61 -0
  58. package/dist/lib/pi-sky/stratus-gate.js.map +1 -0
  59. package/dist/lib/pi-sky/swarm.d.ts +28 -0
  60. package/dist/lib/pi-sky/swarm.d.ts.map +1 -0
  61. package/dist/lib/pi-sky/swarm.js +208 -0
  62. package/dist/lib/pi-sky/swarm.js.map +1 -0
  63. package/dist/lib/pi-sky/types.d.ts +139 -0
  64. package/dist/lib/pi-sky/types.d.ts.map +1 -0
  65. package/dist/lib/pi-sky/types.js +2 -0
  66. package/dist/lib/pi-sky/types.js.map +1 -0
  67. package/dist/lib/pi-sky/voice-bridge.d.ts +20 -0
  68. package/dist/lib/pi-sky/voice-bridge.d.ts.map +1 -0
  69. package/dist/lib/pi-sky/voice-bridge.js +91 -0
  70. package/dist/lib/pi-sky/voice-bridge.js.map +1 -0
  71. package/dist/lib/policy-head.d.ts +16 -1
  72. package/dist/lib/policy-head.d.ts.map +1 -1
  73. package/dist/lib/policy-head.js +117 -19
  74. package/dist/lib/policy-head.js.map +1 -1
  75. package/dist/lib/predictor.d.ts +10 -0
  76. package/dist/lib/predictor.d.ts.map +1 -1
  77. package/dist/lib/predictor.js +46 -7
  78. package/dist/lib/predictor.js.map +1 -1
  79. package/dist/lib/setup/agent-generator.d.ts +18 -0
  80. package/dist/lib/setup/agent-generator.d.ts.map +1 -0
  81. package/dist/lib/setup/agent-generator.js +114 -0
  82. package/dist/lib/setup/agent-generator.js.map +1 -0
  83. package/dist/lib/setup/context-analyzer.d.ts +16 -0
  84. package/dist/lib/setup/context-analyzer.d.ts.map +1 -0
  85. package/dist/lib/setup/context-analyzer.js +112 -0
  86. package/dist/lib/setup/context-analyzer.js.map +1 -0
  87. package/dist/lib/setup/doc-auditor.d.ts +54 -0
  88. package/dist/lib/setup/doc-auditor.d.ts.map +1 -0
  89. package/dist/lib/setup/doc-auditor.js +629 -0
  90. package/dist/lib/setup/doc-auditor.js.map +1 -0
  91. package/dist/lib/setup/domain-generator.d.ts +7 -0
  92. package/dist/lib/setup/domain-generator.d.ts.map +1 -0
  93. package/dist/lib/setup/domain-generator.js +58 -0
  94. package/dist/lib/setup/domain-generator.js.map +1 -0
  95. package/dist/lib/setup/smart-eval-generator.d.ts +38 -0
  96. package/dist/lib/setup/smart-eval-generator.d.ts.map +1 -0
  97. package/dist/lib/setup/smart-eval-generator.js +378 -0
  98. package/dist/lib/setup/smart-eval-generator.js.map +1 -0
  99. package/dist/lib/setup/smart-recommender.d.ts +63 -0
  100. package/dist/lib/setup/smart-recommender.d.ts.map +1 -0
  101. package/dist/lib/setup/smart-recommender.js +329 -0
  102. package/dist/lib/setup/smart-recommender.js.map +1 -0
  103. package/dist/lib/setup/spec-generator.d.ts +63 -0
  104. package/dist/lib/setup/spec-generator.d.ts.map +1 -0
  105. package/dist/lib/setup/spec-generator.js +310 -0
  106. package/dist/lib/setup/spec-generator.js.map +1 -0
  107. package/dist/lib/setup/violation-agent-generator.d.ts +32 -0
  108. package/dist/lib/setup/violation-agent-generator.d.ts.map +1 -0
  109. package/dist/lib/setup/violation-agent-generator.js +255 -0
  110. package/dist/lib/setup/violation-agent-generator.js.map +1 -0
  111. package/package.json +1 -1
  112. package/packages/pi/extensions/context.ts +88 -55
  113. package/packages/pi/extensions/hub-resolver.ts +63 -0
  114. package/packages/pi/extensions/index.ts +16 -3
  115. package/packages/pi/extensions/memory-tool.ts +9 -4
  116. package/packages/pi/extensions/session.ts +68 -16
  117. package/packages/pi/extensions/tool-renderers.ts +23 -8
  118. package/scripts/train/requirements.txt +5 -0
  119. package/scripts/train/train-policy-head.py +477 -0
  120. package/scripts/train/v2/dataset.py +81 -0
  121. package/scripts/train/v2/domain.json +18 -0
  122. package/scripts/train/v2/eval.py +196 -0
  123. package/scripts/train/v2/generate_data.py +219 -0
  124. package/scripts/train/v2/infer.py +188 -0
  125. package/scripts/train/v2/model.py +112 -0
  126. package/scripts/train/v2/precompute.py +132 -0
  127. package/scripts/train/v2/train.py +302 -0
  128. package/scripts/train/v2/transform_buffer.py +227 -0
  129. package/scripts/train/v2/validate_data.py +115 -0
  130. package/template/.claude/settings.json +2 -15
  131. package/template/scripts/session/session-cleanup.sh +2 -11
  132. package/template/scripts/session/session-end-hub.sh +72 -0
  133. package/template/scripts/session/session-start-hub.sh +105 -0
  134. package/dist/dashboard-static/assets/index-B6b867Pv.js +0 -121
  135. 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"}