@dommaker/harness 1.5.0 → 1.6.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/CHANGELOG.md +11 -0
- package/README.md +0 -2
- package/dist/cli/commands/definitions.d.ts.map +1 -1
- package/dist/cli/commands/definitions.js +1 -32
- package/dist/cli/commands/definitions.js.map +1 -1
- package/dist/cli/commands/passes-gate.d.ts +0 -2
- package/dist/cli/commands/passes-gate.d.ts.map +1 -1
- package/dist/cli/commands/passes-gate.js +0 -1
- package/dist/cli/commands/passes-gate.js.map +1 -1
- package/dist/cli/commands/performance.d.ts +0 -4
- package/dist/cli/commands/performance.d.ts.map +1 -1
- package/dist/cli/commands/performance.js +10 -20
- package/dist/cli/commands/performance.js.map +1 -1
- package/dist/cli/commands/report.d.ts +1 -1
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +2 -55
- package/dist/cli/commands/report.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +4 -8
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/context/index.d.ts +2 -5
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +2 -8
- package/dist/context/index.js.map +1 -1
- package/dist/context/token-budget.d.ts +0 -29
- package/dist/context/token-budget.d.ts.map +1 -1
- package/dist/context/token-budget.js +1 -65
- package/dist/context/token-budget.js.map +1 -1
- package/dist/context/types.d.ts +0 -1
- package/dist/context/types.d.ts.map +1 -1
- package/dist/context/types.js +0 -9
- package/dist/context/types.js.map +1 -1
- package/dist/core/constraints/checker.d.ts +14 -0
- package/dist/core/constraints/checker.d.ts.map +1 -1
- package/dist/core/constraints/checker.js +22 -2
- package/dist/core/constraints/checker.js.map +1 -1
- package/dist/core/constraints/git-evidence.d.ts +6 -3
- package/dist/core/constraints/git-evidence.d.ts.map +1 -1
- package/dist/core/constraints/git-evidence.js +6 -3
- package/dist/core/constraints/git-evidence.js.map +1 -1
- package/dist/core/index.d.ts +1 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -9
- package/dist/core/index.js.map +1 -1
- package/dist/core/spec/validator.d.ts +2 -0
- package/dist/core/spec/validator.d.ts.map +1 -1
- package/dist/core/spec/validator.js +9 -11
- package/dist/core/spec/validator.js.map +1 -1
- package/dist/core/validators/index.d.ts +1 -1
- package/dist/core/validators/index.d.ts.map +1 -1
- package/dist/core/validators/passes-gate.d.ts +1 -15
- package/dist/core/validators/passes-gate.d.ts.map +1 -1
- package/dist/core/validators/passes-gate.js +0 -125
- package/dist/core/validators/passes-gate.js.map +1 -1
- package/dist/failure/index.d.ts +0 -1
- package/dist/failure/index.d.ts.map +1 -1
- package/dist/failure/index.js +1 -7
- package/dist/failure/index.js.map +1 -1
- package/dist/gates/definitions.d.ts.map +1 -1
- package/dist/gates/definitions.js +0 -4
- package/dist/gates/definitions.js.map +1 -1
- package/dist/gates/performance.d.ts +7 -22
- package/dist/gates/performance.d.ts.map +1 -1
- package/dist/gates/performance.js +7 -89
- package/dist/gates/performance.js.map +1 -1
- package/dist/gates/types.d.ts +2 -8
- package/dist/gates/types.d.ts.map +1 -1
- package/dist/index.d.ts +6 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -22
- package/dist/index.js.map +1 -1
- package/dist/knowledge/index.d.ts +0 -1
- package/dist/knowledge/index.d.ts.map +1 -1
- package/dist/knowledge/index.js +1 -3
- package/dist/knowledge/index.js.map +1 -1
- package/dist/monitoring/trace-analyzer.d.ts +25 -10
- package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
- package/dist/monitoring/trace-analyzer.js +147 -116
- package/dist/monitoring/trace-analyzer.js.map +1 -1
- package/dist/types/passes-gate.d.ts +0 -19
- package/dist/types/passes-gate.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/passes-gate-check.test.ts +20 -4
- package/src/__tests__/passes-gate.test.ts +5 -99
- package/src/__tests__/performance-gate.test.ts +3 -11
- package/src/__tests__/public-exports.test.ts +46 -16
- package/src/__tests__/trace-analyzer.test.ts +52 -2
- package/src/cli/commands/CONTEXT.md +3 -2
- package/src/cli/commands/__tests__/passes-gate-dead-options.test.ts +70 -0
- package/src/cli/commands/__tests__/passes-gate.test.ts +7 -3
- package/src/cli/commands/__tests__/performance.test.ts +5 -16
- package/src/cli/commands/__tests__/registry.test.ts +46 -3
- package/src/cli/commands/__tests__/report-extra.test.ts +0 -19
- package/src/cli/commands/__tests__/report-false-green.test.ts +46 -0
- package/src/cli/commands/__tests__/report.test.ts +0 -20
- package/src/cli/commands/__tests__/status-analysis-wiring.test.ts +68 -0
- package/src/cli/commands/__tests__/status-extra.test.ts +63 -116
- package/src/cli/commands/__tests__/status.test.ts +66 -148
- package/src/cli/commands/definitions.ts +1 -32
- package/src/cli/commands/passes-gate.ts +0 -3
- package/src/cli/commands/performance.ts +13 -27
- package/src/cli/commands/report.ts +3 -61
- package/src/cli/commands/status.ts +5 -10
- package/src/context/CONTEXT.md +2 -3
- package/src/context/__tests__/token-budget.test.ts +1 -81
- package/src/context/index.ts +2 -7
- package/src/context/token-budget.ts +0 -73
- package/src/context/types.ts +0 -9
- package/src/core/CONTEXT.md +5 -6
- package/src/core/constraints/__tests__/collect-constraints.test.ts +66 -0
- package/src/core/constraints/checker.ts +33 -2
- package/src/core/constraints/git-evidence.ts +6 -3
- package/src/core/index.ts +0 -11
- package/src/core/spec/__tests__/validator.test.ts +24 -0
- package/src/core/spec/validator.ts +9 -10
- package/src/core/validators/__tests__/passes-gate.test.ts +2 -9
- package/src/core/validators/index.ts +0 -1
- package/src/core/validators/passes-gate.ts +1 -149
- package/src/failure/CONTEXT.md +8 -6
- package/src/failure/index.ts +0 -10
- package/src/gates/CONTEXT.md +3 -2
- package/src/gates/__tests__/performance.test.ts +6 -74
- package/src/gates/definitions.ts +0 -4
- package/src/gates/performance.ts +9 -111
- package/src/gates/types.ts +2 -8
- package/src/index.ts +1 -36
- package/src/knowledge/CONTEXT.md +1 -2
- package/src/knowledge/index.ts +0 -1
- package/src/monitoring/CONTEXT.md +2 -2
- package/src/monitoring/trace-analyzer.ts +160 -126
- package/src/types/passes-gate.ts +0 -26
- package/src/utils/__tests__/jsonl-skip-disposition.test.ts +0 -1
- package/dist/cli/commands/analyze-sessions.d.ts +0 -20
- package/dist/cli/commands/analyze-sessions.d.ts.map +0 -1
- package/dist/cli/commands/analyze-sessions.js +0 -290
- package/dist/cli/commands/analyze-sessions.js.map +0 -1
- package/dist/cli/commands/update-user-model.d.ts +0 -30
- package/dist/cli/commands/update-user-model.d.ts.map +0 -1
- package/dist/cli/commands/update-user-model.js +0 -406
- package/dist/cli/commands/update-user-model.js.map +0 -1
- package/dist/cli/session-mining/corrections.d.ts +0 -17
- package/dist/cli/session-mining/corrections.d.ts.map +0 -1
- package/dist/cli/session-mining/corrections.js +0 -58
- package/dist/cli/session-mining/corrections.js.map +0 -1
- package/dist/cli/session-mining/index.d.ts +0 -13
- package/dist/cli/session-mining/index.d.ts.map +0 -1
- package/dist/cli/session-mining/index.js +0 -29
- package/dist/cli/session-mining/index.js.map +0 -1
- package/dist/cli/session-mining/text.d.ts +0 -31
- package/dist/cli/session-mining/text.d.ts.map +0 -1
- package/dist/cli/session-mining/text.js +0 -126
- package/dist/cli/session-mining/text.js.map +0 -1
- package/dist/cli/session-mining/transcript.d.ts +0 -34
- package/dist/cli/session-mining/transcript.d.ts.map +0 -1
- package/dist/cli/session-mining/transcript.js +0 -130
- package/dist/cli/session-mining/transcript.js.map +0 -1
- package/dist/context/compaction.d.ts +0 -57
- package/dist/context/compaction.d.ts.map +0 -1
- package/dist/context/compaction.js +0 -165
- package/dist/context/compaction.js.map +0 -1
- package/dist/core/session/clean-state.d.ts +0 -17
- package/dist/core/session/clean-state.d.ts.map +0 -1
- package/dist/core/session/clean-state.js +0 -192
- package/dist/core/session/clean-state.js.map +0 -1
- package/dist/core/session/index.d.ts +0 -6
- package/dist/core/session/index.d.ts.map +0 -1
- package/dist/core/session/index.js +0 -15
- package/dist/core/session/index.js.map +0 -1
- package/dist/core/session/startup.d.ts +0 -47
- package/dist/core/session/startup.d.ts.map +0 -1
- package/dist/core/session/startup.js +0 -263
- package/dist/core/session/startup.js.map +0 -1
- package/dist/failure/constraint-handler.d.ts +0 -83
- package/dist/failure/constraint-handler.d.ts.map +0 -1
- package/dist/failure/constraint-handler.js +0 -138
- package/dist/failure/constraint-handler.js.map +0 -1
- package/dist/knowledge/lifecycle-hooks.d.ts +0 -62
- package/dist/knowledge/lifecycle-hooks.d.ts.map +0 -1
- package/dist/knowledge/lifecycle-hooks.js +0 -143
- package/dist/knowledge/lifecycle-hooks.js.map +0 -1
- package/dist/types/session.d.ts +0 -113
- package/dist/types/session.d.ts.map +0 -1
- package/dist/types/session.js +0 -6
- package/dist/types/session.js.map +0 -1
- package/src/__tests__/clean-state-extra.test.ts +0 -301
- package/src/__tests__/clean-state.test.ts +0 -169
- package/src/__tests__/constraint-handler.test.ts +0 -132
- package/src/__tests__/passes-gate-extra.test.ts +0 -93
- package/src/__tests__/session-startup.test.ts +0 -334
- package/src/cli/commands/__tests__/analyze-sessions.test.ts +0 -184
- package/src/cli/commands/__tests__/update-user-model.test.ts +0 -268
- package/src/cli/commands/analyze-sessions.ts +0 -335
- package/src/cli/commands/update-user-model.ts +0 -476
- package/src/cli/session-mining/__tests__/transcript.test.ts +0 -118
- package/src/cli/session-mining/corrections.ts +0 -56
- package/src/cli/session-mining/index.ts +0 -13
- package/src/cli/session-mining/text.ts +0 -117
- package/src/cli/session-mining/transcript.ts +0 -125
- package/src/context/__tests__/compaction.test.ts +0 -169
- package/src/context/compaction.ts +0 -201
- package/src/core/session/__tests__/startup.test.ts +0 -281
- package/src/core/session/clean-state.ts +0 -178
- package/src/core/session/index.ts +0 -15
- package/src/core/session/startup.ts +0 -253
- package/src/failure/constraint-handler.ts +0 -171
- package/src/knowledge/__tests__/lifecycle-hooks.test.ts +0 -140
- package/src/knowledge/lifecycle-hooks.ts +0 -202
- package/src/types/session.ts +0 -132
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* harness analyze-sessions — 对话模式发现引擎
|
|
4
|
-
*
|
|
5
|
-
* 扫描 transcript 文件,不预设关键词,挖掘:
|
|
6
|
-
* 1. 纠正信号(用户反复指出的问题)
|
|
7
|
-
* 2. 高频 N-gram(跨会话重复出现的概念)
|
|
8
|
-
* 3. 规则缺口(高频模式未被现有 memory 覆盖)
|
|
9
|
-
*
|
|
10
|
-
* 输出候选规则建议,供用户审核后写入 memory。
|
|
11
|
-
*
|
|
12
|
-
* 工单 19-C:transcript 解析/纠正模式/分词相似度收敛至 cli/session-mining/。
|
|
13
|
-
*/
|
|
14
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
-
if (k2 === undefined) k2 = k;
|
|
16
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
-
}
|
|
20
|
-
Object.defineProperty(o, k2, desc);
|
|
21
|
-
}) : (function(o, m, k, k2) {
|
|
22
|
-
if (k2 === undefined) k2 = k;
|
|
23
|
-
o[k2] = m[k];
|
|
24
|
-
}));
|
|
25
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
-
}) : function(o, v) {
|
|
28
|
-
o["default"] = v;
|
|
29
|
-
});
|
|
30
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
-
var ownKeys = function(o) {
|
|
32
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
-
var ar = [];
|
|
34
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
-
return ar;
|
|
36
|
-
};
|
|
37
|
-
return ownKeys(o);
|
|
38
|
-
};
|
|
39
|
-
return function (mod) {
|
|
40
|
-
if (mod && mod.__esModule) return mod;
|
|
41
|
-
var result = {};
|
|
42
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
-
__setModuleDefault(result, mod);
|
|
44
|
-
return result;
|
|
45
|
-
};
|
|
46
|
-
})();
|
|
47
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
48
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
49
|
-
};
|
|
50
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
-
exports.analyzeSessions = analyzeSessions;
|
|
52
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
53
|
-
const fs = __importStar(require("fs"));
|
|
54
|
-
const path = __importStar(require("path"));
|
|
55
|
-
const os = __importStar(require("os"));
|
|
56
|
-
const session_mining_1 = require("../session-mining");
|
|
57
|
-
const command_contract_1 = require("../command-contract");
|
|
58
|
-
// ── Main ──
|
|
59
|
-
async function analyzeSessions(options, io = command_contract_1.processIO) {
|
|
60
|
-
const transcriptDir = process.env.CLAUDE_TRANSCRIPTS_DIR
|
|
61
|
-
|| path.join(os.homedir(), '.claude', 'projects', '-root--claude');
|
|
62
|
-
const memoryDir = path.join(os.homedir(), '.claude', 'projects', '-root-projects', 'memory');
|
|
63
|
-
const days = options.days || 7;
|
|
64
|
-
if (!fs.existsSync(transcriptDir)) {
|
|
65
|
-
(0, command_contract_1.log)(io, chalk_1.default.yellow('No transcripts directory found'));
|
|
66
|
-
return { kind: 'skip', reason: `会话记录目录不存在: ${transcriptDir}` };
|
|
67
|
-
}
|
|
68
|
-
// 1. Scan transcripts(since 下推 seam(harness#112):stat 级过滤,窗口外不 parse;倒序)
|
|
69
|
-
const cutoff = Date.now() - days * 24 * 60 * 60 * 1000;
|
|
70
|
-
const sessions = (0, session_mining_1.readTranscriptSessions)(transcriptDir, { since: cutoff })
|
|
71
|
-
.sort((a, b) => b.date.localeCompare(a.date));
|
|
72
|
-
if (sessions.length === 0) {
|
|
73
|
-
(0, command_contract_1.log)(io, chalk_1.default.yellow(`No sessions found in the last ${days} days`));
|
|
74
|
-
return { kind: 'skip', reason: `最近 ${days} 天没有会话` };
|
|
75
|
-
}
|
|
76
|
-
// 2. Extract corrections + N-grams
|
|
77
|
-
const corrections = extractCorrections(sessions);
|
|
78
|
-
const ngrams = extractNGrams(sessions, { minLen: 4, maxLen: 24, minFreq: 2 });
|
|
79
|
-
// 3. Load existing memory rules for gap detection
|
|
80
|
-
const existingRules = loadExistingRules(memoryDir);
|
|
81
|
-
// 4. Generate candidates
|
|
82
|
-
const candidates = generateCandidates(corrections, ngrams, existingRules);
|
|
83
|
-
// 5. Output
|
|
84
|
-
if (options.json) {
|
|
85
|
-
(0, command_contract_1.log)(io, JSON.stringify({ sessions: sessions.length, corrections: corrections.length, candidates }, null, 2));
|
|
86
|
-
return { kind: 'ok' };
|
|
87
|
-
}
|
|
88
|
-
(0, command_contract_1.log)(io, chalk_1.default.blue(`🔍 Analyzing ${sessions.length} sessions (last ${days} days)...\n`));
|
|
89
|
-
printCorrectionSummary(corrections, io);
|
|
90
|
-
printCandidates(candidates, io);
|
|
91
|
-
return { kind: 'ok' };
|
|
92
|
-
}
|
|
93
|
-
// ── Correction Extraction ──
|
|
94
|
-
function extractCorrections(sessions) {
|
|
95
|
-
const corrections = [];
|
|
96
|
-
for (const session of sessions) {
|
|
97
|
-
for (const turn of session.turns) {
|
|
98
|
-
if (turn.role !== 'user')
|
|
99
|
-
continue;
|
|
100
|
-
const text = (0, session_mining_1.stripCodeBlocks)(turn.content);
|
|
101
|
-
for (const sentence of (0, session_mining_1.extractCorrectionMatches)(text)) {
|
|
102
|
-
if (sentence.length > 3 && sentence.length < 200) {
|
|
103
|
-
corrections.push({
|
|
104
|
-
sentence,
|
|
105
|
-
sessionId: session.id,
|
|
106
|
-
timestamp: session.date,
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return corrections;
|
|
113
|
-
}
|
|
114
|
-
function extractNGrams(sessions, opts) {
|
|
115
|
-
const phraseMap = new Map();
|
|
116
|
-
for (const session of sessions) {
|
|
117
|
-
const userTexts = session.turns
|
|
118
|
-
.filter(t => t.role === 'user' && !t.content.startsWith('{') && !t.content.startsWith('[') && t.content.length > 10)
|
|
119
|
-
.map(t => (0, session_mining_1.stripCodeBlocks)(t.content));
|
|
120
|
-
const combined = userTexts.join(' ');
|
|
121
|
-
// Extract meaningful word sequences (Chinese chars + meaningful words)
|
|
122
|
-
const words = (0, session_mining_1.tokenize)(combined);
|
|
123
|
-
for (let n = 2; n <= 5; n++) {
|
|
124
|
-
for (let i = 0; i <= words.length - n; i++) {
|
|
125
|
-
const phrase = words.slice(i, i + n).join('');
|
|
126
|
-
const clean = phrase.replace(/[,。!?、;:""''()\s]/g, '');
|
|
127
|
-
if (clean.length < opts.minLen || clean.length > opts.maxLen)
|
|
128
|
-
continue;
|
|
129
|
-
if (/^\d+$/.test(clean))
|
|
130
|
-
continue;
|
|
131
|
-
if (session_mining_1.STOP_WORDS.has(clean))
|
|
132
|
-
continue;
|
|
133
|
-
if ((0, session_mining_1.isPunctuation)(clean))
|
|
134
|
-
continue;
|
|
135
|
-
const existing = phraseMap.get(clean) || { count: 0, sessions: new Set() };
|
|
136
|
-
existing.count++;
|
|
137
|
-
existing.sessions.add(session.id);
|
|
138
|
-
phraseMap.set(clean, existing);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
// Filter by minimum frequency and sort
|
|
143
|
-
return Array.from(phraseMap.entries())
|
|
144
|
-
.filter(([, v]) => v.count >= opts.minFreq && v.sessions.size >= 2)
|
|
145
|
-
.map(([phrase, v]) => ({ phrase, frequency: v.count, sessions: Array.from(v.sessions) }))
|
|
146
|
-
.filter(r => !(0, session_mining_1.isCodeNoise)(r.phrase) && (0, session_mining_1.hasSemanticContent)(r.phrase))
|
|
147
|
-
.sort((a, b) => b.frequency - a.frequency || b.sessions.length - a.sessions.length);
|
|
148
|
-
}
|
|
149
|
-
// ── Existing Rules ──
|
|
150
|
-
function isInExistingRules(concept, existingRules) {
|
|
151
|
-
const lower = concept.toLowerCase();
|
|
152
|
-
if (existingRules.has(lower))
|
|
153
|
-
return true;
|
|
154
|
-
// Partial match: concept appears in any rule name
|
|
155
|
-
for (const rule of existingRules) {
|
|
156
|
-
if (rule.includes(lower) || lower.includes(rule))
|
|
157
|
-
return true;
|
|
158
|
-
}
|
|
159
|
-
return false;
|
|
160
|
-
}
|
|
161
|
-
function loadExistingRules(memoryDir) {
|
|
162
|
-
const concepts = new Set();
|
|
163
|
-
try {
|
|
164
|
-
if (!fs.existsSync(memoryDir))
|
|
165
|
-
return concepts;
|
|
166
|
-
for (const file of fs.readdirSync(memoryDir)) {
|
|
167
|
-
if (!file.endsWith('.md'))
|
|
168
|
-
continue;
|
|
169
|
-
const content = fs.readFileSync(path.join(memoryDir, file), 'utf-8');
|
|
170
|
-
// Extract key concepts from rule titles
|
|
171
|
-
const titleMatch = content.match(/#\s+(.+)/);
|
|
172
|
-
if (titleMatch) {
|
|
173
|
-
const words = (0, session_mining_1.tokenize)(titleMatch[1]);
|
|
174
|
-
for (const w of words) {
|
|
175
|
-
if (w.length >= 4)
|
|
176
|
-
concepts.add(w.toLowerCase());
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
catch { }
|
|
182
|
-
return concepts;
|
|
183
|
-
}
|
|
184
|
-
// ── Candidate Generation ──
|
|
185
|
-
function generateCandidates(corrections, ngrams, existingRules) {
|
|
186
|
-
const candidates = [];
|
|
187
|
-
// From corrections: cluster similar sentences
|
|
188
|
-
const correctionClusters = clusterCorrections(corrections);
|
|
189
|
-
for (const cluster of correctionClusters) {
|
|
190
|
-
// Must appear at least 3 times total
|
|
191
|
-
if (cluster.sentences.length < 3)
|
|
192
|
-
continue;
|
|
193
|
-
const concept = extractConcept(cluster.sentences);
|
|
194
|
-
if (isInExistingRules(concept, existingRules))
|
|
195
|
-
continue;
|
|
196
|
-
candidates.push({
|
|
197
|
-
pattern: concept,
|
|
198
|
-
frequency: cluster.sentences.length,
|
|
199
|
-
sessions: cluster.sessions,
|
|
200
|
-
source: 'correction',
|
|
201
|
-
confidence: Math.min(1, cluster.sentences.length / 10),
|
|
202
|
-
suggestedRule: `feedback_auto_${concept.toLowerCase().replace(/[^a-z0-9\u4e00-\u9fff]/g, '_').slice(0, 40)}.md`,
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
// From N-grams: high-frequency concepts not in corrections
|
|
206
|
-
const correctionConcepts = new Set(correctionClusters.map(c => extractConcept(c.sentences).toLowerCase()));
|
|
207
|
-
for (const ng of ngrams) {
|
|
208
|
-
const concept = ng.phrase;
|
|
209
|
-
if (correctionConcepts.has(concept.toLowerCase()))
|
|
210
|
-
continue; // already covered
|
|
211
|
-
if (isInExistingRules(concept, existingRules))
|
|
212
|
-
continue;
|
|
213
|
-
if (ng.frequency < 2)
|
|
214
|
-
continue;
|
|
215
|
-
const crossSessionStrength = ng.sessions.length >= 2;
|
|
216
|
-
const highFreqSingle = ng.sessions.length === 1 && ng.frequency >= 4;
|
|
217
|
-
if (!crossSessionStrength && !highFreqSingle)
|
|
218
|
-
continue;
|
|
219
|
-
candidates.push({
|
|
220
|
-
pattern: concept,
|
|
221
|
-
frequency: ng.frequency,
|
|
222
|
-
sessions: ng.sessions,
|
|
223
|
-
source: 'ngram',
|
|
224
|
-
confidence: Math.min(1, ng.frequency / 10),
|
|
225
|
-
suggestedRule: `feedback_recurring_${concept.toLowerCase().replace(/[^a-z0-9\u4e00-\u9fff]/g, '_').slice(0, 40)}.md`,
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
return candidates.sort((a, b) => b.confidence - a.confidence);
|
|
229
|
-
}
|
|
230
|
-
function clusterCorrections(corrections) {
|
|
231
|
-
const clusters = [];
|
|
232
|
-
const used = new Set();
|
|
233
|
-
for (let i = 0; i < corrections.length; i++) {
|
|
234
|
-
if (used.has(i))
|
|
235
|
-
continue;
|
|
236
|
-
const cluster = {
|
|
237
|
-
sentences: [corrections[i].sentence],
|
|
238
|
-
sessions: [corrections[i].sessionId],
|
|
239
|
-
};
|
|
240
|
-
used.add(i);
|
|
241
|
-
for (let j = i + 1; j < corrections.length; j++) {
|
|
242
|
-
if (used.has(j))
|
|
243
|
-
continue;
|
|
244
|
-
const similarity = (0, session_mining_1.jaccardSimilarity)(corrections[i].sentence, corrections[j].sentence);
|
|
245
|
-
if (similarity > 0.3) {
|
|
246
|
-
cluster.sentences.push(corrections[j].sentence);
|
|
247
|
-
if (!cluster.sessions.includes(corrections[j].sessionId)) {
|
|
248
|
-
cluster.sessions.push(corrections[j].sessionId);
|
|
249
|
-
}
|
|
250
|
-
used.add(j);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
clusters.push(cluster);
|
|
254
|
-
}
|
|
255
|
-
return clusters;
|
|
256
|
-
}
|
|
257
|
-
function extractConcept(sentences) {
|
|
258
|
-
// Take the longest sentence and extract the noun phrase after the correction marker
|
|
259
|
-
const longest = sentences.reduce((a, b) => a.length > b.length ? a : b, '');
|
|
260
|
-
const cleaned = (0, session_mining_1.cleanCorrectionConcept)(longest);
|
|
261
|
-
return cleaned.slice(0, 60) || longest.slice(0, 60);
|
|
262
|
-
}
|
|
263
|
-
// ── Output ──
|
|
264
|
-
function printCorrectionSummary(corrections, io) {
|
|
265
|
-
if (corrections.length === 0) {
|
|
266
|
-
(0, command_contract_1.log)(io, chalk_1.default.green('No correction patterns found'));
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
(0, command_contract_1.log)(io, chalk_1.default.yellow(`📢 ${corrections.length} correction signals detected\n`));
|
|
270
|
-
}
|
|
271
|
-
function printCandidates(candidates, io) {
|
|
272
|
-
if (candidates.length === 0) {
|
|
273
|
-
(0, command_contract_1.log)(io, chalk_1.default.green('✅ No new pattern candidates — all recurring concepts already have rules\n'));
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
|
-
(0, command_contract_1.log)(io, chalk_1.default.bold('🔔 Pattern Candidates (suggested rules)\n'));
|
|
277
|
-
const topK = candidates.slice(0, 10);
|
|
278
|
-
for (const c of topK) {
|
|
279
|
-
const icon = c.source === 'correction' ? '🔴' : '🟡';
|
|
280
|
-
const confBar = '█'.repeat(Math.round(c.confidence * 10)) + '░'.repeat(10 - Math.round(c.confidence * 10));
|
|
281
|
-
(0, command_contract_1.log)(io, chalk_1.default.bold(`${icon} ${c.pattern}`));
|
|
282
|
-
(0, command_contract_1.log)(io, chalk_1.default.gray(` Source: ${c.source} | Freq: ${c.frequency} | Sessions: ${c.sessions.length} | Confidence: ${confBar}`));
|
|
283
|
-
(0, command_contract_1.log)(io, chalk_1.default.cyan(` → Rule: ${c.suggestedRule}`));
|
|
284
|
-
(0, command_contract_1.log)(io);
|
|
285
|
-
}
|
|
286
|
-
if (candidates.length > 10) {
|
|
287
|
-
(0, command_contract_1.log)(io, chalk_1.default.gray(`... and ${candidates.length - 10} more candidates. Run with --json for full list.`));
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
//# sourceMappingURL=analyze-sessions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-sessions.js","sourceRoot":"","sources":["../../../src/cli/commands/analyze-sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* harness update-user-model — 用户模型持续演化引擎
|
|
3
|
-
*
|
|
4
|
-
* 不依赖固定规则快照。每天从最新数据中提取增量信号,
|
|
5
|
-
* 对比昨天状态,输出变化,更新模型。
|
|
6
|
-
*
|
|
7
|
-
* 数据源:
|
|
8
|
-
* ~/.claude/projects/-root--claude/*.jsonl (对话)
|
|
9
|
-
* /tmp/claude-knowledge-hooks.log (行为信号)
|
|
10
|
-
* studio/.harness/knowledge/ (知识新鲜度)
|
|
11
|
-
* ~/.claude/projects/-root-projects/memory/ (规则库)
|
|
12
|
-
*
|
|
13
|
-
* 模型状态: $HARNESS_UUM_STATE_FILE,默认 ~/.claude/user-model-state.json
|
|
14
|
-
* 画像输出: $HARNESS_UUM_PROFILE_FILE,默认 ~/.claude/projects/-root-projects/memory/user_profile.md
|
|
15
|
-
*
|
|
16
|
-
* 工单 19-C:transcript 解析/纠正模式/相似度收敛至 cli/session-mining/。
|
|
17
|
-
*/
|
|
18
|
-
import { type CommandIO, type CommandResult } from '../command-contract';
|
|
19
|
-
export interface UpdateUserModelOptions {
|
|
20
|
-
days?: number;
|
|
21
|
-
json?: boolean;
|
|
22
|
-
dryRun?: boolean;
|
|
23
|
-
}
|
|
24
|
-
export interface UserModelPaths {
|
|
25
|
-
stateFile: string;
|
|
26
|
-
profileFile: string;
|
|
27
|
-
}
|
|
28
|
-
export declare function resolveUserModelPaths(env?: NodeJS.ProcessEnv): UserModelPaths;
|
|
29
|
-
export declare function updateUserModel(options: UpdateUserModelOptions, io?: CommandIO): Promise<CommandResult>;
|
|
30
|
-
//# sourceMappingURL=update-user-model.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update-user-model.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update-user-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAaH,OAAO,EAAkB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzF,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAmBD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,cAAc,CAQ1F;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,EAAE,EAAE,GAAE,SAAqB,GAAG,OAAO,CAAC,aAAa,CAAC,CAmDxH"}
|