add-skill-kit 3.2.4 → 3.2.5
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/README.md +1 -1
- package/bin/lib/commands/help.js +0 -4
- package/bin/lib/commands/install.js +90 -9
- package/bin/lib/ui.js +1 -1
- package/lib/agent-cli/__tests__/adaptive_engine.test.js +190 -0
- package/lib/agent-cli/__tests__/integration/cross_script.test.js +222 -0
- package/lib/agent-cli/__tests__/integration/full_cycle.test.js +230 -0
- package/lib/agent-cli/__tests__/pattern_analyzer.test.js +173 -0
- package/lib/agent-cli/__tests__/pre_execution_check.test.js +167 -0
- package/lib/agent-cli/__tests__/skill_injector.test.js +191 -0
- package/lib/agent-cli/bin/{ag-smart.js → agent.js} +48 -15
- package/lib/agent-cli/dashboard/dashboard_server.js +340 -0
- package/lib/agent-cli/dashboard/index.html +538 -0
- package/lib/agent-cli/lib/audit.js +2 -2
- package/lib/agent-cli/lib/auto-learn.js +8 -8
- package/lib/agent-cli/lib/eslint-fix.js +1 -1
- package/lib/agent-cli/lib/fix.js +5 -5
- package/lib/agent-cli/lib/hooks/install-hooks.js +4 -4
- package/lib/agent-cli/lib/hooks/lint-learn.js +4 -4
- package/lib/agent-cli/lib/learn.js +10 -10
- package/lib/agent-cli/lib/recall.js +1 -1
- package/lib/agent-cli/lib/settings.js +24 -0
- package/lib/agent-cli/lib/skill-learn.js +2 -2
- package/lib/agent-cli/lib/stats.js +3 -3
- package/lib/agent-cli/lib/ui/dashboard-ui.js +103 -4
- package/lib/agent-cli/lib/ui/index.js +36 -6
- package/lib/agent-cli/lib/watcher.js +2 -2
- package/lib/agent-cli/package.json +4 -4
- package/lib/agent-cli/scripts/adaptive_engine.js +381 -0
- package/lib/agent-cli/scripts/dashboard_server.js +224 -0
- package/lib/agent-cli/scripts/error_sensor.js +565 -0
- package/lib/agent-cli/scripts/learn_from_failure.js +225 -0
- package/lib/agent-cli/scripts/pattern_analyzer.js +781 -0
- package/lib/agent-cli/scripts/pre_execution_check.js +623 -0
- package/lib/agent-cli/scripts/rule_sharing.js +374 -0
- package/lib/agent-cli/scripts/skill_injector.js +387 -0
- package/lib/agent-cli/scripts/success_sensor.js +500 -0
- package/lib/agent-cli/scripts/user_correction_sensor.js +426 -0
- package/lib/agent-cli/services/auto-learn-service.js +247 -0
- package/lib/agent-cli/src/MIGRATION.md +418 -0
- package/lib/agent-cli/src/README.md +367 -0
- package/lib/agent-cli/src/core/evolution/evolution-signal.js +42 -0
- package/lib/agent-cli/src/core/evolution/index.js +17 -0
- package/lib/agent-cli/src/core/evolution/review-gate.js +40 -0
- package/lib/agent-cli/src/core/evolution/signal-detector.js +137 -0
- package/lib/agent-cli/src/core/evolution/signal-queue.js +79 -0
- package/lib/agent-cli/src/core/evolution/threshold-checker.js +79 -0
- package/lib/agent-cli/src/core/index.js +15 -0
- package/lib/agent-cli/src/core/learning/cognitive-enhancer.js +282 -0
- package/lib/agent-cli/src/core/learning/index.js +12 -0
- package/lib/agent-cli/src/core/learning/lesson-synthesizer.js +83 -0
- package/lib/agent-cli/src/core/scanning/index.js +14 -0
- package/lib/agent-cli/src/data/index.js +13 -0
- package/lib/agent-cli/src/data/repositories/index.js +8 -0
- package/lib/agent-cli/src/data/repositories/lesson-repository.js +130 -0
- package/lib/agent-cli/src/data/repositories/signal-repository.js +119 -0
- package/lib/agent-cli/src/data/storage/index.js +8 -0
- package/lib/agent-cli/src/data/storage/json-storage.js +64 -0
- package/lib/agent-cli/src/data/storage/yaml-storage.js +66 -0
- package/lib/agent-cli/src/infrastructure/index.js +13 -0
- package/lib/agent-cli/src/presentation/formatters/skill-formatter.js +232 -0
- package/lib/agent-cli/src/services/export-service.js +162 -0
- package/lib/agent-cli/src/services/index.js +13 -0
- package/lib/agent-cli/src/services/learning-service.js +99 -0
- package/lib/agent-cli/types/index.d.ts +343 -0
- package/lib/agent-cli/utils/benchmark.js +269 -0
- package/lib/agent-cli/utils/logger.js +303 -0
- package/lib/agent-cli/utils/ml_patterns.js +300 -0
- package/lib/agent-cli/utils/recovery.js +312 -0
- package/lib/agent-cli/utils/telemetry.js +290 -0
- package/lib/agentskillskit-cli/ag-smart.js +15 -15
- package/lib/agentskillskit-cli/package.json +3 -3
- package/package.json +11 -5
- /package/bin/{cli.js → kit.js} +0 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Learn From Failure Script (ES Module)
|
|
4
|
+
*
|
|
5
|
+
* Analyzes failures and extracts lessons for continuous improvement.
|
|
6
|
+
* Part of the auto-learner skill.
|
|
7
|
+
*
|
|
8
|
+
* Uses JSON storage to avoid external dependencies.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* node learn_from_failure.js --list
|
|
12
|
+
* node learn_from_failure.js --search "keyword"
|
|
13
|
+
* node learn_from_failure.js --pattern "error pattern" --message "lesson" [--severity HIGH]
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import fs from 'fs';
|
|
17
|
+
import path from 'path';
|
|
18
|
+
import { fileURLToPath } from 'url';
|
|
19
|
+
|
|
20
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
21
|
+
const __dirname = path.dirname(__filename);
|
|
22
|
+
|
|
23
|
+
// Colors
|
|
24
|
+
const colors = {
|
|
25
|
+
reset: '\x1b[0m',
|
|
26
|
+
red: '\x1b[31m',
|
|
27
|
+
green: '\x1b[32m',
|
|
28
|
+
yellow: '\x1b[33m',
|
|
29
|
+
blue: '\x1b[34m',
|
|
30
|
+
cyan: '\x1b[36m',
|
|
31
|
+
gray: '\x1b[90m',
|
|
32
|
+
bold: '\x1b[1m'
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// Find project root (.agent folder)
|
|
36
|
+
function findProjectRoot() {
|
|
37
|
+
let current = process.cwd();
|
|
38
|
+
while (current !== path.dirname(current)) {
|
|
39
|
+
if (fs.existsSync(path.join(current, '.agent'))) {
|
|
40
|
+
return current;
|
|
41
|
+
}
|
|
42
|
+
current = path.dirname(current);
|
|
43
|
+
}
|
|
44
|
+
return process.cwd();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const projectRoot = findProjectRoot();
|
|
48
|
+
const lessonsPath = path.join(projectRoot, '.agent', 'knowledge', 'lessons-learned.json');
|
|
49
|
+
|
|
50
|
+
// Ensure lessons file exists
|
|
51
|
+
function ensureLessonsFile() {
|
|
52
|
+
const dir = path.dirname(lessonsPath);
|
|
53
|
+
if (!fs.existsSync(dir)) {
|
|
54
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
55
|
+
}
|
|
56
|
+
if (!fs.existsSync(lessonsPath)) {
|
|
57
|
+
fs.writeFileSync(lessonsPath, JSON.stringify({ lessons: [] }, null, 2));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Load lessons
|
|
62
|
+
function loadLessons() {
|
|
63
|
+
ensureLessonsFile();
|
|
64
|
+
try {
|
|
65
|
+
const content = fs.readFileSync(lessonsPath, 'utf8');
|
|
66
|
+
const data = JSON.parse(content);
|
|
67
|
+
return Array.isArray(data.lessons) ? data.lessons : [];
|
|
68
|
+
} catch {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Save lessons
|
|
74
|
+
function saveLessons(lessons) {
|
|
75
|
+
ensureLessonsFile();
|
|
76
|
+
const data = {
|
|
77
|
+
_comment: "Lessons Learned - Auto-generated by auto-learner skill",
|
|
78
|
+
updatedAt: new Date().toISOString(),
|
|
79
|
+
lessons
|
|
80
|
+
};
|
|
81
|
+
fs.writeFileSync(lessonsPath, JSON.stringify(data, null, 2));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Generate lesson ID
|
|
85
|
+
function generateId(lessons) {
|
|
86
|
+
const existing = lessons.map(l => l.id).filter(Boolean);
|
|
87
|
+
let maxNum = 0;
|
|
88
|
+
for (const id of existing) {
|
|
89
|
+
const match = id.match(/LEARN-(\d+)/);
|
|
90
|
+
if (match) {
|
|
91
|
+
maxNum = Math.max(maxNum, parseInt(match[1]));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return `LEARN-${String(maxNum + 1).padStart(3, '0')}`;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Add new lesson
|
|
98
|
+
function addLesson(pattern, message, severity = 'HIGH', trigger = '') {
|
|
99
|
+
const lessons = loadLessons();
|
|
100
|
+
|
|
101
|
+
// Check for duplicate pattern
|
|
102
|
+
const exists = lessons.some(l => l.pattern === pattern);
|
|
103
|
+
if (exists) {
|
|
104
|
+
console.log(`${colors.yellow}⚠️ Lesson with this pattern already exists${colors.reset}`);
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const lesson = {
|
|
109
|
+
id: generateId(lessons),
|
|
110
|
+
pattern,
|
|
111
|
+
severity,
|
|
112
|
+
message,
|
|
113
|
+
date: new Date().toISOString().split('T')[0],
|
|
114
|
+
trigger: trigger || 'manual',
|
|
115
|
+
fix_applied: true
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
lessons.push(lesson);
|
|
119
|
+
saveLessons(lessons);
|
|
120
|
+
|
|
121
|
+
return lesson;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// List all lessons
|
|
125
|
+
function listLessons() {
|
|
126
|
+
const lessons = loadLessons();
|
|
127
|
+
|
|
128
|
+
console.log(`${colors.cyan}╔════════════════════════════════════════╗${colors.reset}`);
|
|
129
|
+
console.log(`${colors.cyan}║${colors.reset} 📚 Lessons Learned ${colors.cyan}║${colors.reset}`);
|
|
130
|
+
console.log(`${colors.cyan}╚════════════════════════════════════════╝${colors.reset}`);
|
|
131
|
+
console.log(`${colors.gray}Total: ${lessons.length} lessons${colors.reset}\n`);
|
|
132
|
+
|
|
133
|
+
if (lessons.length === 0) {
|
|
134
|
+
console.log(`${colors.yellow}No lessons recorded yet.${colors.reset}`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
for (const lesson of lessons) {
|
|
139
|
+
const severityColor = {
|
|
140
|
+
CRITICAL: colors.red,
|
|
141
|
+
HIGH: colors.yellow,
|
|
142
|
+
MEDIUM: colors.blue,
|
|
143
|
+
LOW: colors.gray
|
|
144
|
+
}[lesson.severity] || colors.gray;
|
|
145
|
+
|
|
146
|
+
console.log(`${colors.bold}${lesson.id}${colors.reset} [${severityColor}${lesson.severity}${colors.reset}]`);
|
|
147
|
+
console.log(` ${colors.gray}Pattern:${colors.reset} ${lesson.pattern}`);
|
|
148
|
+
console.log(` ${colors.gray}Date:${colors.reset} ${lesson.date}`);
|
|
149
|
+
console.log('');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Search lessons
|
|
154
|
+
function searchLessons(keyword) {
|
|
155
|
+
const lessons = loadLessons();
|
|
156
|
+
const lowerKeyword = keyword.toLowerCase();
|
|
157
|
+
|
|
158
|
+
const matches = lessons.filter(l =>
|
|
159
|
+
l.pattern.toLowerCase().includes(lowerKeyword) ||
|
|
160
|
+
l.message.toLowerCase().includes(lowerKeyword) ||
|
|
161
|
+
l.id.toLowerCase().includes(lowerKeyword)
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
console.log(`${colors.cyan}🔍 Search: "${keyword}"${colors.reset}`);
|
|
165
|
+
console.log(`${colors.gray}Found: ${matches.length} lessons${colors.reset}\n`);
|
|
166
|
+
|
|
167
|
+
for (const lesson of matches) {
|
|
168
|
+
console.log(`${colors.bold}${lesson.id}${colors.reset}: ${lesson.pattern}`);
|
|
169
|
+
console.log(` ${colors.gray}${lesson.message.split('\n')[0]}${colors.reset}`);
|
|
170
|
+
console.log('');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Parse arguments
|
|
175
|
+
const args = process.argv.slice(2);
|
|
176
|
+
|
|
177
|
+
if (args.includes('--list') || args.includes('-l')) {
|
|
178
|
+
listLessons();
|
|
179
|
+
} else if (args.includes('--search') || args.includes('-s')) {
|
|
180
|
+
const idx = args.findIndex(a => a === '--search' || a === '-s');
|
|
181
|
+
const keyword = args[idx + 1];
|
|
182
|
+
if (keyword) {
|
|
183
|
+
searchLessons(keyword);
|
|
184
|
+
} else {
|
|
185
|
+
console.log(`${colors.red}Error: --search requires a keyword${colors.reset}`);
|
|
186
|
+
}
|
|
187
|
+
} else if (args.includes('--pattern') || args.includes('-p')) {
|
|
188
|
+
const patternIdx = args.findIndex(a => a === '--pattern' || a === '-p');
|
|
189
|
+
const messageIdx = args.findIndex(a => a === '--message' || a === '-m');
|
|
190
|
+
const severityIdx = args.findIndex(a => a === '--severity');
|
|
191
|
+
const triggerIdx = args.findIndex(a => a === '--trigger');
|
|
192
|
+
|
|
193
|
+
const pattern = patternIdx >= 0 ? args[patternIdx + 1] : null;
|
|
194
|
+
const message = messageIdx >= 0 ? args[messageIdx + 1] : null;
|
|
195
|
+
const severity = severityIdx >= 0 ? args[severityIdx + 1] : 'HIGH';
|
|
196
|
+
const trigger = triggerIdx >= 0 ? args[triggerIdx + 1] : '';
|
|
197
|
+
|
|
198
|
+
if (!pattern || !message) {
|
|
199
|
+
console.log(`${colors.red}Error: --pattern and --message are required${colors.reset}`);
|
|
200
|
+
console.log(`Usage: node learn_from_failure.js --pattern "pattern" --message "lesson message"`);
|
|
201
|
+
process.exit(1);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const lesson = addLesson(pattern, message, severity, trigger);
|
|
205
|
+
if (lesson) {
|
|
206
|
+
console.log(`${colors.green}📚 Đã học: [${lesson.id}] - ${pattern}${colors.reset}`);
|
|
207
|
+
}
|
|
208
|
+
} else {
|
|
209
|
+
// Show help
|
|
210
|
+
console.log(`${colors.cyan}auto-learner - Learn from failures${colors.reset}
|
|
211
|
+
|
|
212
|
+
${colors.bold}Usage:${colors.reset}
|
|
213
|
+
node learn_from_failure.js --list List all lessons
|
|
214
|
+
node learn_from_failure.js --search "keyword" Search lessons
|
|
215
|
+
node learn_from_failure.js --pattern "..." --message "..." Add lesson
|
|
216
|
+
|
|
217
|
+
${colors.bold}Options:${colors.reset}
|
|
218
|
+
-l, --list List all lessons
|
|
219
|
+
-s, --search <keyword> Search lessons
|
|
220
|
+
-p, --pattern <text> Error pattern (required for add)
|
|
221
|
+
-m, --message <text> Lesson message (required for add)
|
|
222
|
+
--severity <level> CRITICAL, HIGH, MEDIUM, LOW (default: HIGH)
|
|
223
|
+
--trigger <text> What triggers this lesson
|
|
224
|
+
`);
|
|
225
|
+
}
|